using System; using System.Collections.Generic; using System.Linq; using System.Text; using Model.ModelDto.BllCheckDto; using Model.ModelDto.PdaDto; using SqlSugar; using WMS.BLL.LogServer; using WMS.Entity.BllAsnEntity; using WMS.Entity.BllCheckEntity; using WMS.Entity.Context; using WMS.Entity.DataEntity; using WMS.Entity.SysEntity; using WMS.IBLL.IPdaServer; namespace WMS.BLL.BllPdaServer { public class PdaCrServer : IPdaCrServer { private static readonly SqlSugarScope Db = DataContext.Db; #region 盘点 //获取盘库单正在执行单号 public List GetStockCheckNoList(string palletNo) { try { List list; if (!string.IsNullOrWhiteSpace(palletNo)) { list = Db.Queryable().Where(m => m.IsDel == "0" && m.PalletNo == palletNo && m.Status == 2).Select(m => m.CRNo).Distinct().ToList(); } else { list = Db.Queryable().Where(m => m.IsDel == "0" && m.Status == 1).Select(m => m.CRNo) .Distinct().ToList(); } return list; } catch (Exception e) { throw new Exception(e.Message); } } //获取盘点明细物料批次信息 public List GetStockCheckDetailList(string crNo, string palletNo) { try { if (string.IsNullOrWhiteSpace(crNo)) { throw new Exception("盘点单据不能为空"); } var list = Db.Queryable().Where(m => m.IsDel == "0" && m.CRNo == crNo); if (!string.IsNullOrWhiteSpace(palletNo)) { list = list.Where(m => m.PalletNo == palletNo); } var data = list.GroupBy(m => new { m.SkuNo, m.SkuName, m.LotNo }).Select(m => new StockCheckDetailDto() { SkuNo = m.SkuNo, SkuName = m.SkuName, LotNo = m.LotNo }).ToList(); return data; } catch (Exception e) { throw new Exception(e.Message); } } //获取要盘点的箱码信息(盘点记录中数据) public List GetStockCheckLogList(string crNo, string crDetail, string palletNo, string boxNo) { try { if (string.IsNullOrWhiteSpace(crNo)) { throw new Exception("盘点单据不能为空"); } if (string.IsNullOrWhiteSpace(crDetail)) { throw new Exception("物料批次不能为空"); } if (string.IsNullOrWhiteSpace(palletNo)) { throw new Exception("托盘码不能为空"); } var detail = crDetail.Split("-"); var sku = detail[0]; var lotNo = detail[1]; var list = Db.Queryable().Where(m => m.IsDel == "0" && m.CRNo == crNo); //var deList= Db.Queryable().Where(m => m.IsDel == "0" && m.SkuNo == sku && m.LotNo == lotNo && m.PalletNo == palletNo); //if (deList.Count() == 0) //{ // throw new Exception("未查询到托盘上的盘点物料批次信息"); //} list = list.Where(m => m.SkuNo == sku && m.LotNo == lotNo && m.PalletNo == palletNo); if (!string.IsNullOrWhiteSpace(boxNo)) { list = list.Where(m => m.BoxNo == boxNo); } var data = list.Select(m => new StockCheckLogDto() { BoxNo = m.BoxNo, BoxNo3 = m.BoxNo3, SkuNo = m.SkuNo, SkuName = m.SkuName, LotNo = m.LotNo, Qty = m.Qty, CheckResult = m.CheckResult, }).ToList(); return data; } catch (Exception e) { throw new Exception(e.Message); } } public void CrSetCheck(string crNo, string crDetail, string palletNo, string boxNo, string boxNo3, string result, int? qty, int userId) { try { if (string.IsNullOrWhiteSpace(crNo)) { throw new Exception("盘点单据不能为空"); } if (string.IsNullOrWhiteSpace(crDetail)) { throw new Exception("物料批次不能为空"); } if (string.IsNullOrWhiteSpace(palletNo)) { throw new Exception("托盘码不能为空"); } //箱码为空 是整托要盘点的都正常 var detail = crDetail.Split("-"); var sku = detail[0]; var lotNo = detail[1]; //盘点明细 var checkDetail = Db.Queryable().First(m => m.IsDel == "0" && m.CRNo == crNo && m.PalletNo == palletNo && m.SkuNo == sku && m.LotNo == lotNo); if (checkDetail == null) { throw new Exception("未查询到未盘点的盘点明细信息"); } //盘点记录 var checkLog = Db.Queryable().Where(m => m.IsDel == "0" && m.CRNo == crNo && m.PalletNo == palletNo && m.SkuNo == sku && m.LotNo == lotNo && m.CheckResult == null); var time = DateTime.Now; if (result == "0") { if (!string.IsNullOrWhiteSpace(boxNo)) { checkLog = checkLog.Where(m => m.BoxNo == boxNo); } if (!string.IsNullOrWhiteSpace(boxNo3)) { checkLog = checkLog.Where(m => m.BoxNo3 == boxNo3); } if (checkLog.Count() == 0) { throw new Exception("未查询到未盘点的箱支信息"); } var list = checkLog.ToList(); var num = 0; foreach (var l in list) { if (l.CheckResult != null) { continue; } l.RealQty = l.Qty; l.CheckResult = 0; l.CheckDate = time; l.CheckUserId = userId; num += int.Parse(l.Qty.ToString()); } if (checkDetail.RealQty == null) { checkDetail.RealQty = 0; } checkDetail.RealQty += num; //if (checkDetail.CheckResult == null || checkDetail.CheckResult == 0) //{ // checkDetail.CheckResult = 0; //} Db.Updateable(checkDetail).ExecuteCommand(); Db.Updateable(list).ExecuteCommand(); } else if (result == "1") { if (!string.IsNullOrWhiteSpace(boxNo)) { checkLog = checkLog.Where(m => m.BoxNo == boxNo); } if (!string.IsNullOrWhiteSpace(boxNo3)) { checkLog = checkLog.Where(m => m.BoxNo3 == boxNo3); } if (checkLog.Count() == 0) { throw new Exception("未查询到箱支信息"); } var list = checkLog.ToList(); var num = 0; foreach (var l in list) { l.RealQty = 0; l.CheckResult = 1; l.CheckDate = time; l.CheckUserId = userId; num -= int.Parse(l.RealQty.ToString()); } if (checkDetail.RealQty == null) { checkDetail.RealQty = 0; } checkDetail.RealQty += num; //checkDetail.CheckResult = 1; Db.Updateable(checkDetail).ExecuteCommand(); Db.Updateable(list).ExecuteCommand(); } else if (result == "2") { if (string.IsNullOrWhiteSpace(boxNo) || string.IsNullOrWhiteSpace(boxNo3)) { throw new Exception("盘盈时箱码与支码不能为空"); } if (qty == null || qty <= 0) { throw new Exception("盘盈时数量不能为空且需大于0"); } var count = Db.Queryable() .Count(m => m.IsDel == "0" && m.BoxNo == boxNo && m.BoxNo3 == boxNo3); var count2 = Db.Queryable() .Count(m => m.IsDel == "0" && m.BoxNo == boxNo && m.BoxNo3 == boxNo3); if (count > 0 || count2 > 0) { throw new Exception("当前库存中已存在该箱支信息"); } var crLog = new BllStockCheckLog() { CRNo = crNo, PalletNo = palletNo, BoxNo = boxNo, BoxNo2 = null, BoxNo3 = boxNo3, Qty = qty, SkuNo = checkDetail.SkuNo, SkuName = checkDetail.SkuName, Standard = checkDetail.Standard, LotNo = checkDetail.LotNo, LotText = checkDetail.LotText, SupplierLot = checkDetail.SupplierLot, RealQty = qty, CheckResult = 2, CheckDate = time, CheckUserId = userId, CreateUser = userId, CreateTime = time }; if (checkDetail.RealQty == null) { checkDetail.RealQty = 0; } checkDetail.RealQty += qty; //checkDetail.CheckResult = 1; Db.Updateable(checkDetail).ExecuteCommand(); Db.Insertable(crLog).ExecuteCommand(); } else { throw new Exception("盘点结果不符,请核实!"); } var checkLogNum = Db.Queryable().Where(m => m.IsDel == "0" && m.CRNo == crNo && m.PalletNo == palletNo && m.SkuNo == sku && m.LotNo == lotNo); if (checkLogNum.Count(m => m.CheckResult == null) == 0) { var checkDe = Db.Queryable().First(m => m.IsDel == "0" && m.CRNo == crNo && m.PalletNo == palletNo && m.SkuNo == sku && m.LotNo == lotNo); checkDe.Status = 3; Db.Updateable(checkDe).ExecuteCommand(); var checkDeNum = Db.Queryable().Count(m => m.IsDel == "0" && m.CRNo == crNo && m.Status != 3 && m.Id != checkDe.Id); if (checkDeNum == 0) { var check = Db.Queryable().First(m => m.CRNo == crNo && m.IsDel == "0"); check.Status = 2; check.CompleteDate = DateTime.Now; Db.Updateable(check).ExecuteCommand(); } } Db.CommitTran(); } catch (Exception e) { Db.RollbackTran(); throw new Exception(e.Message); } } #endregion #region 库存查询 /// /// pda库存查询 /// /// 储位编号 /// 托盘号 /// public List GetStockQueryList(string locatNo, string palletNo) { string str = "select LocatNo,PalletNo,SkuName,SkuNo,Standard,LotNo,Qty,LockQty,FrozenQty,InspectQty from DataStockDetail Where IsDel = @isdel"; //判断储位编号是否为空 if (!string.IsNullOrEmpty(locatNo)) { str += " and LocatNo like @locatno"; } //判断托盘号是否为空 if (!string.IsNullOrEmpty(palletNo)) { str += " and PalletNo like @palletno"; } //排序 str += " order by LotNo,LocatNo,PalletNo"; List stockList = Db.Ado.SqlQuery(str, new { isdel = "0", //是否删除 locatno = "%" + locatNo + "%", //储位编号 palletno = "%" + palletNo + "%", //托盘号 }); return stockList; } #endregion #region 托盘变更(托盘解绑绑定) //根据托盘号获取箱码和箱内数量 public List GetDataDetailList(string palletNo) { try { if (string.IsNullOrWhiteSpace(palletNo)) { throw new Exception("托盘号不能为空"); } var detail = Db.Queryable().Where(m => m.IsDel == "0" && m.PalletNo == palletNo).Select(m=>m.Id).ToList(); var info = Db.Queryable().Where(m => m.IsDel == "0" && detail.Contains(m.StockDetailId)) .GroupBy(m => m.BoxNo).Select(a => new PdaPalletNoCheckDto { BoxNo = a.BoxNo, Qty = SqlFunc.AggregateSum(a.Qty) }).ToList(); return info; } catch(Exception e) { throw new Exception(e.Message); } } //根据箱码获取物料、批次、数量等信息 public PdaPalletNoCheckDto GetBoxInfoByBox(string boxNo) { try { if (string.IsNullOrWhiteSpace(boxNo)) { throw new Exception("箱码不能为空"); } var info = Db.Queryable().Where(m => m.IsDel == "0" && m.BoxNo == boxNo) .GroupBy(m => new{m.BoxNo,m.SkuNo,m.SkuName,m.LotNo}).Select(a => new PdaPalletNoCheckDto { BoxNo = a.BoxNo, SkuNo = a.SkuNo, SkuName = a.SkuName, LotNo = a.LotNo, Qty = SqlFunc.AggregateSum(a.Qty) }).ToList(); if (info.Count>1) { throw new Exception("当前箱码查询出多条物料或批次信息,请核实"); } return info.FirstOrDefault(); } catch (Exception e) { throw new Exception(e.Message); } } //解绑原托盘绑定新托盘 public void SaveUnbind(string palletNo,string boxNo,string palletNoNew,int userId) { try { if (string.IsNullOrWhiteSpace(palletNo) || string.IsNullOrWhiteSpace(palletNoNew)) { throw new Exception("新旧托盘号不能为空"); } if (palletNo == palletNoNew) { throw new Exception("新旧托盘号不能为相同"); } //库存箱支信息 var infos = Db.Queryable().Where(m => m.IsDel == "0" && m.PalletNo == palletNo);//整托变更 if (!string.IsNullOrWhiteSpace(boxNo)) { //按箱变更 infos = infos.Where(m => m.IsDel == "0" && m.BoxNo == boxNo); } List infosList = infos.ToList(); if (infosList.Count <= 0) { throw new Exception("原托盘上未查到箱支明细,请核实"); } //库存明细id var infoIds = infos.GroupBy(m => m.StockDetailId).Select(a =>a.StockDetailId).ToList(); if (infoIds.Count == 0) { throw new Exception("未查询到当前箱码信息,请核实"); } //开启事务 Db.BeginTran(); var comTime = DateTime.Now; //新托盘库存明细 bool newPalletHaveGoods = false;//新托盘上是否有物品 string pallWareHouseNo = string.Empty;//新托盘所在的位置(库外/平库) var stockDetailList = Db.Queryable().Where(m => m.IsDel == "0" && m.PalletNo == palletNoNew).ToList(); if (stockDetailList != null && stockDetailList.Count() > 0) { newPalletHaveGoods = true; pallWareHouseNo = stockDetailList[0].WareHouseNo; if (!string.IsNullOrEmpty(stockDetailList[0].LocatNo)) { throw new Exception("新托盘在立库内不允许变更,请核实"); } #region 验证是否允许立库同托盘不同物料入库或同托盘同物料不同批次入库 var box = Db.Queryable().First(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.BitBoxMark == "0"); if (box != null) { foreach (var item in infosList) { if (box.SkuNo != item.SkuNo || box.LotNo != item.LotNo) { var funSetting = Db.Queryable().First(a => a.IsDel == "0" && a.FunSetNo == "Fun045"); if (funSetting == null || funSetting.IsEnable == "OFF") { throw new Exception($"不允许立库同托盘不同物料入库或同托盘不同批次入库!"); } } } } #endregion } if (!newPalletHaveGoods)//新托盘上没有物品 { var pallet = Db.Queryable().First(m => m.IsDel == "0" && m.PalletNo == palletNoNew); if (pallet == null) { throw new Exception("未查询到新托盘号信息"); } if (pallet.Status == "0") { pallet.Status = "1";//将新托盘状态修改为已使用 Db.Updateable(pallet).ExecuteCommand(); } else { throw new Exception("新托盘号状态不是未使用"); } } foreach (var infoIdItem in infoIds) { var infosList2 = infosList.Where(w => w.StockDetailId == infoIdItem).ToList(); //原托盘库存明细 var stockDetail1 = Db.Queryable().First(m => m.IsDel == "0" && m.PalletNo == palletNo && m.Id == infoIdItem); if (stockDetail1 == null) { throw new Exception("未在原托盘上查询到箱码信息,请核实"); } if (!string.IsNullOrEmpty(stockDetail1.LocatNo)) { throw new Exception("原托盘在立库内不允许变更,请核实"); } var stockDetail2 = stockDetailList.FirstOrDefault(w => w.SkuNo == stockDetail1.SkuNo && w.LotNo == stockDetail1.LotNo); var stId = 0; if (stockDetail2 == null) //添加-新托盘上没有同物料同批次物品 { //新托盘添加库存明细 var detail = new DataStockDetail() { LotNo = stockDetail1.LotNo, LotText = stockDetail1.LotText, SupplierLot = stockDetail1.SupplierLot, SkuNo = stockDetail1.SkuNo, SkuName = stockDetail1.SkuName, Standard = stockDetail1.Standard, Qty = infosList2.Sum(m => m.Qty), LockQty = 0, FrozenQty = 0, InspectQty = 0, ASNNo = stockDetail1.ASNNo, ASNDetailNo = stockDetail1.ASNDetailNo, WareHouseNo = pallWareHouseNo, RoadwayNo = "", AreaNo = "", LocatNo = stockDetail1.LocatNo, PalletNo = palletNoNew,//新托盘号 PalletNo2 = "", PalletNo3 = "", CompleteTime = comTime, ProductionTime = stockDetail1.ProductionTime, ExpirationTime = stockDetail1.ExpirationTime, Status = "0", InspectMark = stockDetail1.InspectMark, InspectStatus = stockDetail1.InspectStatus, BitPalletMark = stockDetail1.BitPalletMark, PackagNo = stockDetail1.PackagNo, IsBale = "0", IsBelt = "0", IsDel = "0", CreateUser = userId, CreateTime = DateTime.Now }; stId = Db.Insertable(detail).ExecuteReturnIdentity(); } else //修改-新托盘有物品 { stockDetail2.Qty += infosList2.Sum(m => m.Qty);//新托盘增加库存 Db.Updateable(stockDetail2).ExecuteCommand(); stId = stockDetail2.Id; } //修改库存 stockDetail1.Qty -= infosList2.Sum(m => m.Qty); stockDetail1.BitPalletMark = "1";//是否零托 0:否 1:是 if (stockDetail1.Qty == 0) { Db.Deleteable(stockDetail1).ExecuteCommand();//删除原托盘库存明细 //判原托盘还有没有货物 var stockDetail3 = Db.Queryable().Where(m => m.IsDel == "0" && m.PalletNo == palletNo && m.Id != infoIds.First()).ToList(); if (stockDetail3 == null || stockDetail3.Count <= 0) { var pallet = Db.Queryable().First(m => m.IsDel == "0" && m.PalletNo == palletNo); pallet.Status = "0";//原托盘没有货物后将状态修改为未使用 Db.Updateable(pallet).ExecuteCommand(); } } else { Db.Updateable(stockDetail1).ExecuteCommand();//修改原托盘库存明细 } foreach (var item in infosList2) { //修改库存箱码明细 item.StockDetailId = stId; item.BindNo = null; item.PalletNo = palletNoNew; Db.Updateable(item).ExecuteCommand(); } //添加托盘解绑绑定记录 var unBind = new BllPalletUnbind() { UpbindPalletNo = palletNo, BindPalletNo = palletNoNew, LotNo = stockDetail1.LotNo, LotText = stockDetail1.LotText, SupplierLot = stockDetail1.SupplierLot, SkuNo = stockDetail1.SkuNo, SkuName = stockDetail1.SkuName, Standard = stockDetail1.Standard, Qty = infosList2.Sum(m => m.Qty), PalletNo2 = stockDetail1.PalletNo2, PalletNo3 = stockDetail1.PalletNo3, BoxNo = boxNo, InspectNo = "", InspectStatus = stockDetail1.InspectStatus, IsDel = "0", CreateTime = comTime, CreateUser = userId }; Db.Insertable(unBind).ExecuteCommand(); } //添加操作日志 if (string.IsNullOrEmpty(boxNo)) { boxNo = "全部"; } new OperationCrServer().AddLogOperationCr("库内作业", "操作日志", boxNo, "编辑", $"托盘变更:原托盘码:{palletNo}上的箱码{boxNo}解绑,绑定到新托盘{palletNoNew}上", userId); //提交事务 Db.CommitTran(); } catch (Exception e) { Db.RollbackTran(); throw new Exception(e.Message); } } #endregion } }