| | |
| | | |
| | | #endregion |
| | | |
| | | #region 组托收货 |
| | | #region 组托收货 JC34 |
| | | |
| | | /// <summary> |
| | | /// 组托收货列表 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | | /// <param name="count"></param> |
| | | /// <returns></returns> |
| | | /// <exception cref="Exception"></exception> |
| | | public List<PalletBindDto> GetPalletBindList(PalletBindVm model, out int count) |
| | | { |
| | | try |
| | |
| | | .LeftJoin<BllArrivalNoticeDetail>((a, b) => a.ASNDetailNo == b.Id) |
| | | .LeftJoin<SysUserInfor>((a, b, c) => a.CreateUser == c.Id) |
| | | .LeftJoin<SysUserInfor>((a, b, c, d) => a.UpdateUser == d.Id) |
| | | .LeftJoin<SysStorageLocat>((a, b, c, d, e) => a.LocatNo == e.LocatNo) |
| | | .LeftJoin<SysWareHouse>((a, b, c, d, e,f) => a.WareHouseNo == f.WareHouseNo) |
| | | //.LeftJoin<BllBoxInfo>((a, b, c, d, e, f) => a.Id == e.BindNo) |
| | | .Select((a, b, c, d,e,f) => new PalletBindDto() |
| | | //.LeftJoin<SysStorageLocat>((a, b, c, d, e) => a.LocatNo == e.LocatNo) |
| | | .LeftJoin<SysWareHouse>((a, b, c, d,f) => a.WareHouseNo == f.WareHouseNo) |
| | | .LeftJoin<SysStorageRoadway>((a, b, c, d, f,g) => a.RoadwayNo == g.RoadwayNo) |
| | | .Select((a, b, c, d,f,g) => new PalletBindDto() |
| | | { |
| | | Id = a.Id, |
| | | ASNNo = a.ASNNo, |
| | |
| | | PalletNo3 = a.PalletNo3, |
| | | LocatNo = a.LocatNo, |
| | | RoadwayNo = a.RoadwayNo, |
| | | RoadwayName = g.RoadwayName, |
| | | WareHouseNo = a.WareHouseNo, |
| | | WareHouseName = a.WareHouseNo+"-"+f.WareHouseName, |
| | | Qty = a.Qty, |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 明细列表 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | | /// <param name="count"></param> |
| | | /// <returns></returns> |
| | | public List<BoxInfoDto> GetBoxInfoList(BoxInfoVm model, out int count) |
| | | { |
| | | try |
| | |
| | | return data; |
| | | } |
| | | |
| | | //删除托盘绑定信息 |
| | | /// <summary> |
| | | /// 删除托盘绑定信息 |
| | | /// </summary> |
| | | /// <param name="id"></param> |
| | | /// <param name="userId"></param> |
| | | /// <exception cref="Exception"></exception> |
| | | public void DelPalletBind(int id, int userId) |
| | | { |
| | | try |
| | |
| | | throw new Exception(e.Message); |
| | | } |
| | | } |
| | | //删除绑定的箱码信息 |
| | | |
| | | /// <summary> |
| | | /// 删除绑定的箱码信息 |
| | | /// </summary> |
| | | /// <param name="boxNo"></param> |
| | | /// <param name="userId"></param> |
| | | /// <exception cref="Exception"></exception> |
| | | public void DelBindBoxInfo(string boxNo, int userId) |
| | | { |
| | | try |
| | |
| | | } |
| | | } |
| | | |
| | | //托盘绑定撤销申请 |
| | | /// <summary> |
| | | /// 托盘绑定撤销申请 |
| | | /// </summary> |
| | | /// <param name="id"></param> |
| | | /// <param name="reason"></param> |
| | | /// <param name="userId"></param> |
| | | /// <exception cref="Exception"></exception> |
| | | public void CancelPalletBind(int id, string reason, int userId) |
| | | { |
| | | try |
| | |
| | | catch (Exception e) |
| | | { |
| | | throw new Exception(e.Message); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 申请储位 (立体库) |
| | | /// </summary> |
| | | /// <param name="palletNo"></param> |
| | | /// <param name="houseNo"></param> |
| | | /// <param name="roadwayNo"></param> |
| | | /// <returns></returns> |
| | | /// <exception cref="Exception"></exception> |
| | | public OutCommandDto RequestLocation(string palletNo, string houseNo) |
| | | { |
| | | try |
| | | { |
| | | //验证托盘条码是否为空 |
| | | if (string.IsNullOrEmpty(palletNo)) |
| | | { |
| | | throw new Exception("请输入要申请的托盘条码"); |
| | | } |
| | | //验证所属仓库是否为空 |
| | | if (string.IsNullOrEmpty(houseNo)) |
| | | { |
| | | throw new Exception("请选择所属仓库"); |
| | | } |
| | | //验证是否为平库入库 |
| | | var houseType = Db.Queryable<SysWareHouse>().First(a => a.WareHouseNo == houseNo);//获取仓库类型 |
| | | //验证是否为立体库入库 |
| | | if (houseType.Type != "1") |
| | | { |
| | | throw new Exception("仓库类型错误,请选择立体库仓库"); |
| | | } |
| | | |
| | | 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 == "0" || m.Status == "1")).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 = ""; //入库物料 |
| | | var isAddTask = true; //是否添加新任务 |
| | | var oldTaskNo = ""; //旧任务号 |
| | | var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == palletNo).ToList(); |
| | | //验证物料是否有成品 |
| | | foreach (var item in stockDetail) |
| | | { |
| | | var skuItem = skuList.First(m => m.SkuNo == item.SkuNo); |
| | | if (skuItem.Type == "2") |
| | | { |
| | | throw new Exception("成品物料请入成品库"); |
| | | } |
| | | } |
| | | 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("该托盘正在入库,但未查询到任务信息"); |
| | | } |
| | | 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; |
| | | Db.Updateable(beingTask).ExecuteCommand(); |
| | | } |
| | | return comDto; |
| | | } |
| | | else |
| | | { |
| | | //if (string.IsNullOrWhiteSpace(roadwayNo)) |
| | | //{ |
| | | // roadwayNo = beingTask.EndRoadway; |
| | | //} |
| | | isAddTask = false; |
| | | oldTaskNo = beingTask.TaskNo; |
| | | } |
| | | } |
| | | 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 //回流入库 |
| | | { |
| | | if (stockDetail.Count == 0) |
| | | { |
| | | throw new Exception($"{palletNo}托盘条码不具有箱码信息,不可入库!"); |
| | | } |
| | | if (stockDetail.Count(m => !string.IsNullOrWhiteSpace(m.LocatNo)) > 0) |
| | | { |
| | | throw new Exception("当前托盘已在库内,请核实"); |
| | | } |
| | | skuNo = stockDetail.First().SkuNo; |
| | | |
| | | 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; |
| | | //} |
| | | isAddTask = false; |
| | | oldTaskNo = beingTask.TaskNo; |
| | | } |
| | | } |
| | | |
| | | //获取对应回库规则 |
| | | 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(); |
| | | |
| | | #region 申请储位 |
| | | |
| | | SysStorageLocat locate; |
| | | if (isHaveLocateNo) //指定储位 |
| | | { |
| | | locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == haveLocate.LocatNo); |
| | | } |
| | | else |
| | | { |
| | | 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, ""); |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | Db.BeginTran(); |
| | | try |
| | | { |
| | | |
| | | if (isAddTask) // 正常入库 |
| | | { |
| | | //添加巷道使用记录 |
| | | var log = new SysRoadwayUseLog |
| | | { |
| | | RoadwayNo = locate.RoadwayNo, |
| | | 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 = 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 + "的入库任务", //关键信息 |
| | | |
| | | }; |
| | | Db.Insertable(exTask).ExecuteCommand(); |
| | | var asnNo = ""; |
| | | // 添加托盘绑定表托盘入库任务号 liudl |
| | | foreach (DataStockDetail stockModel in stockDetail) |
| | | { |
| | | var bindModel = Db.Queryable<BllPalletBind>().First(m => m.IsDel == "0" && m.Status == "2" |
| | | && m.PalletNo == stockModel.PalletNo && m.ASNNo == stockModel.ASNNo && m.ASNDetailNo == stockModel.ASNDetailNo); |
| | | if (bindModel != null && string.IsNullOrWhiteSpace(bindModel.TaskNo)) |
| | | { |
| | | bindModel.TaskNo = taskNo; |
| | | bindModel.WareHouseNo = locate.WareHouseNo; |
| | | bindModel.RoadwayNo = locate.RoadwayNo; |
| | | bindModel.LocatNo = locate.LocatNo; |
| | | Db.Updateable(bindModel).ExecuteCommand(); |
| | | asnNo = stockModel.ASNNo; |
| | | } |
| | | } |
| | | foreach (DataStockDetail stockModel in stockDetail) |
| | | { |
| | | //添加托盘上架记录 |
| | | var upShelf = new BllPalletUpShelf() |
| | | { |
| | | TaskNo = exTask.TaskNo, |
| | | TraceNo = asnNo, |
| | | PalletNo = palletNo, |
| | | SkuNo = stockModel.SkuNo, |
| | | SkuName = stockModel.SkuName, |
| | | LotNo = stockModel.LotNo, |
| | | Status = "1", |
| | | |
| | | WareHouseNo = houseNo, |
| | | RoadwayNo = locate.RoadwayNo, |
| | | AreaNo = locate.AreaNo, |
| | | LocatNo = locate.LocatNo, |
| | | |
| | | CreateUser = 0, |
| | | }; |
| | | Db.Insertable(upShelf).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(); |
| | | |
| | | |
| | | var bindModelList = Db.Queryable<BllPalletBind>().Where(m => m.IsDel == "0" && m.Status == "2" |
| | | && m.PalletNo == oldTask.PalletNo && m.TaskNo == oldTaskNo).ToList(); |
| | | foreach (var bindModel in bindModelList) |
| | | { |
| | | if (string.IsNullOrWhiteSpace(bindModel.LocatNo)) |
| | | { |
| | | bindModel.TaskNo = oldTask.TaskNo; |
| | | bindModel.WareHouseNo = locate.WareHouseNo; |
| | | bindModel.RoadwayNo = locate.RoadwayNo; |
| | | bindModel.LocatNo = locate.LocatNo; |
| | | Db.Updateable(bindModel).ExecuteCommand(); |
| | | |
| | | } |
| | | } |
| | | //更改上架信息 |
| | | var upShelfList = Db.Queryable<BllPalletUpShelf>().Where(m => m.IsDel == "0" && m.TaskNo == oldTask.TaskNo && m.PalletNo == palletNo).ToList(); |
| | | foreach (var upShelf in upShelfList) |
| | | { |
| | | upShelf.WareHouseNo = locate.WareHouseNo; |
| | | upShelf.RoadwayNo = locate.RoadwayNo; |
| | | upShelf.LocatNo = locate.LocatNo; |
| | | upShelf.Status = "1"; |
| | | Db.Updateable(upShelf).ExecuteCommand(); |
| | | |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | locate.Status = "2"; |
| | | Db.Updateable(locate).ExecuteCommand(); |
| | | if (palletBindList.Count >= 1) |
| | | { |
| | | foreach (var item in palletBindList) |
| | | { |
| | | item.Status = "1"; |
| | | item.WareHouseNo = locate.WareHouseNo; |
| | | item.RoadwayNo = locate.RoadwayNo; |
| | | item.LocatNo = locate.LocatNo; |
| | | item.TaskNo = oldTaskNo; |
| | | } |
| | | Db.Updateable(palletBindList).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); |
| | | } |
| | | #endregion |
| | | |
| | | |
| | | return comDto; |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | throw new Exception(e.Message); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 申请巷道(密集库) |
| | | /// </summary> |
| | | /// <param name="palletNo"></param> |
| | | /// <param name="houseNo"></param> |
| | | /// <returns></returns> |
| | | /// <exception cref="Exception"></exception> |
| | | public OutCommandDto RequestMiJiRoadWay(string palletNo, string houseNo) |
| | | { |
| | | try |
| | | { |
| | | #region 验证托盘合法性 |
| | | //验证托盘条码是否为空 |
| | | if (string.IsNullOrEmpty(palletNo)) |
| | | { |
| | | throw new Exception("请输入要申请的托盘条码"); |
| | | } |
| | | //验证所属仓库是否为空 |
| | | if (string.IsNullOrEmpty(houseNo)) |
| | | { |
| | | throw new Exception("请选择所属仓库"); |
| | | } |
| | | //获取仓库类型 |
| | | var houseType = Db.Queryable<SysWareHouse>().First(a => a.WareHouseNo == houseNo); |
| | | //验证是否为密集库 |
| | | if (houseType.Type != "3") |
| | | { |
| | | throw new Exception("仓库不是密集库"); |
| | | } |
| | | |
| | | var stock = Db.Queryable<SysPallets>().First(a => a.PalletNo == palletNo);//托盘信息 |
| | | //判断托盘条码是否有效 |
| | | if (stock == null) |
| | | { |
| | | throw new Exception("托盘条码不受WMS管理,不可入库!"); |
| | | } |
| | | #endregion |
| | | |
| | | |
| | | OutCommandDto comDto;//返回wcs的入库命令 |
| | | #region |
| | | |
| | | //查询托盘绑定信息(状态为等待入库/正在执行的) |
| | | var palletBindList = Db.Queryable<BllPalletBind>() |
| | | .Where(m => m.IsDel == "0" && m.PalletNo == palletNo && (m.Status == "0" || m.Status == "1")).ToList(); |
| | | var haveLocate = palletBindList.FirstOrDefault(m => !string.IsNullOrWhiteSpace(m.LocatNo)); |
| | | |
| | | var skuNo = ""; //入库物料 |
| | | var lotNo = ""; //入库批次 |
| | | |
| | | var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == palletNo).ToList(); |
| | | 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 = beingTask.StartLocat, // 起始位置 |
| | | EndLocate = beingTask.EndLocat, // 目标位置 |
| | | EndRoadway = beingTask.EndRoadway, // 目标巷道 |
| | | TaskNo = beingTask.TaskNo, // 任务号 |
| | | TaskType = "0",// 任务类型 (入库) |
| | | OutMode = "", //目标地址 |
| | | Order = 1 |
| | | }; |
| | | if (beingTask.IsSuccess == 0) |
| | | { |
| | | beingTask.IsSuccess = 1; |
| | | Db.Updateable(beingTask).ExecuteCommand(); |
| | | } |
| | | return comDto; |
| | | |
| | | } |
| | | |
| | | |
| | | // 验证是否关联单据,获取托盘上存放的物料 |
| | | 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" || notice.Status == "4") |
| | | { |
| | | 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; |
| | | lotNo = noticeDetail.LotNo; |
| | | |
| | | } |
| | | else if (palletBindList.First().Type == "1")//空托盘 |
| | | { |
| | | skuNo = "100099"; |
| | | } |
| | | } |
| | | else //回流入库 |
| | | { |
| | | if (stockDetail.Count == 0) |
| | | { |
| | | throw new Exception($"{palletNo}托盘不存在库存信息,不可入库!"); |
| | | } |
| | | if (stockDetail.Count(m => !string.IsNullOrWhiteSpace(m.LocatNo)) > 0) |
| | | { |
| | | throw new Exception("当前托盘已在库内,请核实"); |
| | | } |
| | | skuNo = stockDetail.First().SkuNo; |
| | | lotNo = stockDetail.First().LotNo; |
| | | |
| | | #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 = beingTask.StartLocat, // 起始位置 |
| | | 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 |
| | | |
| | | #region 判断该托盘,是否符合回库功能设定的回库规则 |
| | | //获取对应回库规则 |
| | | var function = Db.Queryable<SysFunSetting>().First(a => a.IsDel == "0" |
| | | && a.FunSetNo == "Fun041" && a.IsEnable == "NO"); |
| | | if (function != null) |
| | | { |
| | | //拣货完成后允许托盘回库 |
| | | 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; |
| | | |
| | | #region 根据sku确认区域划分 |
| | | |
| | | //物料信息 |
| | | 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); |
| | | } |
| | | |
| | | |
| | | var roadList = Db.Queryable<SysStorageLocat>().Where(m => m.WareHouseNo == houseNo && areaList.Contains(m.AreaNo)) |
| | | .GroupBy(m => m.RoadwayNo).OrderBy(m => m.RoadwayNo).Select(m => m.RoadwayNo).ToList(); |
| | | |
| | | |
| | | #endregion |
| | | |
| | | var roadNo = allotLocate.GetMiJiSuiTableRoad(houseNo, roadList, areaList, skuNo, lotNo); |
| | | |
| | | 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 + "巷道的入库任务", //关键信息 |
| | | |
| | | }; |
| | | Db.Insertable(exTask).ExecuteCommand(); |
| | | |
| | | var asnNo = ""; |
| | | // 添加托盘绑定表托盘入库任务号 liudl |
| | | if (palletBindList.Count < 1) |
| | | { |
| | | foreach (DataStockDetail stockModel in stockDetail) |
| | | { |
| | | var bindModel = Db.Queryable<BllPalletBind>().First(m => m.IsDel == "0" && m.Status == "2" |
| | | && m.PalletNo == stockModel.PalletNo && m.ASNNo == stockModel.ASNNo && m.ASNDetailNo == stockModel.ASNDetailNo); |
| | | if (bindModel != null && string.IsNullOrWhiteSpace(bindModel.TaskNo)) |
| | | { |
| | | bindModel.TaskNo = taskNo; |
| | | bindModel.WareHouseNo = houseNo; |
| | | bindModel.RoadwayNo = roadNo; |
| | | Db.Updateable(bindModel).ExecuteCommand(); |
| | | asnNo = stockModel.ASNNo; |
| | | } |
| | | |
| | | |
| | | } |
| | | } |
| | | foreach (DataStockDetail stockModel in stockDetail) |
| | | { |
| | | //添加托盘上架记录 |
| | | var upShelf = new BllPalletUpShelf() |
| | | { |
| | | TaskNo = exTask.TaskNo, |
| | | TraceNo = asnNo, |
| | | PalletNo = palletNo, |
| | | SkuNo = stockModel.SkuNo, |
| | | SkuName = stockModel.SkuName, |
| | | LotNo = stockModel.LotNo, |
| | | Status = "1", |
| | | |
| | | WareHouseNo = houseNo, |
| | | RoadwayNo = roadNo, |
| | | AreaNo = "", |
| | | LocatNo = "", |
| | | |
| | | CreateUser = 0, |
| | | }; |
| | | Db.Insertable(upShelf).ExecuteCommand(); |
| | | } |
| | | |
| | | |
| | | if (palletBindList.Count >= 1) |
| | | { |
| | | foreach (var item in palletBindList) |
| | | { |
| | | item.WareHouseNo = houseNo; |
| | | item.RoadwayNo = roadNo; |
| | | item.TaskNo = taskNo; |
| | | } |
| | | Db.Updateable(palletBindList).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); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 1 申请储位 2 申请巷道后 再申请储位储位 |
| | | /// </summary> |
| | | /// <param name="palletNo"></param> |
| | | /// <param name="houseNo"></param> |
| | | /// <param name="roadwayNo"></param> |
| | | /// <returns></returns> |
| | | /// <exception cref="Exception"></exception> |
| | | public OutCommandDto RequestMiJiLocation(string palletNo, string houseNo, string roadwayNo) |
| | | { |
| | | 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 == "0" || m.Status == "1")).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 = ""; //入库物料 |
| | | var isAddTask = true; //是否添加新任务 |
| | | var oldTaskNo = ""; //旧任务号 |
| | | var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == palletNo).ToList(); |
| | | 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("该托盘正在入库,但未查询到任务信息"); |
| | | } |
| | | 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; |
| | | Db.Updateable(beingTask).ExecuteCommand(); |
| | | } |
| | | return comDto; |
| | | } |
| | | else |
| | | { |
| | | if (string.IsNullOrWhiteSpace(roadwayNo)) |
| | | { |
| | | roadwayNo = beingTask.EndRoadway; |
| | | } |
| | | isAddTask = false; |
| | | oldTaskNo = beingTask.TaskNo; |
| | | } |
| | | } |
| | | 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 //回流入库 |
| | | { |
| | | if (stockDetail.Count == 0) |
| | | { |
| | | throw new Exception($"{palletNo}托盘条码不具有箱码信息,不可入库!"); |
| | | } |
| | | if (stockDetail.Count(m => !string.IsNullOrWhiteSpace(m.LocatNo)) > 0) |
| | | { |
| | | throw new Exception("当前托盘已在库内,请核实"); |
| | | } |
| | | skuNo = stockDetail.First().SkuNo; |
| | | |
| | | 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; |
| | | } |
| | | isAddTask = false; |
| | | oldTaskNo = beingTask.TaskNo; |
| | | } |
| | | } |
| | | |
| | | //获取对应回库规则 |
| | | 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(); |
| | | |
| | | #region 申请储位 |
| | | |
| | | SysStorageLocat locate; |
| | | if (isHaveLocateNo) //指定储位 |
| | | { |
| | | locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == haveLocate.LocatNo); |
| | | } |
| | | else |
| | | { |
| | | 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.GetMiJiSuiTableLocate(roadwayNo, areaList); |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | 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 + "的入库任务", //关键信息 |
| | | |
| | | }; |
| | | Db.Insertable(exTask).ExecuteCommand(); |
| | | var asnNo = ""; |
| | | // 添加托盘绑定表托盘入库任务号 liudl |
| | | foreach (DataStockDetail stockModel in stockDetail) |
| | | { |
| | | var bindModel = Db.Queryable<BllPalletBind>().First(m => m.IsDel == "0" && m.Status == "2" |
| | | && m.PalletNo == stockModel.PalletNo && m.ASNNo == stockModel.ASNNo && m.ASNDetailNo == stockModel.ASNDetailNo); |
| | | if (bindModel != null && string.IsNullOrWhiteSpace(bindModel.TaskNo)) |
| | | { |
| | | bindModel.TaskNo = taskNo; |
| | | bindModel.WareHouseNo = locate.WareHouseNo; |
| | | bindModel.RoadwayNo = locate.RoadwayNo; |
| | | bindModel.LocatNo = locate.LocatNo; |
| | | Db.Updateable(bindModel).ExecuteCommand(); |
| | | asnNo = stockModel.ASNNo; |
| | | } |
| | | } |
| | | foreach (DataStockDetail stockModel in stockDetail) |
| | | { |
| | | //添加托盘上架记录 |
| | | var upShelf = new BllPalletUpShelf() |
| | | { |
| | | TaskNo = exTask.TaskNo, |
| | | TraceNo = asnNo, |
| | | PalletNo = palletNo, |
| | | SkuNo = stockModel.SkuNo, |
| | | SkuName = stockModel.SkuName, |
| | | LotNo = stockModel.LotNo, |
| | | Status = "1", |
| | | |
| | | WareHouseNo = houseNo, |
| | | RoadwayNo = locate.RoadwayNo, |
| | | AreaNo = locate.AreaNo, |
| | | LocatNo = locate.LocatNo, |
| | | |
| | | CreateUser = 0, |
| | | }; |
| | | Db.Insertable(upShelf).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(); |
| | | |
| | | |
| | | var bindModelList = Db.Queryable<BllPalletBind>().Where(m => m.IsDel == "0" && m.Status == "2" |
| | | && m.PalletNo == oldTask.PalletNo && m.TaskNo == oldTaskNo).ToList(); |
| | | foreach (var bindModel in bindModelList) |
| | | { |
| | | if (string.IsNullOrWhiteSpace(bindModel.LocatNo)) |
| | | { |
| | | bindModel.TaskNo = oldTask.TaskNo; |
| | | bindModel.WareHouseNo = locate.WareHouseNo; |
| | | bindModel.RoadwayNo = locate.RoadwayNo; |
| | | bindModel.LocatNo = locate.LocatNo; |
| | | Db.Updateable(bindModel).ExecuteCommand(); |
| | | |
| | | } |
| | | } |
| | | //更改上架信息 |
| | | var upShelfList = Db.Queryable<BllPalletUpShelf>().Where(m => m.IsDel == "0" && m.TaskNo == oldTask.TaskNo && m.PalletNo == palletNo).ToList(); |
| | | foreach (var upShelf in upShelfList) |
| | | { |
| | | upShelf.WareHouseNo = locate.WareHouseNo; |
| | | upShelf.RoadwayNo = locate.RoadwayNo; |
| | | upShelf.LocatNo = locate.LocatNo; |
| | | upShelf.Status = "1"; |
| | | Db.Updateable(upShelf).ExecuteCommand(); |
| | | |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | locate.Status = "2"; |
| | | Db.Updateable(locate).ExecuteCommand(); |
| | | if (palletBindList.Count >= 1) |
| | | { |
| | | foreach (var item in palletBindList) |
| | | { |
| | | item.Status = "1"; |
| | | item.WareHouseNo = locate.WareHouseNo; |
| | | item.RoadwayNo = locate.RoadwayNo; |
| | | item.LocatNo = locate.LocatNo; |
| | | item.TaskNo = oldTaskNo; |
| | | } |
| | | Db.Updateable(palletBindList).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); |
| | | } |
| | | #endregion |
| | | |
| | | |
| | | return comDto; |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | throw new Exception(e.Message); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 下发入库申请储位任务(下发==》WCS) |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | | /// <returns></returns> |
| | | public void IssueAsnTask(OutCommandDto model,string url) |
| | | { |
| | | try |
| | | { |
| | | |
| | | // 将任务发送至AGV 正式运行程序放开 |
| | | var jsonData = JsonConvert.SerializeObject(model); |
| | | string response = ""; |
| | | |
| | | try |
| | | { |
| | | var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss") |
| | | response = HttpHelper.DoPost(url, jsonData, "下发给WCS入库命令", "WCS"); |
| | | var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss") |
| | | var list = new List<string>() { model.TaskNo }; |
| | | //解析返回数据 |
| | | var wcsModel = JsonConvert.DeserializeObject<WcsModel>(response); |
| | | if (wcsModel.StatusCode == 0) |
| | | { |
| | | //更改任务的发送返回时间// |
| | | new TaskServer().EditTaskIssueOk(list, time1, time2); |
| | | |
| | | } |
| | | if (wcsModel.StatusCode == -1) |
| | | { |
| | | new TaskServer().EditTaskIssueNo(list, time1, time2, wcsModel.Msg); |
| | | throw new Exception(wcsModel.Msg); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | throw new Exception(ex.Message); |
| | | } |
| | | } |
| | | catch (Exception) |
| | | { |
| | | throw; |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | #endregion |
| | | |
| | | // 申请巷道 |
| | | |
| | | #region 申请储位、巷道 任务完成、取消 |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// 申请巷道 (立体库) |
| | | /// </summary> |
| | | /// <param name="palletNo"></param> |
| | | /// <param name="houseNo"></param> |
| | | /// <returns></returns> |
| | | /// <exception cref="Exception"></exception> |
| | | public OutCommandDto RequestRoadWay(string palletNo, string houseNo) |
| | | { |
| | | try |
| | |
| | | } |
| | | //验证是否为平库入库 |
| | | var houseType = Db.Queryable<SysWareHouse>().First(a => a.WareHouseNo == houseNo);//获取仓库类型 |
| | | //验证是否为平库入库 |
| | | if (houseType.Type == "2") |
| | | //验证是否为立体库入库 |
| | | if (houseType.Type != "1") |
| | | { |
| | | throw new Exception("平库请使用PDA手持进行平库入库"); |
| | | throw new Exception("仓库类型错误,请选择立体库仓库"); |
| | | } |
| | | |
| | | var stock = Db.Queryable<SysPallets>().First(a => a.PalletNo == palletNo);//托盘信息 |
| | |
| | | #endregion |
| | | |
| | | |
| | | OutCommandDto comDto;//返回wcs的入库命令 |
| | | var isHaveLocateNo = false; // 是否已有指定储位 |
| | | OutCommandDto comDto;//返回wcs的入库命令 |
| | | #region |
| | | |
| | | //查询托盘绑定信息(状态为等待入库的) |
| | |
| | | var skuNo = ""; //入库物料 |
| | | var isAddTask = true; //是否添加新任务 |
| | | var oldTaskNo = ""; //旧任务号 |
| | | |
| | | var isHaveLocateNo = false; |
| | | var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == palletNo).ToList(); |
| | | if (palletBindList.Count >= 1) //正常入库 |
| | | { |
| | |
| | | } |
| | | } |
| | | |
| | | //1 申请储位 2 申请巷道后 再申请储位储位 |
| | | public OutCommandDto RequestLocation(string palletNo, string houseNo, string roadwayNo) |
| | | { |
| | | 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 == "0" || m.Status == "1")).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 = ""; //入库物料 |
| | | var isAddTask = true; //是否添加新任务 |
| | | var oldTaskNo = ""; //旧任务号 |
| | | var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == palletNo).ToList(); |
| | | 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("该托盘正在入库,但未查询到任务信息"); |
| | | } |
| | | 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; |
| | | Db.Updateable(beingTask).ExecuteCommand(); |
| | | } |
| | | return comDto; |
| | | } |
| | | else |
| | | { |
| | | if (string.IsNullOrWhiteSpace(roadwayNo)) |
| | | { |
| | | roadwayNo = beingTask.EndRoadway; |
| | | } |
| | | isAddTask = false; |
| | | oldTaskNo = beingTask.TaskNo; |
| | | } |
| | | } |
| | | 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 //回流入库 |
| | | { |
| | | if (stockDetail.Count == 0) |
| | | { |
| | | throw new Exception($"{palletNo}托盘条码不具有箱码信息,不可入库!"); |
| | | } |
| | | if (stockDetail.Count(m => !string.IsNullOrWhiteSpace(m.LocatNo)) > 0) |
| | | { |
| | | throw new Exception("当前托盘已在库内,请核实"); |
| | | } |
| | | skuNo = stockDetail.First().SkuNo; |
| | | |
| | | 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; |
| | | } |
| | | isAddTask = false; |
| | | oldTaskNo = beingTask.TaskNo; |
| | | } |
| | | } |
| | | |
| | | //获取对应回库规则 |
| | | 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(); |
| | | |
| | | #region 申请储位 |
| | | |
| | | SysStorageLocat locate; |
| | | if (isHaveLocateNo) //指定储位 |
| | | { |
| | | locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == haveLocate.LocatNo); |
| | | } |
| | | else |
| | | { |
| | | 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); |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | 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 + "的入库任务", //关键信息 |
| | | |
| | | }; |
| | | Db.Insertable(exTask).ExecuteCommand(); |
| | | var asnNo = ""; |
| | | // 添加托盘绑定表托盘入库任务号 liudl |
| | | foreach (DataStockDetail stockModel in stockDetail) |
| | | { |
| | | var bindModel = Db.Queryable<BllPalletBind>().First(m => m.IsDel == "0" && m.Status == "2" |
| | | && m.PalletNo == stockModel.PalletNo && m.ASNNo == stockModel.ASNNo && m.ASNDetailNo == stockModel.ASNDetailNo); |
| | | if (bindModel != null && string.IsNullOrWhiteSpace(bindModel.TaskNo)) |
| | | { |
| | | bindModel.TaskNo = taskNo; |
| | | bindModel.WareHouseNo = locate.WareHouseNo; |
| | | bindModel.RoadwayNo = locate.RoadwayNo; |
| | | bindModel.LocatNo = locate.LocatNo; |
| | | Db.Updateable(bindModel).ExecuteCommand(); |
| | | asnNo = stockModel.ASNNo; |
| | | } |
| | | } |
| | | foreach (DataStockDetail stockModel in stockDetail) |
| | | { |
| | | //添加托盘上架记录 |
| | | var upShelf = new BllPalletUpShelf() |
| | | { |
| | | TaskNo = exTask.TaskNo, |
| | | TraceNo = asnNo, |
| | | PalletNo = palletNo, |
| | | SkuNo = stockModel.SkuNo, |
| | | SkuName = stockModel.SkuName, |
| | | LotNo = stockModel.LotNo, |
| | | Status = "1", |
| | | |
| | | WareHouseNo = houseNo, |
| | | RoadwayNo = locate.RoadwayNo, |
| | | AreaNo = locate.AreaNo, |
| | | LocatNo = locate.LocatNo, |
| | | |
| | | CreateUser = 0, |
| | | }; |
| | | Db.Insertable(upShelf).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(); |
| | | |
| | | |
| | | var bindModelList = Db.Queryable<BllPalletBind>().Where(m => m.IsDel == "0" && m.Status == "2" |
| | | && m.PalletNo == oldTask.PalletNo && m.TaskNo == oldTaskNo).ToList(); |
| | | foreach (var bindModel in bindModelList) |
| | | { |
| | | if (string.IsNullOrWhiteSpace(bindModel.LocatNo)) |
| | | { |
| | | bindModel.TaskNo = oldTask.TaskNo; |
| | | bindModel.WareHouseNo = locate.WareHouseNo; |
| | | bindModel.RoadwayNo = locate.RoadwayNo; |
| | | bindModel.LocatNo = locate.LocatNo; |
| | | Db.Updateable(bindModel).ExecuteCommand(); |
| | | |
| | | } |
| | | } |
| | | //更改上架信息 |
| | | var upShelfList = Db.Queryable<BllPalletUpShelf>().Where(m => m.IsDel == "0" && m.TaskNo == oldTask.TaskNo && m.PalletNo == palletNo).ToList(); |
| | | foreach (var upShelf in upShelfList) |
| | | { |
| | | upShelf.WareHouseNo = locate.WareHouseNo; |
| | | upShelf.RoadwayNo = locate.RoadwayNo; |
| | | upShelf.LocatNo = locate.LocatNo; |
| | | upShelf.Status = "1"; |
| | | Db.Updateable(upShelf).ExecuteCommand(); |
| | | |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | locate.Status = "2"; |
| | | Db.Updateable(locate).ExecuteCommand(); |
| | | if (palletBindList.Count >= 1) |
| | | { |
| | | foreach (var item in palletBindList) |
| | | { |
| | | item.Status = "1"; |
| | | item.WareHouseNo = locate.WareHouseNo; |
| | | item.RoadwayNo = locate.RoadwayNo; |
| | | item.LocatNo = locate.LocatNo; |
| | | item.TaskNo = oldTaskNo; |
| | | } |
| | | Db.Updateable(palletBindList).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); |
| | | } |
| | | #endregion |
| | | |
| | | |
| | | return comDto; |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | throw new Exception(e.Message); |
| | | } |
| | | } |
| | | |
| | | #region 旧版本申请储位 |
| | | |
| | | //申请储位 |
| | | //public OutCommandDto RequestLocation(string palletNo, string houseNo, string roadwayNo) |
| | | //{ |
| | | // 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; |
| | | // if (!string.IsNullOrWhiteSpace(stockDetail.First().WareHouseNo)) |
| | | // { |
| | | // if (stockDetail.First().WareHouseNo == "W01")//立库 |
| | | // { |
| | | // throw new Exception($"{palletNo}托盘上在立库中有库存储位信息,请核实!"); |
| | | // } |
| | | |
| | | // if (stockDetail.First().WareHouseNo == "W02")//平库 |
| | | // { |
| | | // var locatePingKu = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == stockDetail.First().LocatNo); |
| | | // if (locatePingKu != null) |
| | | // { |
| | | // locatePingKu.Status = "0"; |
| | | // Db.Updateable(locatePingKu).ExecuteCommand(); |
| | | // } |
| | | // } |
| | | // } |
| | | |
| | | |
| | | // //获取对应回库规则 |
| | | // 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; |
| | | // if (isHaveLocateNo) //指定储位 |
| | | // { |
| | | // locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == haveLocate.LocatNo); |
| | | // } |
| | | // else |
| | | // { |
| | | // 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 |
| | | // { |
| | | // //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 //入库任务 |
| | | // { |
| | | // 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 + "的入库任务", //关键信息 |
| | | |
| | | // }; |
| | | // Db.Insertable(exTask).ExecuteCommand(); |
| | | // locate.Status = "2"; |
| | | // Db.Updateable(locate).ExecuteCommand(); |
| | | // if (palletBindList.Count >= 1) |
| | | // { |
| | | // foreach (var item in palletBindList) |
| | | // { |
| | | // item.Status = "1"; |
| | | // item.WareHouseNo = locate.WareHouseNo; |
| | | // item.RoadwayNo = locate.RoadwayNo; |
| | | // item.LocatNo = locate.LocatNo; |
| | | // item.TaskNo = taskNo; |
| | | // } |
| | | // Db.Updateable(palletBindList).ExecuteCommand(); |
| | | // } |
| | | // Db.CommitTran(); |
| | | // comDto = new OutCommandDto() |
| | | // { |
| | | // PalletNo = palletNo,//托盘号 |
| | | // StartRoadway = "", |
| | | // StartLocate = "", // 起始位置 |
| | | // EndLocate = locate.LocatNo, // 目标位置 |
| | | // EndRoadway = locate.RoadwayNo, // 目标巷道 |
| | | // TaskNo = exTask.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); |
| | | // } |
| | | //} |
| | | |
| | | #endregion |
| | | |
| | | //入库完成(wcs反馈、wms手动完成) |
| | | |
| | | /// <summary> |
| | | /// 入库完成(wcs反馈、wms手动完成) |
| | | /// </summary> |
| | | /// <param name="taskNo"></param> |
| | | /// <param name="userId"></param> |
| | | /// <exception cref="Exception"></exception> |
| | | public void ArrivalSuccess(string taskNo, int userId) |
| | | { |
| | | try |
| | |
| | | throw new Exception(e.Message); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 满入异常 |
| | | /// </summary> |
| | |
| | | } |
| | | } |
| | | |
| | | //手动取消入库任务 |
| | | /// <summary> |
| | | /// 手动取消入库任务 |
| | | /// </summary> |
| | | /// <param name="taskNo"></param> |
| | | /// <param name="userId"></param> |
| | | /// <exception cref="Exception"></exception> |
| | | public void CancelAsnTask(string taskNo, int userId) |
| | | { |
| | | try |
| | |
| | | throw new Exception(e.Message); |
| | | } |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | #region 数据归档 |
| | | public List<PalletBindDto> GetArchivingPalletBindList(PalletBindVm model, out int count) |
| | | { |