Wms/WMS.BLL/BllAsnServer/PalletBindServer.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Wms/WMS.BLL/Logic/AllotLocation.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
Wms/WMS.BLL/BllAsnServer/PalletBindServer.cs
@@ -700,19 +700,24 @@ var palletBindList = Db.Queryable<BllPalletBind>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo && m.Status != "2").ToList(); var haveLocate = palletBindList.FirstOrDefault(m => !string.IsNullOrWhiteSpace(m.LocatNo)); var skuList = Db.Queryable<SysMaterials>().Where(m => m.IsDel == "0").ToList(); //物料类别信息 var skuCategoryList = Db.Queryable<SysMaterialCategory>().Where(m => m.IsDel == "0").ToList(); var skuNo = ""; //入库物料 if (palletBindList.Count >= 1) //正常入库 { var bindIdList = palletBindList.Select(m => m.Id).ToList(); //var bindIdList = palletBindList.Select(m => m.Id).ToList(); //判断是否有零箱 foreach (var item in bindIdList) { var boxInfo = Db.Queryable<BllBoxInfo>().Where(m => m.IsDel == "0" && m.BindNo == item); if (boxInfo.Count(m => m.BitBoxMark == "1") > 0) { throw new Exception($"{palletNo}托盘上有零箱,请入零箱库!"); } } //foreach (var item in bindIdList) //{ // var boxInfo = Db.Queryable<BllBoxInfo>().Where(m => m.IsDel == "0" && m.BindNo == item); // if (boxInfo.Count(m => m.BitBoxMark == "1") > 0) // { // throw new Exception($"{palletNo}托盘上有零箱,请入零箱库!"); // } //} var palletBind = palletBindList.FirstOrDefault(m => m.Status == "1"); if (palletBind != null) @@ -740,6 +745,7 @@ { isHaveLocateNo = true; //已有指定储位 } if (palletBindList.First().Type == "0") //物料托入库 { //判断是否绑定单据及单据状态是否正常 @@ -750,12 +756,26 @@ { throw new Exception("托盘存在物料未绑定入库单,不可入库!"); } if (notice.Status == "3") { throw new Exception($"入库单{item.ASNNo}已关闭,不可入库!"); } } //获取物料存放区域 var noticeDetail = Db.Queryable<BllArrivalNoticeDetail>().First(m => m.IsDel == "0" && m.Id == palletBindList.First().ASNDetailNo); if (noticeDetail == null) { throw new Exception("托盘存在物料未绑定入库单明细,不可入库"); } skuNo = noticeDetail.SkuNo; } else if(palletBindList.First().Type == "1")//空托盘 { skuNo = "100099"; } } else //回流入库 @@ -765,17 +785,19 @@ { throw new Exception($"{palletNo}托盘条码不具有箱码信息,不可入库!"); } else { //判断是否有零箱 var detailIdList = stockDetail.Select(m => m.Id).ToList(); var dataBoxInfo = Db.Queryable<DataBoxInfo>().Where(m => detailIdList.Contains(m.StockDetailId)).ToList(); if (dataBoxInfo.Count(m => m.BitBoxMark == "1")>0) { throw new Exception($"{palletNo}托盘上有零箱,不可入库!"); } skuNo = stockDetail.First().SkuNo; //else //{ // //判断是否有零箱 // var detailIdList = stockDetail.Select(m => m.Id).ToList(); // var dataBoxInfo = Db.Queryable<DataBoxInfo>().Where(m => detailIdList.Contains(m.StockDetailId)).ToList(); // if (dataBoxInfo.Count(m => m.BitBoxMark == "1")>0) // { // throw new Exception($"{palletNo}托盘上有零箱,不可入库!"); // } } //} //获取对应回库规则 var function = Db.Queryable<SysFunSetting>().First(a => a.IsDel == "0" && a.FunSetName == "托盘回库验证" && a.IsEnable == "NO"); @@ -813,7 +835,31 @@ } else { locate = allotLocate.GetSuiTableLocate(houseNo, roadwayNo); var sku = skuList.FirstOrDefault(m => m.SkuNo == skuNo); if (sku == null) { throw new Exception("物料信息中未查询到入库单明细包含的物料信息,不可入库"); } //判断物料是否含有类别信息 if (string.IsNullOrWhiteSpace(sku.CategoryNo)) { throw new Exception($"物料:{sku.SkuNo}未查询到类别信息"); } var skuCategory = skuCategoryList.FirstOrDefault(m => m.CategoryNo == sku.CategoryNo); if (skuCategory == null) { throw new Exception($"未在类别信息中查询到物料:{sku.SkuNo}包含的类别"); } var areaStr = skuCategory.AreaNo.Split(","); var areaList = new List<string>(); foreach (var item in areaStr) { areaList.Add(item); } locate = allotLocate.GetSuiTableLocate(houseNo, areaList, roadwayNo); } Db.BeginTran(); try @@ -1479,7 +1525,54 @@ AllotLocation allotLocate = new AllotLocation(); try { locate = allotLocate.GetSuiTableLocate("W01", taskModel.EndRoadway); var skuNo = ""; if (asnNo != "回流托盘") { //获取物料存放区域 var noticeDetail = Db.Queryable<BllArrivalNoticeDetail>().First(m => m.IsDel == "0" && m.Id == palletBindModel.ASNDetailNo); if (noticeDetail == null) { throw new Exception("托盘存在物料未绑定入库单明细,不可入库"); } skuNo = noticeDetail.SkuNo; } else { var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == model.PalletNo).ToList(); if (stockDetail.Count == 0) { throw new Exception($"{model.PalletNo}托盘条码不具有箱码信息,不可入库!"); } skuNo = stockDetail.First().SkuNo; } var sku = Db.Queryable<SysMaterials>().First(m =>m.IsDel =="0" && m.SkuNo == skuNo); if (sku == null) { throw new Exception("物料信息中未查询到入库单明细包含的物料信息,不可入库"); } //判断物料是否含有类别信息 if (string.IsNullOrWhiteSpace(sku.CategoryNo)) { throw new Exception($"物料:{sku.SkuNo}未查询到类别信息"); } var skuCategory = Db.Queryable<SysMaterialCategory>().First(m =>m.IsDel=="0" && m.CategoryNo == sku.CategoryNo); if (skuCategory == null) { throw new Exception($"未在类别信息中查询到物料:{sku.SkuNo}包含的类别"); } var areaStr = skuCategory.AreaNo.Split(","); var areaList = new List<string>(); foreach (var item in areaStr) { areaList.Add(item); } locate = allotLocate.GetSuiTableLocate("W01", areaList, taskModel.EndRoadway); } catch (Exception ex) { Wms/WMS.BLL/Logic/AllotLocation.cs
@@ -18,9 +18,10 @@ /// 获取合适的库位 /// </summary> /// <param name="houseNo">仓库号</param> /// <param name="areaList">区域集合</param> /// <param name="roadwayNo">巷道号(可空)</param> /// <returns></returns> public SysStorageLocat GetSuiTableLocate(string houseNo, string roadwayNo = "") public SysStorageLocat GetSuiTableLocate(string houseNo, List<string> areaList,string roadwayNo = "") { try { @@ -33,6 +34,10 @@ { throw new Exception($"未查询到{houseNo}仓库信息"); } var roadList = db.Queryable<SysStorageLocat>().Where(m => m.WareHouseNo == houseNo && areaList.Contains(m.AreaNo) ) .GroupBy(m=>m.RoadwayNo).Select(m=>m.RoadwayNo).ToList(); //数据字典(获取字典中仓库类型) var dic = db.Queryable<SysDictionary>().First(m => m.Id.ToString() == house.Type); switch (dic.DictName) @@ -46,6 +51,11 @@ { throw new Exception($"未查询到{roadwayNo}巷道信息"); } if (!roadList.Contains(roadwayNo)) { throw new Exception("当前物料存放区域未在指定巷道中"); } if (roadway.Status == "1") { throw new Exception($"{roadwayNo}巷道已停用"); @@ -53,7 +63,7 @@ //查询该巷道并且标志为正常的的储位 roadwayList.Add(roadway); var locate = GetLocateByRoadways(roadwayList); var locate = GetLocateByRoadways(roadwayList,areaList); if (locate == null) { throw new Exception($"{roadwayNo}巷道没有合适的空储位"); @@ -63,9 +73,9 @@ //立体库没有指定巷道(循环巷道根据优先级分配) case "立体库" when string.IsNullOrWhiteSpace(roadwayNo): { var roadwayList = db.Queryable<SysStorageRoadway>().Where(m => m.WareHouseNo == houseNo && m.Status == "0").OrderBy(m => new { m.Priority, m.RoadwayNo }).ToList(); var roadwayList = db.Queryable<SysStorageRoadway>().Where(m => m.WareHouseNo == houseNo && m.Status == "0" && roadList.Contains(m.RoadwayNo)).OrderBy(m => new { m.Priority, m.RoadwayNo }).ToList(); var locate = GetLocateByRoadways(roadwayList); var locate = GetLocateByRoadways(roadwayList,areaList); if (locate == null) { throw new Exception($"{houseNo}仓库已启用的巷道中没有合适的空储位"); @@ -96,9 +106,9 @@ /// 获取合适空储位信息(根据巷道集合判断) /// </summary> /// <param name="roadways">巷道集合</param> /// <param name="areaNo">区域号(子母托盘区)</param> /// <param name="areaList">区域集合</param> /// <returns></returns> private SysStorageLocat GetLocateByRoadways(List<SysStorageRoadway> roadways) private SysStorageLocat GetLocateByRoadways(List<SysStorageRoadway> roadways,List<string> areaList) { try { @@ -181,7 +191,7 @@ continue; } //取当前巷最优位置 locate = GetLocateByRoadway(l.RoadwayNo, topOrBom, leftOrRight); locate = GetLocateByRoadway(l.RoadwayNo, topOrBom, leftOrRight, areaList); //当前巷有位置则退出 if (locate != null) { @@ -193,7 +203,7 @@ { if (log != null) { locate = GetLocateByRoadway(log.RoadwayNo, topOrBom, leftOrRight); locate = GetLocateByRoadway(log.RoadwayNo, topOrBom, leftOrRight, areaList); } } } @@ -201,7 +211,7 @@ { foreach (var item in roadways) { locate = GetLocateByRoadway(item.RoadwayNo, topOrBom, leftOrRight); locate = GetLocateByRoadway(item.RoadwayNo, topOrBom, leftOrRight, areaList); } } @@ -221,17 +231,18 @@ /// <param name="roadwayNo">巷道号</param> /// <param name="topOrBom">储位分配上下 0 上 1 下</param> /// <param name="leftOrRight">储位分配上下 0 左 1 右</param> /// <param name="areaNo">区域号(子母托盘区)</param> /// <param name="areaList">区域集合</param> /// <returns></returns> private SysStorageLocat GetLocateByRoadway(string roadwayNo, int topOrBom, int leftOrRight) private SysStorageLocat GetLocateByRoadway(string roadwayNo, int topOrBom, int leftOrRight,List<string> areaList) { var db = DataContext.Db; var str = "''"; //查询该巷道并且标志为正常的的储位 do SysStorageLocat data; foreach (var area in areaList) { var sql = $@"select * from SysStorageLocat where IsDel = 0 and Flag = 0 and [Status] = 0 and RoadwayNo = '{roadwayNo}' and LocatNo not in({str}) "; //sql += !string.IsNullOrWhiteSpace(areaNo) ? $"and AreaNo = '{areaNo}' " : ""; var sql = $@"select * from SysStorageLocat where IsDel = 0 and Flag = 0 and [Status] = 0 and RoadwayNo = '{roadwayNo}' and AreaNo = '{area}' and LocatNo not in({str}) "; sql += "order by "; sql += topOrBom == 0 ? "Layer desc, " : "Layer, "; sql += leftOrRight == 0 ? "[Column], " : "[Column] desc, "; @@ -239,16 +250,16 @@ var locateList = db.Ado.SqlQuery<SysStorageLocat>(sql); var data = locateList.FirstOrDefault(); data = locateList.FirstOrDefault(); if (data != null) { return data; } else { return null; } } while (true); return null; } }