| | |
| | | /// <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) |
| | | { |
| | | //优先先进先出(快过期的先出) |
| | | //优先零箱、零托(出完零箱出整箱) |
| | |
| | | { |
| | | var ztNum = needQty / fullPalletQty;//需要整托数 |
| | | |
| | | |
| | | |
| | | var zps = list.Where(s => s.Qty >= fullPalletQty).ToList();//整托 |
| | | var sps = list.Where(s => s.Qty < fullPalletQty).ToList();//散托(有可能是被锁定了数量的) |
| | | |
| | |
| | | //散托 |
| | | 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; |
| | |
| | | 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; |
| | |
| | | break; |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | } |
| | | else if (allotSet == 1)//优先整托(分配合适的整托数量) |
| | | { |
| | |
| | | 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; |
| | |
| | | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | |
| | | 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> |
| | |
| | | //立库内托盘 |
| | | 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); |
| | |
| | | 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(); |
| | |
| | | } |
| | | |
| | | |
| | | data.AddRange(detail1); |
| | | data.AddRange(data2); |
| | | data.AddRange(data3); |
| | | data.AddRange(detail1); // 库外 |
| | | data.AddRange(detail2); // 平库 |
| | | data.AddRange(data3); // 立库 |
| | | |
| | | return data; |
| | | } |