yyk
2024-08-22 1310b47a24f0cc70f0128c820bd490dca6a1a921
Wms/WMS.BLL/Logic/AllotSku.cs
@@ -20,8 +20,10 @@
        /// <param name="fullPalletQty">满托数量</param>
        /// <param name="fullBoxQty">满箱数量</param>
        /// <param name="stockQtyDic">托出库物品数 key:库存托盘表的ID、val:托盘上的数量</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();//散托(有可能是被锁定了数量的) 
@@ -96,7 +96,14 @@
                                                                                                                          //散托
                        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;
            }