From 1310b47a24f0cc70f0128c820bd490dca6a1a921 Mon Sep 17 00:00:00 2001
From: yyk <2336760928@qq.com>
Date: 星期四, 22 八月 2024 14:08:03 +0800
Subject: [PATCH] Merge branch 'master' into yyk

---
 Wms/WMS.BLL/Logic/AllotSku.cs |  132 +++++++++++++++++++++++++++++++-------------
 1 files changed, 93 insertions(+), 39 deletions(-)

diff --git a/Wms/WMS.BLL/Logic/AllotSku.cs b/Wms/WMS.BLL/Logic/AllotSku.cs
index a995732..03ae06d 100644
--- a/Wms/WMS.BLL/Logic/AllotSku.cs
+++ b/Wms/WMS.BLL/Logic/AllotSku.cs
@@ -20,8 +20,10 @@
         /// <param name="fullPalletQty">婊℃墭鏁伴噺</param>
         /// <param name="fullBoxQty">婊$鏁伴噺</param>
         /// <param name="stockQtyDic">鎵樺嚭搴撶墿鍝佹暟 key:搴撳瓨鎵樼洏琛ㄧ殑ID銆乿al:鎵樼洏涓婄殑鏁伴噺</param>
+        /// <param name="lotNo">鎵规</param>
+        /// <param name="isMixBox">鏄惁鎺ュ彈鎷肩 0锛氬惁  1锛氭槸</param>
         /// <returns></returns>
