using Model.ModelDto.DataDto; using Model.ModelDto.SysDto; using Model.ModelVm.LogVm; using SqlSugar; using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; using Utility; using WMS.BLL.LogServer; using WMS.DAL; using WMS.Entity.BllAsnEntity; using WMS.Entity.Context; using WMS.Entity.DataEntity; using WMS.Entity.LogEntity; using WMS.Entity.SysEntity; using WMS.IBLL.IBllCheckServer; using WMS.IBLL.ILogServer; namespace WMS.BLL.BllCheckServer { public class WarehouseOutsidePalletsServer : DbHelper, IWarehouseOutsidePalletsServer { private static readonly SqlSugarScope Db = DataContext.Db; private readonly UserManager _userManager; private readonly IOperationCRServer _operation; public WarehouseOutsidePalletsServer(UserManager userManager, IOperationCRServer operation) : base(Db) { _userManager = userManager; _operation = operation; } /// /// 获取库外托盘信息列表 /// /// 物料号 /// 物料名称 /// 批次 /// 托盘号 /// public async Task> GetPalletsOutside(string skuNo, string skuName, string lotNo, string palletNo, int page, int limit, RefAsync count) { var list = await Db.Queryable() .Where(a => a.IsDel == "0" && SqlFunc.IsNullOrEmpty(a.LocatNo) && SqlFunc.IsNullOrEmpty(a.WareHouseNo)) .WhereIF(!string.IsNullOrEmpty(skuNo), a => a.SkuNo.Contains(skuNo)) .WhereIF(!string.IsNullOrEmpty(skuName), a => a.SkuName.Contains(skuName)) .WhereIF(!string.IsNullOrEmpty(lotNo), a => a.LotNo.Contains(lotNo)) .WhereIF(!string.IsNullOrEmpty(palletNo), a => a.PalletNo.Contains(palletNo)) .OrderBy(a => new { a.LotNo, a.SkuNo, a.PalletNo }) .Select() .ToPageListAsync(page, limit, count); return list; } //保存指定的储位 public async Task SaveAppointSlot(int stockDetailId, int locateId) { //库存明细信息 var stockDetail = await Db.Queryable().FirstAsync(m => m.IsDel == "0" && m.Id == stockDetailId); if (stockDetail == null) { throw Oops.Bah("未查询到库存库外托盘的信息"); } if (!string.IsNullOrWhiteSpace(stockDetail.LocatNo)) { throw Oops.Bah("该托盘已在储位上,不能指定储位,请核实!"); } //储位 var locate = await Db.Queryable().FirstAsync(m => m.IsDel == "0" && m.Id == locateId); if (locate == null) { throw Oops.Bah("未查询到储位的信息"); } if (locate.Status != "0" || locate.Flag != "0") { throw Oops.Bah("该储位状态不是空储位或标志不是正常的"); } var logTask = await Db.Queryable().FirstAsync(m => m.IsDel == "0" && m.Type == "0" && m.PalletNo == stockDetail.PalletNo && m.Status == "1"); if (logTask != null) { throw Oops.Bah("当前托盘已有正在执行的任务,请核实查看"); } //若是深度1的 则判断深度2是否为空储位 if (locate.Depth == "01") { var locateDepth = await Db.Queryable().FirstAsync(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 Oops.Bah("该储位深度2不是有物品,不可绑定"); } } } //判断是否为深度2的 若为深度2 则获取深度1储位 判断是否为空储位 if (locate.Depth == "02") { var locateDepth = await Db.Queryable().FirstAsync(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 Oops.Bah("该储位深度1不是空储位或标志不是正常的"); } } // 获取此托盘的任务号 var taskModel = await Db.Queryable().FirstAsync(m => m.IsDel == "0" && m.PalletNo == stockDetail.PalletNo && m.IsSuccess == 0 && m.Status == "0"); Db.BeginTran(); try { var time = DateTime.Now; var taskNo = string.Empty; if (taskModel == null) // 之前未指定托盘 { // 添加入库日志记录 taskNo = new Common().GetMaxNo("TK"); var task = new LogTask //入库任务 { TaskNo = taskNo, Sender = "WMS", Receiver = "WCS", IsSuccess = 0, //是否下发成功 0失败 1成功 SendDate = time, //发送时间 BackDate = time, //返回时间 StartRoadway = "", // 起始巷道 StartLocat = "",//起始位置 EndLocat = locate.LocatNo,//目标位置 EndRoadway = locate.RoadwayNo, // 目标巷道 PalletNo = stockDetail.PalletNo,//托盘码 IsSend = 1,//是否可再次下发 IsCancel = 1,//是否可取消 IsFinish = 1,//是否可完成 Type = "0",//任务类型 0 入库任务 1 出库任务 2 移库任务 Status = "0",//任务状态0:等待执行1正在执行2执行完成 OrderType = "0",//0 入库单 1 出库单 2 盘点单 3 移库单 Msg = "入库口到=>>" + locate.LocatNo + "储位的入库任务", //关键信息 }; await Db.Insertable(task).ExecuteCommandAsync(); locate.Status = "2"; await Db.Updateable(locate).ExecuteCommandAsync(); } else // 已指定过托盘需变更 { // 获取上次指定的储位地址 var locateOld = await Db.Queryable().FirstAsync(m => m.IsDel == "0" && m.LocatNo == taskModel.EndLocat); if (locateOld != null) { if (locateOld.LocatNo == locate.LocatNo) // 判断当前指定的地址和上次的是否一致,若一致不做更改 { throw new Exception("已指定相同储位地址"); } else // 若不一致 释放上次指定的储位地址 { locateOld.Status = "0"; await Db.Updateable(locateOld).ExecuteCommandAsync(); } } locate.Status = "2"; await Db.Updateable(locate).ExecuteCommandAsync(); // 更新任务号指定地址信息 taskModel.EndLocat = locate.LocatNo;//目标储位 taskModel.EndRoadway = locate.RoadwayNo;//目标巷道 await Db.Updateable(taskModel).ExecuteCommandAsync(); taskNo = taskModel.TaskNo; } // 更新组盘表巷道地址和储位地址 var bindModel = await Db.Queryable().FirstAsync(m => m.IsDel == "0" && m.PalletNo == stockDetail.PalletNo && m.ASNDetailNo == stockDetail.ASNDetailNo && m.ASNNo == stockDetail.ASNNo); if (string.IsNullOrWhiteSpace(bindModel.TaskNo) || bindModel.TaskNo == taskNo) { bindModel.TaskNo = taskNo; bindModel.WareHouseNo = locate.WareHouseNo; bindModel.RoadwayNo = locate.RoadwayNo; bindModel.LocatNo = locate.LocatNo; await Db.Updateable(bindModel).ExecuteCommandAsync(); } // 插入操作日志 await _operation.AddLogOperationCr(new OperationInputVm() { ParentName = "库内作业", MenuName = "库外托盘", FkNo = stockDetail.PalletNo, TypeName = "编辑", Msg = $"指定了储位:{locate.LocatNo}、单据号:{stockDetail.ASNNo}、托盘码:{stockDetail.PalletNo}的信息" }); //提交事务 Db.CommitTran(); } catch (Exception e) { Db.RollbackTran(); throw new Exception(e.Message); } } } }