From 9b3bbcd08bfba7555190ab3cd16451051024c8a4 Mon Sep 17 00:00:00 2001 From: hehaibing-1996 Date: Tue, 21 Jan 2025 10:58:40 +0800 Subject: [PATCH] =?UTF-8?q?=E7=89=A9=E6=96=99=E7=BB=91=E5=AE=9A=20?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WCS.BLL/DbModels/STZL/MatDetailCurrentInfo.cs | 8 +- .../Service/BatchBindMatDetailService.cs | 118 ++++++++++++++++-- .../BatchBindMatDetailController.cs | 13 +- 货架标准上位机/Api/ApiHelp.cs | 37 ++++++ .../Resources/物料绑定导入模板.xlsx | Bin 10228 -> 10266 bytes .../ViewModels/BatchBindMatDetailViewModel.cs | 4 +- 6 files changed, 158 insertions(+), 22 deletions(-) diff --git a/WCS.BLL/DbModels/STZL/MatDetailCurrentInfo.cs b/WCS.BLL/DbModels/STZL/MatDetailCurrentInfo.cs index 452ca3a..be92e82 100644 --- a/WCS.BLL/DbModels/STZL/MatDetailCurrentInfo.cs +++ b/WCS.BLL/DbModels/STZL/MatDetailCurrentInfo.cs @@ -62,7 +62,7 @@ namespace WCS.BLL.DbModels /// 物料规格 /// [SugarColumn(ColumnName = "mat_spec", Length = 128, IsNullable = true, ColumnDescription = "物料规格")] - public string MatSpec { get; set; } + public string? MatSpec { get; set; } /// /// 物料单位 @@ -94,19 +94,19 @@ namespace WCS.BLL.DbModels /// 单据类型Id /// [SugarColumn(ColumnName = "order_type_id", IsNullable = true, ColumnDescription = "单据类型Id")] - public int OrderTypeId { get; set; } + public int? OrderTypeId { get; set; } /// /// 单据类型名称 /// [SugarColumn(ColumnName = "order_Type_name", Length = 64, IsNullable = true, ColumnDescription = "单据类型名称")] - public string OrderTypeName { get; set; } + public string? OrderTypeName { get; set; } /// /// 单据编号 /// [SugarColumn(ColumnName = "order_number", Length = 64, IsNullable = true, ColumnDescription = "单据编号")] - public string OrderNumber { get; set; } + public string? OrderNumber { get; set; } /// /// 站位编号 用于物料批量绑定时区分是哪个工位绑定的明细 diff --git a/WCS.BLL/Services/Service/BatchBindMatDetailService.cs b/WCS.BLL/Services/Service/BatchBindMatDetailService.cs index f17b967..f5bd2ad 100644 --- a/WCS.BLL/Services/Service/BatchBindMatDetailService.cs +++ b/WCS.BLL/Services/Service/BatchBindMatDetailService.cs @@ -42,7 +42,7 @@ namespace WCS.BLL.Services.Service || (si.TransStatus == TransStatusEnum.运输中 && si.DestinationLocationId == li.Id)) .WhereIF(request.OrderTypeId != null && request.OrderTypeId != 0, (mci, si, li) => mci.OrderTypeId == request.OrderTypeId) .WhereIF(!string.IsNullOrEmpty(request.ShelfCode), (mci, si, li) => si.ShelfCode.Contains(request.ShelfCode)) - //.WhereIF(!string.IsNullOrEmpty(request.StationCode), (mci, si, li) => mci.StationCode.Contains(request.StationCode)) + .WhereIF(!string.IsNullOrEmpty(request.StationCode), (mci, si, li) => mci.StationCode.Contains(request.StationCode)) .Select((mci, si, li) => new MatDetailCurrentInfoModel() { Id = mci.Id, @@ -213,6 +213,26 @@ namespace WCS.BLL.Services.Service }; } + var shelfInfo = await DbHelp.db.Queryable() + .Where(t => (t.TransStatus == TransStatusEnum.静止 && t.CurrentLocationId == station.Id) || + t.TransStatus == TransStatusEnum.运输中 && t.DestinationLocationId == station.Id) + .Where(t => t.IsEnable) + .FirstAsync(); + if (shelfInfo == null) + { + return new ResponseCommon>() + { + Code = 200, + Message = $"导入失败:当前工位不存在货架,请呼叫货架后再进行操作!", + Data = null, + }; + } + + //单据类型校验 物料类型数量较小 不会对内存造成负担 + var orderTypesInDb = await DbHelp.db.Queryable() + .ToListAsync(); + var orderTypeNamesInDb = orderTypesInDb.Select(t => t.OrderTypeName) + .ToList(); //数量、物料编码等必填项的校验 foreach (var matDetailCurrentInfo in lists) { @@ -234,10 +254,62 @@ namespace WCS.BLL.Services.Service Data = null, }; } - } - //单据类型校验 + if (!string.IsNullOrEmpty(matDetailCurrentInfo.单据类型) && !orderTypeNamesInDb.Contains(matDetailCurrentInfo.单据类型)) + { + return new ResponseCommon>() + { + Code = 200, + Message = $"导入失败:单据类型[{matDetailCurrentInfo.单据类型}]无效!", + Data = null, + }; + } - //物料编码校验 + if (!string.IsNullOrEmpty(matDetailCurrentInfo.货架编码) && matDetailCurrentInfo.货架编码 == shelfInfo.ShelfCode) + { + return new ResponseCommon>() + { + Code = 200, + Message = $"导入失败:货架[{matDetailCurrentInfo.货架编码}]不是当前工位的货架!", + Data = null, + }; + } + } + + #region 物料编码校验 + //物料编码校验 物料编码的数据可能比较多 所以有可能会对服务器内存造成负担所以采用以下形式进行校验 + var matCodes = lists.Select(t => t.物料编码) + .Distinct() + .ToList(); + + var matBaseInfoInDb = await DbHelp.db.Queryable() + .Where(t => matCodes.Contains(t.MatCode)) + .Where(t => t.IsEnable == true) + .ToListAsync(); + if (matBaseInfoInDb == null) + { + return new ResponseCommon>() + { + Code = 200, + Message = $"导入失败:请重试!", + Data = null, + }; + } + //判断如果导入表中的物料编码数量与数据库中有效的编码数量不一致证明中间有无效的物料编码 + if (matBaseInfoInDb != null && matBaseInfoInDb?.Count < matCodes.Count) + { + var matCodesInDb = matBaseInfoInDb.Select(t => t.MatName).ToList(); + matCodes.RemoveAll(t => matCodesInDb.Contains(t)); + if (matCodes.Count > 0) + { + return new ResponseCommon>() + { + Code = 200, + Message = $"导入失败:以下物料编码无效!\r\n{string.Join(",", matCodes)}", + Data = null, + }; + } + } + #endregion #endregion @@ -245,19 +317,39 @@ namespace WCS.BLL.Services.Service try { await DbHelp.db.BeginTranAsync(); - foreach (var mat in lists) + foreach (var info in lists) { - var matBaseInfo = new MatBaseInfo() + var matBaseInfo = matBaseInfoInDb?.Where(t => t.MatCode == info.物料编码).First(); + var orderType = orderTypesInDb?.Where(t => t.OrderTypeName == info.单据类型).FirstOrDefault(); + //应该是不能走进的分支 + if (matBaseInfo == null) { - MatCode = mat.物料编码, - MatName = mat.名称, - MatSpec = mat.规格, - MatUnit = mat.单位, - MatCustomer = mat.客户, + continue; + } + var matDetailCurrentInfo = new MatDetailCurrentInfo() + { + + ShlefId = shelfInfo.Id, + ShelfCode = shelfInfo.ShelfCode, + ShelfType = shelfInfo.ShelfTypeName, + + MatCode = matBaseInfo.MatCode, + MatName = matBaseInfo.MatName, + MatSpec = matBaseInfo.MatSpec, + MatUnit = matBaseInfo.MatUnit, + MatSupplier = matBaseInfo.MatSupplier, + MatCustomer = matBaseInfo.MatCustomer, + MatQty = info.数量.GetValueOrDefault(), + + OrderTypeId = orderType?.Id, + OrderTypeName = orderType?.OrderTypeName, + OrderNumber = info.单据编号, + StationCode = stationCode, + ModifyUser = userName, - IsEnable = mat.状态 == "启用" ? true : false, + }; - await DbHelp.db.Insertable(matBaseInfo).ExecuteCommandAsync(); + await DbHelp.db.Insertable(matDetailCurrentInfo).ExecuteCommandAsync(); } await DbHelp.db.CommitTranAsync(); return new ResponseCommon>() diff --git a/WCS.WebApi/Controllers/BatchBindMatDetailController.cs b/WCS.WebApi/Controllers/BatchBindMatDetailController.cs index 4ff6aef..2693baa 100644 --- a/WCS.WebApi/Controllers/BatchBindMatDetailController.cs +++ b/WCS.WebApi/Controllers/BatchBindMatDetailController.cs @@ -142,10 +142,17 @@ namespace WCS.WebApi.Controllers { await excelFile.CopyToAsync(stream); stream.Position = 0; - var list = MiniExcelLibs.MiniExcel.Query(stream, "物料管理", ExcelType.XLSX).ToList(); + var list = MiniExcelLibs.MiniExcel.Query(stream, "物料绑定", ExcelType.XLSX).ToList(); //去除空白行 - list.RemoveAll(x => string.IsNullOrWhiteSpace(x.物料编码)); - + //list.RemoveAll(x => string.IsNullOrWhiteSpace(x.物料编码)); + if (list == null || list.Count == 0) + { + return new ResponseCommon() + { + Code = 201, + Message = "导入失败:上传的文件中不存在有效的数据!" + }; + } return await _batchBindMatDetailService.importMatDetailCurrentInfo(list, userName, deviceType, stationCode); } } diff --git a/货架标准上位机/Api/ApiHelp.cs b/货架标准上位机/Api/ApiHelp.cs index 9ccbe1e..f87b036 100644 --- a/货架标准上位机/Api/ApiHelp.cs +++ b/货架标准上位机/Api/ApiHelp.cs @@ -271,6 +271,43 @@ namespace 智慧物流软件系统.Api } } + + public static async Task StationPostImportFileAsync(string localFilePath, HttpMethod method, string requestUrl, string userName, string deviceType,string stationCode) + { + HttpRequestMessage httpRequestMessage = new HttpRequestMessage(method, requestUrl); + + using (var content = new MultipartFormDataContent()) + { + var fileContent = new StreamContent(new FileStream(localFilePath, FileMode.Open, FileAccess.Read)); + fileContent.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("multipart/form-data"); + content.Add(fileContent, "excelFile", Path.GetFileName(localFilePath)); + + var userNameContent = new StringContent(userName); + userNameContent.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("multipart/form-data"); + content.Add(userNameContent, "userName"); + + var deviceTypeContent = new StringContent(deviceType); + deviceTypeContent.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("multipart/form-data"); + content.Add(deviceTypeContent, "deviceType"); + + var stationCodeContent = new StringContent(stationCode); + stationCodeContent.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("multipart/form-data"); + content.Add(stationCodeContent, "stationCode"); + + httpRequestMessage.Content = content; + using (var response = await httpClient.SendAsync(httpRequestMessage)) + { + response.EnsureSuccessStatusCode(); // 确保请求成功 + var filename = string.Empty; + + if (!response.IsSuccessStatusCode) + return default(T); + + var con = await response.Content.ReadAsStringAsync(); + return JsonConvert.DeserializeObject(con) ?? default(T); ; + } + } + } /// /// 调用接口超时时间10s /// diff --git a/货架标准上位机/Resources/物料绑定导入模板.xlsx b/货架标准上位机/Resources/物料绑定导入模板.xlsx index 46d190cc500c9e51e63a1cb71645e7e922ebbd31..caa392e042cdc1ea2892e87d01a1e50d91f73e91 100644 GIT binary patch delta 2111 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 fAdu8QrvJNWfEUUV>>>(path, System.Net.Http.HttpMethod.Post, - LocalFile.Config.ApiIpHost + "matBaseInfo/importMatBaseInfo", LocalStatic.CurrentUser, LocalFile.Config.DeviceType); + var result = await ApiHelp.StationPostImportFileAsync>>(path, System.Net.Http.HttpMethod.Post, + LocalFile.Config.ApiIpHost + "batchBindMatDetail/importMatDetailCurrentInfos", LocalStatic.CurrentUser, LocalFile.Config.DeviceType,LocalFile.Config.LocationCode); if (result.Code == 200) { Growl.Success("成功导入!");