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 upShelfOld = Db.Queryable().First(m => m.IsDel == "0" && m.PalletNo == palletNo && (m.Status == "0" || m.Status == "1")); 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("成品物料请入成品库"); } } 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() { 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(); 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("当前托盘没有在平库储位上,请核实"); } 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 exTask = 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(exTask).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 = 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(); } locate.Status = "2"; Db.Updateable(locate).ExecuteCommand(); Db.CommitTran(); comDto = new OutCommandDto() { PalletNo = palletNo,//托盘号 StartRoadway = "", StartLocate = starLocate, // 起始位置 EndLocate = locate.LocatNo, // 目标位置 EndRoadway = locate.RoadwayNo, // 目标巷道 TaskNo = taskNo, // 任务号 TaskType = "0",// 任务类型 (出库) OutMode = "", //目标地址 Order = 1, Type = PLCTypeEnum.AGV }; } 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" && m.AreaNo != "B06" && m.AreaNo != "B07").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("当前任务起始储位不在平库储位"); } 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) { throw new Exception(e.Message); } } } }