| | |
| | | } |
| | | } |
| | | |
| | | // 申请巷道 参观模式 |
| | | public OutCommandDto RequestRoadWayModel(string palletNo, string houseNo) |
| | | { |
| | | try |
| | | { |
| | | #region 验证托盘合法性 |
| | | //验证托盘条码是否为空 |
| | | if (string.IsNullOrEmpty(palletNo)) |
| | | { |
| | | throw new Exception("请输入要申请的托盘条码"); |
| | | } |
| | | //验证所属仓库是否为空 |
| | | if (string.IsNullOrEmpty(houseNo)) |
| | | { |
| | | throw new Exception("请选择所属仓库"); |
| | | } |
| | | //验证是否为平库入库 |
| | | if (houseNo == "W02") |
| | | { |
| | | throw new Exception("平库请使用PDA手持进行平库入库"); |
| | | } |
| | | |
| | | var stock = Db.Queryable<SysPallets>().First(a => a.PalletNo == palletNo);//托盘信息 |
| | | //判断托盘条码是否有效 |
| | | if (stock == null) |
| | | { |
| | | throw new Exception("托盘条码不受WMS管理,不可入库!"); |
| | | } |
| | | #endregion |
| | | |
| | | |
| | | OutCommandDto comDto;//返回wcs的入库命令 |
| | | #region |
| | | |
| | | #region 判断任务是否已经存在,若存在直接返回任务; |
| | | var beingTask = Db.Queryable<LogTask>().First(m => m.IsDel == "0" |
| | | && (m.Status == "0" || m.Status == "1") && m.PalletNo == palletNo && m.Type == "0"); |
| | | if (beingTask != null) |
| | | { |
| | | comDto = new OutCommandDto() |
| | | { |
| | | PalletNo = palletNo,//托盘号 |
| | | StartRoadway = beingTask.StartRoadway, // 起始巷道 |
| | | StartLocate = "", // 起始位置 |
| | | EndLocate = beingTask.EndLocat, // 目标位置 |
| | | EndRoadway = beingTask.EndRoadway, // 目标巷道 |
| | | TaskNo = beingTask.TaskNo, // 任务号 |
| | | TaskType = "0",// 任务类型 (出库) |
| | | OutMode = "", //目标地址 |
| | | Order = 1 |
| | | }; |
| | | if (beingTask.IsSuccess == 0) |
| | | { |
| | | beingTask.IsSuccess = 1; |
| | | beingTask.Status = "1"; |
| | | Db.Updateable(beingTask).ExecuteCommand(); |
| | | } |
| | | |
| | | return comDto; |
| | | } |
| | | #endregion |
| | | |
| | | |
| | | |
| | | var areaNoStr = "演示区域"; |
| | | var allotLocate = new AllotLocation(); |
| | | |
| | | #region 根据sku确认区域划分 |
| | | |
| | | 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 && m.AreaNo == areaNoStr) |
| | | .GroupBy(m => m.RoadwayNo).OrderBy(m => m.RoadwayNo).Select(m => m.RoadwayNo).ToList(); |
| | | |
| | | SysRoadwayUseLog useLog = Db.Queryable<SysRoadwayUseLog>().Where(m => m.IsDel == "0" && roadList.Contains(m.RoadwayNo)).OrderByDescending(l => l.Id).First(); //巷道最后一次使用记录 |
| | | #endregion |
| | | |
| | | |
| | | #region 确定巷道排序 |
| | | List<string> roadList2 = new List<string>(); |
| | | List<string> roadSmall = new List<string>(); |
| | | List<string> roadLarge = new List<string>(); |
| | | if (useLog != null) |
| | | { |
| | | roadList2.Add(useLog.RoadwayNo); |
| | | foreach (var r in roadList) |
| | | { |
| | | if (r == useLog.RoadwayNo) |
| | | { |
| | | continue; |
| | | } |
| | | //如果结果为0,则说明两个字符串相等; ABC BCE |
| | | //如果结果小于0,则说明第一个字符串小于第二个字符串; |
| | | //如果结果大于0,则说明第一个字符串大于第二个字符串。 |
| | | var bol = String.CompareOrdinal(r, useLog.RoadwayNo); |
| | | if (bol < 0) |
| | | { |
| | | roadSmall.Add(r); |
| | | } |
| | | if (bol > 0) |
| | | { |
| | | roadLarge.Add(r); |
| | | } |
| | | } |
| | | roadList2.AddRange(roadLarge); |
| | | roadList2.AddRange(roadSmall); |
| | | } |
| | | |
| | | roadList = roadList2; |
| | | #endregion |
| | | |
| | | |
| | | var roadNo = ""; |
| | | if (laneAllot == 0)//跳巷道平均分配 |
| | | { |
| | | //取各巷道所有排第一个合适位 |
| | | 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" && m.AreaNo == areaNoStr && m.RoadwayNo == l).Count(); |
| | | |
| | | var taskNum = Db.Queryable<LogTask>() |
| | | .Where(m => m.IsDel == "0" && m.Type == "0" && (m.Status == "0" || m.Status == "1") && m.EndRoadway == l) |
| | | .GroupBy(m => m.PalletNo).Select(m => m.PalletNo).Count(); |
| | | if (locateCount - taskNum > 0) |
| | | { |
| | | roadNo = l; |
| | | } |
| | | //当前巷有位置则退出 |
| | | if (roadNo != null) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | //如果跳巷道并且未找到合适空储位,则跳到最后一次使用的巷道查询 |
| | | |
| | | if (roadNo == null) |
| | | { |
| | | if (useLog != null) |
| | | { |
| | | var locateCount = Db.Queryable<SysStorageLocat>() |
| | | .Where(m => m.Status == "0" && m.Flag == "0" && m.AreaNo == areaNoStr && m.RoadwayNo == useLog.RoadwayNo).Count(); |
| | | |
| | | var taskNum = Db.Queryable<LogTask>() |
| | | .Where(m => m.IsDel == "0" && m.Type == "0" && (m.Status == "0" || m.Status == "1") && m.EndRoadway == useLog.RoadwayNo) |
| | | .GroupBy(m => m.PalletNo).Select(m => m.PalletNo).Count(); |
| | | if (locateCount - taskNum > 0) |
| | | { |
| | | roadNo = useLog.RoadwayNo; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | else//按照巷道优先级分配 |
| | | { |
| | | foreach (var item in roadList) |
| | | { |
| | | var locateCount = Db.Queryable<SysStorageLocat>() |
| | | .Where(m => m.Status == "0" && m.Flag == "0" && m.AreaNo == areaNoStr && m.RoadwayNo == item).Count(); |
| | | |
| | | var taskNum = Db.Queryable<LogTask>() |
| | | .Where(m => m.IsDel == "0" && m.Type == "0" && (m.Status == "0" || m.Status == "1") && m.EndRoadway == item) |
| | | .GroupBy(m => m.PalletNo).Select(m => m.PalletNo).Count(); |
| | | |
| | | if (locateCount - taskNum > 0) |
| | | { |
| | | roadNo = item; |
| | | } |
| | | //当前巷有位置则退出 |
| | | if (roadNo != null) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (string.IsNullOrWhiteSpace(roadNo)) |
| | | { |
| | | throw new Exception("未查询到空储位巷道"); |
| | | } |
| | | |
| | | Db.BeginTran(); |
| | | try |
| | | { |
| | | //添加巷道使用记录 |
| | | var log = new SysRoadwayUseLog |
| | | { |
| | | RoadwayNo = roadNo, |
| | | WareHouseNo = houseNo, |
| | | Row = 0, |
| | | Column = 0, |
| | | Layer = 0, |
| | | }; |
| | | Db.Insertable(log).ExecuteCommand(); |
| | | |
| | | // 添加入库日志记录 |
| | | var taskNo = new Common().GetMaxNo("TK"); |
| | | var exTask = new LogTask //入库任务 |
| | | { |
| | | TaskNo = taskNo, |
| | | Sender = "WMS", |
| | | Receiver = "WCS", |
| | | IsSuccess = 1, //是否下发成功 0失败 1成功 |
| | | SendDate = DateTime.Now, //发送时间 |
| | | BackDate = DateTime.Now, //返回时间 |
| | | StartRoadway = "", // 起始巷道 |
| | | StartLocat = "",//起始位置 |
| | | EndLocat = "",//目标位置 |
| | | EndRoadway = roadNo, // 目标巷道 |
| | | PalletNo = palletNo,//托盘码 |
| | | IsSend = 1,//是否可再次下发 |
| | | IsCancel = 1,//是否可取消 |
| | | IsFinish = 1,//是否可完成 |
| | | Type = "0",//任务类型 0 入库任务 1 出库任务 2 移库任务 |
| | | Status = "1",//任务状态0:等待执行1正在执行2执行完成 |
| | | OrderType = "0",//0 入库单 1 出库单 2 盘点单 3 移库单 |
| | | Msg = "入库口到=>>" + roadNo + "巷道的入库任务", //关键信息 |
| | | TaskModel = "1" //任务模式 1:演示模式 |
| | | |
| | | }; |
| | | Db.Insertable(exTask).ExecuteCommand(); |
| | | |
| | | Db.CommitTran(); |
| | | |
| | | comDto = new OutCommandDto() |
| | | { |
| | | PalletNo = palletNo,//托盘号 |
| | | StartRoadway = "", |
| | | StartLocate = "", // 起始位置 |
| | | EndLocate = "", // 目标位置 |
| | | EndRoadway = roadNo, // 目标巷道 |
| | | TaskNo = taskNo, // 任务号 |
| | | TaskType = "0",// 任务类型:入库任务 |
| | | OutMode = "", //目标地址 |
| | | Order = 1 |
| | | }; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Db.RollbackTran(); |
| | | throw new Exception(ex.Message); |
| | | } |
| | | #endregion |
| | | |
| | | return comDto; |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | throw new Exception(e.Message); |
| | | } |
| | | } |
| | | |
| | | //申请储位 |
| | | public OutCommandDto RequestLocation(string palletNo, string houseNo, string roadwayNo) |
| | | { |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | //申请储位(参观模式) |
| | | public OutCommandDto RequestLocationModel(string palletNo, string houseNo, string roadwayNo) |
| | | { |
| | | try |
| | | { |
| | | |
| | | //验证托盘条码是否为空 |
| | | if (string.IsNullOrEmpty(palletNo)) |
| | | { |
| | | throw new Exception("请输入要申请的托盘条码"); |
| | | } |
| | | //验证所属仓库是否为空 |
| | | if (string.IsNullOrEmpty(houseNo)) |
| | | { |
| | | throw new Exception("请选择所属仓库"); |
| | | } |
| | | //验证巷道是否为空 |
| | | if (string.IsNullOrWhiteSpace(roadwayNo)) |
| | | { |
| | | throw new Exception("巷道不能为空"); |
| | | } |
| | | //验证是否为平库入库 |
| | | if (houseNo == "W02") |
| | | { |
| | | throw new Exception("平库请使用PDA手持进行平库入库"); |
| | | } |
| | | var stock = Db.Queryable<SysPallets>().First(a => a.PalletNo == palletNo);//托盘信息 |
| | | |
| | | //判断托盘条码是否有效 |
| | | if (stock == null) |
| | | throw new Exception("托盘条码不受WMS管理,不可入库!"); |
| | | |
| | | OutCommandDto comDto;//返回wcs的入库命令 |
| | | |
| | | var isAddTask = false; |
| | | var oldTaskNo = ""; |
| | | #region |
| | | |
| | | var beingTask = Db.Queryable<LogTask>().First(m => m.IsDel == "0" |
| | | && (m.Status == "0" || m.Status == "1") && m.PalletNo == palletNo && m.Type == "0"); |
| | | if (beingTask != null) |
| | | { |
| | | if (!string.IsNullOrWhiteSpace(beingTask.EndLocat)) |
| | | { |
| | | comDto = new OutCommandDto() |
| | | { |
| | | PalletNo = palletNo,//托盘号 |
| | | StartRoadway = beingTask.StartRoadway, // 起始巷道 |
| | | StartLocate = "", // 起始位置 |
| | | EndLocate = beingTask.EndLocat, // 目标位置 |
| | | EndRoadway = beingTask.EndRoadway, // 目标巷道 |
| | | TaskNo = beingTask.TaskNo, // 任务号 |
| | | TaskType = "0",// 任务类型 (出库) |
| | | OutMode = "", //目标地址 |
| | | Order = 1 |
| | | }; |
| | | if (beingTask.IsSuccess == 0) |
| | | { |
| | | beingTask.IsSuccess = 1; |
| | | beingTask.Status = "1"; |
| | | Db.Updateable(beingTask).ExecuteCommand(); |
| | | } |
| | | return comDto; |
| | | } |
| | | else |
| | | { |
| | | if (string.IsNullOrWhiteSpace(roadwayNo)) |
| | | { |
| | | roadwayNo = beingTask.EndRoadway; |
| | | } |
| | | } |
| | | oldTaskNo = beingTask.TaskNo; |
| | | } |
| | | else |
| | | { |
| | | isAddTask = true; |
| | | } |
| | | |
| | | |
| | | #endregion |
| | | |
| | | |
| | | var allotLocate = new AllotLocation(); |
| | | |
| | | SysStorageLocat locate; |
| | | var areaList = new List<string>(); |
| | | areaList.Add("演示区域"); |
| | | locate = allotLocate.GetSuiTableLocate(houseNo, areaList, roadwayNo); |
| | | |
| | | Db.BeginTran(); |
| | | try |
| | | { |
| | | if (isAddTask) |
| | | { |
| | | var taskNo = new Common().GetMaxNo("TK"); |
| | | var exTask = new LogTask //入库任务 |
| | | { |
| | | TaskNo = taskNo, |
| | | Sender = "WMS", |
| | | Receiver = "WCS", |
| | | IsSuccess = 1, //是否下发成功 0失败 1成功 |
| | | SendDate = DateTime.Now, //发送时间 |
| | | BackDate = DateTime.Now, //返回时间 |
| | | StartRoadway = "", // 起始巷道 |
| | | StartLocat = "",//起始位置 |
| | | EndLocat = locate.LocatNo,//目标位置 |
| | | EndRoadway = locate.RoadwayNo, // 目标巷道 |
| | | PalletNo = palletNo,//托盘码 |
| | | IsSend = 1,//是否可再次下发 |
| | | IsCancel = 1,//是否可取消 |
| | | IsFinish = 1,//是否可完成 |
| | | Type = "0",//任务类型 0 入库任务 1 出库任务 2 移库任务 |
| | | Status = "1",//任务状态0:等待执行1正在执行2执行完成 |
| | | OrderType = "0",//0 入库单 1 出库单 2 盘点单 3 移库单 |
| | | Msg = "入库口到=>>" + locate.LocatNo + "的入库任务", //关键信息 |
| | | TaskModel = "1" |
| | | |
| | | }; |
| | | Db.Insertable(exTask).ExecuteCommand(); |
| | | |
| | | oldTaskNo = taskNo; |
| | | } |
| | | else |
| | | { |
| | | var oldTask = Db.Queryable<LogTask>().First(m => m.IsDel == "0" && m.TaskNo == oldTaskNo); |
| | | oldTask.EndLocat = locate.LocatNo; |
| | | oldTask.EndRoadway = locate.RoadwayNo; |
| | | if (oldTask.IsSuccess == 0) |
| | | { |
| | | oldTask.IsSuccess = 1; |
| | | oldTask.Status = "1"; |
| | | } |
| | | Db.Updateable(oldTask).ExecuteCommand(); |
| | | } |
| | | |
| | | |
| | | locate.Status = "2"; |
| | | Db.Updateable(locate).ExecuteCommand(); |
| | | |
| | | Db.CommitTran(); |
| | | comDto = new OutCommandDto() |
| | | { |
| | | PalletNo = palletNo,//托盘号 |
| | | StartRoadway = "", |
| | | StartLocate = "", // 起始位置 |
| | | EndLocate = locate.LocatNo, // 目标位置 |
| | | EndRoadway = locate.RoadwayNo, // 目标巷道 |
| | | TaskNo = oldTaskNo, // 任务号 |
| | | TaskType = "0",// 任务类型 (出库) |
| | | OutMode = "", //目标地址 |
| | | Order = 1 |
| | | }; |
| | | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Db.RollbackTran(); |
| | | throw new Exception(ex.Message); |
| | | } |
| | | |
| | | |
| | | return comDto; |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | throw new Exception(e.Message); |
| | | } |
| | | } |
| | | |
| | | //入库完成(wcs反馈、wms手动完成) |
| | | public void ArrivalSuccess(string taskNo, int userId) |
| | | { |
| | |
| | | //添加操作日志记录 |
| | | var k = new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", taskNo, "完成", $"点击完成按钮、完成任务号为:{taskNo}的任务", userId); |
| | | } |
| | | if (task.TaskModel == "1") //演示模式 |
| | | { |
| | | locate.Status = "1"; |
| | | Db.Updateable(locate).ExecuteCommand(); |
| | | return; |
| | | } |
| | | //判断是否是回流入库完成 |
| | | if (stockDetail.Any()) |
| | | { |