-        public decimal AllotPallets(List<DataStockDetail> palletList, decimal needQty, int fullPalletQty, int fullBoxQty, Dictionary<int, decimal> stockQtyDic)
+        public decimal AllotPallets(List<DataStockDetail> palletList, decimal needQty, int fullPalletQty, int fullBoxQty, Dictionary<int, decimal> stockQtyDic,string lotNo,string isMixBox)
         {
             //浼樺厛鍏堣繘鍏堝嚭锛堝揩杩囨湡鐨勫厛鍑猴級
             //浼樺厛闆剁銆侀浂鎵橈紙鍑哄畬闆剁鍑烘暣绠憋級
@@ -84,8 +86,6 @@
                 {
                     var ztNum = needQty / fullPalletQty;//闇�瑕佹暣鎵樻暟
 
-                   
-
                     var zps = list.Where(s => s.Qty >= fullPalletQty).ToList();//鏁存墭
                     var sps = list.Where(s => s.Qty < fullPalletQty).ToList();//鏁f墭(鏈夊彲鑳芥槸琚攣瀹氫簡鏁伴噺鐨�) 
 
@@ -96,7 +96,14 @@
                                                                                                                           //鏁f墭
                         foreach (var s in st)
                         {
-                            var detailQty = decimal.Parse((s.Qty - s.LockQty - s.FrozenQty).ToString());
+                            decimal otherLotQty = 0;//娣风涓叾浠栨壒娆℃暟閲�
+                            //涓嶆帴鍙楁嫾绠�
+                            if (isMixBox == "0")
+                            {
+                                //鏌ユ壘鍑烘贩绠遍泦鍚�
+                                otherLotQty = GetMixBoxQty(s.Id, lotNo);
+                            }
+                            var detailQty = decimal.Parse((s.Qty - s.LockQty - s.FrozenQty - otherLotQty).ToString());
                             if (needQty - qty < detailQty)
                             {
                                 var num = needQty - qty;
@@ -119,7 +126,14 @@
                             var zt = zps.OrderBy(s => s.ExpirationTime).ToList();//鎵�鏈夋湭浣跨敤鐨勬墭鐩橈紙鏈鍒嗛厤鐨勶級
                             foreach (var ss in zt)
                             {
-                                var detailQty = decimal.Parse((ss.Qty - ss.LockQty - ss.FrozenQty).ToString());
+                                decimal otherLotQty = 0;//娣风涓叾浠栨壒娆℃暟閲�
+                                //涓嶆帴鍙楁嫾绠�
+                                if (isMixBox == "0")
+                                {
+                                    //鏌ユ壘鍑烘贩绠遍泦鍚�
+                                    otherLotQty = GetMixBoxQty(ss.Id, lotNo);
+                                }
+                                var detailQty = decimal.Parse((ss.Qty - ss.LockQty - ss.FrozenQty - otherLotQty).ToString());
                                 if (needQty - qty < detailQty)
                                 {
                                     var num = needQty - qty;
@@ -135,10 +149,7 @@
                                     break;
                                 }
                             }
-
-
                         }
-
                     }
                     else if (allotSet == 1)//浼樺厛鏁存墭锛堝垎閰嶅悎閫傜殑鏁存墭鏁伴噺锛�
                     {
@@ -153,7 +164,14 @@
                             var zt = zps.OrderBy(s => s.ExpirationTime).ToList();//鎵�鏈夋湭浣跨敤鐨勬墭鐩橈紙鏈鍒嗛厤鐨勶級
                             foreach (var ss in zt)
                             {
-                                var detailQty = decimal.Parse((ss.Qty - ss.LockQty - ss.FrozenQty).ToString());
+                                decimal otherLotQty = 0;//娣风涓叾浠栨壒娆℃暟閲�
+                                //涓嶆帴鍙楁嫾绠�
+                                if (isMixBox == "0")
+                                {
+                                    //鏌ユ壘鍑烘贩绠遍泦鍚�
+                                    otherLotQty = GetMixBoxQty(ss.Id, lotNo);
+                                }
+                                var detailQty = decimal.Parse((ss.Qty - ss.LockQty - ss.FrozenQty - otherLotQty).ToString());
                                 if (needQty - qty < detailQty)
                                 {
                                     break;
@@ -174,7 +192,14 @@
 
                             foreach (var ss in zt)
                             {
-                                var detailQty = decimal.Parse((ss.Qty - ss.LockQty - ss.FrozenQty).ToString());
+                                decimal otherLotQty = 0;//娣风涓叾浠栨壒娆℃暟閲�
+                                //涓嶆帴鍙楁嫾绠�
+                                if (isMixBox == "0")
+                                {
+                                    //鏌ユ壘鍑烘贩绠遍泦鍚�
+                                    otherLotQty = GetMixBoxQty(ss.Id, lotNo);
+                                }
+                                var detailQty = decimal.Parse((ss.Qty - ss.LockQty - ss.FrozenQty - otherLotQty).ToString());
                                 if (needQty - qty < detailQty)
                                 {
                                     var num = needQty - qty;
@@ -197,7 +222,14 @@
                             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());
+                                decimal otherLotQty = 0;//娣风涓叾浠栨壒娆℃暟閲�
+                                //涓嶆帴鍙楁嫾绠�
+                                if (isMixBox == "0")
+                                {
+                                    //鏌ユ壘鍑烘贩绠遍泦鍚�
+                                    otherLotQty = GetMixBoxQty(ss.Id, lotNo);
+                                }
+                                var detailQty = decimal.Parse((ss.Qty - ss.LockQty - ss.FrozenQty - otherLotQty).ToString());
                                 if (needQty - qty < detailQty)
                                 {
                                     var num = needQty - qty;
@@ -213,7 +245,6 @@
                                 }
                             }
                         }
-
                     }
                 }
                 
@@ -229,6 +260,28 @@
                 throw new Exception("鍒嗛厤鍑哄簱鐗╂枡澶辫触锛�" + e.Message);
             }
 
+        }
+        /// <summary>
+        /// 鏌ユ壘鍑烘贩绠变腑鍏朵粬鎵规鎬绘暟閲�
+        /// </summary>
+        /// <param name="stockDetailId"></param>
+        /// <param name="lotNo"></param>
+        /// <returns></returns>
+        private decimal GetMixBoxQty(int stockDetailId,string lotNo)
+        {
+            var contextDb = DataContext.Db;
+            //鏌ユ壘鍑烘贩绠遍泦鍚�
+            List<string> mixBoxList = contextDb.Queryable<DataBoxInfo>()
+                .Where(w => w.IsDel == "0" && w.StockDetailId == stockDetailId)
+                .GroupBy(g => g.LotNo)
+                .Having(h => SqlFunc.AggregateCount(h.LotNo) > 1)
+                .Select(s => s.BoxNo).ToList();
+
+            decimal otherLotQty = contextDb.Queryable<DataBoxInfo>()
+                .Where(w => w.IsDel == "0" && w.StockDetailId == stockDetailId && mixBoxList.Contains(w.BoxNo) && w.LotNo != lotNo)
+                .Sum(s => s.Qty);
+
+            return otherLotQty;
         }
 
         /// <summary>
