From 9e579eda4601ed7b492b9d19a24e8146f6ebdf8d Mon Sep 17 00:00:00 2001 From: dengjunjie <dengjunjie@hnkhzn.com> Date: 星期六, 19 四月 2025 19:50:43 +0800 Subject: [PATCH] 优化空托出入库逻辑 --- 项目代码/WMS/WIDESEA_WMSServer/WIDESEA_StockService/Service/StockInfoService.cs | 315 ++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 231 insertions(+), 84 deletions(-) diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_StockService/Service/StockInfoService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_StockService/Service/StockInfoService.cs" index 7372c41..9bc3cd4 100644 --- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_StockService/Service/StockInfoService.cs" +++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_StockService/Service/StockInfoService.cs" @@ -10,7 +10,9 @@ using WIDESEA_Core.BaseServices; using WIDESEA_Core.Enums; using WIDESEA_Core.Helper; +using WIDESEA_DTO.Inbound; using WIDESEA_DTO.Stock; +using WIDESEA_DTO.WCSInfo; using WIDESEA_IBasicRepository; using WIDESEA_IRecordRepository; using WIDESEA_IRecordService; @@ -30,6 +32,98 @@ stockInfo.Details = _stockRepository.StockInfoDetailRepository.QueryData(x => x.StockId == stockInfo.Id); } return stockInfo; + } + /// <summary> + /// 娣诲姞绌烘墭鐩樼粍鐩樹俊鎭� + /// </summary> + /// <returns></returns> + public WebResponseContent AddStockEmpty(string palletCode) + { + try + { + Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == "Empty000"); + if (materielInfo == null) throw new Exception($"鏈壘鍒扮┖鎵樼洏淇℃伅,鐗╂枡缂栧彿銆怑mpty000銆�"); + Dt_StockInfo stockInfo = new Dt_StockInfo() + { + PalletCode = palletCode, + StockStatus = StockStatusEmun.鍏ュ簱纭.ObjToInt(), + Creater = "System", + Details = new List<Dt_StockInfoDetail>() + }; + Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail() + { + Status = StockStatusEmun.鍏ュ簱纭.ObjToInt(), + OrderNo = DateTime.Now.ToString("yyMMdd"), + StockId = stockInfo.Id != 0 ? stockInfo.Id : 0, + MaterielName = materielInfo.MaterielName, + MaterielCode = materielInfo.MaterielCode, + BatchNo = DateTime.Now.ToString("yyMMdd") + "E", + StockQuantity = 1, + SerialNumber = "", + Creater = "System" + }; + stockInfo.Details.Add(stockInfoDetail); + AddMaterielGroup(stockInfo); + return WebResponseContent.Instance.OK(); + } + catch (Exception ex) + { + return WebResponseContent.Instance.Error(ex.Message); + } + } + /// <summary> + /// 娣诲姞缁勭洏/搴撳瓨淇℃伅 + /// </summary> + /// <returns></returns> + public WebResponseContent AddStockInfo(ref Dt_StockInfo stockInfo, ref Dt_InboundOrder inboundOrder, ProductionlineDTO productionlineDTO) + { + WebResponseContent content = new WebResponseContent().OK(); + try + { + var materielCode = productionlineDTO.traytype.ToString(); + var inboundOrderDetail = inboundOrder.Details.FirstOrDefault(x => x.BatchNo == productionlineDTO.batchNo); + materielCode = inboundOrderDetail.MaterielCode; + inboundOrderDetail.ReceiptQuantity++; + inboundOrderDetail.OrderDetailStatus = inboundOrderDetail.OverInQuantity == inboundOrderDetail.OrderQuantity ? OrderDetailStatusEnum.Over.ObjToInt() : OrderDetailStatusEnum.GroupAndInbound.ObjToInt(); + + if (inboundOrder.Details.FirstOrDefault(x => x.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()) == null) + { + inboundOrder.OrderStatus = InboundStatusEnum.鍏ュ簱瀹屾垚.ObjToInt(); + } + else if (inboundOrder.OrderStatus == InboundStatusEnum.鏈紑濮�.ObjToInt()) + { + inboundOrder.OrderStatus = InboundStatusEnum.鍏ュ簱涓�.ObjToInt(); + } + var materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == materielCode); + if (materielInfo == null) throw new Exception($"鏈壘鍒扮墿鏂欎俊鎭�,鐗╂枡缂栫爜銆恵materielCode}銆�"); + Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail() + { + Status = StockStatusEmun.缁勭洏鏆傚瓨.ObjToInt(), + OrderNo = inboundOrder?.OrderNo, + StockId = stockInfo.Id != 0 ? stockInfo.Id : 0, + MaterielName = materielInfo.MaterielName, + MaterielCode = materielInfo.MaterielCode, + BatchNo = inboundOrderDetail.BatchNo, + StockQuantity = 1,// productionlineDTO.QtySum, + SerialNumber = "", + //SerialNumber = $"{inboundOrder.OrderNo} | {materielInfo.MaterielCode} | {pdaMaterielGroupDTO.BatchNo} | {pdaMaterielGroupDTO.ReceiptQuantity}", + Creater = "System" + }; + if (stockInfo.Id == 0) + { + stockInfo.PalletCode = productionlineDTO.Barcode; + stockInfo.StockStatus = StockStatusEmun.缁勭洏鏆傚瓨.ObjToInt(); + stockInfo.Creater = "System"; + stockInfo.Remark = productionlineDTO.productQty; + } + stockInfo.Details.Add(stockInfoDetail); + + } + catch (Exception ex) + { + content.Error(ex.Message); + } + return content; } public void AddMaterielGroup(Dt_StockInfo stockInfo) @@ -75,8 +169,16 @@ //}); } //_stockQuantityChangeRecordRepository.AddData(stockQuantityChangeRecords); - stockInfo.Details = details; - _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfo.Details, beforeQuantity, stockInfo.Details.Sum(x => x.StockQuantity) + beforeQuantity, StockChangeType.MaterielGroup); + if (details.Count > 0) + { + stockInfo.Details = details; + _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfo.Details, beforeQuantity, stockInfo.Details.Sum(x => x.StockQuantity) + beforeQuantity, StockChangeType.MaterielGroup); + } + else + { + details = stockInfo.Details; + _stockRepository.StockInfoDetailRepository.UpdateData(details); + } } public List<Dt_StockInfo> GetUseableStocks(string materielCode) @@ -91,108 +193,153 @@ return BaseDal.GetStockInfos(materielCode, locationCodes); } - + /// <summary> + /// 鑾峰彇鎸囧畾鐗╂枡搴撳瓨淇℃伅 + /// </summary> + /// <param name="materielCode"></param> + /// <returns></returns> public List<StockSelectViewDTO> GetStockSelectViews(string materielCode) { - List<string> roadways = _basicRepository.RoadwayInfoRepository.CanOutRoadwayNos; - - List<int> warehouseIds = _basicRepository.WarehouseRepository.EnableWarehouseIds; - - List<int> areaIds = _basicRepository.AreaInfoRepository.GetEnableAreaIds(warehouseIds); - - List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(roadways, areaIds); - - return BaseDal.QueryTabs<Dt_StockInfo, Dt_StockInfoDetail, StockSelectViewDTO>((a, b) => a.Id == b.StockId, (a, b) => new StockSelectViewDTO + try { - LocationCode = a.LocationCode, - MaterielCode = b.MaterielCode, - MaterielName = b.MaterielName, - PalletCode = a.PalletCode, - UseableQuantity = b.StockQuantity - b.OutboundQuantity - }, a => locationCodes.Contains(a.LocationCode), b => b.StockQuantity > b.OutboundQuantity && b.MaterielCode == materielCode, x => true).GroupBy(x => x.PalletCode).Select(x => new StockSelectViewDTO + //Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == materielCode); + //if (materielInfo == null) throw new Exception($"鏈壘鍒扮墿鏂欎俊鎭�"); + return BaseDal.QueryTabs<Dt_StockInfo, Dt_StockInfoDetail, StockSelectViewDTO>((a, b) => a.Id == b.StockId, (a, b) => new StockSelectViewDTO + { + LocationCode = a.LocationCode, + MaterielCode = b.MaterielCode, + MaterielName = b.MaterielName, + PalletCode = a.PalletCode, + //UseableQuantity = b.StockQuantity - b.OutboundQuantity + UseableQuantity = b.StockQuantity, + BatchNo = b.BatchNo, + }, a => a.StockStatus == StockStatusEmun.宸插叆搴�.ObjToInt(), b => b.Status == StockStatusEmun.宸插叆搴�.ObjToInt() && b.MaterielCode == materielCode, x => true).GroupBy(x => x.LocationCode).Select(x => new StockSelectViewDTO + { + LocationCode = x.FirstOrDefault()?.LocationCode ?? "", + MaterielCode = x.FirstOrDefault()?.MaterielCode ?? "", + MaterielName = x.FirstOrDefault()?.MaterielName ?? "", + PalletCode = string.Join(",", x.Select(x => x.PalletCode).ToList()), + //UseableQuantity = x.Sum(x => x.UseableQuantity) + UseableQuantity = x.Sum(x => x.UseableQuantity), + BatchNo = x.FirstOrDefault()?.BatchNo ?? "" + }).ToList(); + } + catch (Exception ex) { - LocationCode = x.FirstOrDefault()?.LocationCode ?? "", - MaterielCode = x.FirstOrDefault()?.MaterielCode ?? "", - MaterielName = x.FirstOrDefault()?.MaterielName ?? "", - PalletCode = x.Key, - UseableQuantity = x.Sum(x => x.UseableQuantity) - }).ToList(); + return null; + } } - + /// <summary> + /// 璁$畻搴撳瓨 + /// </summary> + /// <param name="stockInfos"></param> + /// <param name="materielCode"></param> + /// <param name="needQuantity"></param> + /// <param name="residueQuantity"></param> + /// <returns></returns> public List<Dt_StockInfo> GetOutboundStocks(List<Dt_StockInfo> stockInfos, string materielCode, decimal needQuantity, out decimal residueQuantity) { List<Dt_StockInfo> outStocks = new List<Dt_StockInfo>(); - decimal stockTotalQuantity = stockInfos.Select(x => x.Details.Sum(v => v.StockQuantity - v.OutboundQuantity)).Sum(x => x); - stockInfos = stockInfos.OrderBy(x => x.Id).ToList(); - if (stockTotalQuantity >= needQuantity)//搴撳瓨澶� + #region + if (stockInfos.Count >= needQuantity)//搴撳瓨澶� { - int index = 0; - while (needQuantity > 0) + foreach (var item in stockInfos.OrderBy(x => x.InDate).ToList().GroupBy(x => x.LocationCode)) { - Dt_StockInfo stockInfo = stockInfos[index]; - decimal useableStockQuantity = stockInfo.Details.Where(x => x.MaterielCode == materielCode).Sum(x => x.StockQuantity - x.OutboundQuantity); - if (useableStockQuantity < needQuantity) + if (item.Count() <= needQuantity && needQuantity > 0) { - stockInfo.Details.ForEach(x => x.OutboundQuantity = x.StockQuantity); - needQuantity -= useableStockQuantity; + outStocks.AddRange(item); + needQuantity -= item.Count(); } - else + else if (needQuantity > 0) { - stockInfo.Details.ForEach(x => - { - if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == materielCode) - { - if (x.StockQuantity - x.OutboundQuantity >= needQuantity) - { - x.OutboundQuantity += needQuantity; - needQuantity = 0; - } - else - { - needQuantity -= (x.StockQuantity - x.OutboundQuantity); - x.OutboundQuantity = x.StockQuantity; - } - } - }); + outStocks.Add(item.OrderByDescending(x => x.InDate).First()); + needQuantity -= 1; } - outStocks.Add(stockInfo); - index++; } + } else { - for (int i = 0; i < stockInfos.Count; i++) - { - Dt_StockInfo stockInfo = stockInfos[i]; - decimal useableStockQuantity = stockInfo.Details.Where(x => x.MaterielCode == materielCode).Sum(x => x.StockQuantity - x.OutboundQuantity); - if (useableStockQuantity < needQuantity) - { - stockInfo.Details.ForEach(x => x.OutboundQuantity = x.StockQuantity); - needQuantity -= useableStockQuantity; - } - else - { - stockInfo.Details.ForEach(x => - { - if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == materielCode) - { - if (x.StockQuantity - x.OutboundQuantity >= needQuantity) - { - x.OutboundQuantity += needQuantity; - needQuantity = 0; - } - else - { - needQuantity -= (x.StockQuantity - x.OutboundQuantity); - x.OutboundQuantity = x.StockQuantity; - } - } - }); - } - outStocks.Add(stockInfo); - } + outStocks = stockInfos; + needQuantity -= stockInfos.Count(); } residueQuantity = needQuantity; + #endregion + + #region 鎸夊簱瀛樹笂鎵樼洏鏁伴噺璁$畻 + //decimal stockTotalQuantity = stockInfos.Select(x => x.Details.Sum(v => v.StockQuantity - v.OutboundQuantity)).Sum(x => x); + //stockInfos = stockInfos.OrderBy(x => x.Id).ToList(); + //if (stockTotalQuantity >= needQuantity)//搴撳瓨澶� + //{ + // int index = 0; + // while (needQuantity > 0) + // { + // Dt_StockInfo stockInfo = stockInfos[index]; + // decimal useableStockQuantity = stockInfo.Details.Where(x => x.MaterielCode == materielCode).Sum(x => x.StockQuantity - x.OutboundQuantity); + // if (useableStockQuantity < needQuantity) + // { + // stockInfo.Details.ForEach(x => x.OutboundQuantity = x.StockQuantity); + // needQuantity -= useableStockQuantity; + // } + // else + // { + // stockInfo.Details.ForEach(x => + // { + // if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == materielCode) + // { + // if (x.StockQuantity - x.OutboundQuantity >= needQuantity) + // { + // x.OutboundQuantity += needQuantity; + // needQuantity = 0; + // } + // else + // { + // needQuantity -= (x.StockQuantity - x.OutboundQuantity); + // x.OutboundQuantity = x.StockQuantity; + // } + // } + // }); + // } + // outStocks.Add(stockInfo); + // index++; + // } + //} + //else + //{ + // for (int i = 0; i < stockInfos.Count; i++) + // { + // Dt_StockInfo stockInfo = stockInfos[i]; + // decimal useableStockQuantity = stockInfo.Details.Where(x => x.MaterielCode == materielCode).Sum(x => x.StockQuantity - x.OutboundQuantity); + // if (useableStockQuantity < needQuantity) + // { + // stockInfo.Details.ForEach(x => x.OutboundQuantity = x.StockQuantity); + // needQuantity -= useableStockQuantity; + // } + // else + // { + // stockInfo.Details.ForEach(x => + // { + // if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == materielCode) + // { + // if (x.StockQuantity - x.OutboundQuantity >= needQuantity) + // { + // x.OutboundQuantity += needQuantity; + // needQuantity = 0; + // } + // else + // { + // needQuantity -= (x.StockQuantity - x.OutboundQuantity); + // x.OutboundQuantity = x.StockQuantity; + // } + // } + // }); + // } + // outStocks.Add(stockInfo); + // } + //} + //residueQuantity = needQuantity; + #endregion + return outStocks; } } -- Gitblit v1.9.3