using Model.ModelDto.DataDto; using Model.ModelDto.SysDto; using SqlSugar; using System; using System.Collections.Generic; using System.Text; 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; namespace WMS.BLL.BllCheckServer { public class WarehouseOutsidePalletsServer : DbHelper, IWarehouseOutsidePalletsServer { private static readonly SqlSugarScope Db = DataContext.Db; public WarehouseOutsidePalletsServer() : base(Db) { } /// /// 获取库外托盘信息列表 /// /// 物料号 /// 物料名称 /// 批次 /// 托盘号 /// public List GetPalletsOutside(string skuNo, string skuName, string lotNo, string palletNo, int page, int limit, out int count) { string sqlCount = "SELECT DISTINCT COUNT(DataStockDetail.ID) " + "FROM DataStockDetail " + "where IsDel = 0 and isnull(LocatNo,'') = '' and isnull(WareHouseNo,'') = '' "; string str = "select Id,LotNo,LotText,SupplierLot,SkuNo,SkuName,Standard,Qty,LockQty,FrozenQty,PalletNo," + "Status,InspectMark,BitPalletMark,InspectStatus " + "from DataStockDetail " + "where IsDel = 0 and isnull(LocatNo,'') = '' and isnull(WareHouseNo,'') = ''"; //判断物料号是否为空 if (!string.IsNullOrEmpty(skuNo)) { str += $" and SkuNo like '%{skuNo}%'"; } //判断物料名称是否为空 if (!string.IsNullOrEmpty(skuName)) { str += $" and SkuName like '%{skuName}%'"; } //判断批次是否为空 if (!string.IsNullOrEmpty(lotNo)) { str += $" and LotNo like '%{lotNo}%'"; } //判断托盘号是否为空 if (!string.IsNullOrEmpty(palletNo)) { str += $" and PalletNo like '%{palletNo}%'"; } //排序 str += " order by LotNo,SkuNo,PalletNo"; if (page == 0) { page = 1; } str += $" offset {((page - 1) * limit)} rows fetch next {limit} rows only;"; List mateDataStockDtos = Db.Ado.SqlQuery(str); var com = new Common(); count = com.GetRowCount(sqlCount); return mateDataStockDtos; } //保存指定的储位 public void SaveAppointSlot(int stockDetailId, int locateId, int userId) { try { //库存明细信息 var stockDetail = Db.Queryable().First(m => m.IsDel == "0" && m.Id == stockDetailId); if (stockDetail == null) { throw new Exception("未查询到库存库外托盘的信息"); } if (!string.IsNullOrWhiteSpace(stockDetail.LocatNo)) { 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("该储位状态不是空储位或标志不是正常的"); } var logTask = Db.Queryable().First(m => m.IsDel == "0" && m.Type == "0" && m.PalletNo == stockDetail.PalletNo && m.Status == "1"); if (logTask != null) { throw new Exception("当前托盘已有正在执行的任务,请核实查看"); } //若是深度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 taskModel = Db.Queryable().First(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 + "储位的入库任务", //关键信息 }; Db.Insertable(task).ExecuteCommand(); locate.Status = "2"; Db.Updateable(locate).ExecuteCommand(); } else // 已指定过托盘需变更 { // 获取上次指定的储位地址 var locateOld = Db.Queryable().First(m => m.IsDel == "0" && m.LocatNo == taskModel.EndLocat); if (locateOld != null) { if (locateOld.LocatNo == locate.LocatNo) // 判断当前指定的地址和上次的是否一致,若一致不做更改 { throw new Exception("已指定相同储位地址"); } else // 若不一致 释放上次指定的储位地址 { locateOld.Status = "0"; Db.Updateable(locateOld).ExecuteCommand(); } } locate.Status = "2"; Db.Updateable(locate).ExecuteCommand(); // 更新任务号指定地址信息 taskModel.EndLocat = locate.LocatNo;//目标储位 taskModel.EndRoadway = locate.RoadwayNo;//目标巷道 Db.Updateable(taskModel).ExecuteCommand(); taskNo = taskModel.TaskNo; } // 更新组盘表巷道地址和储位地址 var bindModel = Db.Queryable().First(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; Db.Updateable(bindModel).ExecuteCommand(); } // 插入操作日志 new OperationASNServer().AddLogOperationAsn("库内作业", "库外托盘", stockDetail.PalletNo, "编辑", $"指定了储位:{locate.LocatNo}、单据号:{stockDetail.ASNNo}、托盘码:{stockDetail.PalletNo}的信息", userId); //提交事务 Db.CommitTran(); } catch (Exception e) { Db.RollbackTran(); throw new Exception(e.Message); } } catch (Exception e) { throw new Exception(e.Message); } } } }