From 2be1922b035c182c3c516427aa68be54badd6938 Mon Sep 17 00:00:00 2001
From: IPC-610 <IPC-610@DESKTOP-6LEOOS3>
Date: 星期四, 26 九月 2024 15:15:52 +0800
Subject: [PATCH] 登录页修改

---
 Wms/WMS.BLL/Logic/AllotSku.cs |  670 +++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 569 insertions(+), 101 deletions(-)

diff --git a/Wms/WMS.BLL/Logic/AllotSku.cs b/Wms/WMS.BLL/Logic/AllotSku.cs
index e54bfcb..da7ef8b 100644
--- a/Wms/WMS.BLL/Logic/AllotSku.cs
+++ b/Wms/WMS.BLL/Logic/AllotSku.cs
@@ -54,18 +54,13 @@
                 }
                 #endregion
                 decimal qty = 0; //鍒嗛厤鐨勬�绘暟閲�
-                var ztNum = needQty / fullPalletQty;//闇�瑕佹暣鎵樻暟
-
                 var list = GetDataListOrderByDept(palletList);
 
-                var zps = list.Where(s => s.Qty >= fullPalletQty).ToList();//鏁存墭
-                var sps = list.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 = decimal.Parse((s.Qty - s.LockQty - s.FrozenQty).ToString());
@@ -84,109 +79,144 @@
                             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)//浼樺厛鏁存墭锛堝垎閰嶅悎閫傜殑鏁存墭鏁伴噺锛�
+                else
                 {
-                    //鍏堝垽鏂渶瑕佺殑鏁伴噺
-                    //鍒ゆ柇闇�瑕佹暣鎵樼殑鏁伴噺鏄惁澶т簬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();//鎵�鏈夋湭浣跨敤锛堟湭琚垎閰嶇殑锛�
+                    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 = decimal.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 = 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;
-                            }
-                        }
-                    }
 
+                            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("搴撳瓨鏁伴噺涓嶈冻");
@@ -203,12 +233,404 @@
 
 
         /// <summary>
