Administrator
2024-03-27 9ebb2b2124c6ea776c61da36c3cc49940895687a
Merge branch 'master' into wxw
2个文件已修改
341 ■■■■■ 已修改文件
Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/Logic/AllotSku.cs 277 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs
@@ -2874,41 +2874,43 @@
                        #region 包装信息
                        var pack = packList.FirstOrDefault(p => p.PackagNo == detail.PackagNo);
                        if (pack == null)
                        {
                            throw new Exception("未查询到物料包装");
                        }
                        var pNum = 0;//托盘物品数量
                        var bNum = 0;//箱物品数量
                        if (pack.L5Num.HasValue)
                        if (pack != null)
                        {
                            pNum = Convert.ToInt32(pack.L5Num);
                            bNum = Convert.ToInt32(pack.L4Num);
                            //throw new Exception("未查询到物料包装");
                            if (pack.L5Num.HasValue)
                            {
                                pNum = Convert.ToInt32(pack.L5Num);
                                bNum = Convert.ToInt32(pack.L4Num);
                            }
                            else if (pack.L4Num.HasValue)
                            {
                                pNum = Convert.ToInt32(pack.L4Num);
                                bNum = Convert.ToInt32(pack.L3Num);
                            }
                            else if (pack.L3Num.HasValue)
                            {
                                pNum = Convert.ToInt32(pack.L3Num);
                                bNum = Convert.ToInt32(pack.L2Num);
                            }
                            else if (pack.L2Num.HasValue)
                            {
                                pNum = Convert.ToInt32(pack.L2Num);
                                bNum = Convert.ToInt32(pack.L1Num);
                            }
                            else if (pack.L1Num.HasValue)
                            {
                                pNum = Convert.ToInt32(pack.L1Num);
                                bNum = Convert.ToInt32(pack.L1Num);
                            }
                        }
                        else if (pack.L4Num.HasValue)
                        {
                            pNum = Convert.ToInt32(pack.L4Num);
                            bNum = Convert.ToInt32(pack.L3Num);
                        }
                        else if (pack.L3Num.HasValue)
                        {
                            pNum = Convert.ToInt32(pack.L3Num);
                            bNum = Convert.ToInt32(pack.L2Num);
                        }
                        else if (pack.L2Num.HasValue)
                        {
                            pNum = Convert.ToInt32(pack.L2Num);
                            bNum = Convert.ToInt32(pack.L1Num);
                        }
                        else if (pack.L1Num.HasValue)
                        {
                            pNum = Convert.ToInt32(pack.L1Num);
                            bNum = Convert.ToInt32(pack.L1Num);
                        }
                        if (pNum == 0)
                        {
                            throw new Exception("未查询到物料包装托箱关系信息");
                        }
                        //if (pNum == 0)
                        //{
                        //    throw new Exception("未查询到物料包装托箱关系信息");
                        //}
                        #endregion
                        //取合适库存商品
                        Dictionary<int, decimal> stockQtyDic = new Dictionary<int, decimal>();//托出库物品数
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("库存数量不足");
@@ -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;
            }