| | |
| | | } |
| | | #endregion |
| | | |
| | | // 申请巷道 |
| | | public OutCommandDto RequestRoadWay(string palletNo, string houseNo) |
| | | { |
| | | try |
| | | { |
| | | //验证托盘条码是否为空 |
| | | if (string.IsNullOrEmpty(palletNo)) |
| | | { |
| | | throw new Exception("请输入要申请的托盘条码"); |
| | | } |
| | | //验证所属仓库是否为空 |
| | | if (string.IsNullOrEmpty(houseNo)) |
| | | { |
| | | throw new Exception("请选择所属仓库"); |
| | | } |
| | | //验证是否为平库入库 |
| | | if (houseNo == "W02") |
| | | { |
| | | throw new Exception("平库请使用PDA手持进行平库入库"); |
| | | } |
| | | |
| | | OutCommandDto comDto;//返回wcs的入库命令 |
| | | var isHaveLocateNo = false; //托盘绑定信息中是否已有指定储位 |
| | | |
| | | var stock = Db.Queryable<SysPallets>().First(a => a.PalletNo == palletNo);//托盘信息 |
| | | |
| | | //判断托盘条码是否有效 |
| | | if (stock == null) |
| | | { |
| | | throw new Exception("托盘条码不受WMS管理,不可入库!"); |
| | | } |
| | | |
| | | #region |
| | | |
| | | //查询托盘绑定信息(状态为等待入库的) |
| | | 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 palletBind = palletBindList.FirstOrDefault(m => m.Status == "1");//查询是否有正在执行的托盘绑定 |
| | | if (palletBind != null) |
| | | { |
| | | var beingTask = Db.Queryable<LogTask>().First(m => m.IsDel == "0" && m.TaskNo == palletBind.TaskNo); |
| | | if (beingTask == null) |
| | | { |
| | | throw new Exception("该托盘正在入库,但未查询到任务信息"); |
| | | } |
| | | comDto = new OutCommandDto() |
| | | { |
| | | PalletNo = palletNo,//托盘号 |
| | | StartRoadway = beingTask.StartRoadway, // 起始巷道 |
| | | StartLocate = "", // 起始位置 |
| | | EndLocate = beingTask.EndLocat, // 目标位置 |
| | | EndRoadway = beingTask.EndRoadway, // 目标巷道 |
| | | TaskNo = beingTask.TaskNo, // 任务号 |
| | | TaskType = "0",// 任务类型 (出库) |
| | | OutMode = "", //目标地址 |
| | | Order = 1 |
| | | }; |
| | | return comDto; |
| | | } |
| | | if (haveLocate != null) |
| | | { |
| | | isHaveLocateNo = true; //已有指定储位 |
| | | } |
| | | |
| | | if (palletBindList.First().Type == "0") //物料托入库 |
| | | { |
| | | //判断是否绑定单据及单据状态是否正常 |
| | | foreach (var item in palletBindList) |
| | | { |
| | | var notice = Db.Queryable<BllArrivalNotice>().First(m => m.IsDel == "0" && m.ASNNo == item.ASNNo); |
| | | if (notice == null) |
| | | { |
| | | 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 //回流入库 |
| | | { |
| | | var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == palletNo).ToList(); |
| | | if (stockDetail.Count == 0) |
| | | { |
| | | throw new Exception($"{palletNo}托盘条码不具有箱码信息,不可入库!"); |
| | | } |
| | | skuNo = stockDetail.First().SkuNo; |
| | | |
| | | //获取对应回库规则 |
| | | var function = Db.Queryable<SysFunSetting>().First(a => a.IsDel == "0" && a.FunSetName == "托盘回库验证" && a.IsEnable == "NO"); |
| | | #region 托盘回库规则 |
| | | |
| | | if (function != null) |
| | | { |
| | | //拣货完成后允许托盘回库 |
| | | if (function.SetValue == "CompletePick") |
| | | { |
| | | var allot = Db.Queryable<BllExportAllot>().First(a => a.IsDel == "0" && a.LotNo == stockDetail[0].LotNo && a.PalletNo == palletNo && a.SkuNo == stockDetail[0].SkuNo); |
| | | |
| | | //验证拣货明细是否存在 |
| | | if (allot != null) |
| | | { |
| | | //验证当前托盘拣货信息是否已完成 |
| | | if (allot.Status != "5") |
| | | { |
| | | throw new Exception("当前托盘拣货信息未完成,请完成后回库!"); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | #endregion |
| | | } |
| | | |
| | | var allotLocate = new AllotLocation(); |
| | | |
| | | SysStorageLocat locate; |
| | | |
| | | 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); |
| | | } |
| | | |
| | | var laneAllot = 0; //储位跳巷分配 0:跳着分配(一个一个分配)1:巷道按照优先级分配,同优先级顺序分配(一个巷道满了再分配下一个的巷道储位) |
| | | var funSet3 = Db.Queryable<SysFunSetting>().First(m => m.IsDel == "0" && m.FunSetName == "储位跳巷分配" && m.IsEnable == "NO"); |
| | | if (funSet3 != null) |
| | | { |
| | | switch (funSet3.SetValue) |
| | | { |
| | | case "JumpLaneAllot": |
| | | laneAllot = 0;//立库储位分配 巷道同优先级巷道跳着分配(一个一个分配) |
| | | break; |
| | | case "RankLaneAllot": |
| | | laneAllot = 1;//立库储位分配 巷道按照优先级分配,同优先级顺序分配(一个巷道满了再分配下一个的巷道储位) |
| | | break; |
| | | default: |
| | | laneAllot = 1;// 默认 跳着分配 |
| | | break; |
| | | } |
| | | } |
| | | var roadList = Db.Queryable<SysStorageLocat>().Where(m => m.WareHouseNo == houseNo && areaList.Contains(m.AreaNo)) |
| | | .GroupBy(m => m.RoadwayNo).Select(m => m.RoadwayNo).ToList(); |
| | | |
| | | SysRoadwayUseLog useLog = Db.Ado.SqlQuerySingle<SysRoadwayUseLog>("select Top(1) * from SysRoadwayUseLog where IsDel=0 order by CreateTime desc"); //巷道最后一次使用记录 |
| | | |
| | | var bindNum = Db.Queryable<BllPalletBind>() |
| | | .Where(m => m.IsDel == "0" && m.Status == "0" && !string.IsNullOrWhiteSpace(m.RoadwayNo)) |
| | | .GroupBy(m => m.PalletNo).Select(m => m.PalletNo).Count(); |
| | | |
| | | var roadNo = ""; |
| | | if (laneAllot == 0)//跳巷道平均分配 |
| | | { |
| | | //如果同级巷道有多条则查上次位置日志 |
| | | if (roadList.Count > 1) |
| | | { |
| | | useLog = Db.Queryable<SysRoadwayUseLog>().OrderByDescending(l => l.Id).First(); |
| | | } |
| | | //取各巷道所有排第一个合适位 |
| | | foreach (var l in roadList) |
| | | { |
| | | //如果上次是当前巷道则跳出 |
| | | if (useLog != null && l == useLog.RoadwayNo) |
| | | { |
| | | continue; |
| | | } |
| | | |
| | | var locateCount = Db.Queryable<SysStorageLocat>() |
| | | .Where(m => m.Status == "0" && m.Flag == "0" && areaList.Contains(m.AreaNo)).Count(); |
| | | if (locateCount- bindNum>0) |
| | | { |
| | | roadNo = l; |
| | | } |
| | | //当前巷有位置则退出 |
| | | if (roadNo != null) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | //如果跳巷道并且未找到合适空储位,则跳到最后一次使用的巷道查询 |
| | | |
| | | if (roadNo == null) |
| | | { |
| | | if (useLog != null) |
| | | { |
| | | roadNo = useLog.RoadwayNo; |
| | | } |
| | | } |
| | | } |
| | | else//按照巷道优先级分配 |
| | | { |
| | | foreach (var item in roadList) |
| | | { |
| | | roadNo = item; |
| | | if (roadNo != null) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (string.IsNullOrWhiteSpace(roadNo)) |
| | | { |
| | | throw new Exception("未查询到空储位巷道"); |
| | | } |
| | | |
| | | Db.BeginTran(); |
| | | try |
| | | { |
| | | if (roadNo != null) |
| | | { |
| | | //添加巷道使用记录 |
| | | var log = new SysRoadwayUseLog |
| | | { |
| | | RoadwayNo = roadNo , |
| | | WareHouseNo = houseNo, |
| | | Row = 0, |
| | | Column = 0, |
| | | Layer = 0, |
| | | }; |
| | | Db.Insertable(log).ExecuteCommand(); |
| | | } |
| | | |
| | | if (palletBindList.Count >= 1) |
| | | { |
| | | foreach (var item in palletBindList) |
| | | { |
| | | item.WareHouseNo = houseNo; |
| | | item.RoadwayNo = roadNo; |
| | | item.TaskNo = ""; |
| | | } |
| | | Db.Updateable(palletBindList).ExecuteCommand(); |
| | | } |
| | | Db.CommitTran(); |
| | | comDto = new OutCommandDto() |
| | | { |
| | | PalletNo = palletNo,//托盘号 |
| | | StartRoadway = "", |
| | | StartLocate = "", // 起始位置 |
| | | EndLocate = "", // 目标位置 |
| | | EndRoadway = roadNo, // 目标巷道 |
| | | TaskNo = "", // 任务号 |
| | | TaskType = "0",// 任务类型 (出库) |
| | | OutMode = "", //目标地址 |
| | | Order = 1 |
| | | }; |
| | | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Db.RollbackTran(); |
| | | throw new Exception(ex.Message); |
| | | } |
| | | #endregion |
| | | |
| | | return null; |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | throw new Exception(e.Message); |
| | | } |
| | | } |
| | | |
| | | //申请储位 |
| | | public OutCommandDto RequestLocation(string palletNo, string houseNo, string roadwayNo) |
| | | { |
| | |
| | | //验证是否为平库入库 |
| | | if (houseNo == "W02") |
| | | { |
| | | throw new Exception("零箱库请使用PDA手持进行平库入库"); |
| | | throw new Exception("平库请使用PDA手持进行平库入库"); |
| | | } |
| | | |
| | | OutCommandDto comDto;//返回wcs的入库命令 |
| | |
| | | Db.BeginTran(); |
| | | try |
| | | { |
| | | if (locate != null) |
| | | { |
| | | //添加巷道使用记录 |
| | | var log = new SysRoadwayUseLog |
| | | { |
| | | RoadwayNo = locate.RoadwayNo, |
| | | LocateNo = locate.LocatNo, |
| | | WareHouseNo = locate.WareHouseNo, |
| | | Row = locate.Row, |
| | | Column = locate.Column, |
| | | Layer = locate.Layer, |
| | | Depth = locate.Depth |
| | | }; |
| | | Db.Insertable(log).ExecuteCommand(); |
| | | } |
| | | //if (locate != null) |
| | | //{ |
| | | // //添加巷道使用记录 |
| | | // var log = new SysRoadwayUseLog |
| | | // { |
| | | // RoadwayNo = locate.RoadwayNo, |
| | | // LocateNo = locate.LocatNo, |
| | | // WareHouseNo = locate.WareHouseNo, |
| | | // Row = locate.Row, |
| | | // Column = locate.Column, |
| | | // Layer = locate.Layer, |
| | | // Depth = locate.Depth |
| | | // }; |
| | | // Db.Insertable(log).ExecuteCommand(); |
| | | //} |
| | | |
| | | var taskNo = new Common().GetMaxNo("TK"); |
| | | var exTask = new LogTask //入库任务 |