using System; using System.Collections.Generic; using SqlSugar; using System.Linq; using System.Linq.Expressions; using Model.InterFaceModel; using Model.ModelDto; using SqlSugar.Extensions; using WMS.Entity.BllSoEntity; using WMS.Entity.Context; using WMS.Entity.DataEntity; using WMS.Entity.SysEntity; using WMS.IBLL.IPdaServer; using Model.ModelVm; using Model.ModelVm.PdaVm; using Newtonsoft.Json; using Utility.Tools; using WMS.BLL.LogServer; using WMS.DAL; using WMS.Entity.LogEntity; namespace WMS.BLL.BllPdaServer { public class PdaSoServer : IPdaSoServer { private static readonly SqlSugarScope Db = DataContext.Db; //验证托盘是否存在并是否可出库 public string IsEnableOkPalletNo(string palletNo) { try { string sqlMsg = ""; var models = Db.Queryable().Where(m => m.IsDel == "0" && m.PalletNo == palletNo).ToList(); if (models.Count > 1) { sqlMsg = "-1:存在重复托盘号,请检查!"; return sqlMsg; } if (models.Count > 0) { if (models[0].Status == "0") { sqlMsg = "-1:托盘号状态为未使用!"; } } else { sqlMsg = "-1:托盘号不存在!"; } return sqlMsg; } catch (Exception ex) { throw new Exception(ex.Message); } } //获取托盘中含有的执行中的单据 public List GetRunSoNoticeList(string palletNo, string type) { try { if (string.IsNullOrWhiteSpace(palletNo))//判断托盘是否为空 { throw new Exception("托盘码为空,请输入托盘码"); } if (type == "1")//平库出库获取单据 { var allotList = Db.Queryable().Where(m => m.IsDel == "0" && m.Status == "1" && m.PalletNo == palletNo).Select(m => m.SONo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToList(); return allotList; } //获取状态为待拣货或者部分拣货的出库单 var allotList2 = Db.Queryable().Where(m => m.IsDel == "0" && (m.Status == "2" || m.Status == "3") && m.PalletNo == palletNo).Select(m => m.SONo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToList(); //var allotList = Db.Queryable().Where(m => m.IsDel == "0" && m.PalletNo == palletNo).Select(m => m.SONo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToList(); //获取出库单据不为待拣货 执行完毕 订单关闭 等待执行的单据 //var export = Db.Queryable().Where(a => a.IsDel == "0" && a.Status == "1" || a.Status == "2" || a.Status == "3").Select(a => a.SONo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToList(); return allotList2; } catch (Exception ex) { throw new Exception(ex.Message); } } //获取出库托盘上的物料批次(根据托盘码) public List GetSoSkuLotNoListByPallet(string palletNo, string soNo) { try { if (string.IsNullOrWhiteSpace(palletNo))//判断托盘是否为空 { throw new Exception("托盘码为空,请输入托盘码"); } //获取状态为待拣货或者部分拣货的出库单 var allotList = Db.Queryable().Where(m => m.IsDel == "0" && (m.Status == "2" || m.Status == "3") && m.PalletNo == palletNo); //var allotList = Db.Queryable().Where(m => m.IsDel == "0" && m.SONo == soNo && m.Status != "4" && m.Status != "5"); if (!string.IsNullOrWhiteSpace(soNo)) { allotList = allotList.Where(m => m.SONo == soNo); } var list = allotList.GroupBy(m => new { m.SODetailNo, m.PalletNo, m.SkuNo, m.SkuName, m.LotNo }).Select(m => new DetailIdSkuLotNo() { SoDetailId = m.SODetailNo, PalletNo = m.PalletNo, SkuNo = m.SkuNo, SkuName = m.SkuName, LotNo = m.LotNo, }).ToList(); return list; } catch (Exception ex) { throw new Exception(ex.Message); } } //获取出库口、规格、待拣及已拣数量(根据出库单明细ID、托盘号) public OutPdaInfo GetOutlets(string soDetailId, string palletNo) { try { var allotInfo = Db.Queryable().Where(m => m.IsDel == "0" && m.SODetailNo == int.Parse(soDetailId) && m.PalletNo == palletNo && (m.Status == "2" || m.Status == "3")).ToList(); if (allotInfo.Count == 0) { throw new Exception($"{palletNo}托盘上未查询到分配信息,请核实"); } if (allotInfo.Count > 1) { throw new Exception($"{palletNo}托盘上存在多条相同的分配信息,请核实"); } var data = allotInfo.First(); var data2 = new OutPdaInfo() { OutModel = data.OutMode, Standard = data.Standard, PickQty = data.Qty, PickedQty = data.CompleteQty }; return data2; } catch (Exception e) { throw new Exception(e.Message); } } //获取出库单的计划数量和完成 public OutPdaInfo GetPlanAndFinishQty(string soDetailId) { try { var detail = Db.Queryable().First(m => m.Id == int.Parse(soDetailId) && m.IsDel == "0"); if (detail == null) { throw new Exception("未查询到出库单的明细"); } var data = new OutPdaInfo() { PlanQty = detail.Qty, FinishQty = detail.CompleteQty }; return data; } catch (Exception e) { throw new Exception(e.Message); } } //获取箱码信息(根据箱码在库存箱码明细中查询及拣货明细中拣货数量) public List GetDataComBoxInfo(string soDetailId, string palletNo, string boxNo, string boxNo3) { try { if (string.IsNullOrWhiteSpace(palletNo)) { throw new Exception("托盘号不能为空"); } Expression> item = Expressionable.Create() .And(it => it.PalletNo == palletNo) .AndIF(!string.IsNullOrWhiteSpace(boxNo), it => it.BoxNo == boxNo) .AndIF(!string.IsNullOrWhiteSpace(boxNo3), it => it.BoxNo3 == boxNo3) .And(m => m.IsDel == "0") .ToExpression();//注意 这一句 不能少 var info = Db.Queryable().Where(item); if (info.Count() == 0) { throw new Exception("未在库存中查询到信息"); } var type = "0";//0:查箱码或支码不分组 1:查托盘分组 显示箱 var list = new List(); if (!string.IsNullOrWhiteSpace(boxNo3) || !string.IsNullOrWhiteSpace(boxNo))//判断支码是否为空 { foreach (var demo in info.ToList()) { var t = new BoxInfo() { BoxNo = demo.BoxNo3, Qty = demo.Qty, //SkuNo = demo.SkuNo, //SkuName = demo.SkuName, //LotNo = demo.LotNo, }; list.Add(t); } } else if (!string.IsNullOrWhiteSpace(palletNo)) { list = info.GroupBy(m => new { m.BoxNo }).Select(it => new BoxInfo { BoxNo = it.BoxNo, Qty = SqlFunc.AggregateSum(it.Qty) }).ToList(); type = "1"; } if (!string.IsNullOrWhiteSpace(soDetailId)) { var allotInfos = Db.Queryable().Where(m => m.IsDel == "0" && m.SODetailNo == int.Parse(soDetailId) && m.PalletNo == palletNo && (m.Status == "2" || m.Status == "3")).ToList(); if (allotInfos.Count == 0) { throw new Exception($"{palletNo}托盘上未查询到分配信息,请核实"); } if (allotInfos.Count > 1) { throw new Exception($"{palletNo}托盘上存在多条相同的分配信息,请核实"); } var allotInfo = allotInfos.First(); var comInfo = Db.Queryable().Where(m => m.IsDel == "0" && m.ExportAllotId == allotInfo.Id).ToList(); if (comInfo.Count != 0) { if (type == "0") { foreach (var demo in list) { var com = comInfo.FirstOrDefault(m => m.IsDel == "0" && m.BoxNo3 == demo.BoxNo); if (com!=null) { demo.PickedQty = com.CompleteQty; } } } if (type == "1") { var com = comInfo.Where(m => m.IsDel == "0").GroupBy(m => m.BoxNo).Select(it => new BoxInfo { BoxNo = it.Key, PickedQty = it.Sum(a => a.CompleteQty) }).ToList(); foreach (var demo in list) { var com2 = com.FirstOrDefault(m => m.BoxNo == demo.BoxNo); if (com2 != null) { demo.PickedQty = com2.PickedQty; } } } } } return list; } catch (Exception e) { throw new Exception(e.Message); } } //出库pda拣货 public void SoSetPick(string soNo, string soDetailId, string palletNo, string boxNo, string boxNo3, int userId) { Db.BeginTran(); try { #region 判断 if (string.IsNullOrWhiteSpace(soNo)) { throw new Exception("出库单据不能为空"); } if (string.IsNullOrWhiteSpace(soDetailId)) { throw new Exception("出库物料-批次不能为空"); } if (string.IsNullOrWhiteSpace(palletNo)) { throw new Exception("托盘码不能为空"); } //出库单 var notice = Db.Queryable().First(m => m.IsDel == "0" && m.SONo == soNo); if (notice == null) { throw new Exception("未查询到该出库单的信息"); } if (notice.Status != "3") { throw new Exception("出库单的状态不是正在执行,不能拣货"); } //出库单明细 var noticeDetail = Db.Queryable() .First(m => m.IsDel == "0" && m.Id == int.Parse(soDetailId)); if (noticeDetail == null) { throw new Exception("未查询到该出库单明细的信息"); } //出库分配信息 var allot = Db.Queryable().First(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 new Exception("未查询到该托盘的分配信息"); } //剩余拣货数量(待拣减去已拣) var needQty = allot.Qty - allot.CompleteQty; //库存明细 var stockDetail = Db.Queryable().First(m => m.IsDel == "0" && m.Id == allot.StockId); if (stockDetail == null) { throw new Exception("未查询到该托盘分配的库存明细信息!"); } //库存总表 var stock = Db.Queryable().First(a => a.IsDel == "0" && a.SkuNo == stockDetail.SkuNo && a.LotNo == stockDetail.LotNo); if (stock == null) { throw new Exception("未查询到该托盘分配的库存信息!"); } #endregion if (string.IsNullOrWhiteSpace(boxNo))//整托拣货 { List boxInfos; var boxInfo = Db.Queryable().Where(m => m.IsDel == "0" && m.PalletNo == palletNo);//找到托盘上所有箱码 boxInfos = boxInfo.ToList(); if (boxInfo.Count() <= 0) { throw new Exception("该托盘上没有可拣货的箱子"); } var boxQty = boxInfo.GroupBy(m => m.PalletNo).Select(m => SqlFunc.AggregateSum(m.Qty)).ToList(); if (boxQty[0] > needQty) { throw new Exception("拣货数量不能大于箱内剩余待拣数量"); } var pickQty = 0;//拣货的数量 var comDetailList = Db.Queryable().Where(m => m.IsDel == "0" && m.ExportAllotId == allot.Id && m.PalletNo == palletNo).ToList(); var comList = new List(); foreach (var item in boxInfos) { if (comDetailList.Any(m => m.BoxNo3 == item.BoxNo3)) { throw new Exception($"当前{item.BoxNo}中{item.BoxNo3}已拣货完成,请勿重复拣货"); } if (item.SkuNo != allot.SkuNo || item.LotNo != allot.LotNo) { throw new Exception("当前托盘上有其他不同物料批次,拣货失败"); } //添加拣货明细 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); //删除库存箱码明细 Db.Deleteable(item).ExecuteCommand(); pickQty += item.Qty; } //添加拣货明细 Db.Insertable(comList).ExecuteCommand(); //修改出库分配信息 allot.CompleteQty += pickQty; allot.Status = allot.Qty == allot.CompleteQty ? "5" : "3"; Db.Updateable(allot).ExecuteCommand(); //删除库存明细 Db.Deleteable(stockDetail).ExecuteCommand(); //删除或修改库存 stock.Qty -= pickQty; stock.LockQty -= pickQty; if (stock.Qty <= 0) { Db.Deleteable(stock).ExecuteCommand(); } else { Db.Updateable(stock).ExecuteCommand(); } //改变托盘状态为:未使用 var pallet = Db.Queryable().First(m => m.PalletNo == palletNo && m.IsDel == "0"); if (pallet == null) { throw new Exception("未在托盘表中查询到托盘信息"); } pallet.Status = "0"; Db.Updateable(pallet).ExecuteCommand(); //修改出库单明细拣货数量 noticeDetail.CompleteQty += pickQty; Db.Updateable(noticeDetail).ExecuteCommand(); var num = Db.Queryable() .Count(m => m.IsDel == "0" && m.SONo == soNo && m.CompleteQty < m.Qty); if (num <= 0) { notice.Status = "4"; //更改为执行完成 } //修改出库单信息 Db.Updateable(notice).ExecuteCommand(); } else { var biaoShi = "0";//0:整箱拣货、1:散支拣货 List boxInfos; var boxInfo = Db.Queryable().Where(m => m.IsDel == "0" && m.BoxNo == boxNo); if (boxInfo.Count() == 0) { throw new Exception("未查询到该箱码及追溯码的信息"); } boxInfos = boxInfo.ToList(); if (!string.IsNullOrWhiteSpace(boxNo3)) //散支拣货 { boxInfos = boxInfos.Where(m => m.BoxNo3 == boxNo3).ToList(); if (boxInfos.Count() == 0) { throw new Exception("未查询到该箱码及追溯码的信息"); } if (boxInfos.Count() > 1) { throw new Exception("该追溯支码的信息大于1条,信息错误,请核实!"); } if (boxInfos.Any(m => m.PalletNo != palletNo)) { throw new Exception("该托盘与箱码没有绑定关系"); } var boxQty = boxInfos.First().Qty; if (boxQty > needQty) { throw new Exception("拣货数量不能大于剩余待拣数量"); } biaoShi = "1"; } else //整箱拣货 { if (boxInfo.Count() == 0) { throw new Exception("未查询到该箱码的信息"); } if (boxInfo.Any(m => m.PalletNo != palletNo)) { throw new Exception("该托盘与箱码没有绑定关系"); } var boxQty = boxInfo.GroupBy(m => m.BoxNo).Select(m => SqlFunc.AggregateSum(m.Qty)).ToList(); if (boxQty[0] > needQty) { throw new Exception("拣货数量不能大于箱内剩余待拣数量"); } } var pickQty = 0;//拣货的数量 var comDetailList = Db.Queryable().Where(m => m.IsDel == "0" && m.ExportAllotId == allot.Id && m.PalletNo == palletNo).ToList(); var comList = new List(); foreach (var item in boxInfos) { if (comDetailList.Any(m => m.BoxNo3 == item.BoxNo3)) { throw new Exception($"当前{item.BoxNo}中{item.BoxNo3}已拣货完成,请勿重复拣货"); } //添加拣货明细 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); //删除库存箱码明细 Db.Deleteable(item).ExecuteCommand(); pickQty += item.Qty; } //改变库内箱码是否零箱信息 if (biaoShi == "1") { var boxSurplusList = boxInfo.Where(m => m.BoxNo3 != boxNo3).ToList(); foreach (var item in boxSurplusList) { item.BitBoxMark = "1"; Db.Updateable(item).ExecuteCommand(); } } Db.Insertable(comList).ExecuteCommand(); //修改出库分配信息 allot.CompleteQty += pickQty; allot.Status = allot.Qty == allot.CompleteQty ? "5" : "3"; if (allot.Status == "5") { //判断该托盘是否还存在物料 存在改为待回库 待回库完成后改为已完成 } Db.Updateable(allot).ExecuteCommand(); //删除或修改库存明细 stockDetail.BitPalletMark = "1";//修改为零托标识 stockDetail.Qty -= pickQty; stockDetail.LockQty -= 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) { Db.Deleteable(stockDetail).ExecuteCommand(); } else { Db.Updateable(stockDetail).ExecuteCommand(); } stock.Qty -= pickQty; stock.LockQty -= pickQty; if (stock.Qty <= 0) { Db.Deleteable(stock).ExecuteCommand(); } else { Db.Updateable(stock).ExecuteCommand(); } var num2 = Db.Queryable().Count(m => m.IsDel == "0" && m.PalletNo == palletNo); if (num2 <= 0) { //改变托盘状态 var pallet = Db.Queryable().First(m => m.PalletNo == palletNo && m.IsDel == "0"); if (pallet == null) { throw new Exception("未在托盘表中查询到托盘信息"); } pallet.Status = "0"; Db.Updateable(pallet).ExecuteCommand(); } //修改出库单明细拣货数量 noticeDetail.CompleteQty += pickQty; Db.Updateable(noticeDetail).ExecuteCommand(); var num = Db.Queryable() .Count(m => m.IsDel == "0" && m.SONo == soNo && m.CompleteQty < m.Qty); if (num <= 0) { notice.Status = "4"; //更改为执行完成 } //修改出库单信息 Db.Updateable(notice).ExecuteCommand(); } Db.CommitTran(); } catch (Exception e) { Db.RollbackTran(); throw new Exception(e.Message); } } /// /// 下发空托出库 /// /// /// /// /// /// public string IssuePlnOutHouse(OutModePalletVm model, int userId,string url) { try { string strMsg = ""; var outDtoList = new List(); //出库数据的集合 //获取当前时间 DateTime serverTime = Db.GetDate(); //获取库存明细是否小于等于该垛数 string str = "select * from DataStockDetail where IsDel = '0' and SkuNo = '100099' and Status = '0' "; var stockDetail = Db.Ado.SqlQuery(str); if (stockDetail.Count > 0) { //判断是否大于需要垛数 if (stockDetail.Count< int.Parse(model.Num)) { strMsg = "需要垛数大于库存垛数,请重新输入!"; return strMsg; } } //获取库存总表信息 var stock = Db.Queryable().First(s => s.IsDel == "0" && s.SkuNo == "100099"); //验证库存总表是否为空 if (stock == null) { strMsg = "库存信息不存在,请核查!"; return strMsg; } int i = 0; Db.BeginTran(); //遍历库存信息 foreach (var s in stockDetail) { //获取储位信息 var locat = Db.Queryable().First(l => l.LocatNo == s.LocatNo && l.IsDel == "0" && l.WareHouseNo == "W01"); if (locat != null) { if (locat.Status != "1") { continue; } //更改储位状态为出库中 locat.Status = "3"; //3 出库中 locat.UpdateTime = serverTime; //修改时间 locat.UpdateUser = userId; //修改人 //修改储位信息 Db.Updateable(locat).ExecuteCommand(); } //增加库存锁定数量 //stock.AllotQty += stock.LockQty += (int)s.Qty; //锁定数量 stock.UpdateTime = serverTime; //修改时间 stock.UpdateUser = userId; //修改人 //修改库存总表信息 Db.Updateable(stock).ExecuteCommand(); //增加库存明细锁定数量 //s.AllotQty += s.LockQty += (int)s.Qty; //锁定数量 s.UpdateTime = serverTime; //修改时间 s.UpdateUser = userId; //修改人 s.Status = "2"; //2 已分配 //修改库存明细信息 Db.Updateable(s).ExecuteCommand(); #region 分配 //添加分配表信息 var allot = new BllExportAllot { SONo = "", WaveNo = "", SODetailNo = 0, StockId = s.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)s.Qty, CompleteQty = 0, Status = "1", LogisticsId = 0, IsAdvance = "0", OutMode = model.OutMode,//出库口 CreateUser = userId, CreateTime = DateTime.Now }; Db.Insertable(allot).ExecuteCommand(); #endregion #region 添加出库任务信息 var taskNo = new Common().GetMaxNo("TK"); var exTask = new LogTask //出库任务 { TaskNo = taskNo, Sender = "WMS", Receiver = "PDA", IsSuccess = 1, //是否下发成功 0失败 1成功 StartLocat = locat == null ? "零箱库" : s.LocatNo,//起始位置 EndLocat = model.OutMode,//目标位置 PalletNo = s.PalletNo,//托盘码 IsSend = 1,//是否可再次下发 IsCancel = 1,//是否可取消 IsFinish = 1,//是否可完成 Type = "1",//任务类型 0 入库任务 1 出库任务 2 移库任务 Status = "1",//任务状态0:等待执行1正在执行2执行完成 OrderType = "1",//0 入库单 1 出库单 2 盘点单 3 移库单 CreateTime = serverTime, //创建时间 CreateUser = userId, //创建人 Msg = "Pda空托从" + locat == null ? "零箱库" : s.LocatNo + "到" + model.OutMode + "的出库任务", //关键信息 //FinishDate = serverTime, //完成时间 }; outDtoList.Add(new OutCommandDto() { PalletNo = exTask.PalletNo,//托盘号 StartLocate = exTask.StartLocat, // 起始位置 StartRoadway = locat.RoadwayNo, //所属巷道 EndLocate = "", // 目标位置 TaskNo = exTask.TaskNo, // 任务号 TaskType = "1",// 任务类型 (出库) OutMode = model.OutMode, //目标地址 Order = 1 }); Db.Insertable(exTask).ExecuteCommand(); #endregion i += 1; if (i == int.Parse(model.Num)) { //需求垛数已达到 可以出库了 break; } } if (outDtoList.Count > 0) { // 正式运行程序放开 var list2 = outDtoList.Select(m => m.TaskNo).ToList(); var jsonData = JsonConvert.SerializeObject(outDtoList); 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); if (wcsModel.StatusCode == 0) { //更改任务的发送返回时间// new TaskServer().EditTaskIssueOk(list2, time1, time2); str += "下发成功"; } if (wcsModel.StatusCode == -1) { new TaskServer().EditTaskIssueNo(list2, time1, time2, wcsModel.Msg); throw new Exception(wcsModel.Msg); } } catch (Exception ex) { throw new Exception(ex.Message); } } //添加操作日志记录 var k = new OperationSOServer().AddLogOperationSo("PDA模块", "空托出库", i+"", "下发", $"用PDA下发了 {i} 个空托垛", userId); Db.CommitTran(); return ""; } catch (Exception e) { Db.RollbackTran(); throw new Exception(e.Message); } } //获取平库托盘信息 public List GetPingKuInfoByPallet(string soNo, string palletNo) { try { var info = Db.Queryable().Where(m => m.SONo == soNo && m.PalletNo == palletNo && m.IsDel == "0"); if (info.Count() == 0) { throw new Exception("未查询到托盘分配下发的信息"); } var data = info.GroupBy(m => new { m.SkuNo, m.SkuName, m.LotNo }).Select(m => new BoxInfo() { SkuNo = m.SkuNo, SkuName = m.SkuName, LotNo = m.LotNo }).ToList(); return data; } catch (Exception e) { throw new Exception(e.Message); } } /// /// 平库出库完成 /// /// 单据号 /// 托盘码 /// 操作人 public void PlaneExportSuccess(string soNo, string palletNo, int userId) { try { #region 托盘信息 //获取托盘信息 var pallet = Db.Queryable().First(p => p.IsDel == "0" && p.PalletNo == palletNo); //验证托盘信息是否为空 if (pallet == null) { throw new Exception("托盘信息不存在,请检查!"); } if (pallet.Status == "0") { throw new Exception("托盘未使用,请检查!"); } #endregion #region 托盘是否在平库验证 var result = Db.Queryable().First(m => m.PalletNo == palletNo); if (result == null) { throw new Exception("库存信息中不存在该托盘信息,请检查!"); } if (result.WareHouseNo!="W02")//W02:零箱库 { throw new Exception("该托盘未在零箱库,请检查!"); } #endregion //获取库存明细信息 var stockDetail = Db.Queryable().Where(s => s.IsDel == "0" && s.PalletNo == palletNo).ToList(); //验证库存明细信息是否存在 if (stockDetail == null) { throw new Exception("库存明细不存在,请检查库存信息!"); } Db.BeginTran(); try { foreach (var item in stockDetail) { if (item.SkuNo == "100099")//判断是否是空托出库 { //判断总库存是否为0,如果为0删除 否则减去数量 var stock = Db.Queryable().First(m => m.SkuNo == "100099"); if (stock != null) { if (item.LockQty != null) { stock.Qty -= item.LockQty.Value; stock.LockQty -= item.LockQty.Value; Db.Updateable(stock).ExecuteCommand(); } if (stock.Qty == 0) { Db.Deleteable(stock).ExecuteCommand(); } } //托盘状态改为未使用 var sCode = Db.Queryable().First(m => m.PalletNo == item.PalletNo); if (sCode != null) { sCode.Status = "0"; Db.Updateable(sCode).ExecuteCommand(); } Db.Deleteable(item).ExecuteCommand(); continue; } item.LocatNo = "";//储位更改(改为空) item.WareHouseNo = "";//所属仓库更改(改为空) item.RoadwayNo = "";//所属巷道更改(改为空) item.AreaNo = "";//所属区域更改(改为空) Db.Updateable(item).ExecuteCommand(); } //出库流水(更改状态) var allot = Db.Queryable().Where(m => m.IsDel == "0" && m.Status == "1" && m.PalletNo == palletNo && m.SONo == soNo).ToList(); foreach (var item in allot) { if (item.SkuNo == "100099") { item.Status = "5"; item.CompleteQty += stockDetail[0].Qty; } else { item.Status = "2"; } } Db.Updateable(allot).ExecuteCommand(); #region 添加出库操作日志记录信息 //添加操作日志记录 var k = new OperationSOServer().AddLogOperationSo("出库作业", "拣货明细", soNo, "完成", $"用PDA完成了单据号为{soNo}的平库出库", userId); #endregion Db.CommitTran(); } catch (Exception e) { Db.RollbackTran(); throw new Exception(e.Message); } } catch (Exception e) { throw new Exception(e.Message); } } } }