| | |
| | | using WMS.Entity.BllAsnEntity; |
| | | using System.Threading.Tasks; |
| | | using Utility; |
| | | using WMS.BLL.Logic; |
| | | |
| | | namespace WMS.BLL.BllPdaServer |
| | | { |
| | | public class PdaSoServer : IPdaSoServer |
| | | { |
| | | private static readonly SqlSugarScope Db = DataContext.Db; |
| | | |
| | | #region JC34 |
| | | |
| | | /// <summary> |
| | | /// 拼托出库pda拣货-标签 |
| | | /// </summary> |
| | | /// <param name="soNo"></param> |
| | | /// <param name="soDetailId"></param> |
| | | /// <param name="palletNo"></param> |
| | | /// <param name="boxNo"></param> |
| | | /// <param name="palletNoNew"></param> |
| | | /// <param name="userId"></param> |
| | | public async Task SoSetPinPick34(string soNo, string soDetailId, string palletNo, string boxNo , string palletNoNew, int userId) |
| | | { |
| | | Db.BeginTran(); |
| | | try |
| | | { |
| | | var nowDate = DateTime.Now;//当前时间 |
| | | #region 判断 |
| | | |
| | | if (string.IsNullOrWhiteSpace(soNo)) |
| | | { |
| | | throw Oops.Bah("出库单据不能为空"); |
| | | } |
| | | if (string.IsNullOrWhiteSpace(soDetailId)) |
| | | { |
| | | throw Oops.Bah("出库物料-批次不能为空"); |
| | | } |
| | | if (string.IsNullOrWhiteSpace(palletNo)) |
| | | { |
| | | throw Oops.Bah("托盘码不能为空"); |
| | | } |
| | | if (string.IsNullOrWhiteSpace(palletNoNew)) |
| | | { |
| | | throw Oops.Bah("新托盘码不能为空"); |
| | | } |
| | | if (palletNo == palletNoNew)//原托盘与新托盘一致 |
| | | { |
| | | if (!string.IsNullOrEmpty(boxNo)) |
| | | { |
| | | throw Oops.Bah("原托盘与新托盘一致,请选择整托出库"); |
| | | } |
| | | } |
| | | |
| | | //出库单 |
| | | var notice = await Db.Queryable<BllExportNotice>().FirstAsync(m => m.IsDel == "0" && m.SONo == soNo); |
| | | if (notice == null) |
| | | { |
| | | throw Oops.Bah("未查询到该出库单的信息"); |
| | | } |
| | | if (notice.Status != "3") |
| | | { |
| | | throw Oops.Bah("出库单的状态不是正在执行,不能拣货"); |
| | | } |
| | | //出库单明细 |
| | | var noticeDetail = await Db.Queryable<BllExportNoticeDetail>() |
| | | .FirstAsync(m => m.IsDel == "0" && m.Id == int.Parse(soDetailId)); |
| | | if (noticeDetail == null) |
| | | { |
| | | throw Oops.Bah("未查询到该出库单明细的信息"); |
| | | } |
| | | //出库分配信息 |
| | | var allot = await Db.Queryable<BllExportAllot>().FirstAsync(m => |
| | | m.IsDel == "0" && (m.Status == "2" || m.Status == "3") && m.SONo == soNo && |
| | | m.SODetailNo == int.Parse(soDetailId) && m.PalletNo == palletNo); |
| | | if (allot == null) |
| | | { |
| | | throw Oops.Bah("未查询到该托盘的分配信息"); |
| | | } |
| | | //剩余拣货数量(待拣减去已拣) |
| | | var needQty = allot.Qty - allot.CompleteQty; |
| | | |
| | | //库存明细 |
| | | var stockDetail = await Db.Queryable<DataStockDetail>().FirstAsync(m => m.IsDel == "0" && m.Id == allot.StockId); |
| | | if (stockDetail == null) |
| | | { |
| | | throw Oops.Bah("未查询到该托盘分配的库存明细信息!"); |
| | | } |
| | | //库存总表 |
| | | var stock = await Db.Queryable<DataStock>().FirstAsync(a => a.IsDel == "0" && a.SkuNo == stockDetail.SkuNo && a.LotNo == stockDetail.LotNo); |
| | | if (stock == null) |
| | | { |
| | | throw Oops.Bah("未查询到该托盘分配的库存信息!"); |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | #region 拼托信息 |
| | | var sdId = 0; |
| | | bool isNew = false; |
| | | |
| | | var pinStockDetail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.SkuNo == stockDetail.SkuNo && m.LotNo == stockDetail.LotNo); |
| | | |
| | | if (pinStockDetail != null) |
| | | { |
| | | if (palletNo != palletNoNew)//非整托拣货 |
| | | { |
| | | var pinStockDetails = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.Id!= pinStockDetail.Id).ToList(); |
| | | if (pinStockDetails.Count(m=>m.SONo != notice.SONo) > 0) |
| | | { |
| | | throw Oops.Bah("拼托托盘上只能放同一个出库单下的物料!"); |
| | | } |
| | | } |
| | | |
| | | sdId = pinStockDetail.Id; |
| | | } |
| | | else |
| | | { |
| | | isNew = true; |
| | | |
| | | var newPalletInfo = await Db.Queryable<SysPallets>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.Status == "0"); |
| | | if (newPalletInfo == null) |
| | | { |
| | | var pinStockDetails = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.Id != pinStockDetail.Id).ToList(); |
| | | if (pinStockDetails.Count(m => m.SONo != notice.SONo) > 0) |
| | | { |
| | | throw Oops.Bah("新托盘信息不存在或已被使用!"); |
| | | } |
| | | } |
| | | //修改新托盘状态 |
| | | newPalletInfo.Status = "1"; |
| | | await Db.Updateable(newPalletInfo).ExecuteCommandAsync(); |
| | | } |
| | | |
| | | var sd = new DataStockDetail(); |
| | | if (isNew) |
| | | { |
| | | sd.LotNo = stockDetail.LotNo; |
| | | sd.LotText = stockDetail.LotText; |
| | | sd.SupplierLot = stockDetail.SupplierLot; |
| | | sd.SkuNo = stockDetail.SkuNo; |
| | | sd.SkuName = stockDetail.SkuName; |
| | | sd.Standard = stockDetail.Standard; |
| | | |
| | | sd.FrozenQty = 0; |
| | | sd.InspectQty = 0; |
| | | sd.ASNNo = ""; |
| | | sd.ASNDetailNo = null; |
| | | sd.SONo = soNo;//出库单号 |
| | | sd.WareHouseNo = ""; |
| | | sd.RoadwayNo = ""; |
| | | sd.AreaNo = ""; |
| | | sd.LocatNo = ""; |
| | | sd.PalletNo = palletNoNew; |
| | | sd.PalletNo2 = ""; |
| | | sd.PalletNo3 = ""; |
| | | |
| | | sd.CompleteTime = nowDate; |
| | | sd.ProductionTime = stockDetail.ProductionTime; |
| | | sd.ExpirationTime = stockDetail.ExpirationTime; |
| | | sd.Status = "2";//状态,已分配 |
| | | sd.InspectMark = stockDetail.InspectMark; |
| | | sd.InspectStatus = stockDetail.InspectStatus; |
| | | sd.BitPalletMark = "0"; |
| | | sd.PackagNo = noticeDetail.PackagNo; |
| | | sd.IsBale = stockDetail.IsBale; |
| | | sd.IsBelt = stockDetail.IsBelt; |
| | | sd.Demo = stockDetail.Demo; |
| | | sd.OwnerName = stockDetail.OwnerName; |
| | | sd.OwnerNo = stockDetail.OwnerNo; |
| | | sd.SupplierName = stockDetail.SupplierName; |
| | | sd.SupplierNo = stockDetail.SupplierNo; |
| | | |
| | | sd.IsDel = "0"; |
| | | sd.CreateUser = userId; |
| | | sd.CreateTime = nowDate; |
| | | sd.UDF5 = "1"; |
| | | //新增拼托库存明细信息 |
| | | sdId = await Db.Insertable(sd).ExecuteReturnIdentityAsync(); |
| | | } |
| | | #endregion |
| | | |
| | | decimal pickQty = 0;//拣货的数量 |
| | | if (string.IsNullOrWhiteSpace(boxNo))//整托拣货 |
| | | { |
| | | List<DataBoxInfo> boxInfos; |
| | | var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo);//找到托盘上所有箱码 |
| | | boxInfos = await boxInfo.ToListAsync(); |
| | | if (boxInfo.Count() <= 0) |
| | | { |
| | | throw Oops.Bah("该托盘上没有可拣货的箱子"); |
| | | } |
| | | var boxQty = await boxInfo.GroupBy(m => m.PalletNo).Select(m => SqlFunc.AggregateSum(m.Qty)).ToListAsync(); |
| | | if (boxQty[0] > needQty) |
| | | { |
| | | throw Oops.Bah("拣货数量不能大于箱内剩余待拣数量"); |
| | | } |
| | | |
| | | var comDetailList = await Db.Queryable<BllCompleteDetail>().Where(m => m.IsDel == "0" && m.ExportAllotId == allot.Id && m.PalletNo == palletNo).ToListAsync(); |
| | | var comList = new List<BllCompleteDetail>(); |
| | | foreach (var item in boxInfos) |
| | | { |
| | | if (comDetailList.Any(m => m.BoxNo == item.BoxNo)) |
| | | { |
| | | throw Oops.Bah($"当前{item.BoxNo}已拣货完成,请勿重复拣货"); |
| | | } |
| | | if (item.SkuNo != allot.SkuNo || item.LotNo != allot.LotNo) |
| | | { |
| | | throw Oops.Bah("当前托盘上有其他不同物料批次,拣货失败"); |
| | | } |
| | | //添加拣货明细 |
| | | var completeDetail = new BllCompleteDetail() |
| | | { |
| | | SONo = soNo, |
| | | SODetailNo = int.Parse(soDetailId), |
| | | ExportAllotId = allot.Id, |
| | | StockId = allot.StockId, |
| | | BoxNo = item.BoxNo, |
| | | BoxNo2 = item.BoxNo2, |
| | | BoxNo3 = item.BoxNo3, |
| | | |
| | | LotNo = allot.LotNo, |
| | | LotText = allot.LotText, |
| | | SupplierLot = allot.SupplierLot, |
| | | SkuNo = allot.SkuNo, |
| | | SkuName = allot.SkuName, |
| | | Standard = allot.Standard, |
| | | PalletNo = palletNo, |
| | | CompleteQty = item.Qty, |
| | | |
| | | CreateUser = userId |
| | | }; |
| | | comList.Add(completeDetail); |
| | | |
| | | if (palletNo != palletNoNew) |
| | | { |
| | | item.StockDetailId = sdId; |
| | | item.BindNo = null;//托盘绑定号 |
| | | item.PalletNo = palletNoNew; |
| | | } |
| | | item.Status = "5";//箱支状态,0:未组托 1:已组托 2:已入库 3:已出库 4:已分配 5:已拣货 |
| | | //修改库存箱码明细 |
| | | await Db.Updateable(item).ExecuteCommandAsync(); |
| | | |
| | | pickQty += item.Qty; |
| | | } |
| | | //添加拣货明细 |
| | | await Db.Insertable(comList).ExecuteCommandAsync(); |
| | | //修改出库分配信息 |
| | | allot.CompleteQty += pickQty; |
| | | allot.Status = allot.Qty == allot.CompleteQty ? "5" : "3"; |
| | | allot.UpdateTime = DateTime.Now; |
| | | await Db.Updateable(allot).ExecuteCommandAsync(); |
| | | |
| | | if (palletNo != palletNoNew) |
| | | { |
| | | var locateStr = stockDetail.LocatNo; |
| | | //删除原托盘库存明细 |
| | | await Db.Deleteable(stockDetail).ExecuteCommandAsync(); |
| | | |
| | | //改变原托盘状态为:未使用 |
| | | var pallet = await Db.Queryable<SysPallets>().FirstAsync(m => m.PalletNo == palletNo && m.IsDel == "0"); |
| | | if (pallet == null) |
| | | { |
| | | throw Oops.Bah("未在托盘表中查询到托盘信息"); |
| | | } |
| | | pallet.Status = "0"; |
| | | await Db.Updateable(pallet).ExecuteCommandAsync(); |
| | | |
| | | //更改储位状态为空储位 |
| | | var locate = Db.Queryable<SysStorageLocat>().First(m => m.IsDel == "0" && m.LocatNo == locateStr); |
| | | if (locate != null) |
| | | { |
| | | locate.Status = "0"; |
| | | Db.Updateable(locate).ExecuteCommand(); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | stockDetail.SONo = soNo; |
| | | stockDetail.UDF5 = "1"; |
| | | await Db.Updateable(stockDetail).ExecuteCommandAsync(); |
| | | } |
| | | |
| | | //修改出库单明细拣货数量 |
| | | noticeDetail.CompleteQty += pickQty; |
| | | await Db.Updateable(noticeDetail).ExecuteCommandAsync(); |
| | | |
| | | var num = Db.Queryable<BllExportNoticeDetail>().Count(m => m.IsDel == "0" && m.SONo == soNo && m.CompleteQty < m.Qty); |
| | | if (num <= 0) |
| | | { |
| | | notice.Status = "4"; //更改为执行完成 |
| | | } |
| | | //修改出库单信息 |
| | | await Db.Updateable(notice).ExecuteCommandAsync(); |
| | | } |
| | | else |
| | | { |
| | | List<DataBoxInfo> boxInfos; |
| | | var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo == boxNo); |
| | | if (await boxInfo.CountAsync() == 0) |
| | | { |
| | | throw Oops.Bah("未查询到该箱码的信息"); |
| | | } |
| | | boxInfos = boxInfo.ToList(); |
| | | var comDetailList = await Db.Queryable<BllCompleteDetail>().Where(m => m.IsDel == "0" && m.ExportAllotId == allot.Id && m.PalletNo == palletNo).ToListAsync(); |
| | | |
| | | //整箱拣货 |
| | | |
| | | if (boxInfo.Any(m => m.PalletNo != palletNo)) |
| | | { |
| | | throw Oops.Bah("该托盘与箱码没有绑定关系"); |
| | | } |
| | | var boxQty = await boxInfo.GroupBy(m => m.BoxNo).Select(m => SqlFunc.AggregateSum(m.Qty)).ToListAsync(); |
| | | if (boxQty[0] > needQty) |
| | | { |
| | | throw Oops.Bah("拣货数量不能大于箱内剩余待拣数量"); |
| | | } |
| | | |
| | | foreach (var item in boxInfos) |
| | | { |
| | | if (comDetailList.Any(m => m.BoxNo == item.BoxNo)) |
| | | { |
| | | throw Oops.Bah($"当前{item.BoxNo}已拣货完成,请勿重复拣货"); |
| | | } |
| | | } |
| | | |
| | | |
| | | var comList = new List<BllCompleteDetail>(); |
| | | foreach (var item in boxInfos) |
| | | { |
| | | //添加拣货明细 |
| | | var completeDetail = new BllCompleteDetail() |
| | | { |
| | | SONo = soNo, |
| | | SODetailNo = int.Parse(soDetailId), |
| | | ExportAllotId = allot.Id, |
| | | StockId = allot.StockId, |
| | | BoxNo = item.BoxNo, |
| | | BoxNo2 = item.BoxNo2, |
| | | BoxNo3 = item.BoxNo3, |
| | | |
| | | LotNo = allot.LotNo, |
| | | LotText = allot.LotText, |
| | | SupplierLot = allot.SupplierLot, |
| | | SkuNo = allot.SkuNo, |
| | | SkuName = allot.SkuName, |
| | | Standard = allot.Standard, |
| | | PalletNo = palletNo, |
| | | CompleteQty = item.Qty, |
| | | |
| | | CreateUser = userId |
| | | }; |
| | | comList.Add(completeDetail); |
| | | |
| | | //修改库存箱码明细 |
| | | if (palletNo != palletNoNew) |
| | | { |
| | | item.StockDetailId = sdId; |
| | | item.BindNo = null;//托盘绑定号 |
| | | item.PalletNo = palletNoNew; |
| | | } |
| | | |
| | | item.Status = "5";//箱支状态,0:未组托 1:已组托 2:已入库 3:已出库 4:已分配 5:已拣货 |
| | | await Db.Updateable(item).ExecuteCommandAsync(); |
| | | |
| | | pickQty += item.Qty; |
| | | |
| | | } |
| | | |
| | | await Db.Insertable(comList).ExecuteCommandAsync(); |
| | | //修改出库分配信息 |
| | | allot.CompleteQty += pickQty; |
| | | allot.Status = allot.Qty == allot.CompleteQty ? "5" : "3"; |
| | | allot.UpdateTime = DateTime.Now; |
| | | |
| | | await Db.Updateable(allot).ExecuteCommandAsync(); |
| | | |
| | | //删除或修改库存明细 |
| | | stockDetail.BitPalletMark = "1";//修改为零托标识 |
| | | stockDetail.Qty -= pickQty; |
| | | stockDetail.LockQty -= pickQty; |
| | | stockDetail.UDF5 = "1"; |
| | | if (stockDetail.Qty == stockDetail.LockQty) |
| | | { |
| | | stockDetail.Status = "2"; |
| | | } |
| | | else if (stockDetail.Qty > stockDetail.LockQty && stockDetail.LockQty > 0) |
| | | { |
| | | stockDetail.Status = "1"; |
| | | } |
| | | else |
| | | { |
| | | stockDetail.Status = "0"; |
| | | } |
| | | |
| | | if (stockDetail.Qty <= 0) |
| | | { |
| | | var locateStr = stockDetail.LocatNo; |
| | | await Db.Deleteable(stockDetail).ExecuteCommandAsync(); |
| | | |
| | | //改变托盘状态 |
| | | var pallet = await Db.Queryable<SysPallets>().FirstAsync(m => m.PalletNo == palletNo && m.IsDel == "0"); |
| | | if (pallet == null) |
| | | { |
| | | throw Oops.Bah("未在托盘表中查询到托盘信息"); |
| | | } |
| | | pallet.Status = "0"; |
| | | await Db.Updateable(pallet).ExecuteCommandAsync(); |
| | | |
| | | //更改储位状态为空储位 |
| | | var locate = Db.Queryable<SysStorageLocat>().First(m => m.IsDel == "0" && m.LocatNo == locateStr); |
| | | if (locate != null) |
| | | { |
| | | locate.Status = "0"; |
| | | Db.Updateable(locate).ExecuteCommand(); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | await Db.Updateable(stockDetail).ExecuteCommandAsync(); |
| | | } |
| | | |
| | | //修改出库单明细拣货数量 |
| | | noticeDetail.CompleteQty += pickQty; |
| | | await Db.Updateable(noticeDetail).ExecuteCommandAsync(); |
| | | |
| | | var num = await Db.Queryable<BllExportNoticeDetail>() |
| | | .CountAsync(m => m.IsDel == "0" && m.SONo == soNo && m.CompleteQty < m.Qty); |
| | | if (num <= 0) |
| | | { |
| | | notice.Status = "4"; //更改为执行完成 |
| | | } |
| | | //修改出库单信息 |
| | | await Db.Updateable(notice).ExecuteCommandAsync(); |
| | | } |
| | | |
| | | if (isNew) |
| | | { |
| | | sd.Qty = pickQty; |
| | | sd.LockQty = pickQty; |
| | | await Db.Updateable(sd).ExecuteCommandAsync(); |
| | | } |
| | | else |
| | | { |
| | | if (palletNo != palletNoNew) |
| | | { |
| | | //修改拼托托盘库存明细 |
| | | pinStockDetail.Qty += pickQty; |
| | | pinStockDetail.LockQty += pickQty; |
| | | await Db.Updateable(pinStockDetail).ExecuteCommandAsync(); |
| | | } |
| | | } |
| | | |
| | | //添加操作日志记录 |
| | | var k = new OperationSOServer().AddLogOperationSo("PDA模块", "拣货拼托", soNo, "拣货", $"在PDA上对出库单号为:{soNo}的原托盘码为:{palletNo},新托盘码为:{palletNoNew}的拣货拼托操作", userId); |
| | | Db.CommitTran(); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | Db.RollbackTran(); |
| | | throw e; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 拼托出库pda拣货-数量 |
| | | /// </summary> |
| | | /// <param name="soNo"></param> |
| | | /// <param name="soDetailId"></param> |
| | | /// <param name="palletNo"></param> |
| | | /// <param name="PickQty"></param> |
| | | /// <param name="palletNoNew"></param> |
| | | /// <param name="userId"></param> |
| | | public async Task SoSetQtyPinPick34(string soNo, string soDetailId, string palletNo, string PickQty, string palletNoNew, int userId) |
| | | { |
| | | Db.BeginTran(); |
| | | try |
| | | { |
| | | var nowDate = DateTime.Now;//当前时间 |
| | | #region 判断 |
| | | |
| | | if (string.IsNullOrWhiteSpace(soNo)) |
| | | { |
| | | throw Oops.Bah("出库单据不能为空"); |
| | | } |
| | | if (string.IsNullOrWhiteSpace(palletNo)) |
| | | { |
| | | throw Oops.Bah("托盘码不能为空"); |
| | | } |
| | | if (string.IsNullOrWhiteSpace(palletNoNew)) |
| | | { |
| | | throw Oops.Bah("新托盘码不能为空"); |
| | | } |
| | | |
| | | //出库单 |
| | | var notice = await Db.Queryable<BllExportNotice>().FirstAsync(m => m.IsDel == "0" && m.SONo == soNo); |
| | | if (notice == null) |
| | | { |
| | | throw Oops.Bah("未查询到该出库单的信息"); |
| | | } |
| | | if (notice.Status != "3") |
| | | { |
| | | throw Oops.Bah("出库单的状态不是正在执行,不能拣货"); |
| | | } |
| | | //出库单明细 |
| | | var noticeDetail = await Db.Queryable<BllExportNoticeDetail>() |
| | | .FirstAsync(m => m.IsDel == "0" && m.Id == int.Parse(soDetailId)); |
| | | if (noticeDetail == null) |
| | | { |
| | | throw Oops.Bah("未查询到该出库单明细的信息"); |
| | | } |
| | | //出库分配信息 |
| | | var allot = await Db.Queryable<BllExportAllot>().FirstAsync(m => |
| | | m.IsDel == "0" && (m.Status == "2" || m.Status == "3") && m.SONo == soNo && |
| | | m.SODetailNo == int.Parse(soDetailId) && m.PalletNo == palletNo); |
| | | if (allot == null) |
| | | { |
| | | throw Oops.Bah("未查询到该托盘的分配信息"); |
| | | } |
| | | //剩余拣货数量(待拣减去已拣) |
| | | var needQty = allot.Qty - allot.CompleteQty; |
| | | if (int.Parse(PickQty) > needQty) |
| | | { |
| | | throw Oops.Bah("拣货数量不能大于托内剩余待拣数量"); |
| | | } |
| | | |
| | | //库存明细 |
| | | var stockDetail = await Db.Queryable<DataStockDetail>().FirstAsync(m => m.IsDel == "0" && m.Id == allot.StockId); |
| | | if (stockDetail == null) |
| | | { |
| | | throw Oops.Bah("未查询到该托盘分配的库存明细信息!"); |
| | | } |
| | | //库存总表 |
| | | var stock = await Db.Queryable<DataStock>().FirstAsync(a => a.IsDel == "0" && a.SkuNo == stockDetail.SkuNo && a.LotNo == stockDetail.LotNo); |
| | | if (stock == null) |
| | | { |
| | | throw Oops.Bah("未查询到该托盘分配的库存信息!"); |
| | | } |
| | | if (palletNo == palletNoNew)//原托盘与新托盘一致 |
| | | { |
| | | if (int.Parse(PickQty) != stockDetail.Qty) |
| | | { |
| | | throw Oops.Bah("原托盘与新托盘一致,需要把托盘上所有数量拣货"); |
| | | } |
| | | } |
| | | #endregion |
| | | |
| | | #region 拼托信息 |
| | | bool isNew = false; |
| | | var pinStockDetail = await Db.Queryable<DataStockDetail>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.SkuNo== stockDetail.SkuNo && m.LotNo == stockDetail.LotNo); |
| | | if (pinStockDetail != null) |
| | | { |
| | | if (palletNo != palletNoNew)//非整托拣货 |
| | | { |
| | | var pinStockDetails = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.Id != pinStockDetail.Id).ToList(); |
| | | if (pinStockDetails.Count(m => m.SONo != notice.SONo) > 0) |
| | | { |
| | | throw Oops.Bah("拼托托盘上只能放同一个出库单下的物料!"); |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | isNew = true; |
| | | |
| | | var newPalletInfo = await Db.Queryable<SysPallets>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.Status == "0"); |
| | | if (newPalletInfo == null) |
| | | { |
| | | var pinStockDetails = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.Id != pinStockDetail.Id).ToList(); |
| | | if (pinStockDetails.Count(m => m.SONo != notice.SONo) > 0) |
| | | { |
| | | throw Oops.Bah("新托盘信息不存在或已被使用!"); |
| | | } |
| | | } |
| | | //修改新托盘状态 |
| | | newPalletInfo.Status = "1"; |
| | | await Db.Updateable(newPalletInfo).ExecuteCommandAsync(); |
| | | } |
| | | |
| | | if (isNew) |
| | | { |
| | | var sd = new DataStockDetail(); |
| | | |
| | | sd.LotNo = stockDetail.LotNo; |
| | | sd.LotText = stockDetail.LotText; |
| | | sd.SupplierLot = stockDetail.SupplierLot; |
| | | sd.SkuNo = stockDetail.SkuNo; |
| | | sd.SkuName = stockDetail.SkuName; |
| | | sd.Standard = stockDetail.Standard; |
| | | |
| | | sd.Qty = int.Parse(PickQty); |
| | | sd.LockQty = int.Parse(PickQty); |
| | | |
| | | sd.FrozenQty = 0; |
| | | sd.InspectQty = 0; |
| | | sd.ASNNo = ""; |
| | | sd.ASNDetailNo = null; |
| | | sd.SONo = soNo;//出库单号 |
| | | sd.WareHouseNo = ""; |
| | | sd.RoadwayNo = ""; |
| | | sd.AreaNo = ""; |
| | | sd.LocatNo = ""; |
| | | sd.PalletNo = palletNoNew; |
| | | sd.PalletNo2 = ""; |
| | | sd.PalletNo3 = ""; |
| | | //PalletType = item.PalletType, |
| | | sd.CompleteTime = nowDate; |
| | | sd.ProductionTime = stockDetail.ProductionTime; |
| | | sd.ExpirationTime = stockDetail.ExpirationTime; |
| | | sd.Status = "2";//状态,已分配 |
| | | sd.InspectMark = stockDetail.InspectMark; |
| | | sd.InspectStatus = stockDetail.InspectStatus; |
| | | sd.BitPalletMark = "0"; |
| | | sd.PackagNo = noticeDetail.PackagNo; |
| | | sd.IsBale = stockDetail.IsBale; |
| | | sd.IsBelt = stockDetail.IsBelt; |
| | | sd.Demo = stockDetail.Demo; |
| | | sd.OwnerName = stockDetail.OwnerName; |
| | | sd.OwnerNo = stockDetail.OwnerNo; |
| | | sd.SupplierName = stockDetail.SupplierName; |
| | | sd.SupplierNo = stockDetail.SupplierNo; |
| | | |
| | | sd.IsDel = "0"; |
| | | sd.CreateUser = userId; |
| | | sd.CreateTime = nowDate; |
| | | sd.UDF5 = "1"; |
| | | |
| | | //新增拼托库存明细信息 |
| | | await Db.Insertable(sd).ExecuteReturnIdentityAsync(); |
| | | } |
| | | else |
| | | { |
| | | if (palletNo != palletNoNew) |
| | | { |
| | | //修改拼托托盘库存明细 |
| | | pinStockDetail.Qty += int.Parse(PickQty); |
| | | pinStockDetail.LockQty += int.Parse(PickQty); |
| | | pinStockDetail.UDF5 = "1"; |
| | | await Db.Updateable(pinStockDetail).ExecuteCommandAsync(); |
| | | } |
| | | else |
| | | { |
| | | pinStockDetail.SONo = soNo; |
| | | pinStockDetail.UDF5 = "1"; |
| | | await Db.Updateable(pinStockDetail).ExecuteCommandAsync(); |
| | | } |
| | | } |
| | | #endregion |
| | | |
| | | //获取当前托盘拣货明细 |
| | | var complete = await Db.Queryable<BllCompleteDetail>().FirstAsync(a => a.IsDel == "0" && a.PalletNo == palletNo && a.SONo == notice.SONo && a.SODetailNo == noticeDetail.Id && a.ExportAllotId == allot.Id && a.StockId == stockDetail.Id); |
| | | |
| | | //判读是否存在拣货明细 |
| | | int isComplete = 0; |
| | | if (complete != null) |
| | | { |
| | | isComplete = 1; |
| | | } |
| | | |
| | | var comList = new List<BllCompleteDetail>(); |
| | | //判断是否存在拣货明细 |
| | | isComplete = 0;//所有无箱码或一级箱码拣货时,拣货明细应重新插入数据(体现多次拣货流程记录) |
| | | if (isComplete == 0) |
| | | { |
| | | //添加拣货明细 |
| | | var completeDetail = new BllCompleteDetail() |
| | | { |
| | | SONo = soNo, |
| | | SODetailNo = int.Parse(soDetailId), |
| | | ExportAllotId = allot.Id, |
| | | StockId = allot.StockId, |
| | | BoxNo = "", |
| | | BoxNo2 = "", |
| | | BoxNo3 = "", |
| | | |
| | | LotNo = allot.LotNo, |
| | | LotText = allot.LotText, |
| | | SupplierLot = allot.SupplierLot, |
| | | SkuNo = allot.SkuNo, |
| | | SkuName = allot.SkuName, |
| | | Standard = allot.Standard, |
| | | PalletNo = palletNo, |
| | | CompleteQty = int.Parse(PickQty), |
| | | |
| | | CreateUser = userId, |
| | | CreateTime = Db.GetDate(), |
| | | }; |
| | | comList.Add(completeDetail); |
| | | |
| | | //添加拣货明细 |
| | | await Db.Insertable(comList).ExecuteCommandAsync(); |
| | | } |
| | | else if (isComplete == 1) |
| | | { |
| | | complete.CompleteQty += int.Parse(PickQty); |
| | | complete.UpdateUser = userId; |
| | | complete.UpdateTime = Db.GetDate(); |
| | | |
| | | await Db.Updateable(complete).ExecuteCommandAsync(); |
| | | } |
| | | |
| | | //修改出库分配信息 |
| | | allot.CompleteQty += int.Parse(PickQty); |
| | | allot.Status = allot.Qty == allot.CompleteQty ? "5" : "3"; |
| | | allot.UpdateTime = DateTime.Now; |
| | | await Db.Updateable(allot).ExecuteCommandAsync(); |
| | | |
| | | int isDel = 0; |
| | | var locateStr = stockDetail.LocatNo; |
| | | if (palletNo != palletNoNew) |
| | | { |
| | | //删除或修改库存明细 |
| | | stockDetail.BitPalletMark = "1";//修改为零托标识 |
| | | stockDetail.Qty -= int.Parse(PickQty); |
| | | stockDetail.LockQty -= int.Parse(PickQty); |
| | | if (stockDetail.Qty == stockDetail.LockQty) |
| | | { |
| | | stockDetail.Status = "2"; |
| | | } |
| | | else if (stockDetail.Qty > stockDetail.LockQty && stockDetail.LockQty > 0) |
| | | { |
| | | stockDetail.Status = "1"; |
| | | } |
| | | else |
| | | { |
| | | stockDetail.Status = "0"; |
| | | } |
| | | if (stockDetail.Qty <= 0) |
| | | { |
| | | await Db.Deleteable(stockDetail).ExecuteCommandAsync(); |
| | | } |
| | | else |
| | | { |
| | | isDel = 1; |
| | | await Db.Updateable(stockDetail).ExecuteCommandAsync(); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | isDel = 1; |
| | | } |
| | | //判断托盘上物料是否拣货完毕 |
| | | if (isDel == 0) |
| | | { |
| | | //改变托盘状态为:未使用 |
| | | var pallet = await Db.Queryable<SysPallets>().FirstAsync(m => m.PalletNo == palletNo && m.IsDel == "0"); |
| | | if (pallet == null) |
| | | { |
| | | throw Oops.Bah("未在托盘表中查询到托盘信息"); |
| | | } |
| | | |
| | | pallet.Status = "0"; |
| | | await Db.Updateable(pallet).ExecuteCommandAsync(); |
| | | |
| | | //更改储位状态为空储位 |
| | | var locate = Db.Queryable<SysStorageLocat>().First(m=>m.IsDel == "0" && m.LocatNo == locateStr); |
| | | if (locate!=null) |
| | | { |
| | | locate.Status = "0"; |
| | | Db.Updateable(locate).ExecuteCommand(); |
| | | } |
| | | |
| | | } |
| | | |
| | | //修改出库单明细拣货数量 |
| | | noticeDetail.CompleteQty += int.Parse(PickQty); |
| | | await Db.Updateable(noticeDetail).ExecuteCommandAsync(); |
| | | |
| | | var num = await Db.Queryable<BllExportNoticeDetail>() |
| | | .CountAsync(m => m.IsDel == "0" && m.SONo == soNo && m.CompleteQty < m.Qty); |
| | | if (num <= 0) |
| | | { |
| | | notice.Status = "4"; //更改为执行完成 |
| | | } |
| | | //修改出库单信息 |
| | | await Db.Updateable(notice).ExecuteCommandAsync(); |
| | | |
| | | //添加操作日志记录 |
| | | var k = new OperationSOServer().AddLogOperationSo("PDA模块", "拣货拼托", soNo, "拣货", $"在PDA上对出库单号为:{soNo}的托盘码为:{palletNo},新托盘码为:{palletNoNew}的拣货操作", userId); |
| | | Db.CommitTran(); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | Db.RollbackTran(); |
| | | throw e; |
| | | } |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | //验证托盘是否存在并是否可出库 |
| | | public async Task<string> IsEnableOkPalletNo(string palletNo) |
| | |
| | | throw Oops.Bah("托盘码为空,请输入托盘码"); |
| | | } |
| | | var palletInfo = await Db.Queryable<DataStockDetail>().FirstAsync(w => w.IsDel == "0" && w.PalletNo == palletNo); |
| | | if (!string.IsNullOrEmpty(palletInfo.WareHouseNo) && type != "1") |
| | | { |
| | | throw Oops.Bah("该托盘还未出库"); |
| | | } |
| | | //if (!string.IsNullOrEmpty(palletInfo.WareHouseNo) && type != "1") |
| | | //{ |
| | | // throw Oops.Bah("该托盘还未出库"); |
| | | //} |
| | | if (type == "1")//平库出库获取单据 |
| | | { |
| | | var allotList = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.Status == "1" && m.PalletNo == palletNo).Select(m => m.SONo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToListAsync(); |
| | |
| | | return allotList2; |
| | | } |
| | | |
| | | |
| | | public async Task<List<DetailIdSkuLotNo>> GetSoSkuLotNoListBySo(string soNo) |
| | | { |
| | | if (string.IsNullOrWhiteSpace(soNo))//判断托盘是否为空 |
| | | { |
| | | throw Oops.Bah("单据为空,请选择单据"); |
| | | } |
| | | //获取状态为待拣货或者部分拣货的出库单 |
| | | var allotList = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.SONo == soNo && (m.Status == "0" || m.Status == "1")); |
| | | |
| | | var list = await allotList.GroupBy(m => new { m.SODetailNo, m.SkuNo, m.SkuName, m.LotNo }).Select(m => new DetailIdSkuLotNo() |
| | | { |
| | | SoDetailId = m.SODetailNo, |
| | | SkuName = m.SkuName, |
| | | LotNo = m.LotNo, |
| | | }).ToListAsync(); |
| | | |
| | | return list; |
| | | } |
| | | //获取出库托盘上的物料批次(根据托盘码) |
| | | public async Task<List<DetailIdSkuLotNo>> GetSoSkuLotNoListByPallet(string palletNo, string soNo) |
| | | { |
| | |
| | | //获取当前时间 |
| | | DateTime serverTime = Db.GetDate(); |
| | | //获取库存明细是否小于等于该垛数 |
| | | //string str = "select * from DataStockDetail where IsDel = '0' and SkuNo = '100099' and Status = '0' "; |
| | | //var stockDetail = Db.Ado.SqlQuery<DataStockDetail>(str); |
| | | var stockDetail = await Db.Queryable<DataStockDetail>().Where(s => s.IsDel == "0" && s.SkuNo == "100099" && s.Status == "0").ToListAsync(); |
| | | |
| | | var stockDetail = await Db.Queryable<DataStockDetail>().Where(s => s.IsDel == "0" && s.SkuNo == "100099" && s.Status == "0" && !string.IsNullOrWhiteSpace(s.WareHouseNo)).ToListAsync(); |
| | | if (stockDetail.Count > 0) |
| | | { |
| | | //判断是否大于需要垛数 |
| | |
| | | foreach (var s in stockDetail) |
| | | { |
| | | //获取储位信息 |
| | | var locat = await Db.Queryable<SysStorageLocat>().FirstAsync(l => l.LocatNo == s.LocatNo && l.IsDel == "0" && l.WareHouseNo == "W01"); |
| | | var locat = await Db.Queryable<SysStorageLocat>().FirstAsync(l => l.LocatNo == s.LocatNo && l.IsDel == "0" && (l.WareHouseNo == "W01"||l.WareHouseNo == "W02")); |
| | | |
| | | if (locat != null) |
| | | if (locat == null) |
| | | { |
| | | if (locat.Status != "1") |
| | | { |
| | | continue; |
| | | } |
| | | //更改储位状态为出库中 |
| | | locat.Status = "3"; //3 出库中 |
| | | locat.UpdateTime = serverTime; //修改时间 |
| | | locat.UpdateUser = userId; //修改人 |
| | | //修改储位信息 |
| | | await Db.Updateable(locat).ExecuteCommandAsync(); |
| | | throw new Exception("储位上没有空托盘跺"); |
| | | } |
| | | if (locat.Status != "1") |
| | | { |
| | | continue; |
| | | } |
| | | //更改储位状态为出库中 |
| | | locat.Status = "3"; //3 出库中 |
| | | locat.UpdateTime = serverTime; //修改时间 |
| | | locat.UpdateUser = userId; //修改人 |
| | | //修改储位信息 |
| | | await Db.Updateable(locat).ExecuteCommandAsync(); |
| | | |
| | | //增加库存锁定数量 |
| | | //stock.AllotQty += |
| | |
| | | { |
| | | TaskNo = taskNo, |
| | | Sender = "WMS", |
| | | Receiver = "PDA", |
| | | Receiver = "WCS", |
| | | IsSuccess = 1, //是否下发成功 0失败 1成功 |
| | | |
| | | StartLocat = locat == null ? "零箱库" : s.LocatNo,//起始位置 |
| | | StartLocat = s.LocatNo,//起始位置 |
| | | EndLocat = model.OutMode,//目标位置 |
| | | PalletNo = s.PalletNo,//托盘码 |
| | | IsSend = 1,//是否可再次下发 |
| | |
| | | OrderType = "1",//0 入库单 1 出库单 2 盘点单 3 移库单 |
| | | CreateTime = serverTime, //创建时间 |
| | | CreateUser = userId, //创建人 |
| | | Msg = "Pda空托从" + locat == null ? "零箱库" : s.LocatNo + "到" + model.OutMode + "的出库任务", //关键信息 |
| | | Msg = "Pda空托从" + s.LocatNo + "到" + model.OutMode + "的出库任务", //关键信息 |
| | | //FinishDate = serverTime, //完成时间 |
| | | }; |
| | | var endroad = ""; |
| | | if (locat.WareHouseNo == "W01") |
| | | { |
| | | endroad = new AllotLocation().RoadwayToStationNum(locat.RoadwayNo, model.OutMode); |
| | | } |
| | | |
| | | outDtoList.Add(new OutCommandDto() |
| | | { |
| | | PalletNo = exTask.PalletNo,//托盘号 |
| | | StartLocate = exTask.StartLocat, // 起始位置 |
| | | StartRoadway = locat.RoadwayNo, //所属巷道 |
| | | EndLocate = "", // 目标位置 |
| | | TaskNo = exTask.TaskNo, // 任务号 |
| | | TaskType = "1",// 任务类型 (出库) |
| | | OutMode = model.OutMode, //目标地址 |
| | | Order = 1 |
| | | PalletNo = exTask.PalletNo,//托盘号 |
| | | |
| | | StartLocate = exTask.StartLocat, // 起始位置 |
| | | StartRoadway = locat.RoadwayNo, //所属巷道 |
| | | EndLocate = model.OutMode, // 目标位置 |
| | | EndRoadway = endroad, |
| | | |
| | | Order = 999, |
| | | Type = locat.WareHouseNo == "W01"?PLCTypeEnum.ShuttleCar : PLCTypeEnum.AGV |
| | | }); |
| | | await Db.Insertable(exTask).ExecuteCommandAsync(); |
| | | |
| | |
| | | var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss") |
| | | |
| | | ////解析返回数据 |
| | | var wcsModel = JsonConvert.DeserializeObject<WcsModel>(response); |
| | | if (wcsModel.StatusCode == 0) |
| | | var wcsModel = JsonConvert.DeserializeObject<WcsModel2>(response); |
| | | if (wcsModel.code == 200) |
| | | { |
| | | //更改任务的发送返回时间// |
| | | new TaskServer().EditTaskIssueOk(list2, time1, time2); |
| | | //str += "下发成功"; |
| | | } |
| | | if (wcsModel.StatusCode == -1) |
| | | else |
| | | { |
| | | new TaskServer().EditTaskIssueNo(list2, time1, time2, wcsModel.Msg); |
| | | throw Oops.Bah(wcsModel.Msg); |
| | | new TaskServer().EditTaskIssueNo(list2, time1, time2, wcsModel.message); |
| | | throw Oops.Bah(wcsModel.message); |
| | | } |
| | | } |
| | | catch (AppFriendlyException e) |
| | |
| | | var k = new OperationSOServer().AddLogOperationSo("PDA模块", "空托出库", i + "", "下发", $"用PDA下发了 {i} 个空托垛", userId); |
| | | Db.CommitTran(); |
| | | |
| | | return ""; |
| | | return "成功"; |
| | | |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | Db.RollbackTran(); |
| | | return ""; |
| | | throw new Exception(e.Message); |
| | | } |
| | | |
| | | } |