IPC-610
2024-09-26 2be1922b035c182c3c516427aa68be54badd6938
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();//散托(有可能是被锁定了数量的)
                if (allotSet == 0)//优先零箱(出完零箱出整箱)
                if (fullPalletQty == 0)//无包装物料分配
                {
                    //已分配的托盘 key:库存明细ID,value:分配的数量
                    var st = sps.OrderBy(s => s.ExpirationTime).ThenBy(s => s.Qty - s.LockQty - s.FrozenQty).ToList();//所有未使用的托盘(未被分配的)
                    //散托
                    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();//散托(有可能是被锁定了数量的)
                    if (allotSet == 0)//优先零箱(出完零箱出整箱)
                    {
                        //已分配的托盘 key:库存明细ID,value:分配的数量
                        var st = sps.OrderBy(s => s.ExpirationTime).ThenBy(s => s.Qty - s.LockQty - s.FrozenQty).ToList();//所有未使用的托盘(未被分配的)
                                                                                                                          //散托
                        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;
                            }
                        }
                    }
                    //找完散托还不够再找整托
                    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;
                                }
                            }
                        }
                        //找完散托还不够再找整托
                        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")//规则取样(N<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;//开平方 //规则 箱数 √N+1
                //        if (boxCount > 300)
                //        {
                //            a = Math.Sqrt(boxCount) / 2 + 1;//规则 箱数 √N/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
                //    {
                //        //规则 取样支数 √N+1
                //        var c = Math.Sqrt(infoCount) + 1;//开平方
                //        if (infoCount > 300) //箱内数量 > 300
                //        {
                //            //规则 箱数 √N/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")//规则取样(N<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;//开平方 //规则 箱数 √N+1
                        if (boxCount > 300)
                        {
                            a = Math.Sqrt(boxCount) / 2 + 1;//规则 箱数 √N/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
                    {
                        //规则 取样支数 √N+1
                        var c = Math.Sqrt(zhi) + 1;//开平方
                        if (zhi > 300) //箱内数量 > 300
                        {
                            //规则 箱数 √N/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
                    {
                        //规则 取样支数 √N+1
                        var c = Math.Sqrt(zhi) + 1;//开平方
                        if (zhi > 300) //箱内数量 > 300
                        {
                            //规则 箱数 √N/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))
            {
@@ -275,31 +697,114 @@
                var Db = DataContext.Db;
                var data = new List<StockDetailDto>();
                //库外托盘
                var detail1 = palletList.Where(m => string.IsNullOrWhiteSpace(m.LocatNo)).ToList();
                //平库内托盘
                var detail2 = palletList.Where(m => m.WareHouseNo == "W02").ToList();
                //立库内托盘
                var detail3 = palletList.Where(m => m.WareHouseNo == "W01").ToList();
                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,
                var data1 = detail1.Select(m => new StockDetailDto()).ToList();
                var data2 = detail2.Select(m => new StockDetailDto()).ToList();
                var data3 = detail3.Select(m => new StockDetailDto()).ToList();
                foreach (var item in data2)
                }).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 data3)
                foreach (var item in detail3)
                {
                    var dept = item.LocatNo.Substring(6, 2);
                    item.Dept = int.Parse(dept);
                }
                data.AddRange(data1);
                data.AddRange(data2.OrderBy(m => m.Dept).ToList());
                data.AddRange(data3.OrderBy(m => m.Dept).ToList());
                //平库
                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(data2);
                data.AddRange(data3);
                return data;
            }