using Model.InterFaceModel; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Text; using WMS.BLL.Logic; using WMS.BLL.LogServer; using WMS.DAL; using WMS.Entity.BllAsnEntity; using WMS.Entity.BllSoEntity; using WMS.Entity.Context; using WMS.Entity.DataEntity; using WMS.Entity.LogEntity; using WMS.Entity.SysEntity; using WMS.IBLL; namespace WMS.BLL { public class HttpServer:IHttpServer { private static readonly SqlSugarScope Db = DataContext.Db; public HttpServer() { } /// /// 申请储位 (立体库) /// /// /// /// /// /// 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().First(a => a.WareHouseNo == houseNo);//获取仓库类型 //验证是否为立体库入库 if (houseType.Type != "1") { throw new Exception("仓库类型错误,请选择立体库仓库"); } OutCommandDto comDto;//返回wcs的入库命令 var stock = Db.Queryable().First(a => a.PalletNo == palletNo);//托盘信息 //判断托盘条码是否有效 if (stock == null) throw new Exception("托盘条码不受WMS管理,不可入库!"); #region var skuList = Db.Queryable().Where(m => m.IsDel == "0").ToList(); //物料类别信息 var skuCategoryList = Db.Queryable().Where(m => m.IsDel == "0").ToList(); var skuNo = ""; //入库物料 var starLocate = ""; // 起始储位 var stockDetail = Db.Queryable().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("成品物料请入成品库"); } } var upShelfOldList = Db.Queryable().Where(m => m.IsDel == "0" && m.PalletNo == palletNo && (m.Status == "0" || m.Status == "1")).ToList(); if (upShelfOldList != null) //查询到入库信息 { var upShelfOld = upShelfOldList.First(); var beingTask = Db.Queryable().First(m => m.IsDel == "0" && m.TaskNo == upShelfOld.TaskNo); if (beingTask == null) { throw new Exception("该托盘正在入库,但未查询到任务信息"); } if (!string.IsNullOrWhiteSpace(beingTask.EndLocat)) { comDto = new OutCommandDto() { TaskNo = beingTask.TaskNo, // 任务号 TaskType = "0",// 任务类型 PalletNo = palletNo,//托盘号 StartRoadway = beingTask.StartRoadway, // 起始巷道 StartLocate = beingTask.StartLocat, // 起始位置 EndLocate = beingTask.EndLocat, // 目标位置 EndRoadway = beingTask.EndRoadway, // 目标巷道 Order = 999, Type = PLCTypeEnum.AGV }; if (beingTask.IsSuccess == 0) { beingTask.IsSuccess = 1; } beingTask.Status = "1"; Db.Updateable(beingTask).ExecuteCommand(); foreach (var item in upShelfOldList) { if (item.Status == "0") { upShelfOld.Status = "1"; Db.Updateable(upShelfOld).ExecuteCommand(); } } return comDto; } else { throw new Exception("查询到任务但目的储位为空"); } } else //申请入库 { if (stockDetail.Count == 0) { throw new Exception($"{palletNo}托盘条码不具有箱码信息,不可入库!"); } if (stockDetail.Count(m => !string.IsNullOrWhiteSpace(m.LocatNo)) == 0) { throw new Exception("当前托盘没有在平库储位上,请核实"); } starLocate = stockDetail.First().LocatNo; var pingAreaStr = Db.Queryable().Where(m => m.IsDel == "0" && m.WareHouseNo == "W04" && m.AreaNo != "B06" && m.AreaNo != "B07").Select(m => m.AreaNo).ToList(); var pingLocateInfo = Db.Queryable().First(m => m.LocatNo == starLocate && pingAreaStr.Contains(m.AreaNo) && m.IsDel == "0"); if (pingLocateInfo == null) { throw new Exception("当前托盘所在的储位没有在系统中找到信息"); } if (pingLocateInfo.Status != "1") { throw new Exception("当前托盘所在的储位状态错误,不是空储位"); } skuNo = stockDetail.First().SkuNo; var beingTask = Db.Queryable().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 = beingTask.StartLocat, // 起始位置 EndLocate = beingTask.EndLocat, // 目标位置 EndRoadway = beingTask.EndRoadway, // 目标巷道 TaskNo = beingTask.TaskNo, // 任务号 TaskType = "0",// 任务类型 (出库) OutMode = "", //目标地址 Order = 1, Type = PLCTypeEnum.AGV }; if (beingTask.IsSuccess == 0) { beingTask.IsSuccess = 1; } beingTask.Status = "1"; Db.Updateable(beingTask).ExecuteCommand(); return comDto; } else { throw new Exception("查询到任务但目的储位为空"); } } //获取对应回库规则 var function = Db.Queryable().First(a => a.IsDel == "0" && a.FunSetName == "托盘回库验证" && a.IsEnable == "NO"); #region 托盘回库规则 if (function != null) { //拣货完成后允许托盘回库 if (function.SetValue == "CompletePick") { var allot = Db.Queryable().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; 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(); foreach (var item in areaStr) { areaList.Add(item); } locate = allotLocate.GetSuiTableLocate(houseNo, areaList, ""); #endregion Db.BeginTran(); try { //添加巷道使用记录 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 inTask = new LogTask //入库任务 { TaskNo = taskNo, Sender = "WMS", Receiver = "WCS", IsSuccess = 1, //是否下发成功 0失败 1成功 SendDate = DateTime.Now, //发送时间 BackDate = DateTime.Now, //返回时间 StartRoadway = "", // 起始巷道 StartLocat = starLocate,//起始位置 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(inTask).ExecuteCommand(); var asnNo = ""; // 添加托盘绑定表托盘入库任务号 liudl foreach (DataStockDetail stockModel in stockDetail) { var bindModel = Db.Queryable().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 = inTask.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(); } locate.Status = "2"; Db.Updateable(locate).ExecuteCommand(); Db.CommitTran(); comDto = new OutCommandDto() { TaskNo = taskNo, // 任务号 TaskType = "0",// 任务类型 PalletNo = palletNo,//托盘号 StartRoadway = inTask.StartRoadway, StartLocate = inTask.StartLocat, // 起始位置 EndLocate = inTask.EndLocat, // 目标位置 EndRoadway = inTask.EndRoadway, // 目标巷道 Order = 999, Type = PLCTypeEnum.AGV }; } catch (Exception ex) { Db.RollbackTran(); throw new Exception(ex.Message); } #endregion return comDto; } catch (Exception e) { throw new Exception(e.Message); } } /// /// 申请巷道(密集库) /// /// /// /// /// 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().First(a => a.WareHouseNo == houseNo); //验证是否为密集库 if (houseType.Type != "3") { throw new Exception("仓库不是密集库"); } var stock = Db.Queryable().First(a => a.PalletNo == palletNo);//托盘信息 //判断托盘条码是否有效 if (stock == null) { throw new Exception("托盘条码不受WMS管理,不可入库!"); } #endregion OutCommandDto comDto;//返回wcs的入库命令 #region 代码块 //查询托盘绑定信息(状态为等待入库/正在执行的) var skuNo = ""; //入库物料 var lotNo = ""; //入库批次 //物料信息 var skuList = Db.Queryable().Where(m => m.IsDel == "0").ToList(); //物料类别信息 var skuCategoryList = Db.Queryable().Where(m => m.IsDel == "0").ToList(); //托盘库存信息 var stockDetail = Db.Queryable().Where(m => m.PalletNo == palletNo).ToList(); //验证物料是否有成品 foreach (var item in stockDetail) { var skuItem = skuList.First(m => m.SkuNo == item.SkuNo); if (skuItem.SkuNo == "100099") { continue; } if (skuItem.Type != "2") { throw new Exception("托盘上有不是成品的物料"); } } var upShelfOld = Db.Queryable().First(m => m.IsDel == "0" && m.PalletNo == palletNo && (m.Status == "0" || m.Status == "1")); if (upShelfOld != null) //正常入库 { var beingTask = Db.Queryable().First(m => m.IsDel == "0" && m.TaskNo == upShelfOld.TaskNo); if (beingTask == null) { throw new Exception("该托盘正在入库,但未查询到任务信息"); } if (!string.IsNullOrWhiteSpace(beingTask.EndRoadway)) { comDto = new OutCommandDto() { TaskNo = beingTask.TaskNo, // 任务号 TaskType = "0",// 任务类型 PalletNo = palletNo,//托盘号 StartRoadway = beingTask.StartRoadway, // 起始巷道 StartLocate = beingTask.StartLocat, // 起始位置 EndLocate = beingTask.EndLocat, // 目标位置 EndRoadway = beingTask.EndRoadway, // 目标巷道 Order = 999, Type = PLCTypeEnum.ConveyorLine }; if (beingTask.IsSuccess == 0) { beingTask.IsSuccess = 1; } beingTask.Status = "1"; Db.Updateable(beingTask).ExecuteCommand(); if (upShelfOld.Status == "0") { upShelfOld.Status = "1"; Db.Updateable(upShelfOld).ExecuteCommand(); } return comDto; } else { throw new Exception("查询到任务但目的巷道为空"); } } 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 function = Db.Queryable().First(a => a.IsDel == "0"&& a.FunSetNo == "Fun041" && a.IsEnable == "NO"); if (function != null) { //拣货完成后允许托盘回库 var allot = Db.Queryable().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 根据sku确认区域划分 //物料信息 var sku = Db.Queryable().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().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(); foreach (var item in areaStr) { areaList.Add(item); } //巷道组信息 var roadList = Db.Queryable().Where(m => m.IsDel == "0" && m.WareHouseNo == houseNo && areaList.Contains(m.AreaNo) && !string.IsNullOrWhiteSpace(m.RoadwayNo)) .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 inTask = new LogTask //入库任务 { TaskNo = taskNo, Sender = "WMS", Receiver = "WCS", IsSuccess = 0, //是否下发成功 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(inTask).ExecuteCommand(); var asnNo = ""; // 添加托盘绑定表托盘入库任务号 liudl foreach (DataStockDetail stockModel in stockDetail) { var bindModel = Db.Queryable().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 = inTask.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(); } Db.CommitTran(); comDto = new OutCommandDto() { TaskNo = taskNo, // 任务号 TaskType = "0",// 任务类型:入库任务 PalletNo = palletNo,//托盘号 StartRoadway = inTask.StartRoadway,// 起始巷道 StartLocate = inTask.StartLocat, // 起始位置 EndLocate = inTask.EndLocat, // 目标位置 EndRoadway = inTask.EndRoadway, // 目标巷道 Order = 999, Type = PLCTypeEnum.ConveyorLine }; } catch (Exception ex) { Db.RollbackTran(); throw new Exception(ex.Message); } #endregion return comDto; } catch (Exception e) { throw new Exception(e.Message); } } /// /// 1 申请储位 (申请巷道后 再申请储位储位 ) /// /// /// /// /// /// public OutCommandDto RequestMiJiLocation(string palletNo, string houseNo, string roadwayNo) { try { #region 验证 //验证托盘条码是否为空 if (string.IsNullOrEmpty(palletNo)) { throw new Exception("请输入要申请的托盘条码"); } //验证所属仓库是否为空 if (string.IsNullOrEmpty(houseNo)) { throw new Exception("请选择所属仓库"); } //验证所属仓库是否为空 if (string.IsNullOrEmpty(roadwayNo)) { throw new Exception("巷道不能为空"); } //获取仓库类型 var houseType = Db.Queryable().First(a => a.WareHouseNo == houseNo); //验证是否为密集库 if (houseType.Type != "3") { throw new Exception("仓库不是密集库"); } var stock = Db.Queryable().First(a => a.PalletNo == palletNo);//托盘信息 //判断托盘条码是否有效 if (stock == null) { throw new Exception("托盘条码不受WMS管理,不可入库!"); } #endregion OutCommandDto comDto;//返回wcs的入库命令 #region //查询托盘绑定信息(状态为等待入库的) var skuList = Db.Queryable().Where(m => m.IsDel == "0").ToList(); //物料类别信息 var skuCategoryList = Db.Queryable().Where(m => m.IsDel == "0").ToList(); var skuNo = "";//入库物料 var isAddTask = true; //是否添加新任务 var oldTaskNo = ""; //旧任务号 var stockDetail = Db.Queryable().Where(m => m.PalletNo == palletNo).ToList(); //验证物料是否有成品 foreach (var item in stockDetail) { var skuItem = skuList.First(m => m.SkuNo == item.SkuNo); if (skuItem.SkuNo == "100099") { continue; } if (skuItem.Type != "2") { throw new Exception("托盘上有不是成品的物料"); } } var upShelfOld = Db.Queryable().First(m => m.IsDel == "0" && m.PalletNo == palletNo && (m.Status == "0" || m.Status == "1")); if (upShelfOld != null) //有上架入库信息 { var beingTask = Db.Queryable().First(m => m.IsDel == "0" && m.TaskNo == upShelfOld.TaskNo); if (beingTask == null) { throw new Exception("该托盘正在入库,但未查询到任务信息"); } if (!string.IsNullOrWhiteSpace(beingTask.EndLocat)) { comDto = new OutCommandDto() { TaskNo = beingTask.TaskNo, // 任务号 TaskType = "0",// 任务类型 PalletNo = palletNo,//托盘号 StartRoadway = beingTask.StartRoadway, // 起始巷道 StartLocate = beingTask.StartRoadway, // 起始位置 EndLocate = beingTask.EndLocat, // 目标位置 EndRoadway = beingTask.EndRoadway, // 目标巷道 Order = 999, Type = PLCTypeEnum.ShuttleCar, }; if (beingTask.IsSuccess == 0) { beingTask.IsSuccess = 1; Db.Updateable(beingTask).ExecuteCommand(); } if (upShelfOld.Status == "0") { upShelfOld.Status = "1"; Db.Updateable(upShelfOld).ExecuteCommand(); } return comDto; } else { isAddTask = false; oldTaskNo = beingTask.TaskNo; skuNo = upShelfOld.SkuNo;//入库物料 } } 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 function = Db.Queryable().First(a => a.IsDel == "0" && a.FunSetName == "托盘回库验证" && a.IsEnable == "NO"); #region 托盘回库规则 if (function != null) { //拣货完成后允许托盘回库 if (function.SetValue == "CompletePick") { var allot = Db.Queryable().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; 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(); foreach (var item in areaStr) { areaList.Add(item); } locate = allotLocate.GetMiJiSuiTableLocate(roadwayNo, areaList); if (locate == null) { throw new Exception($"没有空储位"); } #endregion Db.BeginTran(); try { if (isAddTask) { var taskNo = new Common().GetMaxNo("TK"); var inTask = 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(inTask).ExecuteCommand(); var asnNo = ""; // 添加托盘绑定表托盘入库任务号 liudl foreach (DataStockDetail stockModel in stockDetail) { var bindModel = Db.Queryable().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 = inTask.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().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().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().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(); Db.CommitTran(); comDto = new OutCommandDto() { TaskNo = oldTaskNo, // 任务号 TaskType = "0",// 任务类型 PalletNo = palletNo,//托盘号 StartRoadway = "", StartLocate = "", // 起始位置 EndLocate = locate.LocatNo, // 目标位置 EndRoadway = locate.RoadwayNo, // 目标巷道 Order = 999, //目标地址 Type = PLCTypeEnum.ShuttleCar }; } catch (Exception ex) { Db.RollbackTran(); throw new Exception(ex.Message); } #endregion return comDto; } catch (Exception e) { throw new Exception(e.Message); } } /// /// agv走出储位修改储位信息,仅限平库储位 /// /// /// public void UpLocateByAgvOut(string taskNo, int userId) { try { var task = Db.Queryable().First(m => m.IsDel == "0" && m.TaskNo == taskNo); if (task == null) { throw new Exception("未查询到任务信息"); } if (task.Status != "1") { throw new Exception("当前任务已完成"); } if (userId != 0) { //添加操作日志记录 var k = new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", taskNo, "完成", $"点击完成按钮、完成任务号为:{taskNo}的任务", userId); } var locate = Db.Queryable().First(m => m.LocatNo == task.StartLocat); if (locate == null) { throw new Exception($"未查询到任务中的储位信息"); } var pingAreaStr = Db.Queryable().Where(m => m.IsDel == "0" && m.WareHouseNo == "W04").Select(m => m.AreaNo).ToList(); var pingLocateInfo = Db.Queryable().First(m => m.LocatNo == locate.LocatNo && pingAreaStr.Contains(m.AreaNo) && m.IsDel == "0"); if (pingLocateInfo == null) { throw new Exception("当前任务起始储位不在平库储位"); } var stockDetail = Db.Queryable().Where(m => m.IsDel == "0" && m.PalletNo == task.PalletNo).ToList(); foreach (var item in stockDetail) { item.WareHouseNo = ""; item.RoadwayNo = ""; item.AreaNo = ""; item.LocatNo = ""; } Db.Updateable(stockDetail).ExecuteCommand(); locate.Status = "0"; Db.Updateable(locate).ExecuteCommand(); } catch (Exception e) { throw new Exception(e.Message); } } /// /// 入库任务完成JC34 /// /// /// /// public void ArrivalSuccess2(string taskNo, int userId) { try { //正常入库 var task = Db.Queryable().First(m => m.IsDel == "0" && m.TaskNo == taskNo); if (task == null) { throw new Exception("未查询到任务信息"); } if (task.Status == "2") { throw new Exception("当前任务已完成"); } var stockDetail = Db.Queryable().Where(m => m.PalletNo == task.PalletNo).ToList(); var upShelf = Db.Queryable().First(m => m.TaskNo == taskNo); if (upShelf == null) { throw new Exception("没有找到托盘上架信息"); } //当前任务中的储位信息 var locate = Db.Queryable().First(m => m.LocatNo == task.EndLocat); if (locate == null) { throw new Exception($"未查询到任务中的储位信息"); } Db.BeginTran(); task.Status = "2";//任务状态 task.IsSend = 0; task.IsCancel = 0; task.IsFinish = 0; task.FinishDate = DateTime.Now;//完成时间 Db.Updateable(task).ExecuteCommand(); if (userId != 0) { //添加操作日志记录 var k = new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", taskNo, "完成", $"点击完成按钮、完成任务号为:{taskNo}的任务", userId); } //判断是否是回流入库完成 if (!stockDetail.Any()) { throw new Exception("没有查询到库存信息"); } foreach (var item in stockDetail) { item.WareHouseNo = locate.WareHouseNo; item.RoadwayNo = locate.RoadwayNo; item.AreaNo = locate.AreaNo; item.LocatNo = locate.LocatNo; item.UpdateTime = DateTime.Now; if (userId != 0) { item.UpdateUser = userId; } } upShelf.Status = "2"; Db.Updateable(upShelf).ExecuteCommand(); locate.Status = "1"; Db.Updateable(locate).ExecuteCommand(); Db.Updateable(stockDetail).ExecuteCommand(); Db.CommitTran(); } catch (Exception e) { Db.RollbackTran(); throw new Exception(e.Message); } } /// /// 移库任务完成JC34 /// /// /// /// public void MoveSuccess(string taskNo, int userId) { try { Db.BeginTran(); //正常入库 var task = Db.Queryable().First(m => m.IsDel == "0" && m.TaskNo == taskNo); if (task == null) { throw new Exception("未查询到任务信息"); } if (task.Status == "2") { throw new Exception("当前任务已完成"); } var stockDetail = Db.Queryable().Where(m => m.PalletNo == task.PalletNo).ToList(); //判断是否是回流入库完成 if (!stockDetail.Any()) { throw new Exception("没有查询到库存信息"); } //当前任务中的储位信息 var locate = Db.Queryable().First(m => m.LocatNo == task.StartLocat); if (locate == null) { throw new Exception($"未查询到任务中的起始储位信息"); } //当前任务中的储位信息 var locate2 = Db.Queryable().First(m => m.LocatNo == task.EndLocat); if (locate2 == null) { throw new Exception($"未查询到任务中的目标储位信息"); } task.Status = "2";//任务状态 task.IsSend = 0; task.IsCancel = 0; task.IsFinish = 0; task.FinishDate = DateTime.Now;//完成时间 Db.Updateable(task).ExecuteCommand(); if (userId != 0) { //添加操作日志记录 var k = new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", taskNo, "完成", $"点击完成按钮、完成任务号为:{taskNo}的任务", userId); } foreach (var item in stockDetail) { if (locate2.LocatNo == "B040101") { item.WareHouseNo = ""; item.RoadwayNo = ""; item.AreaNo = ""; item.LocatNo = ""; } else { item.WareHouseNo = locate2.WareHouseNo; item.RoadwayNo = locate2.RoadwayNo; item.AreaNo = locate2.AreaNo; item.LocatNo = locate2.LocatNo; } item.UpdateTime = DateTime.Now; if (userId != 0) { item.UpdateUser = userId; } } if (locate.WareHouseNo != "W04") { locate.Status = "0"; Db.Updateable(locate).ExecuteCommand(); } if (locate2.LocatNo == "B040101") { locate2.Status = "0"; Db.Updateable(locate2).ExecuteCommand(); } else { locate2.Status = "1"; Db.Updateable(locate).ExecuteCommand(); } Db.Updateable(stockDetail).ExecuteCommand(); Db.CommitTran(); } catch (Exception e) { Db.RollbackTran(); throw new Exception(e.Message); } } } }