using System; using System.Collections.Generic; using System.Linq; using System.Text; using Model.ModelDto.DataDto; using SqlSugar; using WMS.Entity.Context; using WMS.Entity.DataEntity; using WMS.Entity.SysEntity; namespace WMS.BLL.Logic { public class AllotSku { /// /// 分配货物 /// /// 库存明细集合 /// 需要分配的数量 /// 满托数量 /// 满箱数量 /// 托出库物品数 key:库存托盘表的ID、val:托盘上的数量 /// 批次 /// 是否接受拼箱 0:否 1:是 /// public decimal AllotPallets(List palletList, decimal needQty, int fullPalletQty, int fullBoxQty, Dictionary stockQtyDic,string house) { //优先先进先出(快过期的先出) //优先零箱、零托(出完零箱出整箱) //优先匹配数、(分配合适的数量) try { var contextDb = DataContext.Db; #region 分配规则 var funSet = contextDb.Queryable().Where(m => m.IsDel == "0" && m.FunSetName == "分配规则" && m.IsEnable == "NO").ToList().FirstOrDefault(); var allotSet = 1;//分配规则设定 if (funSet != null) { switch (funSet.FunSetNo) { case "Fun001": allotSet = 0;//优先零托(出完零托出整托) break; case "Fun002": allotSet = 1;//优先整托(分配合适的整托数量) break; default: allotSet = 1;// 默认:优先整托、 break; } } #endregion var list = palletList; decimal qty = 0; //分配的总数量 if (house == "W01") //仓库是密集库先进行排序 { list = GetDataListOrder(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 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((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; } } //不够//取整托 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("库存数量不足"); } return qty; } catch (Exception e) { throw new Exception("分配出库物料失败:" + e.Message); } } /// /// 根据储位深度获取分配的优先级别信息(密集库) /// /// /// private List GetDataListOrder(List palletList) { try { var Db = DataContext.Db; var data = new List(); var locateList = Db.Queryable().Where(m => m.IsDel == "0" && m.WareHouseNo == "W01").ToList(); var list = palletList; //库外托盘 var detail1 = list.Where(m => string.IsNullOrWhiteSpace(m.LocatNo)).OrderByDescending(a => a.PalletTags).ToList(); // 库外 data.AddRange(detail1); //密集库内托盘 var detail2 = list.Where(m => m.WareHouseNo == "W01").ToList(); var detail3 = detail2.GroupBy(m=>m.RoadwayNo).OrderBy(m=>m.Key).ToList(); foreach (var item in detail3) { var locates = locateList.Where(m => m.RoadwayNo == item.Key).FirstOrDefault(); if (locates == null) { throw new Exception("未查询到巷道内的储位信息"); } //如果结果为0,则说明两个字符串相等; ABC BCE //如果结果小于0,则说明第一个字符串小于第二个字符串; //如果结果大于0,则说明第一个字符串大于第二个字符串。 var bol = String.CompareOrdinal(locates.LocatNo, locates.AisleOne); //储位小于通道口 倒序 //储位大于通道口 正序 if (bol < 0) { //var s = item.OrderByDescending(m => m.LocatNo).ToList(); data.AddRange(item.OrderByDescending(m => m.LocatNo)); } if (bol > 0) { data.AddRange(item.OrderBy(m => m.LocatNo)); } } return data; } catch (Exception e) { throw new Exception(e.Message); } } /// /// 查找出混箱中其他批次总数量 /// /// /// /// private decimal GetMixBoxQty(int stockDetailId,string lotNo) { var contextDb = DataContext.Db; //查找出混箱集合 List mixBoxList = contextDb.Queryable() .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() .Where(w => w.IsDel == "0" && w.StockDetailId == stockDetailId && mixBoxList.Contains(w.BoxNo) && w.LotNo != lotNo) .Sum(s => s.Qty); return otherLotQty; } /// /// JC23领料出库分配货物(分配托盘上全部物料,防止四楼不同投料口分配同一托盘物料冲突) /// /// 库存明细集合 /// 需要分配的数量 /// 满托数量 /// 满箱数量 /// 托出库物品数 key:库存托盘表的ID、val:托盘上的数量 /// public decimal LingLiaoAllotPallets(List palletList, decimal needQty, int fullPalletQty, int fullBoxQty, Dictionary stockQtyDic) { try { var contextDb = DataContext.Db; #region 分配规则 领料出库不适用分配规则、整个托盘都会被分配 //var funSet = contextDb.Queryable().Where(m => m.IsDel == "0" && m.FunSetName == "分配规则" && m.IsEnable == "NO").ToList().FirstOrDefault(); //var allotSet = 1;//分配规则设定 //if (funSet != null) //{ // switch (funSet.FunSetNo) // { // case "Fun001": // allotSet = 0;//优先零托(出完零托出整托) // break; // case "Fun002": // allotSet = 1;//优先整托(分配合适的整托数量) // break; // default: // allotSet = 1;// 默认:优先整托、 // break; // } //} #endregion //分配:优先库外(正常情况下不存在库外托盘)、平库、立库 2:数量少的先出(零托优先) 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()); qty += detailQty; SaveDic(stockQtyDic, s.Id, detailQty); if (qty >= needQty) { break; } } } else { var ztNum = needQty / fullPalletQty;//需要整托数 var zps = list.Where(s => s.Qty >= fullPalletQty).ToList();//整托 var sps = list.Where(s => s.Qty < fullPalletQty).ToList();//散托(有可能是被锁定了数量的) //已分配的托盘 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((s.Qty - s.LockQty - s.FrozenQty).ToString()); 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()); qty += detailQty; SaveDic(stockQtyDic, ss.Id, detailQty); if (qty >= needQty) { break; } } } } if (qty < needQty) { throw new Exception("库存数量不足"); } return qty; } catch (Exception e) { throw new Exception("分配出库物料失败:" + e.Message); } } /// /// 原辅料取样出库分配库存 /// /// 托盘明细 /// 箱码明细 /// 需求数 /// 托出库物品数 /// 托出库物品数 /// 取样类型1:规则取样 2:随机取样 /// 需分配的箱数量 随机取样用 /// /// public decimal AllotPalletsQuYang(List palletList, List boxInfoList, decimal needQty, Dictionary stockQtyDic, Dictionary useBoxQtyDic, string type, int boxNum, decimal pickNum) { try { decimal? qty = 0; var listOrder = boxInfoList.Where(m => m.IsDel == "0").OrderBy(m => m.BoxNo).ThenBy(m => m.Qty).ToList();//根据箱码、数量排序 整箱的 var boxList = listOrder.GroupBy(m => m.BoxNo).Select(m => m.Key).ToList();//分组后的箱码集合 var boxCount = boxList.Count();//箱数量 #region 旧分配原则 //var outInfoCount = 0; //var boxStrList = new List();//随机使用箱 //Dictionary useInfoQtyDic = new Dictionary();//使用箱 //if (type == "1")//规则取样(N<3;3 3)//箱子小于3 // { // var a = Math.Sqrt(boxCount)+1;//开平方 //规则 箱数 √N+1 // if (boxCount > 300) // { // a = Math.Sqrt(boxCount) / 2 + 1;//规则 箱数 √N/2+1 // } // var b = Math.Floor(a); //取样的箱数 // var lit = new List(); // do // { // byte[] buffer = Guid.NewGuid().ToByteArray(); // int iSeed = BitConverter.ToInt32(buffer, 0); // Random random = new Random(iSeed); // var j = random.Next(0, boxCount); // if (lit.Contains(j)) // { // continue; // } // var boxCode = boxList[j];//箱码 // boxStrList.Add(boxCode); // lit.Add(j); // } while (lit.Count < b); // } //} //else if(type == "2") //随机取样(一批次出一箱) //{ // if (boxCount < boxNum) // { // throw new Exception("当前库存整箱数少于输入的取样数"); // } // var lit = new List(); // do // { // byte[] buffer = Guid.NewGuid().ToByteArray(); // int iSeed = BitConverter.ToInt32(buffer, 0); // Random random = new Random(iSeed); // var j = random.Next(0, boxCount); // if (lit.Contains(j)) // { // continue; // } // var boxCode = boxList[j];//箱码 // boxStrList.Add(boxCode); // lit.Add(j); // } while (lit.Count < boxNum); //} //else //{ // throw new Exception("请选择取样规则"); //} //foreach (var item in boxStrList)//循环箱子 //{ // var box = listOrder.Where(m => m.BoxCode == item).ToList(); // var infoCount = box.Count;//箱内支数量 // if (infoCount <= 3) //支数量<=3 // { // outInfoCount += infoCount; // SaveDic(useInfoQtyDic, item, infoCount); // } // else if (infoCount > 3)//箱内数量 > 3 且 <=300 // { // //规则 取样支数 √N+1 // var c = Math.Sqrt(infoCount) + 1;//开平方 // if (infoCount > 300) //箱内数量 > 300 // { // //规则 箱数 √N/2+1 // c = Math.Sqrt(infoCount) / 2 + 1; // } // var d = Math.Floor(c); //取样的支数量 // outInfoCount += (int)d; // SaveDic(useInfoQtyDic, item, (decimal)d); // } //} //var pingJunNum = needQty / outInfoCount;//平均每支取的数量 //foreach (var item in useInfoQtyDic) //{ // var box = listOrder.Where(m => m.BoxCode == item.Key).ToList(); // var infoCount = box.Count;//箱内支数量 // if (infoCount <= 3) //支数量<=3 // { // foreach (var item2 in box) // { // if (pingJunNum >= item2.Qty) // { // throw new Exception("平均需取样数量大于等于箱支内数量"); // } // qty += pingJunNum; // var tray = palletList.First(m => m.Id == item2.TrayId); // SaveDic(stockQtyDic, tray.Id, pingJunNum); // SaveDic(useBoxQtyDic, item2.Id, pingJunNum); // } // } // else if (infoCount > 3)//箱内数量 > 3 且 <=300 // { // var e = item.Value; //取样的支数量 // var lit2 = new List(); // do // { // byte[] buffer = Guid.NewGuid().ToByteArray(); // int iSeed = BitConverter.ToInt32(buffer, 0); // Random random = new Random(iSeed); // var j = random.Next(0, infoCount);//随机箱内支码 // if (lit2.Contains(j)) // { // continue; // } // var info = box[j]; // if (pingJunNum >= info.Qty) // { // throw new Exception("平均需取样数量大于等于箱支内数量"); // } // qty += pingJunNum; // var tray = palletList.First(m => m.Id == info.TrayId); // SaveDic(stockQtyDic, tray.Id, pingJunNum); // SaveDic(useBoxQtyDic, info.Id, pingJunNum); // lit2.Add(j); // } while (lit2.Count < e); // } //} #endregion var outInfoCount = 0; var boxStrList = new List();//随机使用箱 Dictionary useInfoQtyDic = new Dictionary();//使用箱 及每箱出多少支 if (type == "1")//规则取样(N<3;3 3)//箱子小于3 { var a = Math.Sqrt(boxCount) + 1;//开平方 //规则 箱数 √N+1 if (boxCount > 300) { a = Math.Sqrt(boxCount) / 2 + 1;//规则 箱数 √N/2+1 } var b = Math.Floor(a); //取样的箱数 var lit = new List(); do { byte[] buffer = Guid.NewGuid().ToByteArray(); int iSeed = BitConverter.ToInt32(buffer, 0); Random random = new Random(iSeed); var j = random.Next(0, boxCount); if (lit.Contains(j)) { continue; } var boxCode = boxList[j];//箱码 boxStrList.Add(boxCode); lit.Add(j); } while (lit.Count < b); } var zhi = listOrder.Count(); if (zhi <= 3) //支数量<=3 { outInfoCount += zhi; } else if (zhi > 3)//箱内数量 > 3 且 <=300 { //规则 取样支数 √N+1 var c = Math.Sqrt(zhi) + 1;//开平方 if (zhi > 300) //箱内数量 > 300 { //规则 箱数 √N/2+1 c = Math.Sqrt(zhi) / 2 + 1; } var d = Math.Floor(c); //取样的支数量 outInfoCount += (int)d; } } else if (type == "2") //随机取样(一批次出一箱) { if (boxCount < boxNum) { throw new Exception("当前库存整箱数少于输入的取样数"); } var lit = new List(); do { byte[] buffer = Guid.NewGuid().ToByteArray(); int iSeed = BitConverter.ToInt32(buffer, 0); Random random = new Random(iSeed); var j = random.Next(0, boxCount); if (lit.Contains(j)) { continue; } var boxCode = boxList[j];//箱码 boxStrList.Add(boxCode); lit.Add(j); } while (lit.Count < boxNum); var zhi = listOrder.Count(m => boxStrList.Contains(m.BoxNo)); if (zhi <= 3) //支数量<=3 { outInfoCount += zhi; } else if (zhi > 3)//箱内数量 > 3 且 <=300 { //规则 取样支数 √N+1 var c = Math.Sqrt(zhi) + 1;//开平方 if (zhi > 300) //箱内数量 > 300 { //规则 箱数 √N/2+1 c = Math.Sqrt(zhi) / 2 + 1; } var d = Math.Floor(c); //取样的支数量 outInfoCount += (int)d; } } else { throw new Exception("请选择取样规则"); } var zhiCount = outInfoCount; var xiangCount = boxStrList.Count; //随机出的箱数量 for (int i = 1; i <= boxStrList.Count; i++) { decimal t = zhiCount / xiangCount; var t2 = zhiCount % xiangCount; var t3 = 5 / 2; var t4 = 5 % 2; if (t2 > 0) { t += 1; } var q = (int)t;//箱内出多少支 var infoCount = listOrder.Count(m => m.BoxNo == boxStrList[i - 1]); if (q > infoCount) { throw new Exception("箱内支数小于要分配的支数"); } zhiCount -= q; xiangCount -= 1; SaveDic2(useInfoQtyDic, boxStrList[i - 1], q); } var pingJunNum = needQty / outInfoCount;// / pickNum;平均每支取的数量 foreach (var item in useInfoQtyDic) { var box = listOrder.Where(m => m.BoxNo == item.Key).ToList(); var infoCount = box.Count;//箱内支数量 if (infoCount == item.Value) //支数量<=3 { foreach (var item2 in box) { if (pingJunNum > item2.Qty) { throw new Exception("平均需取样数量大于等于箱支内数量"); } qty += pingJunNum; var tray = palletList.First(m => m.Id == item2.Id); SaveDic(stockQtyDic, tray.Id, pingJunNum); SaveDic(useBoxQtyDic, item2.Id, pingJunNum); } } else { var e = item.Value; //取样的支数量 var lit2 = new List(); do { byte[] buffer = Guid.NewGuid().ToByteArray(); int iSeed = BitConverter.ToInt32(buffer, 0); Random random = new Random(iSeed); var j = random.Next(0, infoCount);//随机箱内支码 if (lit2.Contains(j)) { continue; } var info = box[j]; if (pingJunNum > info.Qty) { throw new Exception("平均需取样数量大于等于箱支内数量"); } qty += pingJunNum; var tray = palletList.First(m => m.Id == info.Id); SaveDic(stockQtyDic, tray.Id, pingJunNum); SaveDic(useBoxQtyDic, info.Id, pingJunNum); lit2.Add(j); } while (lit2.Count < e); } } return (decimal)qty; } catch (Exception e) { throw new Exception(e.Message); } } /// /// 保存字典 /// /// /// /// private void SaveDic(Dictionary dic, int key, decimal v) { if (dic.ContainsKey(key)) { dic[key] += v; } else { dic.Add(key, v); } } private void SaveDic2(Dictionary dic, string key, int v) { if (dic.ContainsKey(key)) { dic[key] += v; } else { dic.Add(key, v); } } //-------------------------------------------------------------------------------------------------------------- #region MyRegion ///// ///// 获得背包承重w,装货物o,从第k件向后考虑,得到的最大价值 ///// ///// 背包承重 ///// 货物o ///// 第几件开始默认索引0 ///// //public static int GetMaxValue(int w, int[,] o, int k) //{ // int v, t1, t2; // //如果是最后一件货物 // if (k == o.GetLength(1) - 1) // { // if (w >= o[0, k]) // { // v = o[1, k]; // } // else // { // v = 0; // } // } // //如果装得下当前货物 // else if (w >= o[0, k]) // { // t1 = GetMaxValue(w - o[0, k], o, k + 1) + o[1, k]; // t2 = GetMaxValue(w, o, k + 1); // v = GetMax(t1, t2); // } // //装不下当前货物的情况 // else // { // v = GetMaxValue(w, o, k + 1); // } // return v; //} //public static int GetMax(int a, int b) //{ // return a > b ? a : b; //} #endregion /// /// 根据储位深度获取分配的优先级别信息 /// /// /// private List GetDataListOrderByDept(List palletList) { try { var Db = DataContext.Db; var data = new List(); var list = palletList.Select(m => new StockDetailDto() { Id = m.Id, LotNo = m.LotNo, LotText = m.LotText, SupplierLot = m.SupplierLot, OwnerNo = m.OwnerNo, OwnerName = m.OwnerName, SupplierNo = m.SupplierNo, SupplierName = m.SupplierName, SkuNo = m.SkuNo, SkuName = m.SkuName, Standard = m.Standard, Qty = m.Qty, LockQty = m.LockQty, FrozenQty = m.FrozenQty, InspectQty = m.InspectQty, ASNNo = m.ASNNo, ASNDetailNo = m.ASNDetailNo, WareHouseNo = m.WareHouseNo, RoadwayNo = m.RoadwayNo, AreaNo = m.AreaNo, LocatNo = m.LocatNo, PalletNo = m.PalletNo, PalletNo2 = m.PalletNo2, PalletNo3 = m.PalletNo3, CompleteTime = m.CompleteTime, ProductionTime = m.ProductionTime, ExpirationTime = m.ExpirationTime, Status = m.Status, InspectMark = m.InspectMark, BitPalletMark = m.BitPalletMark, InspectStatus = m.InspectStatus, InspectTime = m.InspectTime, PackagNo = m.PackagNo, IsBale = m.IsBale, IsBelt = m.IsBelt, Demo = m.Demo, PalletTags = m.PalletTags }).ToList(); //库外托盘 var detail1 = list.Where(m => string.IsNullOrWhiteSpace(m.LocatNo)).OrderByDescending(a => a.PalletTags).ToList(); //平库内托盘 var detail2 = list.Where(m => m.WareHouseNo == "W02").ToList(); //立库内托盘 var detail3 = list.Where(m => m.WareHouseNo == "W01").ToList(); // 平库储位编码规则确认后,根据实际规则取深度 //foreach (var item in detail2) //{ // var dept = item.LocatNo.Substring(5,2); // 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().Where(m => m.IsDel == "0" && m.WareHouseNo == "W02"); //var data2 = new List(); //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)); // } // } // data2.Add(pingku); //} //立库 var locate2 = Db.Queryable().Where(m => m.IsDel == "0" && m.WareHouseNo == "W01").ToList(); var data3 = new List(); foreach (var liku in detail3.OrderByDescending(a => a.PalletTags).ThenBy(m => m.Dept).ToList()) { if (data3.Contains(liku)) { continue; } 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.Contains(detail3.First(m => m.LocatNo == locat.LocatNo))) { data3.Add(detail3.First(m=>m.LocatNo == locat.LocatNo)); } } data3.Add(liku); } data.AddRange(detail1); // 库外 data.AddRange(detail2); // 平库 data.AddRange(data3); // 立库 return data; } catch (Exception e) { throw new Exception(e.Message); } } } }