| | |
| | | } |
| | | #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()); |
| | |
| | | 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("库存数量不足"); |
| | |
| | | |
| | | 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; |
| | | } |