@@ -869,12 +922,13 @@
                 //绔嬪簱鍐呮墭鐩�
                 var detail3 = list.Where(m => m.WareHouseNo == "W01").ToList();
 
-                foreach (var item in detail2)
-                {
-                    var dept = item.LocatNo.Substring(5,2);
+                // 骞冲簱鍌ㄤ綅缂栫爜瑙勫垯纭鍚庯紝鏍规嵁瀹為檯瑙勫垯鍙栨繁搴�
+                //foreach (var item in detail2)
+                //{
+                //    var dept = item.LocatNo.Substring(5,2);
 
-                    item.Dept = int.Parse(dept);
-                }
+                //    item.Dept = int.Parse(dept);
+                //}
                 foreach (var item in detail3)
                 {
                     var dept = item.LocatNo.Substring(6, 2);
@@ -882,27 +936,27 @@
                     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 pingku in detail2.OrderByDescending(a => a.PalletTags).ThenBy(m => m.Dept).ToList())
-                {
-                    if (data2.Contains(pingku))
-                    {
-                        continue;
-                    }
+                //var locate1 = Db.Queryable<SysStorageLocat>().Where(m => m.IsDel == "0" && m.WareHouseNo == "W02");
+                //var data2 = new List<StockDetailDto>();
+                //foreach (var pingku in detail2.OrderByDescending(a => a.PalletTags).ThenBy(m => m.Dept).ToList())
+                //{
+                //    if (data2.Contains(pingku))
+                //    {
+                //        continue;
+                //    }
                     
-                    var currentLocate = locate1.First(m => m.LocatNo == pingku.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 (detail2.Any(m => m.LocatNo == locat.LocatNo) && !data2.Contains(detail2.First(m => m.LocatNo == locat.LocatNo)))
-                        {
-                            data2.Add(detail2.First(m => m.LocatNo == locat.LocatNo));
-                        }
+                //    var currentLocate = locate1.First(m => m.LocatNo == pingku.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 (detail2.Any(m => m.LocatNo == locat.LocatNo) && !data2.Contains(detail2.First(m => m.LocatNo == locat.LocatNo)))
+                //        {
+                //            data2.Add(detail2.First(m => m.LocatNo == locat.LocatNo));
+                //        }
 
-                    }
-                    data2.Add(pingku);
-                }
+                //    }
+                //    data2.Add(pingku);
+                //}
 
                 //绔嬪簱
                 var locate2 = Db.Queryable<SysStorageLocat>().Where(m => m.IsDel == "0" && m.WareHouseNo == "W01").ToList();
@@ -928,9 +982,9 @@
                 }
 
 
-                data.AddRange(detail1);
-                data.AddRange(data2);
-                data.AddRange(data3);
+                data.AddRange(detail1);             // 搴撳
+                data.AddRange(detail2);             // 骞冲簱
+                data.AddRange(data3);               // 绔嬪簱
 
                 return data;
             }

--
Gitblit v1.8.0