From 0526dcb90825d1c01a23d85caef9228f31f1823a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E6=AD=A3=E6=98=93?= Date: Tue, 25 Mar 2025 16:27:06 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=B0=E5=BD=95=E6=A3=80=E6=B5=8B=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E5=A2=9E=E5=8A=A0=EF=BC=8C=E6=AF=9B=E5=9D=AF=E6=89=A3?= =?UTF-8?q?=E9=99=A4=E6=B7=BB=E5=8A=A0=E4=B8=8D=E6=89=A3=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mes/wms/WmOneTimeInventoryController.cs | 13 + ZR.Model/MES/wms/Dto/WmOneTimeInventoryDto.cs | 9 + .../IService/IWmOneTimeInventoryService.cs | 8 + ZR.Service/mes/wms/WmBlankRecordService.cs | 10 + .../mes/wms/WmOneTimeInventoryService.cs | 373 ++++++++++++------ ZR.Tasks/TaskScheduler/Job_Blank.cs | 1 + 6 files changed, 295 insertions(+), 119 deletions(-) diff --git a/ZR.Admin.WebApi/Controllers/mes/wms/WmOneTimeInventoryController.cs b/ZR.Admin.WebApi/Controllers/mes/wms/WmOneTimeInventoryController.cs index 353944d3..bffeecf3 100644 --- a/ZR.Admin.WebApi/Controllers/mes/wms/WmOneTimeInventoryController.cs +++ b/ZR.Admin.WebApi/Controllers/mes/wms/WmOneTimeInventoryController.cs @@ -228,5 +228,18 @@ namespace ZR.Admin.WebApi.Controllers var result = ExportExcelMini(list, "wm_one_time_inventory", "一次合格品仓库数据"); return ExportExcel(result.Item2, result.Item1); } + + /// + /// 一次合格品仓库数据导出 + /// + /// + /// + [HttpGet("ErrorCheck")] + [AllowAnonymous] + public IActionResult ErrorCheck() + { + var list = _WmOneTimeInventoryService.CheckErrorTable(); + return SUCCESS(list); + } } } diff --git a/ZR.Model/MES/wms/Dto/WmOneTimeInventoryDto.cs b/ZR.Model/MES/wms/Dto/WmOneTimeInventoryDto.cs index 897c7b0e..742471a1 100644 --- a/ZR.Model/MES/wms/Dto/WmOneTimeInventoryDto.cs +++ b/ZR.Model/MES/wms/Dto/WmOneTimeInventoryDto.cs @@ -70,6 +70,15 @@ namespace ZR.Model.MES.wms.Dto public List Result { get; set; } } + public class ErrorCheckTableDto + { + public string Name { get; set; } + public string Partnumber { get; set; } + public string Description { get; set; } + public string ErrorMessage { get; set; } + public DateTime CheckTime { get; set; } + } + // 一次合格(产成品)导出 [SugarTable("wm_one_time_record", "一次合格表")] public class WmOneTimeInventoryExportDto diff --git a/ZR.Service/mes/wms/IService/IWmOneTimeInventoryService.cs b/ZR.Service/mes/wms/IService/IWmOneTimeInventoryService.cs index b4229233..3103efc4 100644 --- a/ZR.Service/mes/wms/IService/IWmOneTimeInventoryService.cs +++ b/ZR.Service/mes/wms/IService/IWmOneTimeInventoryService.cs @@ -59,5 +59,13 @@ namespace ZR.Service.mes.wms.IService /// public (string, object, object) ImportExcel(List excel); + + /// + /// 检查一次合格品记录,抛光记录错误原因 + /// + /// + public List CheckErrorTable(); + + } } diff --git a/ZR.Service/mes/wms/WmBlankRecordService.cs b/ZR.Service/mes/wms/WmBlankRecordService.cs index cae0ec08..e03bd688 100644 --- a/ZR.Service/mes/wms/WmBlankRecordService.cs +++ b/ZR.Service/mes/wms/WmBlankRecordService.cs @@ -326,11 +326,21 @@ namespace ZR.Service.mes.wms .Queryable() .Where(it => it.ClientWorkorder == workOrderId) .First(); + + if (workOrderInfo == null) { Context.Ado.RollbackTran(); throw new Exception("工单记录不存在!" + workOrderId); } + //TODO 20250325 remark1 存在不扣,则不扣除 + if (workOrderInfo.Remark1.Contains("不扣")) + { + Context.Ado.CommitTran(); + return 0; + } + + if (workOrderInfo.Remark1.Contains("返工")) { type = 2; diff --git a/ZR.Service/mes/wms/WmOneTimeInventoryService.cs b/ZR.Service/mes/wms/WmOneTimeInventoryService.cs index 4bd65460..22f51885 100644 --- a/ZR.Service/mes/wms/WmOneTimeInventoryService.cs +++ b/ZR.Service/mes/wms/WmOneTimeInventoryService.cs @@ -231,126 +231,122 @@ namespace ZR.Service.mes.wms return response;*/ } - - - /// - /// 查询一次合格品仓库列表 - /// - /// - /// - public WmOneTimeInventoryTableDto GetListNew(WmOneTimeInventoryQueryDto parm) - { - var list = Context - .Queryable() - .LeftJoin((m, p) => m.Partnumber == p.Partnumber) - .Distinct() - .WhereIF( - !string.IsNullOrEmpty(parm.Description), - (m, p) => m.Description.Contains(parm.Description) - ) - .WhereIF( - !string.IsNullOrEmpty(parm.Partnumber), - (m, p) => m.Partnumber.Contains(parm.Partnumber) - ) - .Where((m, p) => m.Status == 1) - .Where((m, p) => m.Type == 1) - // .WhereIF(string.IsNullOrEmpty(parm.Partnumber), (m, p) => p.Status == 1) - .OrderBy((m, p) => m.Description) - .Select( - (m, p) => - new WmOneTimeInventoryDto - { - RealQuantity = 0, - Partnumber = m.Partnumber, - Color = m.Color, - Specification = m.Specification, - Description = m.Description, - Id = p.Id ?? m.Id, - BlankNum = p.BlankNum, - Quantity = p.Quantity ?? 0, - MaxNum = p.MaxNum, - MinNum = p.MinNum, - WarnNum = p.WarnNum, - Type = p.Type ?? 1, - Status = p.Status, - Remark = p.Remark, - CreatedBy = p.CreatedBy, - CreatedTime = p.CreatedTime, - UpdatedBy = p.UpdatedBy, - UpdatedTime = p.UpdatedTime, - } - ) - .ToList(); - //TODO 取出库存表 WmOneTimeInventory 最小CreatedTime时间 - DateTime minDateTime = - Context - .Queryable() - .OrderBy(it => it.CreatedTime) - .Select(it => it.CreatedTime) - .First() ?? DateTime.Now; - //TODO 根据时间范围取出所有记录数据 - List wmOneTimeRecords = Context - .Queryable() - //.Where(it => it.Code == "自动") - .Where(it => it.ActionTime >= minDateTime) - .ToList(); + /// + /// 查询一次合格品仓库列表 + /// + /// + /// + public WmOneTimeInventoryTableDto GetListNew(WmOneTimeInventoryQueryDto parm) + { + var list = Context + .Queryable() + .LeftJoin((m, p) => m.Partnumber == p.Partnumber) + .Distinct() + .WhereIF( + !string.IsNullOrEmpty(parm.Description), + (m, p) => m.Description.Contains(parm.Description) + ) + .WhereIF( + !string.IsNullOrEmpty(parm.Partnumber), + (m, p) => m.Partnumber.Contains(parm.Partnumber) + ) + .Where((m, p) => m.Status == 1) + .Where((m, p) => m.Type == 1) + // .WhereIF(string.IsNullOrEmpty(parm.Partnumber), (m, p) => p.Status == 1) + .OrderBy((m, p) => m.Description) + .Select( + (m, p) => + new WmOneTimeInventoryDto + { + RealQuantity = 0, + Partnumber = m.Partnumber, + Color = m.Color, + Specification = m.Specification, + Description = m.Description, + Id = p.Id ?? m.Id, + BlankNum = p.BlankNum, + Quantity = p.Quantity ?? 0, + MaxNum = p.MaxNum, + MinNum = p.MinNum, + WarnNum = p.WarnNum, + Type = p.Type ?? 1, + Status = p.Status, + Remark = p.Remark, + CreatedBy = p.CreatedBy, + CreatedTime = p.CreatedTime, + UpdatedBy = p.UpdatedBy, + UpdatedTime = p.UpdatedTime, + } + ) + .ToList(); + //TODO 取出库存表 WmOneTimeInventory 最小CreatedTime时间 + DateTime minDateTime = + Context + .Queryable() + .OrderBy(it => it.CreatedTime) + .Select(it => it.CreatedTime) + .First() ?? DateTime.Now; + //TODO 根据时间范围取出所有记录数据 + List wmOneTimeRecords = Context + .Queryable() + //.Where(it => it.Code == "自动") + .Where(it => it.ActionTime >= minDateTime) + .ToList(); foreach (WmOneTimeInventoryDto item in list) - { - int? runum = wmOneTimeRecords - .Where(o => - o.ActionTime >= item.CreatedTime - && o.Partnumber == item.Partnumber - && o.ChangeType == 1 - ) - .Select(o => o.ChangeQuantity) - .Sum(); - int? chunum = wmOneTimeRecords - .Where(o => - o.ActionTime >= item.CreatedTime - && o.Partnumber == item.Partnumber - && o.ChangeType == 2 - ) - .Select(o => o.ChangeQuantity) - .Sum(); - item.RealQuantity = item.Quantity.Value + (runum.Value - chunum.Value); - } - list = list.Where(it => it.RealQuantity != 0 || it.Quantity != 0) - .Where(it => !string.IsNullOrEmpty(it.Partnumber)) - .DistinctBy(it => it.Partnumber) + { + int? runum = wmOneTimeRecords + .Where(o => + o.ActionTime >= item.CreatedTime + && o.Partnumber == item.Partnumber + && o.ChangeType == 1 + ) + .Select(o => o.ChangeQuantity) + .Sum(); + int? chunum = wmOneTimeRecords + .Where(o => + o.ActionTime >= item.CreatedTime + && o.Partnumber == item.Partnumber + && o.ChangeType == 2 + ) + .Select(o => o.ChangeQuantity) + .Sum(); + item.RealQuantity = item.Quantity.Value + (runum.Value - chunum.Value); + } + list = list.Where(it => it.RealQuantity != 0 || it.Quantity != 0) + .Where(it => !string.IsNullOrEmpty(it.Partnumber)) + .DistinctBy(it => it.Partnumber) .OrderBy(it => it.RealQuantity) - .ToList(); + .ToList(); - int total = list.Count; - // 仓库总盘点零件数 - int StocktakingTotal = - Context.Queryable().Sum(it => it.Quantity) ?? 0; - // 仓库当前查询盘点零件数 - int QuantitySum = list.Sum(it => it.Quantity) ?? 0; - // 仓库当前查询实际零件数 - int RealQuantitySum = list.Sum(it => it.RealQuantity); - WmOneTimeInventoryTableDto response = - new() - { - Total = total, - StocktakingTotal = StocktakingTotal, - QuantitySum = QuantitySum, - RealQuantitySum = RealQuantitySum, + int total = list.Count; + // 仓库总盘点零件数 + int StocktakingTotal = + Context.Queryable().Sum(it => it.Quantity) ?? 0; + // 仓库当前查询盘点零件数 + int QuantitySum = list.Sum(it => it.Quantity) ?? 0; + // 仓库当前查询实际零件数 + int RealQuantitySum = list.Sum(it => it.RealQuantity); + WmOneTimeInventoryTableDto response = + new() + { + Total = total, + StocktakingTotal = StocktakingTotal, + QuantitySum = QuantitySum, + RealQuantitySum = RealQuantitySum, MinStocktakingTime = minDateTime, Result = list.Skip((parm.PageNum - 1) * parm.PageSize) - .Take(parm.PageSize) - .ToList(), - }; - return response; + .Take(parm.PageSize) + .ToList(), + }; + return response; + } - - } - - /// - /// 获取详情 - /// - /// - /// - public WmOneTimeInventory GetInfo(string Id) + /// + /// 获取详情 + /// + /// + /// + public WmOneTimeInventory GetInfo(string Id) { var response = Queryable().Where(x => x.Id == Id).First(); @@ -764,11 +760,14 @@ namespace ZR.Service.mes.wms .First() ?? new DateTime(2024, 11, 16, 12, 0, 0); // DateTime CommonFQCService commonFQCService = new(); - // 获取报表数据 - // 一次合格计算后库存 = 盘点库存 + 产线合格 + 抛光合格 - gp12投入 - 后道直接出库 - //return commonFQCService.GetBatchOneTimePartRealStock(partnumbers, checkTime.Value); - return commonFQCService.GetBatchOneTimePartRealStockNew(partnumbers, checkTime.Value); - } + // 获取报表数据 + // 一次合格计算后库存 = 盘点库存 + 产线合格 + 抛光合格 - gp12投入 - 后道直接出库 + //return commonFQCService.GetBatchOneTimePartRealStock(partnumbers, checkTime.Value); + return commonFQCService.GetBatchOneTimePartRealStockNew( + partnumbers, + checkTime.Value + ); + } catch (Exception e) { throw; @@ -832,5 +831,141 @@ namespace ZR.Service.mes.wms return (msg, x.ErrorList, x.IgnoreList); } + + public List CheckErrorTable() + { + List errorCheckTableDtos = new List(); + + // 盘点数据的零件号与物料内零件号不匹配异常进行检查 + // 获取物料列表并将零件号提取到 HashSet 中以进行快速查找 + HashSet materialPartnumbers = + new(GetWmMaterialList("").Select(m => m.Partnumber)); + List oneTimeInventoryList = Context + .Queryable() + .ToList(); + List polishInventoryList = Context + .Queryable() + .ToList(); + foreach (var inventoryItem in oneTimeInventoryList) + { + if (!materialPartnumbers.Contains(inventoryItem.Partnumber)) + { + errorCheckTableDtos.Add( + new ErrorCheckTableDto + { + Name = "零件号不存在", + Partnumber = inventoryItem.Partnumber, + Description = "该零件号在物料列表中不存在。", + ErrorMessage = "检测到【一次合格盘点记录】中的零件号不匹配。", + CheckTime = DateTime.Now + } + ); + } + } + foreach (var inventoryItem in polishInventoryList) + { + if (!materialPartnumbers.Contains(inventoryItem.Partnumber)) + { + errorCheckTableDtos.Add( + new ErrorCheckTableDto + { + Name = "零件号不存在", + Partnumber = inventoryItem.Partnumber, + Description = "该零件号在物料列表中不存在。", + ErrorMessage = "检测到【抛光品盘点记录】中的零件号不匹配。", + CheckTime = DateTime.Now + } + ); + } + } + + DateTime minOneTimeStocktakingTime = + oneTimeInventoryList.Min(x => x.CreatedTime) ?? DateTime.Now; + DateTime minPolishStocktakingTime = + polishInventoryList.Min(x => x.CreatedTime) ?? DateTime.Now; + + List oneTimeRecordList = Context + .Queryable() + .Where(it => it.ActionTime >= minOneTimeStocktakingTime) + .ToList(); + List polishRecordList = Context + .Queryable() + .Where(it => it.ActionTime >= minPolishStocktakingTime) + .ToList(); + + foreach (var recordItem in oneTimeRecordList) + { + if (!materialPartnumbers.Contains(recordItem.Partnumber)) + { + errorCheckTableDtos.Add( + new ErrorCheckTableDto + { + Name = "零件号不存在", + Partnumber = recordItem.Partnumber, + Description = "该零件号在物料列表中不存在。", + ErrorMessage = "检测到【一次合格品报表】中的零件号不匹配。记录时间:" + recordItem.ActionTime, + CheckTime = DateTime.Now + } + ); + } + } + + foreach (var recordItem in polishRecordList) + { + if (!materialPartnumbers.Contains(recordItem.Partnumber)) + { + errorCheckTableDtos.Add( + new ErrorCheckTableDto + { + Name = "零件号不存在", + Partnumber = recordItem.Partnumber, + Description = "该零件号在物料列表中不存在。", + ErrorMessage = "检测到【抛光品报表】中的零件号不匹配。记录时间:" + recordItem.ActionTime, + CheckTime = DateTime.Now + } + ); + } + } + + //TODO 判断oneTimeRecordList中是否存在oneTimeInventoryList没有的零件号 + // 提取 oneTimeInventoryList 中的所有零件号 + HashSet oneTimeInventoryPartnumbers = new HashSet(oneTimeInventoryList.Select(i => i.Partnumber)); + foreach (var recordItem in oneTimeRecordList) + { + if (!oneTimeInventoryPartnumbers.Contains(recordItem.Partnumber)) + { + errorCheckTableDtos.Add( + new ErrorCheckTableDto + { + Name = "该零件号记录丢失", + Partnumber = recordItem.Partnumber, + Description = "该零件号与盘点数据不匹配。请确认情况,是否未盘点到!", + ErrorMessage = $"检测到【一次合格品记录】中的零件号在盘点清单中不存在。记录时间: {recordItem.ActionTime}", + CheckTime = DateTime.Now + } + ); + } + } + //TODO 判断polishRecordList中是否存在polishInventoryList没有的零件号 + HashSet polishInventoryPartnumbers = new HashSet(polishInventoryList.Select(i => i.Partnumber)); + foreach (var recordItem in polishRecordList) + { + if (!polishInventoryPartnumbers.Contains(recordItem.Partnumber)) + { + errorCheckTableDtos.Add( + new ErrorCheckTableDto + { + Name = "该零件号记录丢失", + Partnumber = recordItem.Partnumber, + Description = "该零件号与盘点数据不匹配。请确认情况,是否未盘点到!", + ErrorMessage = $"检测到【抛光品记录】中的零件号在盘点清单中不存在。记录时间: {recordItem.ActionTime}", + CheckTime = DateTime.Now + } + ); + } + } + + return errorCheckTableDtos; + } } } diff --git a/ZR.Tasks/TaskScheduler/Job_Blank.cs b/ZR.Tasks/TaskScheduler/Job_Blank.cs index aeee1f7f..83522d39 100644 --- a/ZR.Tasks/TaskScheduler/Job_Blank.cs +++ b/ZR.Tasks/TaskScheduler/Job_Blank.cs @@ -116,6 +116,7 @@ namespace ZR.Tasks.TaskScheduler .And(it => it.Year == year) .And(it => it.Week == week) .And(it => it.Date == date) + .And(it => !it.Remark1.Contains("不扣")) .And(it => it.Remark2.Contains("调试")) // .And(it => it.Remark3 == "是") .ToExpression();