From c827fe7b0c5b3b444d76ba0d96a2649c764630dd Mon Sep 17 00:00:00 2001 From: dengjunjie <dengjunjie@hnkhzn.com> Date: 星期四, 14 十一月 2024 16:36:08 +0800 Subject: [PATCH] 修改WCS、WMS出入库逻辑 --- 项目代码/WMS/WIDESEA_WMSServer/WIDESEA_StockService/Service/StockInfoService.cs | 211 +++++++++++++++++++++++++++++++++++----------------- 1 files changed, 142 insertions(+), 69 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 3a4315c..6a69746 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" @@ -99,7 +99,6 @@ return BaseDal.GetStockInfos(materielCode, locationCodes); } - /// <summary> /// 鑾峰彇鎸囧畾鐗╂枡搴撳瓨淇℃伅 /// </summary> @@ -115,97 +114,171 @@ 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 + #region 鎸夌墿鏂欐暟閲忔煡璇� + //var StockSelectViewDTOs = 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 + //}, a => locationCodes.Contains(a.LocationCode), b => b.StockQuantity > b.OutboundQuantity && b.Status == StockStatusEmun.宸插叆搴�.ObjToInt() && b.MaterielCode == materielCode, x => true).GroupBy(x => x.PalletCode).Select(x => new StockSelectViewDTO + //{ + // LocationCode = x.FirstOrDefault()?.LocationCode ?? "", + // MaterielCode = x.FirstOrDefault()?.MaterielCode ?? "", + // MaterielName = x.FirstOrDefault()?.MaterielName ?? "", + // PalletCode = x.Key, + // UseableQuantity = x.Sum(x => x.UseableQuantity) + //}).ToList(); + #endregion + + #region 鎸夋壒鍙峰拰鎵樼洏鏁伴噺鏌ヨ + //StockSelectViewDTOs = 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, + // BatchNo = b.BatchNo, + // UseableQuantity = 1 + //}, a => locationCodes.Contains(a.LocationCode), b => b.StockQuantity > b.OutboundQuantity && b.Status == StockStatusEmun.宸插叆搴�.ObjToInt() && b.MaterielCode == materielCode, x => true).GroupBy(x => x.PalletCode).Select(x => new StockSelectViewDTO + //{ + // LocationCode = x.FirstOrDefault()?.LocationCode ?? "", + // MaterielCode = x.FirstOrDefault()?.MaterielCode ?? "", + // MaterielName = x.FirstOrDefault()?.MaterielName ?? "", + // BatchNo = x.FirstOrDefault()?.BatchNo ?? "", + // PalletCode = x.Key, + // UseableQuantity = x.Sum(x => x.UseableQuantity) + //}).ToList(); + #endregion + + #region 鏌ヨ鐗╂枡搴撳瓨鎸夋壒鍙峰垎缁� + var StockSelectViewDTOs = 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 - }, a => locationCodes.Contains(a.LocationCode), b => b.StockQuantity > b.OutboundQuantity && b.MaterielCode == materielCode, x => true).GroupBy(x => x.PalletCode).Select(x => new StockSelectViewDTO + BatchNo = b.BatchNo, + }, a => locationCodes.Contains(a.LocationCode), b => b.StockQuantity > b.OutboundQuantity && b.Status == StockStatusEmun.宸插叆搴�.ObjToInt() && b.MaterielCode == materielCode, x => true).GroupBy(x => x.BatchNo).Select(x => new StockSelectViewDTO { - LocationCode = x.FirstOrDefault()?.LocationCode ?? "", MaterielCode = x.FirstOrDefault()?.MaterielCode ?? "", MaterielName = x.FirstOrDefault()?.MaterielName ?? "", - PalletCode = x.Key, - UseableQuantity = x.Sum(x => x.UseableQuantity) + BatchNo = x.Key, + UseableQuantity = x.Count() }).ToList(); + #endregion + return StockSelectViewDTOs; } - + /// <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