| | |
| | | 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; |
| | |
| | | public class WarehouseOutsidePalletsServer : DbHelper<DataStockDetail>, IWarehouseOutsidePalletsServer |
| | | { |
| | | private static readonly SqlSugarScope Db = DataContext.Db; |
| | | public WarehouseOutsidePalletsServer() : base(Db) |
| | | private readonly UserManager _userManager; |
| | | public WarehouseOutsidePalletsServer(UserManager userManager) : base(Db) |
| | | { |
| | | _userManager = userManager; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | /// <param name="lotNo">批次</param> |
| | | /// <param name="palletNo">托盘号</param> |
| | | /// <returns></returns> |
| | | public List<MateDataStockDto> GetPalletsOutside(string skuNo, string skuName, string lotNo, string palletNo, int page, int limit, out int count) |
| | | public async Task<List<MateDataStockDto>> GetPalletsOutside(string skuNo, string skuName, string lotNo, string palletNo, int page, int limit, RefAsync<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<MateDataStockDto> mateDataStockDtos = Db.Ado.SqlQuery<MateDataStockDto>(str); |
| | | var com = new Common(); |
| | | count = com.GetRowCount(sqlCount); |
| | | return mateDataStockDtos; |
| | | var list = await Db.Queryable<DataStockDetail>() |
| | | .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<MateDataStockDto>() |
| | | .ToPageListAsync(page, limit, count); |
| | | return list; |
| | | } |
| | | |
| | | |
| | | //保存指定的储位 |
| | | public void SaveAppointSlot(int stockDetailId, int locateId, int userId) |
| | | public async Task SaveAppointSlot(int stockDetailId, int locateId) |
| | | { |
| | | //库存明细信息 |
| | | var stockDetail = await Db.Queryable<DataStockDetail>().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<SysStorageLocat>().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<LogTask>().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<SysStorageLocat>().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<SysStorageLocat>().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<LogTask>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == stockDetail.PalletNo && m.IsSuccess == 0 && m.Status == "0"); |
| | | |
| | | Db.BeginTran(); |
| | | try |
| | | { |
| | | |
| | | //库存明细信息 |
| | | var stockDetail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.Id == stockDetailId); |
| | | if (stockDetail == null) |
| | | var time = DateTime.Now; |
| | | var taskNo = string.Empty; |
| | | if (taskModel == null) // 之前未指定托盘 |
| | | { |
| | | throw new Exception("未查询到库存库外托盘的信息"); |
| | | } |
| | | if (!string.IsNullOrWhiteSpace(stockDetail.LocatNo)) |
| | | { |
| | | throw new Exception("该托盘已在储位上,不能指定储位,请核实!"); |
| | | } |
| | | //储位 |
| | | var locate = Db.Queryable<SysStorageLocat>().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<LogTask>().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<SysStorageLocat>().First(a => a.IsDel == "0" && a.Row == locate.Row && a.Column == locate.Column && a.Layer == locate.Layer && a.Depth == "02"); |
| | | if (locateDepth != null) |
| | | // 添加入库日志记录 |
| | | taskNo = new Common().GetMaxNo("TK"); |
| | | var task = new LogTask //入库任务 |
| | | { |
| | | if (locateDepth.Status != "1") |
| | | 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<SysStorageLocat>().FirstAsync(m => m.IsDel == "0" && m.LocatNo == taskModel.EndLocat); |
| | | if (locateOld != null) |
| | | { |
| | | if (locateOld.LocatNo == locate.LocatNo) // 判断当前指定的地址和上次的是否一致,若一致不做更改 |
| | | { |
| | | throw new Exception("该储位深度2不是有物品,不可绑定"); |
| | | 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; |
| | | } |
| | | //判断是否为深度2的 若为深度2 则获取深度1储位 判断是否为空储位 |
| | | if (locate.Depth == "02") |
| | | // 更新组盘表巷道地址和储位地址 |
| | | var bindModel = await Db.Queryable<BllPalletBind>().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) |
| | | { |
| | | var locateDepth = Db.Queryable<SysStorageLocat>().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不是空储位或标志不是正常的"); |
| | | } |
| | | bindModel.TaskNo = taskNo; |
| | | bindModel.WareHouseNo = locate.WareHouseNo; |
| | | bindModel.RoadwayNo = locate.RoadwayNo; |
| | | bindModel.LocatNo = locate.LocatNo; |
| | | await Db.Updateable(bindModel).ExecuteCommandAsync(); |
| | | } |
| | | |
| | | // 获取此托盘的任务号 |
| | | var taskModel = Db.Queryable<LogTask>().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<SysStorageLocat>().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<BllPalletBind>().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); |
| | | } |
| | | |
| | | // 插入操作日志 |
| | | new OperationASNServer().AddLogOperationAsn("库内作业", "库外托盘", stockDetail.PalletNo, "编辑", |
| | | $"指定了储位:{locate.LocatNo}、单据号:{stockDetail.ASNNo}、托盘码:{stockDetail.PalletNo}的信息", _userManager.UserId); |
| | | //提交事务 |
| | | Db.CommitTran(); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | Db.RollbackTran(); |
| | | throw new Exception(e.Message); |
| | | } |
| | | } |