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 Model.ModelVm.SysVm; using Newtonsoft.Json; using Utility.Tools; using WMS.BLL.Logic; using WMS.BLL.LogServer; using WMS.BLL.SysServer; 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 System.Diagnostics; using System.Security.Policy; using System.Threading.Tasks; using WMS.IBLL.IBllSoServer; using WMS.Entity.BllQualityEntity; using ZXing.IMB; using System.Collections; using Microsoft.VisualBasic; namespace WMS.BLL.BllAsnServer { enum SkuTypeEnum { 原料吨袋, 袋子, 成品罐装满桶, 原料罐装桶, 成品吨袋, 母托盘, 子托盘塑料, 子托盘木质, 其它 } 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) { string sqlString = string.Empty; string sqlCount = string.Empty; string sqlPub = string.Empty; try { //var strList = new List(); //if (!string.IsNullOrWhiteSpace(model.SkuNo) || !string.IsNullOrWhiteSpace(model.SkuName) || !string.IsNullOrWhiteSpace(model.LotNo)) //{ // var detailList = Db.Queryable().Where(m => m.IsDel == "0") // .WhereIF(!string.IsNullOrWhiteSpace(model.SkuNo), m => m.SkuNo.Contains(model.SkuNo.Trim())) // .WhereIF(!string.IsNullOrWhiteSpace(model.SkuName), m => m.SkuNo.Contains(model.SkuName.Trim())) // .WhereIF(!string.IsNullOrWhiteSpace(model.LotNo), m => m.SkuNo.Contains(model.LotNo.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.IsNullOrWhiteSpace(model.Status), it => it.Status == model.Status) // .AndIF(!string.IsNullOrWhiteSpace(model.StartTime), it => it.CreateTime >= Convert.ToDateTime(model.StartTime)) // .AndIF(!string.IsNullOrWhiteSpace(model.EndTime), it => it.CreateTime <= Convert.ToDateTime(model.EndTime).AddDays(1)) // .AndIF(!string.IsNullOrWhiteSpace(model.SkuNo) || !string.IsNullOrWhiteSpace(model.SkuName) || !string.IsNullOrWhiteSpace(model.LotNo), m => strList.Contains((int)m.ASNDetailNo)) // .ToExpression();//注意 这一句 不能少 var total = 0; var data = Db.Queryable().Where(m => m.IsDel == "0") .LeftJoin((a, b) => a.CreateUser == b.Id) .LeftJoin((a, b, c) => a.CreateUser == c.Id) .LeftJoin((a, b, c, d) => a.BindNo == d.Id) .WhereIF(!string.IsNullOrWhiteSpace(model.LotNo), (a, b, c, d) => a.LotNo == model.LotNo) .WhereIF(!string.IsNullOrWhiteSpace(model.ASNNo), (a, b, c, d) => d.ASNNo.Contains(model.ASNNo.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(model.PalletNo), (a, b, c, d) => d.PalletNo.Contains(model.PalletNo.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(model.LocatNo), (a, b, c, d) => d.LocatNo.Contains(model.LocatNo.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(model.Status), (a, b, c, d) => d.Status == model.Status) .WhereIF(!string.IsNullOrWhiteSpace(model.StartTime), (a, b, c, d) => d.CreateTime >= Convert.ToDateTime(model.StartTime)) .WhereIF(!string.IsNullOrWhiteSpace(model.EndTime), (a, b, c, d) => d.CreateTime <= Convert.ToDateTime(model.EndTime).AddDays(1)) .WhereIF(!string.IsNullOrWhiteSpace(model.SkuNo), (a, b, c, d) => a.SkuNo == model.SkuNo) .Select((a, b, c, d) => new PalletBindDto() { Id = d.Id, ASNNo = d.ASNNo, ASNDetailNo = d.ASNDetailNo, LocatNo = d.LocatNo, LotNo = d.LotNo, LotText = d.LotText, SupplierLot = d.SupplierLot, PalletNo = d.PalletNo, PalletNo2 = d.PalletNo2, PalletNo3 = d.PalletNo3, IsBale = d.IsBale, IsBelt = d.IsBelt, Qty = d.Qty, FullQty = d.FullQty, PalletType = d.PalletType, Status = d.Status, CompleteTime = d.CompleteTime, ProductionTime = d.ProductionTime, ExpirationTime = d.ExpirationTime, InspectMark = d.InspectMark, BitPalletMark = d.BitPalletMark, RealWeight = a.RealWeight, //实际重量 SkuNo = a.SkuNo, //物料编码 SkuName = a.SkuName, //物料名称 CreateUser = b.RealName, CreateTime = d.CreateTime, }).OrderByDescending(a => a.CreateTime) .ToOffsetPage(model.Page, model.Limit, ref total); count = total; return data; } catch (Exception ex) { throw ex; } } public List GetBoxInfoList(BoxInfoVm model, out int count) { try { var total = 0; var data = Db.Queryable().Where(m => m.IsDel == "0" && m.BindNo == model.BindNo) .LeftJoin((a, b) => a.CreateUser == b.Id) .LeftJoin((a, b, c) => a.CreateUser == c.Id) .LeftJoin((a, b, c, d) => a.BindNo == d.Id) .Select((a, b, c, d) => new BoxInfoDto() { Id = a.Id, ASNNo = a.ASNNo, ASNDetailNo = a.ASNDetailNo, BindNo = a.BindNo, BoxNo = a.BoxNo, BoxNo2 = a.BoxNo2, BoxNo3 = a.BoxNo3, PalletNo = a.PalletNo, PalletNo2 = a.PalletNo2, PalletNo3 = a.PalletNo3, Qty = a.Qty, FullQty = a.FullQty, Status = a.Status, SkuNo = a.SkuNo, SkuName = a.SkuName, LotNo = a.LotNo, LotText = a.LotText, ProductionTime = a.ProductionTime, CompleteTime = a.CompleteTime, ExpirationTime = a.ExpirationTime, SupplierLot = a.SupplierLot, InspectMark = a.InspectMark, BitBoxMark = a.BitBoxMark, InspectStatus = a.InspectStatus, Origin = a.Origin, BindStatus = d.Status, CreateUserName = b.RealName, UpdateUserName = c.RealName, CreateTime = a.CreateTime, UpdateTime = a.UpdateTime }).ToOffsetPage(model.Page, model.Limit, ref total); count = total; return data; } catch (Exception ex) { throw ex; } } //删除托盘绑定信息 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 pallet = Db.Queryable().First(m => m.IsDel == "0" && m.Status != "0" && m.PalletNo == bind.PalletNo); 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.ASNNo = ""; b.ASNDetailNo = null; b.BindNo = null; b.Status = "0"; b.IsDel = "1"; 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); locate.Status = "0"; Db.Updateable(locate).ExecuteCommand(); } //判断是否有任务 if (!string.IsNullOrWhiteSpace(bind.TaskNo)) { var task = Db.Queryable().First(m => m.TaskNo == bind.TaskNo); Db.Deleteable(task).ExecuteCommand(); } //删除托盘绑定信息 bind.IsDel = "1"; bind.UpdateTime = time; bind.UpdateUser = userId; Db.Updateable(bind).ExecuteCommand(); pallet.Status = "0"; pallet.UpdateTime = time; pallet.UpdateUser = userId; Db.Updateable(pallet).ExecuteCommand(); //入库单明细 var noticeDetail = Db.Queryable().First(m => m.IsDel == "0" && m.Id == bind.ASNDetailNo); if (noticeDetail == null) { throw new Exception("未查询到托盘绑定的入库单明细信息"); } //修改入库单明细 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(); 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(int id, int userId) { try { var boxInfo = Db.Queryable().First(m => m.IsDel == "0" && m.Id == id); if (boxInfo == null) { throw new Exception("未查询到绑定箱支信息"); } if (boxInfo.Status == "2") { throw new Exception("该箱支信息状态为已入库,不能删除"); } 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("该托盘绑定信息的状态不是等待入库,不能删除"); } var pallet = Db.Queryable().First(m => m.IsDel == "0" && m.Status != "0" && m.PalletNo == bind.PalletNo); if (pallet == null) { throw new Exception("未查询到托盘信息"); } if (pallet.Status == "0") { throw new Exception("该托盘信息的状态是未使用,不能删除"); } Db.BeginTran(); var time = DateTime.Now; //删除解绑箱支信息 boxInfo.ASNNo = ""; boxInfo.ASNDetailNo = null; boxInfo.BindNo = null; boxInfo.Status = "0"; boxInfo.CompleteTime = null; boxInfo.IsDel = "1"; boxInfo.UpdateTime = time; boxInfo.UpdateUser = userId; Db.Updateable(boxInfo).ExecuteCommand(); //修改托盘绑定信息 bind.Qty -= boxInfo.Qty; if (bind.Qty == 0) { //判断是否有指定储位 if (!string.IsNullOrWhiteSpace(bind.LocatNo)) { bind.LocatNo = ""; //储位状态变更为空储位 var locate = Db.Queryable().First(m => m.LocatNo == bind.LocatNo); locate.Status = "0"; Db.Updateable(locate).ExecuteCommand(); } //判断是否有任务 if (!string.IsNullOrWhiteSpace(bind.TaskNo)) { var task = Db.Queryable().First(m => m.TaskNo == bind.TaskNo); Db.Deleteable(task).ExecuteCommand(); } //删除托盘绑定信息 bind.IsDel = "1"; bind.UpdateTime = time; bind.UpdateUser = userId; //修改托盘信息状态 pallet.Status = "0"; pallet.UpdateTime = time; pallet.UpdateUser = userId; Db.Updateable(pallet).ExecuteCommand(); } Db.Updateable(bind).ExecuteCommand(); //入库单明细 var noticeDetail = Db.Queryable().First(m => m.IsDel == "0" && m.Id == bind.ASNDetailNo); if (noticeDetail == null) { throw new Exception("未查询到托盘绑定的入库单明细信息"); } //修改入库单明细 因在取消任务时已减去数量 所以不需要再次减 //noticeDetail.FactQty -= boxInfo.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(); new OperationASNServer().AddLogOperationAsn("入库作业", "托盘绑定", boxInfo.BoxNo3, "删除", $"删除了箱码:{boxInfo.BoxNo}、追溯码:{boxInfo.BoxNo3}的箱支物料信息", userId); Db.CommitTran(); } catch (Exception e) { Db.RollbackTran(); throw new Exception(e.Message); } } #endregion #region 指定储位 //指定储位数据源(正常的空储位) public List GetLocateList(string houseNo, string roadwayNo, string row, string column, string layer, string locateNo, int page, int limit, out int count) { try { 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) .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("该储位状态不是空储位或标志不是正常的"); } 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.UpdateTime = time; b.UpdateUser = userId; } Db.Updateable(bindList).ExecuteCommand(); } //修改指定的储位 bind.LocatNo = locate.LocatNo; 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 void WcsBindPallet(WcsPalletBindVm model) { try { #region 判断 var skuNo = ""; var materials = Db.Queryable().Where(m => m.IsDel == "0").ToList(); SysMaterials material = null; switch (model.SkuType) { case "10": material = materials.First(m => m.Type == ((int)SkuTypeEnum.母托盘).ToString()); //material = materials.FirstOrDefault(m => m.Type == ((int)SkuTypeEnum.母托盘).ToString()); break; case "20": //子托盘塑料-蓝色 100098 material = materials.First(m => m.Type == ((int)SkuTypeEnum.子托盘塑料).ToString()); break; case "21": //子托盘木制-单面 100097 material = materials.First(m => m.Type == ((int)SkuTypeEnum.子托盘木质).ToString()); break; case "22": //子托盘塑料-黑色 100096 material = materials.First(m => m.SkuNo == "100096"); break; case "23": //子拖盘木制-双面 100095 material = materials.First(m => m.SkuNo == "100095"); break; case "30": material = materials.First(m => m.Type == ((int)SkuTypeEnum.成品吨袋).ToString()); break; case "31": material = materials.First(m => m.Type == ((int)SkuTypeEnum.原料吨袋).ToString()); break; case "40": material = materials.First(m => m.Type == ((int)SkuTypeEnum.袋子).ToString()); break; case "50": //50:塑料空桶 可拆桶 material = materials.First(m => m.Type == ((int)SkuTypeEnum.原料罐装桶).ToString()); break; case "51": //51:钢质空桶 可拆桶 material = materials.First(m => m.Type == ((int)SkuTypeEnum.原料罐装桶).ToString()); break; case "52": //52:纸质空桶 material = materials.First(m => m.Type == ((int)SkuTypeEnum.原料罐装桶).ToString()); break; case "53": //53:铁质空桶 material = materials.First(m => m.Type == ((int)SkuTypeEnum.原料罐装桶).ToString()); break; case "60": //60:塑料满桶 material = materials.First(m => m.Type == ((int)SkuTypeEnum.成品罐装满桶).ToString()); break; case "61": //61:钢质满桶 可拆桶 material = materials.First(m => m.Type == ((int)SkuTypeEnum.成品罐装满桶).ToString()); break; case "62": //62:纸质满桶 material = materials.First(m => m.Type == ((int)SkuTypeEnum.成品罐装满桶).ToString()); break; case "63": //63:铁质满桶 material = materials.First(m => m.Type == ((int)SkuTypeEnum.成品罐装满桶).ToString()); break; case "99": material = materials.First(m => m.Type == ((int)SkuTypeEnum.其它).ToString()); break; default: break; } if (material == null) { throw new Exception("任务类型无效!"); } else { skuNo = material.SkuNo; } if (string.IsNullOrEmpty(model.PalletNo)) { throw new Exception("托盘号不可为空!"); } if (model.SkuQty <= 0) { throw new Exception("物料数量不可为空!"); } #endregion Db.BeginTran(); //托盘是否存在 var pallet = Db.Queryable().First(m => m.IsDel == "0" && m.PalletNo == model.PalletNo); if (pallet == null) { throw new Exception("未查询到托盘信息,请核实!"); } if (pallet.Status == "1") { throw new Exception("托盘的状态为使用中,请核实!"); } var plnList = new List() { "100099", "100098", "100097", "100096", "100095", }; //根据批次获取入库单 根据入库单获取物料信息 //var stockDetali = Db.Queryable().First(m => m.LotNo == model.LotNo); if (plnList.Contains(skuNo))//空托盘跺 { var sku = Db.Queryable().First(m => m.IsDel == "0" && m.SkuNo == skuNo); // 插入托盘绑定表 var modelPb = new BllPalletBind { ASNNo = "", PalletNo = model.PalletNo, PalletNo2 = "", PalletNo3 = "", PalletType = model.SubPallet, Qty = model.SkuQty, FullQty = null, Status = "0", Type = "1", LotNo = "", LotText = "", SupplierLot = model.SupplierLot, InspectMark = "", BitPalletMark = "", IsBale = "", IsBelt = "", CreateUser = 0, }; var id = Db.Insertable(modelPb).ExecuteReturnIdentity(); // 添加箱支关系表 var box = new BllBoxInfo() { ASNNo = "", ASNDetailNo = null, BindNo = id, PalletNo = model.PalletNo, Status = "1", CompleteTime = DateTime.Now, Qty = model.SkuQty, FullQty = null, SkuNo = sku.SkuNo, SkuName = sku.SkuName, LotNo = model.LotNo, LotText = model.LotText, SupplierLot = model.SupplierLot, InspectStatus = "1", Origin = "PLC", Weight = sku.Weight, RealWeight = decimal.Parse(model.SkuWeight), CreateUser = 0, }; Db.Insertable(box).ExecuteCommand(); // 更改托盘使用状态 var sqlStr = $"update SysPallets set Status = '1' where PalletNo = '{model.PalletNo}';"; //添加托盘记录表数据 sqlStr += $"insert into LogPalletTrack values('{model.PalletNo}','{model.PalletNo}','组盘','0',getDate(),0,NULL,NULL);"; Db.Ado.ExecuteCommand(sqlStr); Db.CommitTran(); } else { // 根据物料批次查找入库单显示 var notice = Db.Queryable() .Where(m => m.IsDel == "0" && m.Status != "2" && m.Status != "3" && m.Status != "4" && m.Status != "5" && m.Status != "6") .WhereIF(!string.IsNullOrWhiteSpace(model.LotNo), m => m.LotNo == model.LotNo) .WhereIF(!string.IsNullOrWhiteSpace(model.SupplierLot), m => m.SupplierLot == model.SupplierLot) .OrderBy(m => m.CreateTime).First(); var detail = Db.Queryable().Where(a => a.IsDel == "0" && a.ASNNo == notice.ASNNo).First(); ////.Where(m => m.SkuNo == skuNo) //.WhereIF(!string.IsNullOrWhiteSpace(model.LotNo), m => m.LotNo == model.LotNo) //.WhereIF(!string.IsNullOrWhiteSpace(model.SupplierLot), m => m.SupplierLot == model.SupplierLot) //.Where(m => m.IsDel == "0" && m.Status == "0" && m.Status == "1") //.OrderBy(m => m.CreateTime).First(); if (detail == null) { throw new Exception("当前物料及批次未查询到相对应的单据,请核实!"); } int rqty = (int)(detail.CompleteQty + model.SkuQty); int zqty = (int)(detail.FactQty + model.SkuQty); //判断入库数量是否超入 if (rqty > detail.Qty) { throw new Exception("-1:当前入库单据入库数量已超入,请核实!"); } //判断已组数量是否超出 if (zqty > detail.Qty) { throw new Exception("-1:当前入库单据已组数量已超出,请核实!"); } //获取入库单总单 var arrival = Db.Queryable().First(a => a.IsDel == "0" && a.ASNNo == detail.ASNNo); if (arrival == null) { throw new Exception("当前物料及批次未查询到相对应的单据,请核实!"); } #region 包装信息 var package = Db.Queryable().Where(m => m.IsDel == "0"); var sku = Db.Queryable().First(m => m.IsDel == "0" && m.SkuNo == detail.SkuNo); var pack = package.First(m => m.IsDel == "0" && m.PackagNo == sku.PackagNo); var pNum = 0;//托盘物品数量 if (pack.L5Num.HasValue) { pNum = (int)pack.L5Num; } else if (pack.L4Num.HasValue) { pNum = (int)pack.L4Num; } else if (pack.L3Num.HasValue) { pNum = (int)pack.L3Num; } else if (pack.L2Num.HasValue) { pNum = (int)pack.L2Num; } else if (pack.L1Num.HasValue) { pNum = (int)pack.L1Num; } if (pNum == 0) { throw new Exception($"绑定失败,{detail.SkuNo}物品包装未找到!"); } if (model.SkuQty > pNum) { throw new Exception($"绑定失败,托盘{model.PalletNo}实际数量大于物品包装数量!"); } #endregion //托盘绑定信息 var bind = Db.Queryable().First(m => m.IsDel == "0" && m.ASNDetailNo == detail.Id && m.PalletNo == model.PalletNo && m.Status != "2"); var bindId = 0; if (bind == null) { bind = new BllPalletBind { ASNNo = detail.ASNNo, ASNDetailNo = detail.Id, PalletNo = model.PalletNo, PalletNo2 = "", PalletNo3 = "", PalletType = model.SubPallet, Qty = model.SkuQty, FullQty = pNum, Status = "0", Type = "0", LotNo = model.LotNo, LotText = "", SupplierLot = "", InspectMark = materials[0].IsInspect == "0" ? "0" : "1", BitPalletMark = model.SkuQty == pNum ? "0" : "1", IsBale = model.IsBale,//是否裹包 IsBelt = model.IsBelt,//是否打带 CreateUser = 0 }; if (arrival.Type == "5") { bind.InspectMark = "1"; } if (model.ManuFactureDate != null) { bind.ProductionTime = model.ManuFactureDate; bind.ExpirationTime = model.ManuFactureDate.AddDays((double)material.Warranty); } // 插入托盘绑定表 bindId = Db.Insertable(bind).ExecuteReturnIdentity(); } else { if (bind.Status != "4") { throw new Exception("-1:当前托盘正在执行中,绑定失败,请核实!"); } } // 添加箱支关系表 var box = new BllBoxInfo() { ASNNo = detail.ASNNo, ASNDetailNo = detail.Id, BindNo = bindId, PalletNo = model.PalletNo, Status = "1", CompleteTime = DateTime.Now, Qty = model.SkuQty, FullQty = pNum, SkuNo = sku.SkuNo, SkuName = sku.SkuName, LotNo = model.LotNo, LotText = model.LotText, SupplierLot = model.SupplierLot, InspectStatus = sku.IsInspect == "0" ? "0" : "1", Origin = "PLC", Weight = sku.Weight, RealWeight = decimal.Parse(model.SkuWeight), CreateUser = 0, }; if (arrival.Type == "5") { box.InspectMark = "1"; } if (model.ManuFactureDate != null) { box.ProductionTime = model.ManuFactureDate; box.ExpirationTime = model.ManuFactureDate.AddDays((double)material.Warranty); } Db.Insertable(box).ExecuteCommand(); // 更新托盘绑定表 if (bind.FullQty < bind.Qty) { throw new Exception("托盘绑定数量已超出该物料包装数量"); } if (bind.FullQty == bind.Qty) { bind.BitPalletMark = "0"; } Db.Updateable(bind).Where(m => m.Id == bindId).ExecuteCommand(); // 更改入库单明细已组数量 var sqlString = string.Empty; sqlString += $"update BllArrivalNoticeDetail set FactQty = FactQty + '{model.SkuQty}' where id = '{detail.Id}';"; Db.Ado.ExecuteCommand(sqlString); // 更改入库单及入库明细状态 if (detail.Status == "0") { var sqlString2 = string.Empty; sqlString2 += $"update BllArrivalNotice set Status = '1',CompleteTime= getDate() where ASNNo = '{detail.ASNNo}' and Status ='0';"; sqlString2 += $"update BllArrivalNoticeDetail set Status = '1',CompleteTime= getDate() where id = '{detail.Id}' and Status ='0';"; Db.Ado.ExecuteCommand(sqlString2); } // 更改托盘使用状态 var sqlStr = $"update SysPallets set Status = '1' where PalletNo = '{model.PalletNo}';"; //添加托盘记录表数据 sqlStr += $"insert into LogPalletTrack values('{model.PalletNo}','{detail.ASNNo}','组盘','0',getDate(),0,NULL,NULL);"; Db.Ado.ExecuteCommand(sqlStr); Db.CommitTran(); } } catch (Exception ex) { Db.Ado.RollbackTran(); throw ex; } } //申请储位(包含组托的信息) public OutCommandDto RequestLocation(RequestLocate model) { try { OutCommandDto comDto;//返回wcs的入库命令 if (model.IsBale != "0") { model.IsBale = "1"; } var isHaveLocateNo = false; //托盘绑定信息中是否已有指定储位 var stock = Db.Queryable().First(a => a.PalletNo == model.PalletNo);//托盘信息 //判断托盘条码是否有效 if (stock == null) { throw new Exception("托盘条码不受WMS管理,不可入库!"); } //获取当前托盘的拣货信息 是否存在待拣货等状态 var allot = Db.Queryable().Where(a => a.IsDel == "0" && a.PalletNo == model.PalletNo).ToList(); //var allotStatus = "1,2,3,4"; var allotStatus = new List() { "1", "2", "3", "4" }; if (allot.Count > 0) { if (allotStatus.Contains(allot[allot.Count - 1].Status)) //if (allot[allot.Count].Status == "1" || allot[allot.Count].Status=="2" || allot[allot.Count].Status == "3" || allot[allot.Count].Status == "4") { throw new Exception("当前托盘拣货状态信息异常,不可入库!"); } } #region //获取入库单是否拥有 //var arrival = Db.Queryable().First(a => a.IsDel == "0" && a.Status == "1" && a.LotNo == model.LotNo); // //判断是否是已经申请的任务 var task = Db.Queryable().First(m => m.IsDel == "0" && m.Type == "0" && m.PalletNo == model.PalletNo && m.Status == "1"); if (task != null) { var r = Db.Queryable().First(m => m.LocatNo == task.EndLocat); comDto = new OutCommandDto() { PalletNo = model.PalletNo,//托盘号 PalletType = model.SubPallet,//托盘类型 StartLocat = model.StationNum, // 起始位置 EndLocat = task.EndLocat, // 目标位置 EndRoadway = r.RoadwayNo, // 目标巷道 TaskNo = task.TaskNo, // 任务号 Type = "0",// 任务类型 (入库) OutMode = "", //目标地址 Order = 1 }; return comDto; } int aa = 1; var bol = true; // 回流入库 var stockDetail = Db.Queryable().Where(m => m.PalletNo == model.PalletNo).ToList(); if (stockDetail.Count > 0) { bol = false; //判断是否为相同托盘码入库 if (!string.IsNullOrEmpty(stockDetail[0].LocatNo)) { throw new Exception("当前托盘条码已在库内,请核实是否为重复托盘!"); } aa = 0; } Db.BeginTran(); //绑定托盘信息 if (bol) { // 判断组盘信息是否已存在 //查找托盘绑定信息 状态为等待入库 var palletBind = Db.Queryable().Where(m => m.PalletNo == model.PalletNo && m.IsDel == "0" && m.Status == "0").ToList(); if (palletBind.Count <= 0) { WcsBindPallet(model); } } //查询托盘绑定信息(状态为等待入库的或者正在入库的) var palletBindList = Db.Queryable().Where(m => m.IsDel == "0" && m.PalletNo == model.PalletNo && m.Status == "0").ToList(); if (aa == 0) { palletBindList = Db.Queryable().Where(m => m.IsDel == "0" && m.PalletNo == model.PalletNo && m.LotNo == model.LotNo).OrderByDescending(m => m.CreateTime).ToList(); } var haveLocate = palletBindList.FirstOrDefault(m => !string.IsNullOrWhiteSpace(m.LocatNo)); if (palletBindList.Count >= 1) //正常入库 { if (haveLocate != null) { isHaveLocateNo = true; //已有指定储位 } if (palletBindList.First().Type == "0") //物料托入库 { if (aa == 1) { //判断是否绑定单据及单据状态是否正常 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 areaCode = ""; SysStorageArea area = null; switch (model.SubPallet) { case "0": area = Db.Queryable().First(m => m.WareHouseNo == "W03" && m.AreaName == "母托盘区" && m.IsDel == "0"); break; case "1": case "2": case "3": case "4": area = Db.Queryable().First(m => m.WareHouseNo == "W03" && m.AreaName == "子母托盘区" && m.IsDel == "0"); break; } if (area != null) { areaCode = area.AreaNo; } var plnList = new List() { "10", "20", "30", }; if (!plnList.Contains(model.TaskType)) { areaCode = ""; } if (string.IsNullOrWhiteSpace(areaCode) && !plnList.Contains(model.TaskType)) { throw new Exception("未查询到当前托盘有无子托定义,请核实"); } var allotLocate = new AllotLocation(); SysStorageLocat locate; //if (isHaveLocateNo) //指定储位 //{ // locate = Db.Queryable().First(m => m.LocatNo == haveLocate.LocatNo); //} //else //{ locate = allotLocate.GetSuiTableLocate("W03", areaCode); //} try { 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, //返回时间 StartLocat = model.StationNum,//起始位置 EndLocat = locate.LocatNo,//目标位置 PalletNo = model.PalletNo,//托盘码 IsSend = 1,//是否可再次下发 IsCancel = 1,//是否可取消 IsFinish = 1,//是否可完成 Type = "0",//任务类型 0 入库任务 1 出库任务 2 移库任务 Status = "1",//任务状态0:等待执行1正在执行2执行完成 OrderType = "0",//0 入库单 1 出库单 2 盘点单 3 移库单 Msg = model.StationNum + " ==>> " + 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.LocatNo = locate.LocatNo; item.TaskNo = taskNo; } Db.Updateable(palletBindList).ExecuteCommand(); } var log = new RoadwayUseLogServer(); var bl = log.AddRoadwayUseLog(new AddRoadwayUseLogVm() { WareHouseNo = locate.WareHouseNo, RoadwayNo = locate.RoadwayNo, LocateNo = locate.LocatNo, Row = locate.Row, Column = locate.Column, Layer = locate.Layer, Depth = locate.Depth, }, 0); if (!bl) { throw new Exception("巷道使用记录添加失败"); } Db.CommitTran(); comDto = new OutCommandDto() { PalletNo = model.PalletNo,//托盘号 PalletType = model.SubPallet,//托盘类型 StartLocat = "", // 起始位置 EndLocat = locate.LocatNo, // 目标位置 EndRoadway = locate.RoadwayNo, // 目标位置 TaskNo = exTask.TaskNo, // 任务号 Type = "0",// 任务类型 (入库) OutMode = "", //出库口 Order = 1 }; } catch (Exception ex) { Db.RollbackTran(); throw new Exception(ex.Message); } #endregion return comDto; } catch (Exception e) { Db.RollbackTran(); throw new Exception(e.Message); } } //入库完成--正常入库、回流入库、盘点回库(wcs反馈、wms手动完成) public void ArrivalSuccess(string taskNo, int userId, string url) { try { //url = "http://localhost:57061/api/WCSApi/FinshTasks"; //正常入库 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("当前任务已完成"); } Db.BeginTran(); int huistatus = 0; //回流状态 task.Status = "2";//任务状态 task.IsSend = 0; task.IsCancel = 0; task.IsFinish = 0; task.FinishDate = DateTime.Now;//完成时间 Db.Updateable(task).ExecuteCommand(); var stockDetail = Db.Queryable().Where(m => m.PalletNo == task.PalletNo).ToList(); //当前任务中的储位信息 var locate = Db.Queryable().First(m => m.LocatNo == task.EndLocat); string skunno = ""; BllBoxInfo bind = new BllBoxInfo(); if (stockDetail.Count <= 0) { string str = $"select Top 1 * from BllBoxInfo where IsDel = '0' and PalletNo = '{task.PalletNo}' order by CreateTime desc"; bind = Db.Ado.SqlQuerySingle(str); skunno = bind.SkuNo; } else if (stockDetail.Count > 0) { skunno = stockDetail[0].SkuNo; } //获取对应物料当天库存信息 string strinfo = $"select top 1 * from DataStockInfo where IsDel = '0' and SkuNo = '{skunno}' order by CreateTime desc"; var datainfo = Db.Ado.SqlQuerySingle(strinfo); if (locate == null) { throw new Exception("未查询到任务中的储位信息"); } if (userId != 0) { //添加操作日志记录 var k = new OperationSOServer().AddLogOperationSo("入库作业", "入库日志", taskNo, "完成", $"点击完成按钮、完成任务号为:{taskNo}的任务", userId); // 正式运行程序放开 var jsonData = JsonConvert.SerializeObject(task); 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 wcsModel = JsonConvert.DeserializeObject(response); } catch (Exception ex) { Db.RollbackTran(); throw new Exception(ex.Message); } } //判断是否是回流入库完成 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(); huistatus = 1; 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; var datatime = DateTime.Now.ToString("yyyy-MM-dd"); //当天日期 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 = "1", 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 box1 = 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(box1).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 #region 库存记录 if (huistatus == 0) { if (datainfo == null) { datainfo = new DataStockInfo { SkuNo = sku.SkuNo, //物料编码 SkuName = sku.SkuName, //物料名称 Standard = sku.Standard, //规格 Type = sku.Type, //类型 ArrivalQty = item.Qty, // 入库数量 YearArrivalQty = item.Qty, // 入库数量(月) ExportQty = 0, //出库数量 YearExportQty = 0, // 出库数量(月) ExpectedQty = 0, //期初数量 YearExpectedQty = 0, //期初数量(月) BalanceQty = item.Qty, // 结存数量 YearBalanceQty = item.Qty, // 结存数量(月) IsDel = "0", //是否删除 CreateTime = DateTime.Now, //创建时间 CreateUser = 1, //创建人 }; Db.Insertable(datainfo).ExecuteCommand(); } else { datainfo.ArrivalQty += item.Qty;//入库数量 //datainfo.ExportQty += item.LockQty.Value;//出库数量 datainfo.BalanceQty += item.Qty;//结存数量 datainfo.YearBalanceQty += item.Qty;//结存数量(月) datainfo.YearArrivalQty += item.Qty;//入库数量(月) Db.Updateable(datainfo).ExecuteCommand(); } } #endregion break; case "0": var noticeDetail = Db.Queryable().First(m => m.IsDel == "0" && m.Id == item.ASNDetailNo); if (noticeDetail == null) { throw new Exception("未查询到托盘绑定的入库单明细信息"); } //获取入库单总单信息Arrival //var arrival = Db.Queryable().First(m => m.IsDel == "0" && m.ASNNo == noticeDetail.ASNNo); var sku1 = Db.Queryable().First(m => m.IsDel == "0" && m.SkuNo == noticeDetail.SkuNo); string isinspect = "0"; //判断物料是否免检 if (sku1.IsInspect == "1") { isinspect = sku1.IsInspect; } if (sku1.Type == "8") { isinspect = "1"; } //获取该批次最终质检结果 var quality = Db.Queryable().First(a => a.LotNo == noticeDetail.LotNo && a.ASNNo == noticeDetail.ASNNo && a.IsDel == "0"); #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, 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, IsDel = "0", CreateUser = 0, CreateTime = comTime }; if (quality != null) { if (quality.IsQualified != "2") { //修改合格不合格数量 if (quality.IsQualified == "1") //合格 { //增加合格数量 quality.PassQty += item.Qty; sd.InspectStatus = "1"; } else if (quality.IsQualified == "0") //不合格 { //增加不合格数量 quality.FailQty += item.Qty; sd.InspectStatus = "2"; } Db.Updateable(quality).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 == 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 #region 库存记录 if (huistatus == 0) { if (datainfo == null) { datainfo = new DataStockInfo { SkuNo = sku1.SkuNo, //物料编码 SkuName = sku1.SkuName, //物料名称 Standard = sku1.Standard, //规格 Type = sku1.Type, //类型 ArrivalQty = item.Qty, // 入库数量 YearArrivalQty = item.Qty, // 入库数量(月) ExportQty = 0, //出库数量 YearExportQty = 0, // 出库数量(月) ExpectedQty = 0, //期初数量 YearExpectedQty = 0, //期初数量(月) BalanceQty = item.Qty, // 结存数量 YearBalanceQty = item.Qty, // 结存数量(月) IsDel = "0", //是否删除 CreateTime = DateTime.Now, //创建时间 CreateUser = 1, //创建人 }; Db.Insertable(datainfo).ExecuteCommand(); } else { datainfo.ArrivalQty += item.Qty;//入库数量 //datainfo.ExportQty += item.LockQty.Value;//出库数量 datainfo.BalanceQty += item.Qty;//结存数量 datainfo.YearBalanceQty += item.Qty;//结存数量(月) datainfo.YearArrivalQty += item.Qty;//入库数量(月) Db.Updateable(datainfo).ExecuteCommand(); } } #endregion break; } item.Status = "2"; item.CompleteTime = comTime; } locate.Status = "1"; Db.Updateable(locate).ExecuteCommand(); Db.Updateable(bindList).ExecuteCommand(); Db.CommitTran(); } catch (Exception e) { Db.RollbackTran(); throw new Exception(e.Message); } } //手动取消入库任务 public void CancelAsnTask(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("未查询到任务信息"); } Db.BeginTran(); var time = DateTime.Now; //修改任务 task.IsSuccess = 1; task.IsCancel = 0; task.IsFinish = 0; task.Status = "3"; task.CancelDate = DateTime.Now; Db.Updateable(task).ExecuteCommand(); //入库绑定托盘信息 var bind = Db.Queryable().Where(m => m.IsDel == "0" && m.TaskNo == taskNo).ToList(); foreach (var item in bind) { item.IsDel = "0"; item.TaskNo = ""; item.Status = "0";//修改托盘绑定状态信息 item.UpdateTime = time; item.UpdateUser = userId; if (item.Type == "0") { // 更改入库单明细已组数量 var sqlString = string.Empty; //sqlString += $"update BllArrivalNoticeDetail set FactQty = FactQty - '{item.Qty}' where id = '{item.ASNDetailNo}';"; //Db.Ado.ExecuteCommand(sqlString); var detail = Db.Queryable().First(m => m.Id == item.ASNDetailNo); // 更改入库单及入库明细状态 if (detail.FactQty <= 0) { var sqlString2 = string.Empty; sqlString2 += $"update BllArrivalNoticeDetail set Status = '0',CompleteTime= getDate() where id = '{detail.Id}' and Status ='1';"; Db.Ado.ExecuteCommand(sqlString2); var count = Db.Queryable().Count(m => m.Status != "0"); if (count > 0) { sqlString2 = $"update BllArrivalNotice set Status = '0',CompleteTime= getDate() where ASNNo = '{item.ASNNo}' and Status ='0';"; Db.Ado.ExecuteCommand(sqlString2); } } // 更改托盘使用状态 var sqlStr = $"update SysPallets set Status = '1' where PalletNo = '{item.PalletNo}';"; //添加托盘记录表数据 sqlStr += $"insert into LogPalletTrack values('{item.PalletNo}','{item.ASNNo}','解绑组盘','0',getDate(),0,NULL,NULL);"; Db.Ado.ExecuteCommand(sqlStr); } } Db.Updateable(bind).ExecuteCommand(); //添加操作日志记录 var k = new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", taskNo, "取消", $"点击取消按钮取消了任务号为:{taskNo}的任务", (int)userId); // 正式运行程序放开 var jsonData = JsonConvert.SerializeObject(task); 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 wcsModel = JsonConvert.DeserializeObject(response); } catch (Exception ex) { Db.RollbackTran(); throw new Exception(ex.Message); } Db.CommitTran(); } catch (Exception e) { throw new Exception(e.Message); } } #region 申请空托盘 /// /// 申请空托出库 /// /// /// /// public List PalletLocation(string skuNo, string endLocat) { OutCommandDto comDto;//返回wcs的入库命令 try { var outDto1 = new List(); //先出库数据的集合(深度为1的储位) var outDto2 = new List(); //后出库数据的集合(深度为2的储位) var moveDto = new List(); //要移库数据的集合 var com = new Common(); //var skuNolist = skuNo.Substring(','); Db.BeginTran(); //先进行分配 因为无出库单 //此物品直接拣货成功 //根据托盘号前往库位查询库存明细表信息 //获取以后根据最大任务号生成任务 //判断储位信息 深度为1 直接出库并下发出库任务 同时库存明细表中 增加分配数量 锁定数量 出库后直接拣货完成 更改库存表状态 //深度为2 先进行移库 再下发出库任务 下发移库任务和出库任务同时下发 移库时 修改库存明细表状态为 移库锁定 锁定数量 库存总表增加锁定数量 分配最近储位 下发移库任务 //新增任务 #region 空托盘出库业务 #region 判断 var palletSkuNo = new List() { "100099", "100098", "100097", "100096", "100095", }; if (!palletSkuNo.Contains(skuNo)) { throw new Exception("托盘物料不包含当前物料编码!"); } //获取物料信息 var sku = Db.Queryable().First(m => m.SkuNo == skuNo && m.IsDel == "0"); if (sku == null) { throw new Exception("未获取到物料信息!"); } //判断该托盘是否为100098、100097 //if (sku.SkuNo == "100098" || sku.SkuNo == "100097") //{ // //塑料 // if (sku.SkuNo == "100098") // { // if (sku.Demo == "使用黑色") // { // sku = Db.Queryable().First(m => m.SkuNo == "100096" && m.IsDel == "0"); // } // } // //木制 // else if (sku.SkuNo == "100097") // { // if (sku.Demo == "使用双面") // { // sku = Db.Queryable().First(m => m.SkuNo == "100095" && m.IsDel == "0"); // } // } //} var roadway = Db.Queryable().Where(a => a.IsDel == "0" && a.WareHouseNo == "W03" && a.Status == "0").Select(a => a.RoadwayNo).ToList(); if (roadway.Count == 0) { throw new Exception("当前巷道已被全部禁用!"); } //先获取库存总表是否存在该空托盘在库中 var dataStock = Db.Queryable().First(m => m.SkuNo == sku.SkuNo && m.IsDel == "0" && (m.Qty - m.FrozenQty - m.LockQty - m.FrozenQty) > 0); if (dataStock == null) { //库存中没有该空托盘剁 throw new Exception("库存中没有该空托盘剁!"); } //根据库存总表获取库存明细信息 库存状态为待分配和部分分配 var dataStockDeali = Db.Queryable().Where(m => roadway.Contains(m.RoadwayNo) && m.SkuNo == sku.SkuNo && m.IsDel == "0" && (m.Qty - m.FrozenQty - m.LockQty - m.FrozenQty) > 0 && m.Status == "0" || m.Status == "1").OrderBy(m => m.CompleteTime).ToList(); //判断空托盘是否有待分配和部分分配 if (dataStockDeali.Count == 0) { //库内该空托盘没有待分配和部分分配的 throw new Exception("库内该空托盘没有待分配和部分分配的!"); } //int? dataStockQtyCount = 0; //foreach (var item in dataStockDeali) //{ // dataStockQtyCount += item.Qty; // if (dataStockQtyCount >= needQty) // { // break; // } //} //if (dataStockQtyCount < needQty) //{ // throw new Exception("当前未禁用巷道可分配货物不足,禁止分配!"); //} //string EndLocatList[] = new string[]; var EndLocatList = new List() { "23", "33", "41", }; if (!EndLocatList.Contains(endLocat)) { throw new Exception("当前申请工位不是叠托机工位,请核实后再次申请!"); } //判断是否已存在该任务 存在返回 var logTasks = Db.Queryable().First(m => m.IsDel == "0" && m.Type == "1" && m.EndLocat == endLocat && (m.Status == "1" || m.Status == "0")); if (logTasks != null) { throw new Exception("已存在正在执行或等待执行的托盘任务!"); } #endregion #region 包装信息 ////包装信息 //var packList = Db.Queryable().First(m => m.PackagNo == sku.PackagNo && m.IsDel == "0"); //if (packList == null) //{ // throw new Exception("未查询到物料包装"); //} //var pNum = 0;//托盘物品数量 //var bNum = 0;//箱物品数量 //if (packList.L5Num.HasValue) //{ // pNum = Convert.ToInt32(packList.L5Num); // bNum = Convert.ToInt32(packList.L4Num); //} //else if (packList.L4Num.HasValue) //{ // pNum = Convert.ToInt32(packList.L4Num); // bNum = Convert.ToInt32(packList.L3Num); //} //else if (packList.L3Num.HasValue) //{ // pNum = Convert.ToInt32(packList.L3Num); // bNum = Convert.ToInt32(packList.L2Num); //} //else if (packList.L2Num.HasValue) //{ // pNum = Convert.ToInt32(packList.L2Num); // bNum = Convert.ToInt32(packList.L1Num); //} //else if (packList.L1Num.HasValue) //{ // pNum = Convert.ToInt32(packList.L1Num); // bNum = Convert.ToInt32(packList.L1Num); //} //if (pNum == 0) //{ // throw new Exception("未查询到物料包装托箱关系信息"); //} #endregion #region 分配 //进行分配空托盘 //var assign = new AllotSku(); //取合适库存商品 //Dictionary stockQtyDic = new Dictionary();//托出库物品数 //分配货物 //int qty = assign.AllotPallets(dataStockDeali, (int)dataStockDeali[0].Qty, (int)dataStockDeali[0].Qty, 1, stockQtyDic); //获取库存明细信息 DataStockDetail stockDeali = new DataStockDetail(); foreach (var sc in dataStockDeali) { stockDeali = dataStockDeali.First(it => it.Id == sc.Id); var s = dataStockDeali.FirstOrDefault(m => m.Id == sc.Id); //添加分配表信息 var allot = new BllExportAllot { SONo = "", WaveNo = "", SODetailNo = 0, StockId = sc.Id, LotNo = "", LotText = "", SupplierLot = "", SkuNo = s.SkuNo, SkuName = s.SkuName, Standard = s.Standard, PalletNo = s.PalletNo, IsBale = "0", //是否裹包 IsBelt = "0", //是否打带 BoxexQty = s.Qty, Qty = (int)sc.Qty, CompleteQty = 0, Status = "0", LogisticsId = 0, IsAdvance = "0", OutMode = "",//出库口 CreateUser = 0, CreateTime = DateTime.Now }; Db.Insertable(allot).ExecuteCommand(); dataStock.LockQty += (int)sc.Qty; s.LockQty += sc.Qty; if (s.LockQty == s.Qty) { s.Status = "2"; } else { s.Status = "1"; } Db.Updateable(dataStock).ExecuteCommand(); //库存总表锁定数量修改 var sd = Db.Updateable(s).UpdateColumns(it => new { it.LockQty, it.Status }).ExecuteCommand(); //库存明细总表锁定数量修改 break; } #endregion #region 出库 //所有要出库的出库分配信息(未下发的信息和待拣货的信息) var list = Db.Queryable().Where(a => a.IsDel == "0" && a.SkuNo == stockDeali.SkuNo && a.PalletNo == stockDeali.PalletNo && (a.Status == "0" || (a.Status == "2" && a.CompleteQty == 0))).ToList(); if (list.Count == 0) //判断是否有需要下发的出库流水 { throw new Exception("当前出库单据无需要下发的托盘"); } //要出库的托盘集合 var outLpnList = list.Select(m => m.PalletNo).ToList(); //要出库的明细集合 var outStockDetail = Db.Queryable().Where(m => m.IsDel == "0" && outLpnList.Contains(m.PalletNo)).ToList(); //记录错误信息的集合 var flagList = new List();//1:当前要出库的储位正在移出、2 出库的托盘储位信息错误(在储位表中未查询到)、3储位损坏不能出库、4 要出库的托盘正在入库,5 双深度出库前面储位是入库中或者移入中 //循环分配的信息生成出库任务 foreach (var item in list) { var taskNoStr = ""; var stockDetail = outStockDetail.First(m => m.PalletNo == item.PalletNo); // 储位号 var locateNo = stockDetail.LocatNo; //托盘上物料(用于判断物料是否是桶装类型) var skuinfo = Db.Queryable().First(m => m.SkuNo == item.SkuNo); #region 判断 //判断托盘是否在库内(不在库内) if (string.IsNullOrWhiteSpace(locateNo)) { //判断托盘是否在入库中 var imBl = com.GetImTask(item.PalletNo); if (imBl != null) { flagList.Add(4); continue; } //(状态为待拣货的 1) if (item.Status == "0") { //if (sku.Type == "2" || sku.Type == "3" || sku.Type == "4")//桶装类型手持拣货 //{ //} //如果不在仓库内,当前分配信息直接更新出库完成 item.Status = "2";//状态 //item.OutMode = "1号口";//出库口 Db.Updateable(item).ExecuteCommand(); } continue; } var locate = Db.Queryable().First(m => m.LocatNo == locateNo && m.IsDel == "0");//当前出库的储位信息 if (locate == null) { flagList.Add(2); continue; } //判断储位标志是否为损坏 if (locate.Flag == "2") { flagList.Add(3); continue; } #endregion if (locate.Status == "1") //有物品 { if (locate.Depth == "01") //深度为1 { #region 添加出库任务 var taskNo = new Common().GetMaxNo("TK"); var exTask = new LogTask //出库任务 { TaskNo = taskNo, Sender = "WMS", Receiver = "WCS", IsSuccess = 0, //是否下发成功 0失败 1成功 StartLocat = locate.LocatNo,//起始位置 EndLocat = sku.SkuNo == "100099" ? "41" : sku.SkuNo == "100097" ? "33" : sku.SkuNo == "100095" ? "33" : "23",//目标位置 PalletNo = item.PalletNo,//托盘码 IsSend = 1,//是否可再次下发 IsCancel = 1,//是否可取消 IsFinish = 1,//是否可完成 Type = "1",//任务类型 0 入库任务 1 出库任务 2 移库任务 Status = "0",//任务状态0:等待执行1正在执行2执行完成 OrderType = "1",//0 入库单 1 出库单 2 盘点单 3 移库单 Msg = locate.LocatNo + "的出库任务" }; Db.Insertable(exTask).ExecuteCommand(); outDto1.Add(new OutCommandDto() { StartRoadway = locate.RoadwayNo, //起始巷道 PalletNo = item.PalletNo,//托盘号 StartLocat = locate.LocatNo, // 起始位置 EndLocat = "", // 目标位置 TaskNo = exTask.TaskNo, // 任务号 Type = "1",// 任务类型 (出库) OutMode = "", //目标地址 Order = 1, SkuType = sku.Type, //物料类型 LotNo = item.LotNo, // 批次 IsBale = item.IsBale, //是否裹包 IsBelt = item.IsBelt, //是否打带 Qty = item.Qty, //拣货数量 //FullQty = (int)item.BoxexQty, //托盘数量 PalletType = stockDetail.PalletType, //托盘类型(有无子托)0||空||null:无子托盘1:有子托盘 }); taskNoStr = exTask.TaskNo; #endregion } else if (locate.Depth == "02") //深度为2 { //获取出库深度为2储位前面的储位信息 var slotBefore = com.GetLocateNoDepth1(locate.WareHouseNo, locate.LocatNo); if (slotBefore.Status == "1") //前面的储位有货物、进行移库操作 { //要出库深度为2的储位前面的储位中货物是否要出库 var isout = outStockDetail.Count(m => m.LocatNo == slotBefore.LocatNo); if (isout <= 0) //进行移库 { //去库存表中找到储位对应的托盘码操作 var stockNew = Db.Queryable().First(m => m.LocatNo == slotBefore.LocatNo); if (stockNew == null) { var slotChange = Db.Queryable().First(m => m.LocatNo == slotBefore.LocatNo); slotChange.Status = "0"; Db.Updateable(slotChange).ExecuteCommand(); } else { //获取移库的库位 var newSlot = MoveAddress(slotBefore.LocatNo, slotBefore.RoadwayNo, slotBefore.AreaNo); //当前移库库位的储位信息 var locatey = Db.Queryable().First(m => m.LocatNo == newSlot && m.IsDel == "0"); if (!string.IsNullOrEmpty(newSlot)) { #region 添加出库时发生的移库任务 var exYkTaskNo = new Common().GetMaxNo("TK"); var exYkTask = new LogTask //出库时产生移库任务 { TaskNo = exYkTaskNo, Sender = "WMS", Receiver = "WCS", IsSuccess = 0, //是否下发成功 0失败 1成功 StartLocat = stockNew.LocatNo,//起始位置 EndLocat = newSlot,//目标位置 PalletNo = stockNew.PalletNo,//托盘码 IsSend = 1,//是否可再次下发 IsCancel = 1,//是否可取消 IsFinish = 1,//是否可完成 Type = "2",//任务类型 0 入库任务 1 出库任务 2 移库任务 Status = "0",//任务状态0:等待执行1正在执行2执行完成 OrderType = "1",//0 入库单 1 出库单 2 盘点单 3 移库单 Msg = stockNew.LocatNo + " ==>> " + newSlot + "的移库任务", }; Db.Insertable(exYkTask).ExecuteCommand(); moveDto.Add(new OutCommandDto() { StartRoadway = slotBefore.RoadwayNo, //起始巷道 PalletNo = stockNew.PalletNo,//托盘号 StartLocat = stockNew.LocatNo, // 起始位置 EndLocat = newSlot, // 目标位置 EndRoadway = locatey.RoadwayNo, // 目标巷道 TaskNo = exYkTask.TaskNo, // 任务号 Type = "2",// 任务类型 (移库) OutMode = "", //目标地址 Order = 1, SkuType = sku.Type, //物料类型 LotNo = stockNew.LotNo, Qty = 0, //拣货数量 //FullQty = (int)stockNew.Qty, //托盘数量 PalletType = stockNew.PalletType, //托盘类型(有无子托)0||空||null:无子托盘1:有子托盘 }); #endregion #region 改变储位装填 var slotChange = Db.Queryable().First(m => m.Id == slotBefore.Id); var slotChange2 = Db.Queryable().First(m => m.LocatNo == newSlot); slotChange.Status = "5"; //改变状态(正在移出) slotChange2.Status = "4"; // 改变状态(正在移入) Db.Updateable(slotChange).ExecuteCommand(); Db.Updateable(slotChange2).ExecuteCommand(); #endregion } else { #region 添加出库任务 var exYkTaskNo1 = new Common().GetMaxNo("TK"); var exYkTask1 = new LogTask //出库移库没有库位了进行出库任务 { TaskNo = exYkTaskNo1, Sender = "WMS", Receiver = "WCS", IsSuccess = 0, //是否下发成功 0失败 1成功 StartLocat = stockNew.LocatNo,//起始位置 EndLocat = sku.SkuNo == "100099" ? "41" : sku.SkuNo == "100097" ? "33" : sku.SkuNo == "100095" ? "33" : "23",//目标位置 PalletNo = stockNew.PalletNo,//托盘码 IsSend = 1,//是否可再次下发 IsCancel = 1,//是否可取消 IsFinish = 1,//是否可完成 Type = "1",//任务类型 0 入库任务 1 出库任务 2 移库任务 Status = "0",//任务状态0:等待执行1正在执行2执行完成 OrderType = "1",//0 入库单 1 出库单 2 盘点单 3 移库单 Msg = locate.LocatNo + "的出库任务" }; Db.Insertable(exYkTask1).ExecuteCommand(); outDto1.Add(new OutCommandDto() { StartRoadway = slotBefore.RoadwayNo, //起始巷道 PalletNo = stockNew.PalletNo,//托盘号 StartLocat = stockNew.LocatNo, // 起始位置 EndLocat = "", // 目标位置 TaskNo = exYkTask1.TaskNo, // 任务号 Type = "1",// 任务类型 (出库) OutMode = "", //目标地址 Order = 1, SkuType = sku.Type, //物料类型 LotNo = "", // 批次 IsBale = "0", //是否裹包 IsBelt = "0", //是否打带 Qty = 0, //拣货数量 //FullQty = (int)stockNew.Qty, //托盘数量 PalletType = stockNew.PalletType, //托盘类型(有无子托)0||空||null:无子托盘1:有子托盘 }); #endregion #region MyRegion var slotChange = Db.Queryable().First(m => m.Id == slotBefore.Id); slotChange.Status = "3"; //改变状态(正在出库) Db.Updateable(slotChange).ExecuteCommand(); #endregion } } } } else if (slotBefore.Status == "2" || slotBefore.Status == "4") //前面储位状态是入库中或者移入中 { flagList.Add(5); continue; } #region 添加出库任务 var taskNo1 = new Common().GetMaxNo("TK"); var exTask1 = new LogTask //出库任务 { TaskNo = taskNo1, Sender = "WMS", Receiver = "WCS", IsSuccess = 0, //是否下发成功 0失败 1成功 StartLocat = locate.LocatNo,//起始位置 EndLocat = sku.SkuNo == "100099" ? "41" : sku.SkuNo == "100097" ? "33" : sku.SkuNo == "100095" ? "33" : "23",//目标位置 PalletNo = item.PalletNo,//托盘码 IsSend = 1,//是否可再次下发 IsCancel = 1,//是否可取消 IsFinish = 1,//是否可完成 Type = "1",//任务类型 0 入库任务 1 出库任务 2 移库任务 Status = "0",//任务状态0:等待执行1正在执行2执行完成 OrderType = "1",//0 入库单 1 出库单 2 盘点单 3 移库单 Msg = locate.LocatNo + "的出库任务" }; Db.Insertable(exTask1).ExecuteCommand(); outDto2.Add(new OutCommandDto() { StartRoadway = locate.RoadwayNo, //起始巷道 PalletNo = item.PalletNo,//托盘号 StartLocat = locate.LocatNo, // 起始位置 EndLocat = "", // 目标位置 TaskNo = exTask1.TaskNo, // 任务号 Type = "1",// 任务类型 (出库) OutMode = "", //目标地址 Order = 1, SkuType = sku.Type, //物料类型 IsBale = item.IsBale, //是否裹包 IsBelt = item.IsBelt, //是否打带 Qty = item.Qty, //拣货数量 //FullQty = (int)item.BoxexQty, //托盘数量 PalletType = stockDetail.PalletType, //托盘类型(有无子托)0||空||null:无子托盘1:有子托盘 }); taskNoStr = exTask1.TaskNo; #endregion } #region 改变数据 if (item.Status == "0")//判断托盘是否下发过 { var noticeDetail = Db.Queryable().First(m => m.IsDel == "0" && m.Id == item.SODetailNo); if (noticeDetail != null) //更新出库单据的下发数量 { noticeDetail.FactQty += item.Qty; Db.Updateable(noticeDetail).ExecuteCommand(); } } item.TaskNo = taskNoStr; // 出库分配信息中更新任务号 item.Status = "1"; // 出库分配信息状态改为正在执行 Db.Updateable(item).ExecuteCommand(); locate.Status = "3"; //要出库的储位改变状态 正在出库 Db.Updateable(locate).ExecuteCommand(); #endregion flagList.Add(0); } else if (locate.Status == "3") //出库中 { if (sku.Type == "2" || sku.Type == "3" || sku.Type == "4") { continue; } #region 改变数据 //判断是否是已经出过库又回库(状态为待拣货的 1) if (item.Status == "0") { var noticeDetail = Db.Queryable().First(m => m.IsDel == "0" && m.Id == item.SODetailNo); if (noticeDetail != null) //更新出库单据的下发数量 { noticeDetail.FactQty += item.Qty; Db.Updateable(noticeDetail).ExecuteCommand(); } } var taskNo = Db.Queryable().First(m => m.OrderType == "1" && m.TaskNo != item.TaskNo && m.Status == "1" && m.PalletNo == item.PalletNo); item.TaskNo = taskNo.TaskNo; item.Status = "1"; // 出库分配信息状态改为正在执行 Db.Updateable(item).ExecuteCommand(); #endregion } else if (locate.Status == "5") //移出中 { flagList.Add(1); } } //先移库后出库 outDto1.AddRange(moveDto); outDto1.AddRange(outDto2); var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss") var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss") // 正式运行程序放开 var list2 = outDto1.Select(m => m.TaskNo).ToList(); var jsonData = JsonConvert.SerializeObject(outDto1); //更改任务的发送返回时间// new TaskServer().EditTaskIssueOk(list2, time1, time2); #endregion #endregion Db.CommitTran(); return outDto1; } catch (Exception e) { Db.RollbackTran(); throw new Exception(e.Message); } } #region 移库目标库位 /// /// 获取移库目标库位 /// /// 需要移动的库位地址 /// 巷道 /// 区域 /// 目标库位地址 为"" 直接下发两次出库指令 public string MoveAddress(string oldAddress, string roadWay, string area)//01020201 排-列-层-深度 { string nowAddress = ""; // 获取移库目标储位 var row = int.Parse(oldAddress.Substring(0, 2)); var lie = int.Parse(oldAddress.Substring(2, 2)); var ceng = int.Parse(oldAddress.Substring(4, 2)); var sqlString = $@"select LocatNo,[Row],[Column],Layer, (ABS(Row-{row}) + ABS([Column]-{lie}) + ABS(Layer-{ceng})) as distNum from SysStorageLocat where Flag = '0' and Status in ('0','3','5') and Depth = '02' and RoadwayNo = '{roadWay}' and AreaNo = '{area}' order by distNum;"; var addressModels = Db.Ado.SqlQuery(sqlString).ToList(); if (addressModels.Count > 0) // 判断同巷道内排空库位 { var listLocaete = new List(); foreach (var item in addressModels) { // 目标内库位对应的外库位 string addressee = item.LocatNo.Substring(0, 6) + "01"; // 判断目标库位的外库位是否存在货物 (正常情况下正在移入情况不存在,因为移库先移入里面,后移入外面) //SlotStatus 0: 空储位 1:有货 2:正在入库 3:正在出库 4:正在移入 5:正在移出 sqlString = $"select count(*) from SysStorageLocat where LocatNo = '{addressee}' and Status in ('0','3','5') and Flag in ('0','1') ; "; var rowNum = Db.Ado.SqlQuery(sqlString).First(); if (rowNum == 0) { continue; } else { nowAddress = item.LocatNo; break; } } } if (nowAddress == "") { // 判断同巷道外排空库位 sqlString = $@"select LocatNo,[Row],[Column],Layer, (ABS(Row-{row}) + ABS([Column]-{lie}) + ABS(Layer-{ceng})) as distNum from SysStorageLocat where Flag = '0' and Status in ('0','3','5') and Depth = '01' and RoadwayNo = '{roadWay}' and AreaNo = '{area}' order by distNum;"; var adderModeling = Db.Ado.SqlQuery(sqlString).ToList(); if (adderModeling.Count > 0) { nowAddress = adderModeling[0].LocatNo; } else { // 库内不存在空储位 nowAddress = ""; } } return nowAddress; } #endregion #endregion #region 满放空取 public OutCommandDto ReLocation(RequestLocate model) { try { OutCommandDto comDto = new OutCommandDto();//返回wcs的入库命令 var stock = Db.Queryable().First(a => a.PalletNo == model.PalletNo);//托盘信息 //判断托盘条码是否有效 if (stock == null) { throw new Exception("托盘条码不受WMS管理,不可入库!"); } //获取托盘绑定信息 var palletbind = Db.Queryable().Where(a => a.PalletNo == model.PalletNo).OrderByDescending(a => a.Id).First(); //获取任务信息 var logtask = Db.Queryable().Where(a => a.PalletNo == model.PalletNo).OrderByDescending(a => a.TaskNo).First(); //获取储位信息 var locat = Db.Queryable().First(a => a.LocatNo == logtask.EndLocat); Db.BeginTran(); #region 修改储位属性 //验证储位是深度1或深度2 if (locat.Depth == "01") { //获取深度2储位 var locat2 = Db.Queryable().First(a => a.LocateGroup == locat.LocateGroup && a.Depth == "02"); //locat.Flag = "1"; locat2.Flag = "1"; Db.Updateable(locat2).ExecuteCommand(); } //else //{ //} locat.Flag = "1"; Db.Updateable(locat).ExecuteCommand(); #endregion #region 重新申请储位 var areaCode = ""; SysStorageArea area = null; switch (model.SubPallet) { case "0": area = Db.Queryable().First(m => m.WareHouseNo == "W03" && m.AreaName == "母托盘区" && m.IsDel == "0"); break; case "1": case "2": case "3": case "4": area = Db.Queryable().First(m => m.WareHouseNo == "W03" && m.AreaName == "子母托盘区" && m.IsDel == "0"); break; } if (area != null) { areaCode = area.AreaNo; } var plnList = new List() { "10", "20", "30", }; if (!plnList.Contains(model.TaskType)) { areaCode = ""; } if (string.IsNullOrWhiteSpace(areaCode) && !plnList.Contains(model.TaskType)) { throw new Exception("未查询到当前托盘有无子托定义,请核实"); } var allotLocate = new AllotLocation(); SysStorageLocat locate; //if (isHaveLocateNo) //指定储位 //{ // locate = Db.Queryable().First(m => m.LocatNo == haveLocate.LocatNo); //} //else //{ //获取同巷道新储位 locate = allotLocate.GetSuiTableLocate("W03", areaCode, locat.RoadwayNo); //} #endregion #region 重新申请后 修改相关信息 //修改储位状态 locate.Status = "2"; Db.Updateable(locate).ExecuteCommand(); //修改托盘绑定储位地址 palletbind.LocatNo = locate.LocatNo; Db.Updateable(palletbind).ExecuteCommand(); //修改任务目标地址 logtask.EndLocat = locate.LocatNo; Db.Updateable(logtask).ExecuteCommand(); var log = new RoadwayUseLogServer(); var bl = log.AddRoadwayUseLog(new AddRoadwayUseLogVm() { WareHouseNo = locate.WareHouseNo, RoadwayNo = locate.RoadwayNo, LocateNo = locate.LocatNo, Row = locate.Row, Column = locate.Column, Layer = locate.Layer, Depth = locate.Depth, }, 0); if (!bl) { throw new Exception("满放巷道使用记录添加失败"); } #endregion Db.CommitTran(); comDto = new OutCommandDto() { PalletNo = model.PalletNo,//托盘号 PalletType = model.SubPallet,//托盘类型 StartLocat = "", // 起始位置 EndLocat = locate.LocatNo, // 目标位置 EndRoadway = locate.RoadwayNo, // 目标位置 TaskNo = logtask.TaskNo, // 任务号 Type = "0",// 任务类型 (入库) OutMode = "", //出库口 Order = 1 }; return comDto; } catch (Exception e) { Db.RollbackTran(); throw new Exception(e.Message); } } #endregion } }