using Model.ModelDto; using Model.ModelVm; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using Model.InterFaceModel; using Model.ModelDto.BllSoDto; using Model.ModelDto.SysDto; using Newtonsoft.Json; using Utility.Tools; 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.IBllAsnServer; using WMS.Entity.BllQualityEntity; namespace WMS.BLL.BllAsnServer { public class PalletBindServer : DbHelper, IPalletBindServer { private static readonly SqlSugarScope Db = DataContext.Db; public PalletBindServer() : base(Db) { } #region 托盘绑定 public List GetPalletBindList(PalletBindVm model, out int count) { try { var strList = new List(); if (!string.IsNullOrWhiteSpace(model.SkuNo) || !string.IsNullOrWhiteSpace(model.SkuName)) { var detailList = Db.Queryable().Where(m => m.IsDel == "0" && m.SkuNo.Contains(model.SkuNo.Trim()) && m.SkuName.Contains(model.SkuName.Trim())).Select(m => m.Id).Distinct().ToList(); strList = detailList; } Expression> item = Expressionable.Create() .AndIF(!string.IsNullOrWhiteSpace(model.ASNNo), it => it.ASNNo.Contains(model.ASNNo.Trim())) .AndIF(!string.IsNullOrWhiteSpace(model.PalletNo), it => it.PalletNo.Contains(model.PalletNo.Trim())) .AndIF(!string.IsNullOrWhiteSpace(model.LocatNo), it => it.LocatNo.Contains(model.LocatNo.Trim())) .AndIF(!string.IsNullOrEmpty(model.RoadwayNo), a => a.RoadwayNo == model.RoadwayNo) .AndIF(!string.IsNullOrEmpty(model.WareHouseNo), a => a.WareHouseNo == model.WareHouseNo) .AndIF(strList.Count > 0, it => strList.Contains((int)it.ASNDetailNo)) .AndIF(!string.IsNullOrWhiteSpace(model.LotNo), it => it.LotNo.Contains(model.LotNo.Trim())) .AndIF(!string.IsNullOrWhiteSpace(model.LotText), it => it.LotText.Contains(model.LotText.Trim())) .AndIF(!string.IsNullOrWhiteSpace(model.StartTime), it => it.CreateTime >= Convert.ToDateTime(model.StartTime)) .AndIF(!string.IsNullOrWhiteSpace(model.EndTime), it => it.CreateTime <= Convert.ToDateTime(model.EndTime)) .AndIF(!string.IsNullOrWhiteSpace(model.Status), it => it.Status == model.Status) .And(m => m.IsDel == "0") .ToExpression();//注意 这一句 不能少 var total = 0; var sku = Db.Queryable().First(a => a.IsDel == "0" && a.SkuNo == "100099" && a.SkuName == "托盘"); var data = GetAllWhereAsync(item) .LeftJoin((a, b) => a.ASNDetailNo == b.Id) .LeftJoin((a, b, c) => a.CreateUser == c.Id) .LeftJoin((a, b, c, d) => a.UpdateUser == d.Id) //.LeftJoin((a, b, c, d, e) => a.LocatNo == e.LocatNo) //.LeftJoin((a, b, c, d, e, f) => a.Id == e.BindNo) .Select((a, b, c, d) => new PalletBindDto() { Id = a.Id, ASNNo = a.ASNNo, ASNDetailNo = a.ASNDetailNo, PalletNo = a.PalletNo, PalletNo2 = a.PalletNo2, PalletNo3 = a.PalletNo3, LocatNo = a.LocatNo, RoadwayNo = a.RoadwayNo, WareHouseNo = a.WareHouseNo, Qty = a.Qty, FullQty = a.FullQty, Status = a.Status, Type = a.Type, CompleteTime = a.CompleteTime, SkuNo = b.SkuNo == null ? sku.SkuNo : b.SkuNo, SkuName = b.SkuName == null ? sku.SkuName : b.SkuName, LotNo = a.LotNo, LotText = a.LotText, ProductionTime = a.ProductionTime, ExpirationTime = a.ExpirationTime, SupplierLot = a.SupplierLot, InspectMark = a.InspectMark, BitPalletMark = a.BitPalletMark, CreateUserName = c.RealName, CreateTime = a.CreateTime, }) .OrderBy(a => a.Status).OrderByDescending(a => a.CreateTime) .ToOffsetPage(model.Page, model.Limit, ref total); count = data.Count; return data; } catch (Exception ex) { throw new Exception(ex.Message); } } public List GetBoxInfoList(BoxInfoVm model, out int count) { try { Expression> item1 = Expressionable.Create() .AndIF(!string.IsNullOrWhiteSpace(model.ASNNo), it => it.ASNNo.Contains(model.ASNNo.Trim())) .AndIF(!string.IsNullOrWhiteSpace(model.PalletNo), it => it.PalletNo.Contains(model.PalletNo.Trim())) .AndIF(!string.IsNullOrWhiteSpace(model.LotNo), it => it.LotNo.Contains(model.LotNo.Trim())) .AndIF(!string.IsNullOrWhiteSpace(model.SkuNo), it => it.SkuNo.Contains(model.SkuNo.Trim())) .AndIF(!string.IsNullOrWhiteSpace(model.SkuName), it => it.SkuName.Contains(model.SkuName.Trim())) .AndIF((model.BindNo != 0 && !string.IsNullOrWhiteSpace(model.BindNo.ToString())),it=>it.BindNo == model.BindNo) .And(m => m.IsDel == "0") .ToExpression(); var total = 0; DbHelper helper = new DbHelper(Db); var data = helper.GetAllWhereAsync(item1).Where(m => m.IsDel == "0") .LeftJoin((a, b) => a.BindNo == b.Id) .GroupBy((a, b) => new { a.PalletNo, a.BoxNo, a.SkuNo, a.SkuName, a.LotNo, a.LotText, a.SupplierLot, a.FullQty, a.ProductionTime, a.ExpirationTime, a.InspectMark, a.BitBoxMark, a.InspectStatus, b.Status }) .Select((a, b) => new BoxInfoDto() { BoxNo = a.BoxNo, PalletNo = a.PalletNo, Qty = SqlFunc.AggregateSum(a.Qty), FullQty = a.FullQty, SkuNo = a.SkuNo, SkuName = a.SkuName, LotNo = a.LotNo, LotText = a.LotText, ProductionTime = a.ProductionTime, ExpirationTime = a.ExpirationTime, SupplierLot = a.SupplierLot, InspectMark = a.InspectMark, BitBoxMark = a.BitBoxMark, InspectStatus = a.InspectStatus, BindStatus = b.Status }).ToOffsetPage(model.Page, model.Limit, ref total); count = total; return data; } catch (Exception ex) { throw ex; } } /// /// 根据箱码获取箱支信息 /// /// 箱码 /// 支码 /// public List GetBoxInfoByBoxNo(string boxNo, string boxNo3) { Expression> item = Expressionable.Create() .AndIF(!string.IsNullOrWhiteSpace(boxNo), it => it.BoxNo == boxNo.Trim()) .AndIF(!string.IsNullOrWhiteSpace(boxNo3), it => it.BoxNo3.Contains(boxNo3.Trim())) .And(m => m.IsDel == "0") .ToExpression(); var data = Db.Queryable().Where(item) .LeftJoin((a, b) => a.CreateUser == b.Id) .LeftJoin((a, b, c) => a.UpdateUser == c.Id) .Select((a, b, c) => new BoxInfoDto() { Id = a.Id, ASNNo = a.ASNNo, ASNDetailNo = a.ASNDetailNo, BindNo = a.BindNo, BoxNo = a.BoxNo, BoxNo3 = a.BoxNo3, PalletNo = a.PalletNo, Qty = a.Qty, FullQty = a.FullQty, Status = a.Status, SkuNo = a.SkuNo, SkuName = a.SkuName, LotNo = a.LotNo, LotText = a.LotText, ProductionTime = a.ProductionTime, ExpirationTime = a.ExpirationTime, CompleteTime = a.CompleteTime, SupplierLot = a.SupplierLot, InspectStatus = a.InspectStatus, InspectMark = a.InspectMark, BitBoxMark = a.BitBoxMark, Origin = a.Origin, CreateUserName = c.RealName, UpdateUserName = c.RealName, CreateTime = a.CreateTime, UpdateTime = a.UpdateTime }).ToList(); return data; } //删除托盘绑定信息 public void DelPalletBind(int id, int userId) { try { //获取托盘绑定信息 var bind = Db.Queryable().First(m => m.IsDel == "0" && m.Id == id); if (bind == null) { throw new Exception("未查询到托盘绑定信息"); } if (bind.Status != "0") { throw new Exception("该托盘绑定信息的状态不是等待入库,不能删除"); } //获取除删除绑定信息外是否存在该托盘且同单据其它绑定信息 var bindid = Db.Queryable().Where(m => m.IsDel == "0" && m.PalletNo == bind.PalletNo && m.Id != id && m.ASNNo == bind.ASNNo).ToList(); //获取托盘信息 var pallet = Db.Queryable().First(a => a.IsDel == "0" && a.PalletNo == bind.PalletNo && a.Status == "1"); if (pallet == null) { throw new Exception("未查询到托盘信息!"); } //if (pallet.Status != "0") //{ // throw new Exception("该托盘信息的状态不是未使用,请核查!"); //} Db.BeginTran(); var time = DateTime.Now; //托盘绑定的箱支信息集合 var boxList = Db.Queryable().Where(m => m.IsDel == "0" && m.BindNo == bind.Id).ToList(); foreach (var b in boxList) { b.IsDel = "0"; b.ASNNo = ""; b.ASNDetailNo = null; b.PalletNo = ""; b.BindNo = null; b.Status = "0"; b.CompleteTime = null; b.UpdateTime = time; b.UpdateUser = userId; var i = Db.Updateable(b).ExecuteCommand(); if (i != 1) { throw new Exception($"{b.BoxNo}箱码、{b.BoxNo3}支码删除失败"); } } //判断是否有指定储位 if (!string.IsNullOrWhiteSpace(bind.LocatNo)) { //储位状态变更为空储位 var locate = Db.Queryable().First(m => m.LocatNo == bind.LocatNo); bind.LocatNo = ""; bind.WareHouseNo = ""; bind.RoadwayNo = ""; locate.Status = "0"; Db.Updateable(locate).ExecuteCommand(); } //删除托盘绑定信息 bind.IsDel = "1"; bind.UpdateTime = time; bind.UpdateUser = userId; Db.Updateable(bind).ExecuteCommand(); //入库单明细 var noticeDetail = Db.Queryable().First(m => m.IsDel == "0" && m.Id == bind.ASNDetailNo); if (noticeDetail == null && boxList[0].SkuNo != "100099") { throw new Exception("未查询到托盘绑定的入库单明细信息"); } if (noticeDetail != null || boxList[0].SkuNo != "100099") { //修改入库单明细 noticeDetail.FactQty -= bind.Qty; //判断入库单明细组托数量是否为0,是:修改明细状态 if (noticeDetail.FactQty == 0) { noticeDetail.Status = "0"; //获取状态不是等待执行的明细信息 var count = Db.Queryable().Count(m => m.IsDel == "0" && m.Id != noticeDetail.Id && m.ASNNo == bind.ASNNo && m.Status != "0"); if (count == 0) { //修改入库单信息 var notice = Db.Queryable().First(m => m.IsDel == "0" && m.ASNNo == bind.ASNNo); notice.Status = "0"; notice.UpdateTime = time; notice.UpdateUser = userId; Db.Updateable(notice).ExecuteCommand(); } } Db.Updateable(noticeDetail).ExecuteCommand(); } if (bindid.Count == 0) { pallet.Status = "0"; pallet.UpdateUser = userId; pallet.UpdateTime = DateTime.Now; Db.Updateable(pallet).ExecuteCommand(); } new OperationASNServer().AddLogOperationAsn("入库作业", "托盘绑定", bind.PalletNo, "删除", $"删除了入库单:{bind.ASNNo}、托盘码:{bind.PalletNo}的信息", userId); Db.CommitTran(); } catch (Exception e) { Db.RollbackTran(); throw new Exception(e.Message); } } //删除绑定的箱码信息 public void DelBindBoxInfo(string boxNo, int userId) { try { var boxInfos = Db.Queryable().Where(m => m.IsDel == "0" && m.BoxNo == boxNo).ToList(); if (boxInfos.Count == 0) { throw new Exception("未查询到绑定箱支信息"); } var boxInfo = boxInfos.First(); if (boxInfo.Status == "2") { throw new Exception("该箱支信息状态为已入库,不能删除"); } if (boxInfo.SkuNo == "100099") { throw new Exception("该箱支信息属于空托组盘,请在托盘信息页中删除"); } var pallet = Db.Queryable().First(m => m.PalletNo == boxInfo.PalletNo); var bind = Db.Queryable().First(m => m.IsDel == "0" && m.Id == boxInfo.BindNo); if (bind == null) { throw new Exception("未查询到托盘绑定信息"); } if (bind.Status != "0") { throw new Exception("该托盘绑定信息的状态不是等待入库,不能删除"); } Db.BeginTran(); var time = DateTime.Now; var qty = 0; foreach (var item in boxInfos) { //删除解绑箱支信息 if (item.Origin != "WMS") { item.ASNNo = ""; item.ASNDetailNo = null; } item.BindNo = null; item.PalletNo = ""; item.Status = "0"; item.CompleteTime = null; item.UpdateTime = time; item.UpdateUser = userId; qty += item.Qty; } Db.Updateable(boxInfos).ExecuteCommand(); //修改托盘绑定信息 bind.Qty -= qty; // 数量变更 bind.BitPalletMark = "1"; // 零托标记变更 if (bind.Qty == 0) { //判断是否有指定储位 if (!string.IsNullOrWhiteSpace(bind.LocatNo)) { bind.LocatNo = ""; bind.RoadwayNo = ""; bind.WareHouseNo = ""; //储位状态变更为空储位 var locate = Db.Queryable().First(m => m.LocatNo == bind.LocatNo); locate.Status = "0"; Db.Updateable(locate).ExecuteCommand(); } //删除托盘绑定信息 bind.IsDel = "1"; bind.UpdateTime = time; bind.UpdateUser = userId; //变更托盘使用状态 pallet.Status = "0"; pallet.UpdateTime = time; pallet.UpdateUser = userId; } Db.Updateable(bind).ExecuteCommand(); Db.Updateable(pallet).ExecuteCommand(); //入库单明细 var noticeDetail = Db.Queryable().First(m => m.IsDel == "0" && m.Id == bind.ASNDetailNo); if (noticeDetail == null && boxInfo.SkuNo != "100099") { throw new Exception("未查询到托盘绑定的入库单明细信息"); } if (boxInfo.SkuNo != "100099") { //修改入库单明细 noticeDetail.FactQty -= qty; //判断入库单明细组托数量是否为0,是:修改明细状态 if (noticeDetail.FactQty == 0) { noticeDetail.Status = "0"; //获取状态不是等待执行的明细信息 var count = Db.Queryable().Count(m => m.IsDel == "0" && m.Id != noticeDetail.Id && m.ASNNo == bind.ASNNo && m.Status != "0"); if (count == 0) { //修改入库单信息 var notice = Db.Queryable().First(m => m.IsDel == "0" && m.ASNNo == bind.ASNNo); notice.Status = "0"; notice.UpdateTime = time; notice.UpdateUser = userId; Db.Updateable(notice).ExecuteCommand(); } } Db.Updateable(noticeDetail).ExecuteCommand(); } //判断是否为托盘物料 //if (boxInfo.SkuNo == "100099") //{ // new OperationASNServer().AddLogOperationAsn("入库作业", "托盘绑定", boxInfo.PalletNo, "删除", $"删除了托盘码:{boxInfo.PalletNo}的箱支物料信息", userId); //} //else //{ new OperationASNServer().AddLogOperationAsn("入库作业", "托盘绑定", boxInfo.BoxNo3, "删除", $"删除了箱码:{boxInfo.BoxNo}、追溯码:{boxInfo.BoxNo3}的箱支物料信息", userId); //} Db.CommitTran(); } catch (Exception e) { Db.RollbackTran(); throw new Exception(e.Message); } } //托盘绑定撤销申请 public void CancelPalletBind(int id, string reason, int userId) { try { var bind = Db.Queryable().First(m => m.IsDel == "0" && m.Id == id); if (bind == null) { throw new Exception("未查询到入库单据的托盘绑定信息"); } if (bind.Type == "1") { throw new Exception("该托盘是空托,不是物料托盘"); } if (bind.Status == "1") { throw new Exception("该托盘状态为正在执行,请稍后撤销"); } var notice = Db.Queryable().First(m => m.IsDel == "0" && m.ASNNo == bind.ASNNo); if (notice == null) { throw new Exception("未查询到入库单据信息"); } if (notice.Status != "1" && notice.Status != "2") { throw new Exception("入库单据状态不是正在执行或执行完成,不能撤销"); } var auditLog = Db.Queryable().Where(m => m.IsDel == "0" && m.Status == "0"); var boxInfo = Db.Queryable().Where(m => m.IsDel == "0" && m.ASNNo == notice.ASNNo); var time = DateTime.Now; var startStatusName = ""; var endStatusName = ""; switch (notice.Status) { case "1": startStatusName = "正在执行"; endStatusName = "正在执行"; break; case "2": startStatusName = "执行完成"; endStatusName = "正在执行"; break; default: throw new Exception("单据状态错误"); } if (auditLog.Count(m => m.OrderNo == bind.ASNNo && m.PalletNo.Contains(bind.PalletNo)) > 0) { throw new Exception("该托盘已有申请撤销信息,请勿重复申请"); } var info = boxInfo.First(m => m.BindNo == bind.Id); //入库单明细 var noticeDetail = Db.Queryable().First(m => m.IsDel == "0" && m.Id == bind.ASNDetailNo); if (noticeDetail == null && info.SkuNo != "100099") { throw new Exception("未查询到托盘绑定的入库单明细信息"); } var log = new BllAuditLog() { OrderNo = notice.ASNNo, PalletNo = bind.PalletNo, Msg = info == null ? $"物料:{noticeDetail.SkuNo}、批次:{noticeDetail.LotNo};" : $"物料:{info.SkuNo}、批次:{info.LotNo};", Reason = reason, Status = "0", Opinion = "", StartStatus = startStatusName, EndStatus = endStatusName, FunctionCode = "002", IsDel = "0", CreateUser = userId, CreateTime = time }; Db.Insertable(log).ExecuteCommand(); new OperationASNServer().AddLogOperationAsn("入库作业", "托盘绑定", notice.ASNNo, "取消", $"添加了单据号为{notice.ASNNo}、托盘号为{bind.PalletNo}撤销申请", userId); } catch (Exception e) { throw new Exception(e.Message); } } #endregion #region 指定储位 //指定储位数据源(正常的空储位) public List GetLocateList(string houseNo, string roadwayNo, string row, string column, string layer, string locateNo, string BindId, int page, int limit, out int count) { try { //获取托盘绑定 var bindASNDetailNo = Db.Queryable().Where(a => a.IsDel == "0" && a.Status == "0" && a.Id == int.Parse(BindId)).Select(a => a.ASNDetailNo).First(); //获取单据明细 var noticeDetailSkuNo = Db.Queryable().Where(a => a.Id == bindASNDetailNo && a.IsDel == "0").Select(a => a.SkuNo).First(); //获取物料 var skuCategoryNo = Db.Queryable().Where(a => a.IsDel == "0" && a.SkuNo == noticeDetailSkuNo).Select(a => a.CategoryNo).First(); //获取物料对应区域 var categoryAreaNo = Db.Queryable().Where(a => a.IsDel == "0" && a.CategoryNo == skuCategoryNo).Select(a => a.AreaNo).First(); Expression> item = Expressionable.Create() .AndIF(!string.IsNullOrWhiteSpace(roadwayNo), m => m.RoadwayNo == roadwayNo) .AndIF(!string.IsNullOrWhiteSpace(row), m => m.Row == int.Parse(row)) .AndIF(!string.IsNullOrWhiteSpace(column), m => m.Column == int.Parse(column)) .AndIF(!string.IsNullOrWhiteSpace(layer), m => m.Layer == int.Parse(layer)) .AndIF(!string.IsNullOrWhiteSpace(locateNo), m => m.LocatNo.Contains(locateNo)) .And(m => m.IsDel == "0" && m.Status == "0" && m.Flag == "0" && m.WareHouseNo == houseNo) .And(m => m.AreaNo.Contains(categoryAreaNo)) .ToExpression();//注意 这一句 不能少 var total = 0; var list = Db.Queryable().Where(item) .Select(a => new LocatDto() { Id = a.Id, RoadwayNo = a.RoadwayNo, LocatNo = a.LocatNo, Row = a.Row, Column = a.Column, Layer = a.Layer, Status = a.Status }).ToOffsetPage(page, limit, ref total); count = total; return list; } catch (Exception e) { throw new Exception(e.Message); } } //保存指定的储位 public void SaveAppointSlot(int bindId, int locateId, int userId) { try { //托盘绑定信息 var bind = Db.Queryable().First(m => m.IsDel == "0" && m.Id == bindId); if (bind == null) { throw new Exception("未查询到托盘绑定的信息"); } if (bind.Status != "0") { throw new Exception("该托盘绑定的信息状态不是等待执行,不能指定储位,请核实!"); } //储位 var locate = Db.Queryable().First(m => m.IsDel == "0" && m.Id == locateId); if (locate == null) { throw new Exception("未查询到储位的信息"); } if (locate.Status != "0" || locate.Flag != "0") { throw new Exception("该储位状态不是空储位或标志不是正常的"); } //判断当前托盘是否存在绑定信息 if (bind.LocatNo != null) { //分割已绑储位与新储位 //已绑储位 var bindRow = bind.LocatNo.Substring(0, 2); var bindColumn = bind.LocatNo.Substring(2, 2); var bindLayer = bind.LocatNo.Substring(4, 2); var bindDepth = bind.LocatNo.Substring(6, 2); //新储位 var Row = locate.LocatNo.Substring(0, 2); var Column = locate.LocatNo.Substring(2, 2); var Layer = locate.LocatNo.Substring(4, 2); var Depth = locate.LocatNo.Substring(6, 2); if (bindDepth == "02") { //判断排列层是否相同 if (bindRow == Row && bindColumn == Column && bindLayer == Layer) { throw new Exception("同储位深度2不可向深度1切换!"); } } } else { //若是深度1的 则判断深度2是否为空储位 if (locate.Depth == "01") { var locateDepth = Db.Queryable().First(a => a.IsDel == "0" && a.Row == locate.Row && a.Column == locate.Column && a.Layer == locate.Layer && a.Depth == "02"); if (locateDepth != null) { if (locateDepth.Status != "1") { throw new Exception("该储位深度2不是有物品,不可绑定"); } } } //判断是否为深度2的 若为深度2 则获取深度1储位 判断是否为空储位 if (locate.Depth == "02") { var locateDepth = Db.Queryable().First(a => a.IsDel == "0" && a.Row == locate.Row && a.Column == locate.Column && a.Layer == locate.Layer && a.Depth == "01"); if (locateDepth.Status != "0" || locateDepth.Flag == "2") { throw new Exception("该储位深度1不是空储位或标志不是正常的"); } } } var bindIdList = Db.Queryable().Where(m => m.IsDel == "0" && m.PalletNo == bind.PalletNo && m.Status != "2").Select(m => m.Id).ToList(); //判断是否有零箱 foreach (var item in bindIdList) { var boxInfo = Db.Queryable().Where(m => m.IsDel == "0" && m.BindNo == item); if (boxInfo.Count(m => m.BitBoxMark == "1") > 0) { throw new Exception($"{bind.PalletNo}托盘上有零箱,请入零箱库!"); } } Db.BeginTran(); try { var time = DateTime.Now; //判断托盘绑定信息是否已有指定储位 if (!string.IsNullOrWhiteSpace(bind.LocatNo)) { var locate2 = Db.Queryable().First(m => m.IsDel == "0" && m.LocatNo == bind.LocatNo); locate2.Status = "0"; Db.Updateable(locate2).ExecuteCommand(); } //获取同托盘的托盘绑定信息 var bindList = Db.Queryable() .Where(m => m.IsDel == "0" && m.PalletNo == bind.PalletNo && m.Status == "0").ToList(); if (bindList.Count > 0) { foreach (var b in bindList) { b.LocatNo = locate.LocatNo; b.WareHouseNo = locate.WareHouseNo; b.RoadwayNo = locate.RoadwayNo; b.UpdateTime = time; b.UpdateUser = userId; } Db.Updateable(bindList).ExecuteCommand(); } //修改指定的储位 bind.LocatNo = locate.LocatNo; bind.WareHouseNo = locate.WareHouseNo; bind.RoadwayNo = locate.RoadwayNo; bind.UpdateTime = time; bind.UpdateUser = userId; locate.Status = "2"; Db.Updateable(bind).ExecuteCommand(); Db.Updateable(locate).ExecuteCommand(); new OperationASNServer().AddLogOperationAsn("入库作业", "托盘绑定", bind.PalletNo, "编辑", $"指定了储位:{locate.LocatNo}、单据号:{bind.ASNNo}、托盘码:{bind.PalletNo}的信息", userId); Db.CommitTran(); } catch (Exception e) { Db.RollbackTran(); throw new Exception(e.Message); } } catch (Exception e) { throw new Exception(e.Message); } } #endregion // 申请巷道 public OutCommandDto RequestRoadWay(string palletNo, string houseNo) { try { //验证托盘条码是否为空 if (string.IsNullOrEmpty(palletNo)) { throw new Exception("请输入要申请的托盘条码"); } //验证所属仓库是否为空 if (string.IsNullOrEmpty(houseNo)) { throw new Exception("请选择所属仓库"); } //验证是否为平库入库 if (houseNo == "W02") { throw new Exception("平库请使用PDA手持进行平库入库"); } OutCommandDto comDto;//返回wcs的入库命令 var isHaveLocateNo = false; //托盘绑定信息中是否已有指定储位 var stock = Db.Queryable().First(a => a.PalletNo == palletNo);//托盘信息 //判断托盘条码是否有效 if (stock == null) { throw new Exception("托盘条码不受WMS管理,不可入库!"); } #region //查询托盘绑定信息(状态为等待入库的) var palletBindList = Db.Queryable().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().Where(m => m.IsDel == "0").ToList(); //物料类别信息 var skuCategoryList = Db.Queryable().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().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().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().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().Where(m => m.PalletNo == palletNo).ToList(); if (stockDetail.Count == 0) { throw new Exception($"{palletNo}托盘条码不具有箱码信息,不可入库!"); } 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(); 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); } var laneAllot = 0; //储位跳巷分配 0:跳着分配(一个一个分配)1:巷道按照优先级分配,同优先级顺序分配(一个巷道满了再分配下一个的巷道储位) var funSet3 = Db.Queryable().First(m => m.IsDel == "0" && m.FunSetName == "储位跳巷分配" && m.IsEnable == "NO"); if (funSet3 != null) { switch (funSet3.SetValue) { case "JumpLaneAllot": laneAllot = 0;//立库储位分配 巷道同优先级巷道跳着分配(一个一个分配) break; case "RankLaneAllot": laneAllot = 1;//立库储位分配 巷道按照优先级分配,同优先级顺序分配(一个巷道满了再分配下一个的巷道储位) break; default: laneAllot = 1;// 默认 跳着分配 break; } } var roadList = Db.Queryable().Where(m => m.WareHouseNo == houseNo && areaList.Contains(m.AreaNo)) .GroupBy(m => m.RoadwayNo).OrderBy(m => m.RoadwayNo).Select(m => m.RoadwayNo).ToList(); SysRoadwayUseLog useLog = Db.Queryable().Where(m => m.IsDel == "0" && roadList.Contains(m.RoadwayNo)).OrderByDescending(l => l.Id).First(); //巷道最后一次使用记录 #region 确定巷道排序 List roadList2 = new List(); List roadSmall = new List(); List roadLarge = new List(); if (useLog != null) { roadList2.Add(useLog.RoadwayNo); foreach (var r in roadList) { if (r == useLog.RoadwayNo) { continue; } //如果结果为0,则说明两个字符串相等; //如果结果小于0,则说明第一个字符串小于第二个字符串; //如果结果大于0,则说明第一个字符串大于第二个字符串。 var bol = String.CompareOrdinal(r, useLog.RoadwayNo); if (bol < 0) { roadSmall.Add(r); } if (bol > 0) { roadLarge.Add(r); } } roadList2.AddRange(roadLarge); roadList2.AddRange(roadSmall); } roadList = roadList2; #endregion var roadNo = ""; if (laneAllot == 0)//跳巷道平均分配 { //取各巷道所有排第一个合适位 foreach (var l in roadList) { //如果上次是当前巷道则跳出 if (useLog != null && l == useLog.RoadwayNo) { continue; } var locateCount = Db.Queryable() .Where(m => m.Status == "0" && m.Flag == "0" && areaList.Contains(m.AreaNo) && m.RoadwayNo == l).Count(); var bindNum = Db.Queryable() .Where(m => m.IsDel == "0" && m.Status == "0" && m.RoadwayNo == l) .GroupBy(m => m.PalletNo).Select(m => m.PalletNo).Count(); if (locateCount - bindNum > 0) { roadNo = l; } //当前巷有位置则退出 if (roadNo != null) { break; } } //如果跳巷道并且未找到合适空储位,则跳到最后一次使用的巷道查询 if (roadNo == null) { if (useLog != null) { var locateCount = Db.Queryable() .Where(m => m.Status == "0" && m.Flag == "0" && areaList.Contains(m.AreaNo) && m.RoadwayNo == useLog.RoadwayNo).Count(); var bindNum = Db.Queryable() .Where(m => m.IsDel == "0" && m.Status == "0" && m.RoadwayNo == useLog.RoadwayNo) .GroupBy(m => m.PalletNo).Select(m => m.PalletNo).Count(); if (locateCount - bindNum > 0) { roadNo = useLog.RoadwayNo; } } } } else//按照巷道优先级分配 { foreach (var item in roadList) { var locateCount = Db.Queryable() .Where(m => m.Status == "0" && m.Flag == "0" && areaList.Contains(m.AreaNo) && m.RoadwayNo == item).Count(); var bindNum = Db.Queryable() .Where(m => m.IsDel == "0" && m.Status == "0" && m.RoadwayNo == item) .GroupBy(m => m.PalletNo).Select(m => m.PalletNo).Count(); if (locateCount - bindNum > 0) { roadNo = item; } //当前巷有位置则退出 if (roadNo != null) { break; } } } if (string.IsNullOrWhiteSpace(roadNo)) { throw new Exception("未查询到空储位巷道"); } Db.BeginTran(); try { if (roadNo != null) { //添加巷道使用记录 var log = new SysRoadwayUseLog { RoadwayNo = roadNo, WareHouseNo = houseNo, Row = 0, Column = 0, Layer = 0, }; Db.Insertable(log).ExecuteCommand(); } if (palletBindList.Count >= 1) { foreach (var item in palletBindList) { item.WareHouseNo = houseNo; item.RoadwayNo = roadNo; item.TaskNo = ""; } Db.Updateable(palletBindList).ExecuteCommand(); } Db.CommitTran(); comDto = new OutCommandDto() { PalletNo = palletNo,//托盘号 StartRoadway = "", StartLocate = "", // 起始位置 EndLocate = "", // 目标位置 EndRoadway = roadNo, // 目标巷道 TaskNo = "", // 任务号 TaskType = "0",// 任务类型 (出库) OutMode = "", //目标地址 Order = 1 }; } catch (Exception ex) { Db.RollbackTran(); throw new Exception(ex.Message); } #endregion return comDto; } catch (Exception e) { throw new Exception(e.Message); } } //申请储位 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().First(a => a.PalletNo == palletNo);//托盘信息 //判断托盘条码是否有效 if (stock == null) throw new Exception("托盘条码不受WMS管理,不可入库!"); #region //查询托盘绑定信息(状态为等待入库的) var palletBindList = Db.Queryable().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().Where(m => m.IsDel == "0").ToList(); //物料类别信息 var skuCategoryList = Db.Queryable().Where(m => m.IsDel == "0").ToList(); var skuNo = ""; //入库物料 if (palletBindList.Count >= 1) //正常入库 { //var bindIdList = palletBindList.Select(m => m.Id).ToList(); //判断是否有零箱 //foreach (var item in bindIdList) //{ // var boxInfo = Db.Queryable().Where(m => m.IsDel == "0" && m.BindNo == item); // if (boxInfo.Count(m => m.BitBoxMark == "1") > 0) // { // throw new Exception($"{palletNo}托盘上有零箱,请入零箱库!"); // } //} var palletBind = palletBindList.FirstOrDefault(m => m.Status == "1"); if (palletBind != null) { var beingTask = Db.Queryable().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().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().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().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().First(m => m.LocatNo == stockDetail.First().LocatNo); if (locatePingKu != null) { locatePingKu.Status = "0"; Db.Updateable(locatePingKu).ExecuteCommand(); } } } //获取对应回库规则 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(); SysStorageLocat locate; if (isHaveLocateNo) //指定储位 { locate = Db.Queryable().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(); 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); } } //入库完成(wcs反馈、wms手动完成) public void ArrivalSuccess(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 locate = Db.Queryable().First(m => m.LocatNo == task.EndLocat); if (locate == null) { throw new Exception($"未查询到任务中的储位信息"); } //获取箱码信息 var box1 = Db.Queryable().First(a => a.PalletNo == task.PalletNo && a.IsDel == "0" && a.Status != "2"); 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()) { 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; } } locate.Status = "1"; Db.Updateable(locate).ExecuteCommand(); Db.Updateable(stockDetail).ExecuteCommand(); Db.CommitTran(); return; } //正常入库 var bindList = Db.Queryable().Where(m => m.IsDel == "0" && m.TaskNo == taskNo && m.Status == "1").ToList(); if (bindList.Count == 0) { throw new Exception($"{taskNo}该任务没有对应的流水信息"); } var comTime = DateTime.Now; foreach (var item in bindList) { switch (item.Type) { case "1": var boxInfo = Db.Queryable().First(m => m.IsDel == "0" && m.BindNo == item.Id); var sku = Db.Queryable().First(m => m.IsDel == "0" && m.SkuNo == boxInfo.SkuNo); #region 库存明细 var sd1 = new DataStockDetail() { LotNo = item.LotNo, LotText = item.LotText, SupplierLot = item.SupplierLot, SkuNo = boxInfo.SkuNo, SkuName = boxInfo.SkuName, Standard = sku.Standard, Qty = item.Qty, LockQty = 0, FrozenQty = 0, InspectQty = 0, ASNNo = item.ASNNo, ASNDetailNo = item.ASNDetailNo, WareHouseNo = locate.WareHouseNo, RoadwayNo = locate.RoadwayNo, AreaNo = locate.AreaNo, LocatNo = locate.LocatNo, PalletNo = item.PalletNo, PalletNo2 = item.PalletNo2, PalletNo3 = item.PalletNo3, //PalletType = item.PalletType, CompleteTime = comTime, ProductionTime = item.ProductionTime, ExpirationTime = item.ExpirationTime, Status = "0", InspectMark = item.InspectMark, InspectStatus = sku.IsInspect, BitPalletMark = item.BitPalletMark, PackagNo = sku.PackagNo, IsBale = item.IsBale, IsBelt = item.IsBelt, IsDel = "0", CreateUser = 0, CreateTime = comTime }; var sdId1 = Db.Insertable(sd1).ExecuteReturnIdentity(); #endregion #region 库存箱码明细 var box2 = new DataBoxInfo() { StockDetailId = sdId1, BindNo = item.Id, BoxNo = boxInfo.BoxNo, BoxNo2 = boxInfo.BoxNo2, BoxNo3 = boxInfo.BoxNo3, PalletNo = boxInfo.PalletNo, PalletNo2 = boxInfo.PalletNo2, PalletNo3 = boxInfo.PalletNo3, Qty = boxInfo.Qty, FullQty = boxInfo.FullQty, Status = "2", LotNo = boxInfo.LotNo, LotText = boxInfo.LotText, SkuNo = boxInfo.SkuNo, SkuName = boxInfo.SkuName, Standard = sku.Standard, ProductionTime = boxInfo.ProductionTime, SupplierLot = boxInfo.SupplierLot, InspectStatus = boxInfo.InspectStatus, InspectMark = boxInfo.InspectMark, BitBoxMark = boxInfo.BitBoxMark, CreateUser = 0, CreateTime = comTime }; boxInfo.Status = "2"; Db.Updateable(boxInfo).ExecuteCommand(); Db.Insertable(box2).ExecuteCommand(); #endregion #region 库存 var dataStock1 = Db.Queryable().First(m => m.IsDel == "0" && m.SkuNo == sku.SkuNo); if (dataStock1 != null) { dataStock1.Qty += item.Qty; Db.Updateable(dataStock1).ExecuteCommand(); } else { var stock = new DataStock() { SkuNo = sku.SkuNo, SkuName = sku.SkuName, Standard = sku.Standard, LotNo = "", LotText = "", Qty = item.Qty, LockQty = 0, FrozenQty = 0, IsDel = "0", CreateUser = userId, CreateTime = comTime }; Db.Insertable(stock).ExecuteCommand(); } #endregion break; case "0": var noticeDetail = Db.Queryable().First(m => m.IsDel == "0" && m.Id == item.ASNDetailNo); if (noticeDetail == null) { throw new Exception("未查询到托盘绑定的入库单明细信息"); } var notice = Db.Queryable().First(m => m.IsDel == "0" && m.ASNNo == noticeDetail.ASNNo); if (notice == null) { throw new Exception("未查询到托盘绑定的入库单信息"); } string ownerNo = notice.CustomerNo;//货主编码 string ownerName = notice.CustomerName;//货主名称 var sku1 = Db.Queryable().First(m => m.IsDel == "0" && m.SkuNo == noticeDetail.SkuNo); string isinspect = "0"; //判断物料是否免检 if (sku1.IsInspect == "1") { isinspect = sku1.IsInspect; } //获取该批次最终质检结果 //var quality = Db.Queryable().Where(a => a.LotNo == noticeDetail.LotNo && a.IsDel == "0").OrderByDescending(a => a.CreateTime).ToList(); #region 库存明细 var sd = new DataStockDetail() { LotNo = item.LotNo, LotText = noticeDetail.LotText, SupplierLot = noticeDetail.SupplierLot, SkuNo = noticeDetail.SkuNo, SkuName = noticeDetail.SkuName, Standard = noticeDetail.Standard, Qty = item.Qty, LockQty = 0, FrozenQty = 0, InspectQty = 0, ASNNo = item.ASNNo, ASNDetailNo = item.ASNDetailNo, WareHouseNo = locate.WareHouseNo, RoadwayNo = locate.RoadwayNo, AreaNo = locate.AreaNo, LocatNo = !string.IsNullOrWhiteSpace(locate.LocatNo) ? locate.LocatNo : "", PalletNo = item.PalletNo, PalletNo2 = item.PalletNo2, PalletNo3 = item.PalletNo3, //PalletType = item.PalletType, CompleteTime = comTime, ProductionTime = item.ProductionTime, ExpirationTime = item.ExpirationTime, Status = "0", InspectMark = item.InspectMark, InspectStatus = isinspect, BitPalletMark = item.BitPalletMark, PackagNo = noticeDetail.PackagNo, IsBale = item.IsBale, IsBelt = item.IsBelt, Demo = item.Demo, OwnerNo = ownerNo, OwnerName = ownerName, IsDel = "0", CreateUser = 0, CreateTime = comTime }; //if (quality.Count() > 0) //{ // //修改合格不合格数量 // if (quality[0].IsQualified == "1") //合格 // { // //增加合格数量 // quality[0].PassQty += item.Qty; // sd.InspectStatus = "1"; // } // else if (quality[0].IsQualified == "0") //不合格 // { // //增加不合格数量 // quality[0].FailQty += item.Qty; // sd.InspectStatus = "2"; // } // Db.Updateable(quality[0]).ExecuteCommand(); //修改质检信息 //} var sdId = Db.Insertable(sd).ExecuteReturnIdentity(); //新增库存明细信息 #endregion #region 库存箱码明细 var boxInfoList = Db.Queryable().Where(m => m.IsDel == "0" && m.BindNo == item.Id).ToList(); var boxList = new List(); foreach (var demo in boxInfoList) { var box = new DataBoxInfo() { StockDetailId = sdId, BindNo = demo.BindNo, BoxNo = demo.BoxNo, BoxNo2 = demo.BoxNo2, BoxNo3 = demo.BoxNo3, PalletNo = demo.PalletNo, PalletNo2 = demo.PalletNo2, PalletNo3 = demo.PalletNo3, Qty = demo.Qty, FullQty = demo.FullQty, Status = "2", LotNo = demo.LotNo, LotText = demo.LotText, SkuNo = demo.SkuNo, SkuName = demo.SkuName, Standard = noticeDetail.Standard, ProductionTime = demo.ProductionTime, SupplierLot = demo.SupplierLot, InspectStatus = demo.InspectStatus, InspectMark = demo.InspectMark, BitBoxMark = demo.BitBoxMark, CreateUser = 0, CreateTime = comTime }; boxList.Add(box); demo.Status = "2"; } Db.Updateable(boxInfoList).ExecuteCommand(); Db.Insertable(boxList).ExecuteCommand(); #endregion #region 库存 var dataStock = Db.Queryable().First(m => m.IsDel == "0" && m.SkuNo == noticeDetail.SkuNo && m.LotNo == item.LotNo); if (dataStock != null) { dataStock.Qty += item.Qty; Db.Updateable(dataStock).ExecuteCommand(); } else { var stock = new DataStock() { SkuNo = noticeDetail.SkuNo, SkuName = noticeDetail.SkuName, Standard = noticeDetail.Standard, LotNo = item.LotNo, LotText = noticeDetail.LotText, Qty = item.Qty, LockQty = 0, FrozenQty = 0, OwnerNo = ownerNo, OwnerName = ownerName, IsDel = "0", CreateUser = userId, CreateTime = comTime }; Db.Insertable(stock).ExecuteCommand(); } #endregion #region 入库单 及 明细 //入库单明细 noticeDetail.CompleteQty += item.Qty; if (noticeDetail.CompleteQty >= noticeDetail.Qty) { noticeDetail.Status = "2"; noticeDetail.CompleteTime = comTime; } Db.Updateable(noticeDetail).ExecuteCommand(); //入库单 var asnDetailNum = Db.Queryable() .Count(m => m.IsDel == "0" && m.ASNNo == noticeDetail.ASNNo && m.Status != "2"); if (asnDetailNum == 0) { notice.Status = "2"; notice.CompleteTime = comTime; Db.Updateable(notice).ExecuteCommand(); } #endregion break; } item.Status = "2"; item.CompleteTime = comTime; #region 手动完成注释代码 //item.Status = "2"; //item.CompleteTime = comTime; //var noticeDetail = Db.Queryable() // .First(m => m.IsDel == "0" && m.Id == item.ASNDetailNo); //if (noticeDetail == null) //{ // throw new Exception("未查询到托盘绑定的入库单明细信息"); //} //#region 库存明细 //var sd = new DataStockDetail() //{ // LotNo = noticeDetail.LotNo, // LotText = noticeDetail.LotText, // SupplierLot = noticeDetail.SupplierLot, // SkuNo = noticeDetail.SkuNo, // SkuName = noticeDetail.SkuName, // Standard = noticeDetail.Standard, // Qty = item.Qty, // LockQty = 0, // FrozenQty = 0, // InspectQty = 0, // ASNNo = item.ASNNo, // ASNDetailNo = item.ASNDetailNo, // WareHouseNo = locate.WareHouseNo, // RoadwayNo = locate.RoadwayNo, // AreaNo = locate.AreaNo, // LocatNo = locate.LocatNo, // PalletNo = item.PalletNo, // PalletNo2 = item.PalletNo2, // PalletNo3 = item.PalletNo3, // CompleteTime = comTime, // ProductionTime = item.ProductionTime, // ExpirationTime = item.ExpirationTime, // Status = "0", // InspectMark = item.InspectMark, // InspectStatus = "1", // BitPalletMark = item.BitPalletMark, // PackagNo = noticeDetail.PackagNo, // IsBale = item.IsBale, // IsBelt = item.IsBelt, // IsDel = "0", // CreateUser = 0, // CreateTime = comTime //}; //var sdId = Db.Insertable(sd).ExecuteReturnIdentity(); //#endregion //#region 库存箱码明细 //var boxInfoList = Db.Queryable().Where(m => m.IsDel == "0" && m.BindNo == item.Id).ToList(); //var boxList = new List(); //foreach (var demo in boxInfoList) //{ // var box = new DataBoxInfo() // { // StockDetailId = sdId, // BindNo = demo.BindNo, // BoxNo = demo.BoxNo, // BoxNo2 = demo.BoxNo2, // BoxNo3 = demo.BoxNo3, // PalletNo = demo.PalletNo, // PalletNo2 = demo.PalletNo2, // PalletNo3 = demo.PalletNo3, // Qty = demo.Qty, // FullQty = demo.FullQty, // Status = "2", // LotNo = demo.LotNo, // LotText = demo.LotText, // SkuNo = demo.SkuNo, // SkuName = demo.SkuName, // Standard = noticeDetail.Standard, // ProductionTime = demo.ProductionTime, // SupplierLot = demo.SupplierLot, // InspectStatus = demo.InspectStatus, // InspectMark = demo.InspectMark, // BitBoxMark = demo.BitBoxMark, // CreateUser = 0, // CreateTime = comTime // }; // boxList.Add(box); // demo.Status = "2"; //} //Db.Updateable(boxInfoList).ExecuteCommand(); //Db.Insertable(boxList).ExecuteCommand(); //#endregion //#region 库存 //var dataStock = Db.Queryable().First(m => // m.IsDel == "0" && m.SkuNo == noticeDetail.SkuNo && m.LotNo == noticeDetail.LotNo); //if (dataStock != null) //{ // dataStock.Qty += item.Qty; // Db.Updateable(dataStock).ExecuteCommand(); //} //else //{ // var stock = new DataStock() // { // SkuNo = noticeDetail.SkuNo, // SkuName = noticeDetail.SkuName, // Standard = noticeDetail.Standard, // LotNo = noticeDetail.LotNo, // LotText = noticeDetail.LotText, // Qty = item.Qty, // LockQty = 0, // FrozenQty = 0, // IsDel = "0", // CreateUser = userId, // CreateTime = comTime // }; // Db.Insertable(stock).ExecuteCommand(); //} //#endregion //#region 入库单 及 明细 ////入库单明细 //noticeDetail.CompleteQty += item.Qty; //if (noticeDetail.CompleteQty>=noticeDetail.Qty) //{ // noticeDetail.Status = "2"; // noticeDetail.CompleteTime = comTime; //} //Db.Updateable(noticeDetail).ExecuteCommand(); ////入库单 //var asnDetailNum = Db.Queryable() // .Count(m => m.IsDel == "0" && m.ASNNo == noticeDetail.ASNNo && m.Status!="2"); //if (asnDetailNum == 0) //{ // var notice = Db.Queryable().First(m => m.IsDel == "0" && m.ASNNo == noticeDetail.ASNNo); // notice.Status = "2"; // notice.CompleteTime = comTime; // Db.Updateable(notice).ExecuteCommand(); //} //#endregion #endregion } //判断储位信息 locate.Status = "1"; Db.Updateable(locate).ExecuteCommand(); Db.Updateable(bindList).ExecuteCommand(); Db.CommitTran(); } catch (Exception e) { Db.RollbackTran(); throw new Exception(e.Message); } } /// /// 满入异常 /// /// 任务信息 /// 返回新的储位地址 public OutCommandDto FullException(ReceiveWcsSignal model) { try { OutCommandDto comDto;//返回wcs的入库命令 // 判断当前任务状态 Status 1:正在执行 3:异常结束 var taskModel = Db.Queryable().First(m => m.TaskNo == model.TaskNo && m.IsDel == "0" && m.Status == "1"); if (taskModel == null) { throw new Exception("此任务不存在或任务状态已变更!"); } Db.BeginTran(); // 将当前任务状态变更异常结束 taskModel.Status = "3"; Db.Updateable(taskModel).ExecuteCommand(); // 改变当前储位地址的储位标志变更为屏蔽 var locatModel = Db.Queryable().First(m => m.LocatNo == taskModel.EndLocat && m.IsDel == "0"); if (locatModel == null) { throw new Exception("未查询到当前任务储位信息!"); } locatModel.Flag = "1"; Db.Updateable(locatModel).ExecuteCommand(); // 验证托盘绑定信息 string asnNo = "回流托盘"; var palletBindModel = Db.Queryable().First(m => m.PalletNo == model.PalletNo && m.TaskNo == model.TaskNo && m.IsDel == "0" && m.Status == "1"); if (palletBindModel != null) { asnNo = palletBindModel.ASNNo; } // 插入异常处理表 string exceptionNo = new Common().GetMaxNo("EX"); var exceptionModel = new SysException() { ExceptionNo = exceptionNo, Type = "1", // 0:空取异常 1:满入异常 2:双工位异常 PalletNo = taskModel.PalletNo, ExcLocatNo = taskModel.EndLocat, OrderNo = asnNo, TaskNo = taskModel.TaskNo, Status = "0", Text = "", // 处理描述 CreateUser = 0 }; Db.Insertable(exceptionModel).ExecuteCommand(); // 根据托盘号重新获取储位地址(当前巷道优先) SysStorageLocat locate = new SysStorageLocat(); AllotLocation allotLocate = new AllotLocation(); try { var skuNo = ""; if (asnNo != "回流托盘") { //获取物料存放区域 var noticeDetail = Db.Queryable().First(m => m.IsDel == "0" && m.Id == palletBindModel.ASNDetailNo); if (noticeDetail == null) { throw new Exception("托盘存在物料未绑定入库单明细,不可入库"); } skuNo = noticeDetail.SkuNo; } else { var stockDetail = Db.Queryable().Where(m => m.PalletNo == model.PalletNo).ToList(); if (stockDetail.Count == 0) { throw new Exception($"{model.PalletNo}托盘条码不具有箱码信息,不可入库!"); } skuNo = stockDetail.First().SkuNo; } 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); } locate = allotLocate.GetSuiTableLocate("W01", areaList, taskModel.EndRoadway); } catch (Exception ex) { //try //{ // locate = allotLocate.GetSuiTableLocate("W01", ""); //} //catch (Exception ex) //{ // 整个仓库都没有找到托盘 if (asnNo != "回流托盘") { palletBindModel.Status = "0"; // 等待执行 palletBindModel.LocatNo = ""; // 储位地址 Db.Updateable(palletBindModel).ExecuteCommand(); Db.CommitTran(); } return null; //throw ex; //} } // 生成入库任务 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 = taskModel.EndRoadway, //起始巷道 StartLocat = taskModel.EndLocat, //起始位置 EndLocat = locate.LocatNo, //目标位置 EndRoadway = locate.RoadwayNo, //目标巷道 PalletNo = taskModel.PalletNo, //托盘码 IsSend = 1, //是否可再次下发 IsCancel = 1, //是否可取消 IsFinish = 1, //是否可完成 Type = "0", //任务类型 0 入库任务 1 出库任务 2 移库任务 Status = "1", //任务状态0:等待执行1正在执行2执行完成 OrderType = "0", //0 入库单 1 出库单 2 盘点单 3 移库单 Msg = taskModel.EndLocat + ">>>>" + locate.LocatNo + "的入库任务", //关键信息 }; Db.Insertable(exTask).ExecuteCommand(); locate.Status = "2"; Db.Updateable(locate).ExecuteCommand(); if (asnNo != "回流托盘") { palletBindModel.TaskNo = taskNo; // 更新储位地址 palletBindModel.LocatNo = locate.LocatNo; // 更新储位地址 Db.Updateable(palletBindModel).ExecuteCommand(); } comDto = new OutCommandDto() { PalletNo = taskModel.PalletNo, //托盘号 StartRoadway = taskModel.EndRoadway, StartLocate = taskModel.EndLocat, // 起始位置 EndLocate = locate.LocatNo, // 目标位置 EndRoadway = locate.RoadwayNo, // 目标巷道 TaskNo = exTask.TaskNo, // 任务号 TaskType = "0", OutMode = "", //目标地址 Order = 1 // 优先级 }; Db.CommitTran(); return comDto; } catch (Exception e) { Db.RollbackTran(); throw new Exception(e.Message); } } //手动取消入库任务 public void CancelAsnTask(string taskNo, int userId) { try { var task = Db.Queryable().First(m => m.TaskNo == taskNo && m.IsDel == "0"); if (task == null) { throw new Exception("未查询到任务信息"); } Db.BeginTran(); var time = DateTime.Now; //修改任务 task.IsSuccess = 1; task.IsCancel = 0; task.IsFinish = 0; task.IsSend = 0; task.Status = "4"; task.CancelDate = DateTime.Now; Db.Updateable(task).ExecuteCommand(); //托盘绑定信息 var bind = Db.Queryable().Where(m => m.IsDel == "0" && m.TaskNo == taskNo).ToList(); if (bind.Count > 0) { foreach (var item in bind) { item.Status = "0";//修改托盘绑定状态信息 item.TaskNo = "";//任务号清空 item.LocatNo = ""; //储位地址清空 item.WareHouseNo = ""; item.RoadwayNo = ""; item.UpdateTime = time; item.UpdateUser = userId; } Db.Updateable(bind).ExecuteCommand(); } var locate = Db.Queryable().First(m => m.LocatNo == task.EndLocat); if (locate == null) { throw new Exception("未查询道储位信息"); } locate.Status = "0"; //修改储位状态 Db.Updateable(locate).ExecuteCommand(); //添加操作日志记录 var k = new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", taskNo, "取消", $"点击取消按钮取消了任务号为:{taskNo}的任务", (int)userId); Db.CommitTran(); } catch (Exception e) { throw new Exception(e.Message); } } ////重新下发入库任务 //public OutCommandDto AgainSendAsnTask(string taskNo, int userId, string url) //{ // try // { // var task = Db.Queryable().First(m => m.TaskNo == taskNo && m.IsDel == "0"); // if (task == null) // { // throw new Exception("未查询到任务信息"); // } // var stockDetail = Db.Queryable().First(m => m.PalletNo == task.PalletNo); // if (stockDetail == null) // { // throw new Exception(task.PalletNo + " 当前托盘未在库内,请核实信息"); // } // var outDto = new OutCommandDto() // { // PalletNo = task.PalletNo,//托盘号 // StartLocate = "", // 起始位置 // EndLocate = task.EndLocat, // 目标位置 // TaskNo = task.TaskNo, // 任务号 // TaskType = "1",// 任务类型 (出库) // OutMode = "", //目标地址 // Order = 1 // }; // //添加操作日志记录 // var k = new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", taskNo, "下发", $"点击下发按钮、重新下发了任务号为:{taskNo}的入库任务", (int)userId); // // 正式运行程序放开 // var list = new List { outDto.TaskNo }; // var jsonData = JsonConvert.SerializeObject(outDto); // try // { // var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss") // var response = HttpHelper.DoPost(url, jsonData, "下发给WCS出库命令", "WCS"); // var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss") // ////解析返回数据 // var wcsModel = JsonConvert.DeserializeObject(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($"wcs返回状态异常:{wcsModel.Msg}"); // } // } // catch (Exception ex) // { // throw new Exception(ex.Message); // } // return outDto; // } // catch (Exception e) // { // throw new Exception(e.Message); // } //} } }