+        /// 鍘熻緟鏂欏彇鏍峰嚭搴撳垎閰嶅簱瀛�
+        /// </summary>
+        /// <param name="palletList">鎵樼洏鏄庣粏</param> 
+        /// <param name="boxInfoList">绠辩爜鏄庣粏</param> 
+        /// <param name="needQty">闇�姹傛暟</param>
+        /// <param name="stockQtyDic">鎵樺嚭搴撶墿鍝佹暟</param>
+        /// <param name="useBoxQtyDic">鎵樺嚭搴撶墿鍝佹暟</param>
+        /// <param name="type">鍙栨牱绫诲瀷1锛氳鍒欏彇鏍� 2锛氶殢鏈哄彇鏍�</param>
+        /// <param name="boxNum">闇�鍒嗛厤鐨勭鏁伴噺  闅忔満鍙栨牱鐢�</param>
+        /// <param name="pickNum"></param>
+        /// <returns></returns>
+        public decimal AllotPalletsQuYang(List<DataStockDetail> palletList, List<DataBoxInfo> boxInfoList, decimal needQty, Dictionary<int, decimal> stockQtyDic, Dictionary<int, decimal> useBoxQtyDic, string type, int boxNum, decimal pickNum)
+        {
+            try
+            {
+                decimal? qty = 0;
+                var listOrder = boxInfoList.Where(m => m.IsDel == "0").OrderBy(m => m.BoxNo).ThenBy(m => m.Qty).ToList();//鏍规嵁绠辩爜銆佹暟閲忔帓搴� 鏁寸鐨� 
+                var boxList = listOrder.GroupBy(m => m.BoxNo).Select(m => m.Key).ToList();//鍒嗙粍鍚庣殑绠辩爜闆嗗悎
+                var boxCount = boxList.Count();//绠辨暟閲� 
+                #region 鏃у垎閰嶅師鍒�
+
+                //var outInfoCount = 0;
+                //var boxStrList = new List<string>();//闅忔満浣跨敤绠�
+                //Dictionary<string, decimal> useInfoQtyDic = new Dictionary<string, decimal>();//浣跨敤绠� 
+
+                //if (type == "1")//瑙勫垯鍙栨牱锛圢<3;3<N<300;300<N锛�
+                //{
+                //    if (boxCount<=3)//绠卞瓙灏忎簬3
+                //    {
+                //        foreach (var item in boxList)//寰幆绠卞瓙
+                //        {
+                //            boxStrList.Add(item);
+                //        }
+                //    }
+                //    else if (boxCount > 3)//绠卞瓙灏忎簬3
+                //    {
+                //        var a = Math.Sqrt(boxCount)+1;//寮�骞虫柟 //瑙勫垯 绠辨暟 鈭歂+1
+                //        if (boxCount > 300)
+                //        {
+                //            a = Math.Sqrt(boxCount) / 2 + 1;//瑙勫垯 绠辨暟 鈭歂/2+1
+                //        }
+                //        var b = Math.Floor(a); //鍙栨牱鐨勭鏁�
+
+                //        var lit = new List<int>(); 
+                //        do
+                //        {
+                //            byte[] buffer = Guid.NewGuid().ToByteArray();
+                //            int iSeed = BitConverter.ToInt32(buffer, 0);
+                //            Random random = new Random(iSeed);
+                //            var j = random.Next(0, boxCount);
+                //            if (lit.Contains(j))
+                //            {
+                //                continue;
+                //            }
+
+                //            var boxCode = boxList[j];//绠辩爜
+                //            boxStrList.Add(boxCode);
+                //            lit.Add(j);
+
+                //        } while (lit.Count < b);
+
+                //    }
+                //}
+                //else if(type == "2") //闅忔満鍙栨牱(涓�鎵规鍑轰竴绠�)
+                //{
+                //    if (boxCount < boxNum)
+                //    {
+                //        throw new Exception("褰撳墠搴撳瓨鏁寸鏁板皯浜庤緭鍏ョ殑鍙栨牱鏁�");
+                //    }
+                //    var lit = new List<int>();
+                //    do
+                //    {
+                //        byte[] buffer = Guid.NewGuid().ToByteArray();
+                //        int iSeed = BitConverter.ToInt32(buffer, 0);
+                //        Random random = new Random(iSeed);
+                //        var j = random.Next(0, boxCount);
+                //        if (lit.Contains(j))
+                //        {
+                //            continue;
+                //        }
+
+                //        var boxCode = boxList[j];//绠辩爜
+                //        boxStrList.Add(boxCode);
+                //        lit.Add(j);
+
+                //    } while (lit.Count < boxNum); 
+                //}
+                //else
+                //{
+                //    throw new Exception("璇烽�夋嫨鍙栨牱瑙勫垯");
+                //}
+                //foreach (var item in boxStrList)//寰幆绠卞瓙
+                //{
+                //    var box = listOrder.Where(m => m.BoxCode == item).ToList();
+                //    var infoCount = box.Count;//绠卞唴鏀暟閲�
+                //    if (infoCount <= 3) //鏀暟閲�<=3
+                //    {
+                //        outInfoCount += infoCount;
+                //        SaveDic(useInfoQtyDic, item, infoCount);
+                //    }
+                //    else if (infoCount > 3)//绠卞唴鏁伴噺 > 3 涓� <=300
+                //    {
+                //        //瑙勫垯 鍙栨牱鏀暟 鈭歂+1
+                //        var c = Math.Sqrt(infoCount) + 1;//寮�骞虫柟
+
+                //        if (infoCount > 300) //绠卞唴鏁伴噺 > 300
+                //        {
+                //            //瑙勫垯 绠辨暟 鈭歂/2+1
+                //            c = Math.Sqrt(infoCount) / 2 + 1;
+                //        }
+                //        var d = Math.Floor(c);  //鍙栨牱鐨勬敮鏁伴噺
+
+                //        outInfoCount += (int)d;
+                //        SaveDic(useInfoQtyDic, item, (decimal)d);
+                //    }
+                //}
+
+                //var pingJunNum = needQty / outInfoCount;//骞冲潎姣忔敮鍙栫殑鏁伴噺
+                //foreach (var item in useInfoQtyDic)
+                //{
+                //    var box = listOrder.Where(m => m.BoxCode == item.Key).ToList();
+                //    var infoCount = box.Count;//绠卞唴鏀暟閲�
+                //    if (infoCount <= 3) //鏀暟閲�<=3
+                //    {
+                //        foreach (var item2 in box)
+                //        {
+                //            if (pingJunNum >= item2.Qty)
+                //            {
+                //                throw new Exception("骞冲潎闇�鍙栨牱鏁伴噺澶т簬绛変簬绠辨敮鍐呮暟閲�");
+                //            }
+                //            qty += pingJunNum;
+                //            var tray = palletList.First(m => m.Id == item2.TrayId);
+
+                //            SaveDic(stockQtyDic, tray.Id, pingJunNum);
+
+                //            SaveDic(useBoxQtyDic, item2.Id, pingJunNum);
+                //        }
+                //    }
+                //    else if (infoCount > 3)//绠卞唴鏁伴噺 > 3 涓� <=300
+                //    {
+                //        var e = item.Value; //鍙栨牱鐨勬敮鏁伴噺
+
+                //        var lit2 = new List<int>();
+
+                //        do
+                //        {
+                //            byte[] buffer = Guid.NewGuid().ToByteArray();
+                //            int iSeed = BitConverter.ToInt32(buffer, 0);
+                //            Random random = new Random(iSeed);
+                //            var j = random.Next(0, infoCount);//闅忔満绠卞唴鏀爜
+
+                //            if (lit2.Contains(j))
+                //            {
+                //                continue;
+                //            }
+
+                //            var info = box[j];
+                //            if (pingJunNum >= info.Qty)
+                //            {
+                //                throw new Exception("骞冲潎闇�鍙栨牱鏁伴噺澶т簬绛変簬绠辨敮鍐呮暟閲�");
+                //            }
+
+                //            qty += pingJunNum;
+                //            var tray = palletList.First(m => m.Id == info.TrayId);
+
+                //            SaveDic(stockQtyDic, tray.Id, pingJunNum);
+                //            SaveDic(useBoxQtyDic, info.Id, pingJunNum);
+                //            lit2.Add(j);
+
+
+                //        } while (lit2.Count < e);
+                //    }
+                //}
+
+                #endregion
+
+                var outInfoCount = 0;
+                var boxStrList = new List<string>();//闅忔満浣跨敤绠�
+                Dictionary<string, int> useInfoQtyDic = new Dictionary<string, int>();//浣跨敤绠� 鍙婃瘡绠卞嚭澶氬皯鏀�
+
+
+                if (type == "1")//瑙勫垯鍙栨牱锛圢<3;3<N<300;300<N锛�
+                {
+                    if (boxCount <= 3)//绠卞瓙灏忎簬3
+                    {
+                        foreach (var item in boxList)//寰幆绠卞瓙
+                        {
+                            boxStrList.Add(item);
+                        }
+                    }
+                    else if (boxCount > 3)//绠卞瓙灏忎簬3
+                    {
+                        var a = Math.Sqrt(boxCount) + 1;//寮�骞虫柟 //瑙勫垯 绠辨暟 鈭歂+1
+                        if (boxCount > 300)
+                        {
+                            a = Math.Sqrt(boxCount) / 2 + 1;//瑙勫垯 绠辨暟 鈭歂/2+1
+                        }
+                        var b = Math.Floor(a); //鍙栨牱鐨勭鏁�
+
+                        var lit = new List<int>();
+                        do
+                        {
+                            byte[] buffer = Guid.NewGuid().ToByteArray();
+                            int iSeed = BitConverter.ToInt32(buffer, 0);
+                            Random random = new Random(iSeed);
+                            var j = random.Next(0, boxCount);
+                            if (lit.Contains(j))
+                            {
+                                continue;
+                            }
+
+                            var boxCode = boxList[j];//绠辩爜
+                            boxStrList.Add(boxCode);
+                            lit.Add(j);
+
+                        } while (lit.Count < b);
+
+                    }
+                    var zhi = listOrder.Count();
+                    if (zhi <= 3) //鏀暟閲�<=3
+                    {
+                        outInfoCount += zhi;
+                    }
+                    else if (zhi > 3)//绠卞唴鏁伴噺 > 3 涓� <=300
+                    {
+                        //瑙勫垯 鍙栨牱鏀暟 鈭歂+1
+                        var c = Math.Sqrt(zhi) + 1;//寮�骞虫柟
+
+                        if (zhi > 300) //绠卞唴鏁伴噺 > 300
+                        {
+                            //瑙勫垯 绠辨暟 鈭歂/2+1
+                            c = Math.Sqrt(zhi) / 2 + 1;
+                        }
+                        var d = Math.Floor(c);  //鍙栨牱鐨勬敮鏁伴噺
+
+                        outInfoCount += (int)d;
+                    }
+                }
+                else if (type == "2") //闅忔満鍙栨牱(涓�鎵规鍑轰竴绠�)
+                {
+                    if (boxCount < boxNum)
+                    {
+                        throw new Exception("褰撳墠搴撳瓨鏁寸鏁板皯浜庤緭鍏ョ殑鍙栨牱鏁�");
+                    }
+                    var lit = new List<int>();
+                    do
+                    {
+                        byte[] buffer = Guid.NewGuid().ToByteArray();
+                        int iSeed = BitConverter.ToInt32(buffer, 0);
+                        Random random = new Random(iSeed);
+                        var j = random.Next(0, boxCount);
+                        if (lit.Contains(j))
+                        {
+                            continue;
+                        }
+
+                        var boxCode = boxList[j];//绠辩爜
+                        boxStrList.Add(boxCode);
+                        lit.Add(j);
+
+                    } while (lit.Count < boxNum);
+
+                    var zhi = listOrder.Count(m => boxStrList.Contains(m.BoxNo));
+                    if (zhi <= 3) //鏀暟閲�<=3
+                    {
+                        outInfoCount += zhi;
+                    }
+                    else if (zhi > 3)//绠卞唴鏁伴噺 > 3 涓� <=300
+                    {
+                        //瑙勫垯 鍙栨牱鏀暟 鈭歂+1
+                        var c = Math.Sqrt(zhi) + 1;//寮�骞虫柟
+
+                        if (zhi > 300) //绠卞唴鏁伴噺 > 300
+                        {
+                            //瑙勫垯 绠辨暟 鈭歂/2+1
+                            c = Math.Sqrt(zhi) / 2 + 1;
+                        }
+                        var d = Math.Floor(c);  //鍙栨牱鐨勬敮鏁伴噺
+
+                        outInfoCount += (int)d;
+                    }
+                }
+                else
+                {
+                    throw new Exception("璇烽�夋嫨鍙栨牱瑙勫垯");
+                }
+
+                var zhiCount = outInfoCount;
+                var xiangCount = boxStrList.Count; //闅忔満鍑虹殑绠辨暟閲�
+                for (int i = 1; i <= boxStrList.Count; i++)
+                {
+                    decimal t = zhiCount / xiangCount;
+                    var t2 = zhiCount % xiangCount;
+                    var t3 = 5 / 2;
+                    var t4 = 5 % 2;
+                    if (t2 > 0)
+                    {
+                        t += 1;
+                    }
+                    var q = (int)t;//绠卞唴鍑哄灏戞敮
+                    var infoCount = listOrder.Count(m => m.BoxNo == boxStrList[i - 1]);
+                    if (q > infoCount)
+                    {
+                        throw new Exception("绠卞唴鏀暟灏忎簬瑕佸垎閰嶇殑鏀暟");
+                    }
+                    zhiCount -= q;
+                    xiangCount -= 1;
+                    SaveDic2(useInfoQtyDic, boxStrList[i - 1], q);
+                }
+
+
+                var pingJunNum = needQty / outInfoCount;// / pickNum;骞冲潎姣忔敮鍙栫殑鏁伴噺
+
+                foreach (var item in useInfoQtyDic)
+                {
+                    var box = listOrder.Where(m => m.BoxNo == item.Key).ToList();
+                    var infoCount = box.Count;//绠卞唴鏀暟閲�
+                    if (infoCount == item.Value) //鏀暟閲�<=3
+                    {
+                        foreach (var item2 in box)
+                        {
+                            if (pingJunNum > item2.Qty)
+                            {
+                                throw new Exception("骞冲潎闇�鍙栨牱鏁伴噺澶т簬绛変簬绠辨敮鍐呮暟閲�");
+                            }
+                            qty += pingJunNum;
+                            var tray = palletList.First(m => m.Id == item2.Id);
+
+                            SaveDic(stockQtyDic, tray.Id, pingJunNum);
+
+                            SaveDic(useBoxQtyDic, item2.Id, pingJunNum);
+                        }
+                    }
+                    else
+                    {
+                        var e = item.Value; //鍙栨牱鐨勬敮鏁伴噺
+
+                        var lit2 = new List<int>();
+
+                        do
+                        {
+                            byte[] buffer = Guid.NewGuid().ToByteArray();
+                            int iSeed = BitConverter.ToInt32(buffer, 0);
+                            Random random = new Random(iSeed);
+                            var j = random.Next(0, infoCount);//闅忔満绠卞唴鏀爜
+
+                            if (lit2.Contains(j))
+                            {
+                                continue;
+                            }
+
+                            var info = box[j];
+                            if (pingJunNum > info.Qty)
+                            {
+                                throw new Exception("骞冲潎闇�鍙栨牱鏁伴噺澶т簬绛変簬绠辨敮鍐呮暟閲�");
+                            }
+
+                            qty += pingJunNum;
+                            var tray = palletList.First(m => m.Id == info.Id);
+
+                            SaveDic(stockQtyDic, tray.Id, pingJunNum);
+                            SaveDic(useBoxQtyDic, info.Id, pingJunNum);
+                            lit2.Add(j);
+
+
+                        } while (lit2.Count < e);
+                    }
+                }
+
+
+                return (decimal)qty;
+            }
+            catch (Exception e)
+            {
+                throw new Exception(e.Message);
+            }
+        }
+
+
+        /// <summary>
         /// 淇濆瓨瀛楀吀
         /// </summary>
         /// <param name="dic"></param>
         /// <param name="key"></param>
         /// <param name="v"></param>
         private void SaveDic(Dictionary<int, decimal> dic, int key, decimal v)
+        {
+            if (dic.ContainsKey(key))
+            {
+                dic[key] += v;
+            }
+            else
+            {
+                dic.Add(key, v);
+            }
+        }
+
+        private void SaveDic2(Dictionary<string, int> dic, string key, int v)
         {
             if (dic.ContainsKey(key))
             {
@@ -334,9 +756,55 @@
 
                     item.Dept = int.Parse(dept);
                 }
+                //骞冲簱
+                var locate1 = Db.Queryable<SysStorageLocat>().Where(m => m.IsDel == "0" && m.WareHouseNo == "W02").ToList();
+                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").ToList();
+               
+                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(detail2.OrderBy(m => m.Dept).ToList());
-                data.AddRange(detail3.OrderBy(m => m.Dept).ToList());
+                data.AddRange(data2);
+                data.AddRange(data3);
 
                 return data;
             }

--
Gitblit v1.8.0