Demo
2024-03-26 19be6575a27a007b3dba7b0d28ddb769b5a1fed6
Wms/WMS.BLL/Logic/AllotSku.cs
@@ -54,9 +54,37 @@
                }
                #endregion
                decimal qty = 0; //分配的总数量
                var list = GetDataListOrderByDept(palletList);
                if (fullPalletQty == 0)//无包装物料分配
                {
                    //已分配的托盘 key:库存明细ID,value:分配的数量
                    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());
                        if (needQty - qty < detailQty)
                        {
                            var num = needQty - qty;
                            qty += num;
                            SaveDic(stockQtyDic, s.Id, num);
                            break;
                        }
                        qty += detailQty;
                        SaveDic(stockQtyDic, s.Id, detailQty);
                        if (qty >= needQty)
                        {
                            break;
                        }
                    }
                }
                else
                {
                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();//散托(有可能是被锁定了数量的) 
@@ -187,6 +215,8 @@
                    }
                }
                }
                if (qty < needQty)
                {
                    throw new Exception("库存数量不足");
@@ -334,9 +364,54 @@
                    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(detail2.OrderBy(m => m.Dept).ToList());
                data.AddRange(detail3.OrderBy(m => m.Dept).ToList());
                data.AddRange(data2);
                data.AddRange(data3);
                return data;
            }