From f147cfa91feec613eb304c78fecafdf43286034a Mon Sep 17 00:00:00 2001 From: Administrator <Administrator@DESKTOP-5BIMHQ3> Date: 星期六, 30 三月 2024 11:12:24 +0800 Subject: [PATCH] Merge branch 'wxw' --- Wms/WMS.BLL/Logic/AllotSku.cs | 368 +++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 264 insertions(+), 104 deletions(-) diff --git a/Wms/WMS.BLL/Logic/AllotSku.cs b/Wms/WMS.BLL/Logic/AllotSku.cs index d0af838..6cfeb23 100644 --- a/Wms/WMS.BLL/Logic/AllotSku.cs +++ b/Wms/WMS.BLL/Logic/AllotSku.cs @@ -2,6 +2,8 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using Model.ModelDto.DataDto; +using SqlSugar; using WMS.Entity.Context; using WMS.Entity.DataEntity; using WMS.Entity.SysEntity; @@ -14,14 +16,12 @@ /// 鍒嗛厤璐х墿 /// </summary> /// <param name="palletList">搴撳瓨鏄庣粏闆嗗悎</param> - /// <param name="goodCode">鐗╂枡缂栫爜</param> - /// <param name="lotNo">鎵规</param> /// <param name="needQty">闇�瑕佸垎閰嶇殑鏁伴噺</param> /// <param name="fullPalletQty">婊℃墭鏁伴噺</param> /// <param name="fullBoxQty">婊$鏁伴噺</param> /// <param name="stockQtyDic">鎵樺嚭搴撶墿鍝佹暟 key:搴撳瓨鎵樼洏琛ㄧ殑ID銆乿al:鎵樼洏涓婄殑鏁伴噺</param> /// <returns></returns> - public int AllotPallets(List<DataStockDetail> palletList, int needQty, int fullPalletQty, int fullBoxQty, Dictionary<int, int> stockQtyDic) + public decimal AllotPallets(List<DataStockDetail> palletList, decimal needQty, int fullPalletQty, int fullBoxQty, Dictionary<int, decimal> stockQtyDic) { //浼樺厛鍏堣繘鍏堝嚭锛堝揩杩囨湡鐨勫厛鍑猴級 //浼樺厛闆剁銆侀浂鎵橈紙鍑哄畬闆剁鍑烘暣绠憋級 @@ -53,20 +53,17 @@ } } #endregion - var qty = 0; //鍒嗛厤鐨勬�绘暟閲� - var ztNum = needQty / fullPalletQty;//闇�瑕佹暣鎵樻暟 + decimal qty = 0; //鍒嗛厤鐨勬�绘暟閲� + var list = GetDataListOrderByDept(palletList); - var zps = palletList.Where(s => s.Qty >= fullPalletQty).ToList();//鏁存墭 - var sps = palletList.Where(s => s.Qty < fullPalletQty).ToList();//鏁f墭(鏈夊彲鑳芥槸琚攣瀹氫簡鏁伴噺鐨�) - - if (allotSet == 0)//浼樺厛闆剁锛堝嚭瀹岄浂绠卞嚭鏁寸锛� + if (fullPalletQty == 0)//鏃犲寘瑁呯墿鏂欏垎閰� { //宸插垎閰嶇殑鎵樼洏 key锛氬簱瀛樻槑缁咺D锛寁alue锛氬垎閰嶇殑鏁伴噺 - var st = sps.OrderBy(s => s.ExpirationTime).ThenBy(s => s.Qty - s.LockQty - s.FrozenQty).ToList();//鎵�鏈夋湭浣跨敤鐨勬墭鐩橈紙鏈鍒嗛厤鐨勶級 - //鏁f墭 + var st = list.OrderBy(s => s.ExpirationTime).ThenBy(s => s.Qty - s.LockQty - s.FrozenQty).ToList();//鎵�鏈夋湭浣跨敤鐨勬墭鐩橈紙鏈鍒嗛厤鐨勶級 + // foreach (var s in st) { - var detailQty = int.Parse((s.Qty - s.LockQty - s.FrozenQty).ToString()); + var detailQty = decimal.Parse((s.Qty - s.LockQty - s.FrozenQty).ToString()); if (needQty - qty < detailQty) { var num = needQty - qty; @@ -82,109 +79,144 @@ break; } } - - //涓嶅//鍙栨暣鎵� - if (qty < needQty) - { - var zt = zps.OrderBy(s => s.ExpirationTime).ToList();//鎵�鏈夋湭浣跨敤鐨勬墭鐩橈紙鏈鍒嗛厤鐨勶級 - foreach (var ss in zt) - { - var detailQty = int.Parse((ss.Qty - ss.LockQty - ss.FrozenQty).ToString()); - if (needQty - qty < detailQty) - { - var num = needQty - qty; - qty += num; - SaveDic(stockQtyDic, ss.Id, num); - break; - } - qty += detailQty; - SaveDic(stockQtyDic, ss.Id, detailQty); - - if (qty >= needQty) - { - break; - } - } - - - } - } - else if (allotSet == 1)//浼樺厛鏁存墭锛堝垎閰嶅悎閫傜殑鏁存墭鏁伴噺锛� + else { - //鍏堝垽鏂渶瑕佺殑鏁伴噺 - //鍒ゆ柇闇�瑕佹暣鎵樼殑鏁伴噺鏄惁澶т簬0 - //鏄細鍏堝嚭鏁存墭锛屽墿浣欑殑鏁伴噺浠庢墭鐩樹笂鏁伴噺鏈�灏戠殑鍑恒�侊紙濡傛灉鎵惧悎閫傜殑鏁伴噺銆佸彲鑳藉皬鏁伴噺寰堝皬姒傜巼浼氳鍒嗛厤鍒般�佹湁鍏堣繘鍏堝嚭鏃ユ湡鍗$潃锛� - //鍚︼細鏁伴噺浠庢墭鐩樹笂鏁伴噺鏈�灏戠殑鍑恒�侊紙濡傛灉鎵惧悎閫傜殑鏁伴噺銆佸彲鑳藉皬鏁伴噺寰堝皬姒傜巼浼氳鍒嗛厤鍒般�佹湁鍏堣繘鍏堝嚭鏃ユ湡鍗$潃锛� - // - //鍙栨暣鎵� - if (ztNum > 0) - { - var zt = zps.OrderBy(s => s.ExpirationTime).ToList();//鎵�鏈夋湭浣跨敤鐨勬墭鐩橈紙鏈鍒嗛厤鐨勶級 - foreach (var ss in zt) - { - var detailQty = int.Parse((ss.Qty - ss.LockQty - ss.FrozenQty).ToString()); - if (needQty - qty < detailQty) - { - break; - } - qty += detailQty; - SaveDic(stockQtyDic, ss.Id, detailQty); - if (qty >= needQty) - { - break; - } - } - } - //浠庢暣鎵樺拰鍜屾暎鎵樹腑鏌ユ壘鍚堥�傜殑(浠庢暟閲忓皯鐨勫厛鍑哄線) - if (qty < needQty) - { - var sIds = stockQtyDic.Select(s => s.Key).ToList(); - var zt = sps.Where(s => !sIds.Contains(s.Id)).OrderBy(s => s.ExpirationTime).ThenBy(m => m.Qty - m.LockQty - m.FrozenQty).ToList();//鎵�鏈夋湭浣跨敤锛堟湭琚垎閰嶇殑锛� + var ztNum = needQty / fullPalletQty;//闇�瑕佹暣鎵樻暟 - foreach (var ss in zt) + + + var zps = list.Where(s => s.Qty >= fullPalletQty).ToList();//鏁存墭 + var sps = list.Where(s => s.Qty < fullPalletQty).ToList();//鏁f墭(鏈夊彲鑳芥槸琚攣瀹氫簡鏁伴噺鐨�) + + if (allotSet == 0)//浼樺厛闆剁锛堝嚭瀹岄浂绠卞嚭鏁寸锛� + { + //宸插垎閰嶇殑鎵樼洏 key锛氬簱瀛樻槑缁咺D锛寁alue锛氬垎閰嶇殑鏁伴噺 + var st = sps.OrderBy(s => s.ExpirationTime).ThenBy(s => s.Qty - s.LockQty - s.FrozenQty).ToList();//鎵�鏈夋湭浣跨敤鐨勬墭鐩橈紙鏈鍒嗛厤鐨勶級 + //鏁f墭 + foreach (var s in st) { - var detailQty = int.Parse((ss.Qty - ss.LockQty - ss.FrozenQty).ToString()); + var detailQty = decimal.Parse((s.Qty - s.LockQty - s.FrozenQty).ToString()); if (needQty - qty < detailQty) { var num = needQty - qty; qty += num; - SaveDic(stockQtyDic, ss.Id, num); + SaveDic(stockQtyDic, s.Id, num); break; } - qty += detailQty; - SaveDic(stockQtyDic, ss.Id, detailQty); - if (qty >= needQty) - { - break; - } - } - } - //鎵惧畬鏁f墭杩樹笉澶熷啀鎵炬暣鎵� - if (qty < needQty) - { - var sIds = stockQtyDic.Select(s => s.Key).ToList(); - var zt = zps.Where(s => !sIds.Contains(s.Id)).OrderBy(s => s.ExpirationTime).ThenBy(m => m.Qty - m.LockQty - m.FrozenQty).ToList();//鎵�鏈夋湭浣跨敤锛堟湭琚垎閰嶇殑锛� - foreach (var ss in zt) - { - var detailQty = int.Parse((ss.Qty - ss.LockQty - ss.FrozenQty).ToString()); - if (needQty - qty < detailQty) - { - var num = needQty - qty; - qty += num; - SaveDic(stockQtyDic, ss.Id, num); - break; - } - qty += detailQty; - SaveDic(stockQtyDic, ss.Id, detailQty); - if (qty >= needQty) - { - break; - } - } - } + qty += detailQty; + SaveDic(stockQtyDic, s.Id, detailQty); + if (qty >= needQty) + { + break; + } + } + + //涓嶅//鍙栨暣鎵� + if (qty < needQty) + { + var zt = zps.OrderBy(s => s.ExpirationTime).ToList();//鎵�鏈夋湭浣跨敤鐨勬墭鐩橈紙鏈鍒嗛厤鐨勶級 + foreach (var ss in zt) + { + var detailQty = decimal.Parse((ss.Qty - ss.LockQty - ss.FrozenQty).ToString()); + if (needQty - qty < detailQty) + { + var num = needQty - qty; + qty += num; + SaveDic(stockQtyDic, ss.Id, num); + break; + } + qty += detailQty; + SaveDic(stockQtyDic, ss.Id, detailQty); + + if (qty >= needQty) + { + break; + } + } + + + } + + } + else if (allotSet == 1)//浼樺厛鏁存墭锛堝垎閰嶅悎閫傜殑鏁存墭鏁伴噺锛� + { + //鍏堝垽鏂渶瑕佺殑鏁伴噺 + //鍒ゆ柇闇�瑕佹暣鎵樼殑鏁伴噺鏄惁澶т簬0 + //鏄細鍏堝嚭鏁存墭锛屽墿浣欑殑鏁伴噺浠庢墭鐩樹笂鏁伴噺鏈�灏戠殑鍑恒�侊紙濡傛灉鎵惧悎閫傜殑鏁伴噺銆佸彲鑳藉皬鏁伴噺寰堝皬姒傜巼浼氳鍒嗛厤鍒般�佹湁鍏堣繘鍏堝嚭鏃ユ湡鍗$潃锛� + //鍚︼細鏁伴噺浠庢墭鐩樹笂鏁伴噺鏈�灏戠殑鍑恒�侊紙濡傛灉鎵惧悎閫傜殑鏁伴噺銆佸彲鑳藉皬鏁伴噺寰堝皬姒傜巼浼氳鍒嗛厤鍒般�佹湁鍏堣繘鍏堝嚭鏃ユ湡鍗$潃锛� + // + //鍙栨暣鎵� + if (ztNum > 0) + { + var zt = zps.OrderBy(s => s.ExpirationTime).ToList();//鎵�鏈夋湭浣跨敤鐨勬墭鐩橈紙鏈鍒嗛厤鐨勶級 + foreach (var ss in zt) + { + var detailQty = decimal.Parse((ss.Qty - ss.LockQty - ss.FrozenQty).ToString()); + if (needQty - qty < detailQty) + { + break; + } + qty += detailQty; + SaveDic(stockQtyDic, ss.Id, detailQty); + if (qty >= needQty) + { + break; + } + } + } + //浠庢暣鎵樺拰鍜屾暎鎵樹腑鏌ユ壘鍚堥�傜殑(浠庢暟閲忓皯鐨勫厛鍑哄線) + if (qty < needQty) + { + var sIds = stockQtyDic.Select(s => s.Key).ToList(); + var zt = sps.Where(s => !sIds.Contains(s.Id)).OrderBy(s => s.ExpirationTime).ThenBy(m => m.Qty - m.LockQty - m.FrozenQty).ToList();//鎵�鏈夋湭浣跨敤锛堟湭琚垎閰嶇殑锛� + + foreach (var ss in zt) + { + var detailQty = decimal.Parse((ss.Qty - ss.LockQty - ss.FrozenQty).ToString()); + if (needQty - qty < detailQty) + { + var num = needQty - qty; + qty += num; + SaveDic(stockQtyDic, ss.Id, num); + break; + } + qty += detailQty; + SaveDic(stockQtyDic, ss.Id, detailQty); + if (qty >= needQty) + { + break; + } + } + } + //鎵惧畬鏁f墭杩樹笉澶熷啀鎵炬暣鎵� + if (qty < needQty) + { + var sIds = stockQtyDic.Select(s => s.Key).ToList(); + var zt = zps.Where(s => !sIds.Contains(s.Id)).OrderBy(s => s.ExpirationTime).ThenBy(m => m.Qty - m.LockQty - m.FrozenQty).ToList();//鎵�鏈夋湭浣跨敤锛堟湭琚垎閰嶇殑锛� + foreach (var ss in zt) + { + var detailQty = decimal.Parse((ss.Qty - ss.LockQty - ss.FrozenQty).ToString()); + if (needQty - qty < detailQty) + { + var num = needQty - qty; + qty += num; + SaveDic(stockQtyDic, ss.Id, num); + break; + } + qty += detailQty; + SaveDic(stockQtyDic, ss.Id, detailQty); + if (qty >= needQty) + { + break; + } + } + } + + } } + if (qty < needQty) { throw new Exception("搴撳瓨鏁伴噺涓嶈冻"); @@ -206,7 +238,7 @@ /// <param name="dic"></param> /// <param name="key"></param> /// <param name="v"></param> - private void SaveDic(Dictionary<int, int> dic, int key, int v) + private void SaveDic(Dictionary<int, decimal> dic, int key, decimal v) { if (dic.ContainsKey(key)) { @@ -220,6 +252,7 @@ //-------------------------------------------------------------------------------------------------------------- + #region MyRegion ///// <summary> ///// 鑾峰緱鑳屽寘鎵块噸w锛岃璐х墿o锛屼粠绗琸浠跺悜鍚庤�冭檻锛屽緱鍒扮殑鏈�澶т环鍊� @@ -262,5 +295,132 @@ // return a > b ? a : b; //} + #endregion + + + private List<StockDetailDto> GetDataListOrderByDept(List<DataStockDetail> palletList) + { + try + { + var Db = DataContext.Db; + var data = new List<StockDetailDto>(); + + var list = palletList.Select(m => new StockDetailDto() + { + Id = m.Id, + LotNo = m.LotNo, + LotText = m.LotText, + SupplierLot = m.SupplierLot, + OwnerNo = m.OwnerNo, + OwnerName = m.OwnerName, + SupplierNo = m.SupplierNo, + SupplierName = m.SupplierName, + SkuNo = m.SkuNo, + SkuName = m.SkuName, + Standard = m.Standard, + Qty = m.Qty, + LockQty = m.LockQty, + FrozenQty = m.FrozenQty, + InspectQty = m.InspectQty, + ASNNo = m.ASNNo, + ASNDetailNo = m.ASNDetailNo, + WareHouseNo = m.WareHouseNo, + RoadwayNo = m.RoadwayNo, + AreaNo = m.AreaNo, + LocatNo = m.LocatNo, + PalletNo = m.PalletNo, + PalletNo2 = m.PalletNo2, + PalletNo3 = m.PalletNo3, + CompleteTime = m.CompleteTime, + ProductionTime = m.ProductionTime, + ExpirationTime = m.ExpirationTime, + Status = m.Status, + InspectMark = m.InspectMark, + BitPalletMark = m.BitPalletMark, + InspectStatus = m.InspectStatus, + InspectTime = m.InspectTime, + PackagNo = m.PackagNo, + IsBale = m.IsBale, + IsBelt = m.IsBelt, + Demo = m.Demo, + + }).ToList(); + //搴撳鎵樼洏 + var detail1 = list.Where(m => string.IsNullOrWhiteSpace(m.LocatNo)).ToList(); + //骞冲簱鍐呮墭鐩� + var detail2 = list.Where(m => m.WareHouseNo == "W02").ToList(); + //绔嬪簱鍐呮墭鐩� + var detail3 = list.Where(m => m.WareHouseNo == "W01").ToList(); + + foreach (var item in detail2) + { + var dept = item.LocatNo.Substring(5,2); + + item.Dept = int.Parse(dept); + } + foreach (var item in detail3) + { + var dept = item.LocatNo.Substring(6, 2); + + item.Dept = int.Parse(dept); + } + //骞冲簱 + var locate1 = Db.Queryable<SysStorageLocat>().Where(m => m.IsDel == "0" && m.WareHouseNo == "W02"); + var data2 = new List<StockDetailDto>(); + foreach (var liku in detail2.OrderBy(m => m.Dept).ToList()) + { + if (data2.Contains(liku)) + { + continue; + } + data2.Add(liku); + var currentLocate = locate1.First(m => m.LocatNo == liku.LocatNo); + var locateAfter = locate1.Where(m => m.AreaNo == currentLocate.AreaNo && m.Layer == currentLocate.Layer && m.Row == currentLocate.Row && int.Parse(m.Depth) < int.Parse(currentLocate.Depth)).OrderBy(m => m.Depth).ToList(); + foreach (var locat in locateAfter) + { + if (detail3.Any(m => m.LocatNo == locat.LocatNo)) + { + data2.Add(detail3.First(m => m.LocatNo == locat.LocatNo)); + } + + } + } + + //绔嬪簱 + var locate2 = Db.Queryable<SysStorageLocat>().Where(m => m.IsDel == "0" && m.WareHouseNo == "W01"); + var data3 = new List<StockDetailDto>(); + foreach (var liku in detail3.OrderBy(m => m.Dept).ToList()) + { + if (data3.Contains(liku)) + { + continue; + } + data3.Add(liku); + var currentLocate = locate2.First(m => m.LocatNo == liku.LocatNo); + var locateAfter = locate2.Where(m => m.Column == currentLocate.Column && m.Layer == currentLocate.Layer && m.Row == currentLocate.Row && int.Parse(m.Depth) < int.Parse(currentLocate.Depth)).OrderBy(m => m.Depth).ToList(); + foreach (var locat in locateAfter) + { + if (detail3.Any(m=>m.LocatNo == locat.LocatNo)) + { + data3.Add(detail3.First(m=>m.LocatNo == locat.LocatNo)); + } + + } + } + + + data.AddRange(detail1); + data.AddRange(data2); + data.AddRange(data3); + + return data; + } + catch (Exception e) + { + throw new Exception(e.Message); + } + } + + } } -- Gitblit v1.8.0