diff --git a/ZR.Admin.WebApi/wwwroot/export/一次合格品仓库数据04-08-153252.xlsx b/ZR.Admin.WebApi/wwwroot/export/一次合格品仓库数据04-08-153252.xlsx new file mode 100644 index 00000000..d0f22973 Binary files /dev/null and b/ZR.Admin.WebApi/wwwroot/export/一次合格品仓库数据04-08-153252.xlsx differ diff --git a/ZR.Admin.WebApi/wwwroot/export/抛光仓库数据04-08-154205.xlsx b/ZR.Admin.WebApi/wwwroot/export/抛光仓库数据04-08-154205.xlsx new file mode 100644 index 00000000..e0d68bdf Binary files /dev/null and b/ZR.Admin.WebApi/wwwroot/export/抛光仓库数据04-08-154205.xlsx differ diff --git a/ZR.Service/mes/wms/WmOneTimeInventoryService.cs b/ZR.Service/mes/wms/WmOneTimeInventoryService.cs index 22f51885..e7056ed7 100644 --- a/ZR.Service/mes/wms/WmOneTimeInventoryService.cs +++ b/ZR.Service/mes/wms/WmOneTimeInventoryService.cs @@ -280,6 +280,7 @@ namespace ZR.Service.mes.wms ) .ToList(); //TODO 取出库存表 WmOneTimeInventory 最小CreatedTime时间 + DateTime minDateTime = Context .Queryable() @@ -294,9 +295,39 @@ namespace ZR.Service.mes.wms .ToList(); foreach (WmOneTimeInventoryDto item in list) { + + //TODO 20250408 盘点时间修正(三个时间比对) + WmOneTimeRecord minCheckRecord = + wmOneTimeRecords + .Where(o => o.Partnumber == item.Partnumber && o.ChangeType == 3) + .OrderByDescending(o => o.ActionTime) + .FirstOrDefault(); + DateTime minCheckRecordTime = DateTime.MinValue; + int minCheckRecordQuantity = 0; + if (minCheckRecord != null) + { + minCheckRecordTime = minCheckRecord.ActionTime ?? DateTime.MinValue; + } + + DateTime minCheckInventoryTime = item.CreatedTime ?? minDateTime; + //TODO 20250408修改 最小盘点时间判断/如有盘点记录,则优先取盘点记录数据 + DateTime checkTime = + minCheckRecordTime > minCheckInventoryTime + ? minCheckRecordTime + : minCheckInventoryTime; + if (checkTime == minCheckRecordTime) + { + // TODO 20250408 如果最早记录是盘点记录,则取盘点变动数量 + minCheckRecordQuantity = minCheckRecord.ChangeQuantity ?? 0; + } + else + { + minCheckRecordQuantity = item.Quantity.Value; + } + int? runum = wmOneTimeRecords .Where(o => - o.ActionTime >= item.CreatedTime + o.ActionTime >= checkTime && o.Partnumber == item.Partnumber && o.ChangeType == 1 ) @@ -304,13 +335,15 @@ namespace ZR.Service.mes.wms .Sum(); int? chunum = wmOneTimeRecords .Where(o => - o.ActionTime >= item.CreatedTime + o.ActionTime >= checkTime && o.Partnumber == item.Partnumber && o.ChangeType == 2 ) .Select(o => o.ChangeQuantity) .Sum(); - item.RealQuantity = item.Quantity.Value + (runum.Value - chunum.Value); + + item.RealQuantity = minCheckRecordQuantity + (runum.Value - chunum.Value); + item.CreatedTime = checkTime; } list = list.Where(it => it.RealQuantity != 0 || it.Quantity != 0) .Where(it => !string.IsNullOrEmpty(it.Partnumber)) @@ -611,6 +644,7 @@ namespace ZR.Service.mes.wms } } + // 盘点 public int DoWmOneTimeStocktaking(WmOneTimeInventory parm) { if (parm.Quantity < 0) @@ -621,7 +655,7 @@ namespace ZR.Service.mes.wms { Context.Ado.BeginTran(); // 检查是否存在库中 - WmOneTimeInventory oneTImeInventory = Context +/* WmOneTimeInventory oneTImeInventory = Context .Queryable() .Where(it => it.Id == parm.Id) .Where(it => it.Status == 1) @@ -631,8 +665,9 @@ namespace ZR.Service.mes.wms Context.Ado.RollbackTran(); throw new Exception("盘点记录不存在" + parm.Id); } - Context.Updateable(parm).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommand(); + Context.Updateable(parm).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommand();*/ // 已有则新增记录 + //TODO 20250408 新逻辑调整 只添加盘点记录 算库存数时自动调整 string code = !string.IsNullOrEmpty(parm.WorkOrder) ? parm.WorkOrder : SnowFlakeSingle.Instance.NextId().ToString(); @@ -642,7 +677,7 @@ namespace ZR.Service.mes.wms parm.Partnumber, 3, parm.Quantity, - parm.ActionTime, + parm.ActionTime ?? DateTime.Now, parm.Remark, parm.CreatedBy ); @@ -687,44 +722,47 @@ namespace ZR.Service.mes.wms .OrderBy(it => it.Description) .ToList(); } - + //导出 public List GetExportList(WmOneTimeInventoryQueryDto parm) { try { - List materials = GetWmMaterialList(parm.Partnumber); + /* List materials = GetWmMaterialList(parm.Partnumber); - // 获取所有partnumber列表 - List partnumbers = materials - .Where(it => !string.IsNullOrEmpty(it.Partnumber)) - .Select(it => it.Partnumber) - .Distinct() - .ToList(); + // 获取所有partnumber列表 + List partnumbers = materials + .Where(it => !string.IsNullOrEmpty(it.Partnumber)) + .Select(it => it.Partnumber) + .Distinct() + .ToList(); - // 批量获取盘点数和现有库存 - Dictionary stockNumbers = GetBatchOneTimeStockPartNum(partnumbers); - Dictionary realNumbers = GetBatchOneTimeRealPartNum(partnumbers); + // 批量获取盘点数和现有库存 + Dictionary stockNumbers = GetBatchOneTimeStockPartNum(partnumbers); + Dictionary realNumbers = GetBatchOneTimeRealPartNum(partnumbers);*/ // 更新盘点时间 - DateTime dateTime = DateTime.Now.ToLocalTime(); + /*DateTime dateTime = DateTime.Now.ToLocalTime();*/ + + //TODO 20250408 新导出逻辑 // 构建导出数据 - List exportDto = materials + WmOneTimeInventoryQueryDto queryParams = new() + { + PageSize = 10000, + PageNum = 1 + }; + List exportDto = GetListNew(queryParams).Result .Select(it => { - bool found1 = stockNumbers.TryGetValue(it.Partnumber, out object value1); - int stockNumber = found1 && value1 != null ? Convert.ToInt32(value1) : 0; - bool found2 = realNumbers.TryGetValue(it.Partnumber, out int realNumber); - return new WmOneTimeInventoryExportDto { 零件号 = it.Partnumber, 颜色 = it.Color, 规格 = it.Specification, 描述 = it.Description, - 盘点数 = stockNumber, - 现有库存 = found2 ? realNumber : 0, - 盘点时间 = dateTime, + 盘点数 = it.Quantity ?? 0, + 现有库存 = it.RealQuantity, + 盘点时间 = it.CreatedTime, }; }) .ToList(); @@ -929,7 +967,9 @@ namespace ZR.Service.mes.wms //TODO 判断oneTimeRecordList中是否存在oneTimeInventoryList没有的零件号 // 提取 oneTimeInventoryList 中的所有零件号 - HashSet oneTimeInventoryPartnumbers = new HashSet(oneTimeInventoryList.Select(i => i.Partnumber)); + HashSet oneTimeInventoryPartnumbers = new HashSet( + oneTimeInventoryList.Select(i => i.Partnumber) + ); foreach (var recordItem in oneTimeRecordList) { if (!oneTimeInventoryPartnumbers.Contains(recordItem.Partnumber)) @@ -940,14 +980,17 @@ namespace ZR.Service.mes.wms Name = "该零件号记录丢失", Partnumber = recordItem.Partnumber, Description = "该零件号与盘点数据不匹配。请确认情况,是否未盘点到!", - ErrorMessage = $"检测到【一次合格品记录】中的零件号在盘点清单中不存在。记录时间: {recordItem.ActionTime}", + ErrorMessage = + $"检测到【一次合格品记录】中的零件号在盘点清单中不存在。记录时间: {recordItem.ActionTime}", CheckTime = DateTime.Now } ); } } //TODO 判断polishRecordList中是否存在polishInventoryList没有的零件号 - HashSet polishInventoryPartnumbers = new HashSet(polishInventoryList.Select(i => i.Partnumber)); + HashSet polishInventoryPartnumbers = new HashSet( + polishInventoryList.Select(i => i.Partnumber) + ); foreach (var recordItem in polishRecordList) { if (!polishInventoryPartnumbers.Contains(recordItem.Partnumber)) @@ -958,7 +1001,8 @@ namespace ZR.Service.mes.wms Name = "该零件号记录丢失", Partnumber = recordItem.Partnumber, Description = "该零件号与盘点数据不匹配。请确认情况,是否未盘点到!", - ErrorMessage = $"检测到【抛光品记录】中的零件号在盘点清单中不存在。记录时间: {recordItem.ActionTime}", + ErrorMessage = + $"检测到【抛光品记录】中的零件号在盘点清单中不存在。记录时间: {recordItem.ActionTime}", CheckTime = DateTime.Now } ); diff --git a/ZR.Service/mes/wms/WmOneTimeRecordService.cs b/ZR.Service/mes/wms/WmOneTimeRecordService.cs index faa082f5..e1ffbd98 100644 --- a/ZR.Service/mes/wms/WmOneTimeRecordService.cs +++ b/ZR.Service/mes/wms/WmOneTimeRecordService.cs @@ -135,7 +135,7 @@ namespace ZR.Service.mes.wms it => it.FinishedPartNumber == parm.Partnumber ) .Where(it => !it.ProductDescription.Contains("倒车雷达")) - .Where(it => it.StartTime >= parm.StartTime) + .Where(it => it.StartTime >= parm.StartTime) .Where(it => it.QualifiedNumber > 0) .Where(it => it.Remark == "抛光") .ToList(); diff --git a/ZR.Service/mes/wms/WmPolishInventoryService.cs b/ZR.Service/mes/wms/WmPolishInventoryService.cs index 40c98149..c7c063eb 100644 --- a/ZR.Service/mes/wms/WmPolishInventoryService.cs +++ b/ZR.Service/mes/wms/WmPolishInventoryService.cs @@ -313,7 +313,34 @@ namespace ZR.Service.mes.wms // TODO 匹配记录(partnumber零件号,时间范围) foreach (WmPolishInventoryDto item in list) { - // TODO 获取实际库存 item.quantity(盘点开始数量) + recourd 记录的入库数量 - 出库数量(筛选条件是 时间区间【item.CreatedTime】 + partnumber[item.partnumber]) + //TODO 20250408 盘点时间修正(三个时间比对) + WmPolishRecord minCheckRecord = + wmPolishRecords + .Where(o => o.Partnumber == item.Partnumber && o.ChangeType == 3) + .OrderByDescending(o => o.ActionTime) + .FirstOrDefault(); + DateTime minCheckRecordTime = DateTime.MinValue; + int minCheckRecordQuantity = 0; + if (minCheckRecord != null) + { + minCheckRecordTime = minCheckRecord.ActionTime ?? DateTime.MinValue; + } + + DateTime minCheckInventoryTime = item.CreatedTime ?? minDateTime; + //TODO 20250408修改 最小盘点时间判断/如有盘点记录,则优先取盘点记录数据 + DateTime checkTime = + minCheckRecordTime > minCheckInventoryTime + ? minCheckRecordTime + : minCheckInventoryTime; + if (checkTime == minCheckRecordTime) + { + // TODO 20250408 如果最早记录是盘点记录,则取盘点变动数量 + minCheckRecordQuantity = minCheckRecord.ChangeQuantity ?? 0; + } + else + { + minCheckRecordQuantity = item.Quantity.Value; + } int? runum = wmPolishRecords .Where(o => o.ActionTime >= item.CreatedTime @@ -330,7 +357,8 @@ namespace ZR.Service.mes.wms ) .Select(o => o.ChangeQuantity) .Sum(); - item.RealQuantity = item.Quantity.Value + (runum.Value - chunum.Value); + item.RealQuantity = minCheckRecordQuantity + (runum.Value - chunum.Value); + item.CreatedTime = checkTime; } list = list.Where(it => it.RealQuantity != 0 || it.Quantity != 0) @@ -696,7 +724,7 @@ namespace ZR.Service.mes.wms throw new Exception(e.Message); } } - + // 盘点 public int DoWmPolishStocktaking(WmPolishInventory parm) { if (parm.Quantity < 0) @@ -707,7 +735,7 @@ namespace ZR.Service.mes.wms { Context.Ado.BeginTran(); // 检查是否存在库中 - WmPolishInventory polishInventory = Context + /* WmPolishInventory polishInventory = Context .Queryable() .Where(it => it.Id == parm.Id) .Where(it => it.Status == 1) @@ -717,7 +745,7 @@ namespace ZR.Service.mes.wms Context.Ado.RollbackTran(); throw new Exception("盘点记录不存在" + parm.Id); } - Context.Updateable(parm).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommand(); + Context.Updateable(parm).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommand();*/ // 已有则新增记录 string code = !string.IsNullOrEmpty(parm.WorkOrder) ? parm.WorkOrder @@ -728,7 +756,7 @@ namespace ZR.Service.mes.wms parm.Partnumber, 3, parm.Quantity, - parm.ActionTime, + parm.ActionTime ?? DateTime.Now, parm.Remark, parm.CreatedBy ); @@ -779,39 +807,43 @@ namespace ZR.Service.mes.wms { try { - List materials = GetWmMaterialList(parm.Partnumber); + /* List materials = GetWmMaterialList(parm.Partnumber); - // 获取所有partnumber列表 - List partnumbers = materials - .Where(it => !string.IsNullOrEmpty(it.Partnumber)) - .Select(it => it.Partnumber) - .Distinct() - .ToList(); + // 获取所有partnumber列表 + List partnumbers = materials + .Where(it => !string.IsNullOrEmpty(it.Partnumber)) + .Select(it => it.Partnumber) + .Distinct() + .ToList(); - // 批量获取盘点数和现有库存 - Dictionary stockNumbers = GetBatchPolishStockPartNum(partnumbers); - Dictionary realNumbers = GetBatchPolishRealPartNum(partnumbers); + // 批量获取盘点数和现有库存 + Dictionary stockNumbers = GetBatchPolishStockPartNum(partnumbers); + Dictionary realNumbers = GetBatchPolishRealPartNum(partnumbers); - // 更新盘点时间 - DateTime dateTime = DateTime.Now.ToLocalTime(); + // 更新盘点时间 + DateTime dateTime = DateTime.Now.ToLocalTime();*/ + + //TODO 20250408 新导出逻辑 // 构建导出数据 - List exportDto = materials + WmPolishInventoryQueryDto queryParams = new() + { + PageSize = 10000, + PageNum = 1 + }; + // 构建导出数据 + List exportDto = GetListNew(queryParams).Result .Select(it => { - bool found1 = stockNumbers.TryGetValue(it.Partnumber, out object value1); - int stockNumber = found1 && value1 != null ? Convert.ToInt32(value1) : 0; - bool found2 = realNumbers.TryGetValue(it.Partnumber, out int realNumber); - return new WmPolishInventoryExportDto { 零件号 = it.Partnumber, 颜色 = it.Color, 规格 = it.Specification, 描述 = it.Description, - 盘点时间 = dateTime, - 盘点数 = stockNumber, - 现有库存 = found2 ? realNumber : 0, + 盘点数 = it.Quantity ?? 0, + 现有库存 = it.RealQuantity, + 盘点时间 = it.CreatedTime, }; }) .ToList(); @@ -867,6 +899,7 @@ namespace ZR.Service.mes.wms /// public (string, object, object) ImportExcel(List importList) { + List wmPolishInventorylist = importList .Select(it => new WmPolishInventory {