using System; using System.Collections.Generic; using System.Text; using Model.ModelDto.BllCheckDto; using SqlSugar; 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 { #region 判断 if (string.IsNullOrWhiteSpace(crNo)) { throw new Exception("盘点单据不能为空"); } if (string.IsNullOrWhiteSpace(crDetail)) { throw new Exception("物料批次不能为空"); } if (string.IsNullOrWhiteSpace(palletNo)) { throw new Exception("托盘码不能为空"); } #endregion var detail = crDetail.Split("-"); var sku = detail[0]; var lotNo = detail.Length == 3 ? detail[1] + "-" + detail[2] : 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, int? qty, int sQty, int userId) { try { #region 判断 if (string.IsNullOrWhiteSpace(crNo)) { throw new Exception("盘点单据不能为空"); } if (string.IsNullOrWhiteSpace(crDetail)) { throw new Exception("物料批次不能为空"); } if (string.IsNullOrWhiteSpace(palletNo)) { throw new Exception("托盘码不能为空"); } #endregion //箱码为空 是整托要盘点的都正常 //物料-批次 var detail = crDetail.Split("-"); //物料号 var sku = detail[0]; //批次号 var lotNo = detail.Length == 3 ? detail[1] + "-" + detail[2] : 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().First(m => m.IsDel == "0" && m.CRNo == crNo && m.PalletNo == palletNo && m.SkuNo == sku && m.LotNo == lotNo && m.CheckResult == null); //时间 var time = DateTime.Now; #region 包装信息 var package = Db.Queryable().Where(m => m.IsDel == "0"); var skuInfo = Db.Queryable().First(m => m.IsDel == "0" && m.SkuNo == sku); var pack = package.First(m => m.IsDel == "0" && m.PackagNo == skuInfo.PackagNo); var pNum = 0;//托盘物品数量 if (pack.L5Num.HasValue) { pNum = (int)pack.L5Num; } else if (pack.L4Num.HasValue) { pNum = (int)pack.L4Num; } else if (pack.L3Num.HasValue) { pNum = (int)pack.L3Num; } else if (pack.L2Num.HasValue) { pNum = (int)pack.L2Num; } else if (pack.L1Num.HasValue) { pNum = (int)pack.L1Num; } if (pNum == 0) { throw new Exception($"绑定失败,{sku}物品包装未找到!"); } if (sQty > pNum) { throw new Exception($"确认失败,托盘{palletNo}实际数量大于物品包装数量!请取出多余数量进行入库操作!"); } #endregion //判断盘点记录表是否为空 if (checkLog != null) { checkLog.RealQty = sQty; //记录 实际数量 checkLog.CheckResult = sQty == qty ? 0 : sQty < qty ? 1 : 2; //记录 盘点状态 0:正常、1:盘亏、2:盘盈 checkLog.CheckDate = time; //记录 盘点时间 checkLog.CheckUserId = userId; //记录 盘点人 checkDetail.RealQty = sQty; //明细 实际数量 checkDetail.CheckResult = sQty == qty ? 0 : sQty < qty ? 1 : 2; //明细 盘点状态 0:正常、1:盘亏、2:盘盈 //checkDetail.Status = sQty == qty ? 4 : 3; //明细 状态 3:已盘点 checkDetail.Status = 3; //明细 状态 3:已盘点 Db.Updateable(checkDetail).ExecuteCommand(); //修改盘点明细 Db.Updateable(checkLog).ExecuteCommand(); //修改盘点记录 } #region 盘亏 盘盈无用代码 ////盘亏 //else if (sQty < qty) //{ // if (checkLog.Count() == 0) // { // throw new Exception("未查询到托盘信息"); // } // var list = checkLog.ToList(); // foreach (var l in list) // { // l.RealQty = sQty; //实际数量 // l.CheckResult = 1; //盘点状态 1:盘亏 // l.CheckDate = time; //盘点实际 // l.CheckUserId = userId; //盘点人 // } // //盘点明细实际数量 // checkDetail.RealQty = 0; // checkDetail.RealQty = sQty; // Db.Updateable(checkDetail).ExecuteCommand(); //修改盘点明细 // Db.Updateable(list).ExecuteCommand(); //修改盘点记录 //} ////盘盈 //else if (sQty> qty) //{ // var list = checkLog.ToList(); // foreach (var l in list) // { // l.RealQty = sQty; //实际数量 // l.CheckResult = 2; //盘点状态 2:盘盈 // l.CheckDate = time; //盘点实际 // l.CheckUserId = userId; //盘点人 // } // checkDetail.RealQty = sQty; // Db.Updateable(checkDetail).ExecuteCommand(); //修改盘点明细 // Db.Updateable(list).ExecuteCommand(); //修改盘点记录; //} //else //{ // throw new Exception("实际数量为0,请核实!"); //} #endregion //获取该盘点单 盘点明细中未变更为已盘点的信息条数 var checkDetailCount = Db.Queryable().Where(m => m.IsDel == "0" && m.CRNo == crNo && m.Status != 3 && m.CheckResult == null && m.RealQty == null).ToList(); //判断条数是否为0 if (checkDetailCount.Count <= 0) { //获取盘点单信息 var check = Db.Queryable().First(m => m.CRNo == crNo && m.IsDel == "0"); check.Status = 2; 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 skuName) { string str = "select LocatNo,PalletNo,SkuName,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"; } //判断物料名称是否为空 if (!string.IsNullOrEmpty(skuName)) { str += " and SkuName like @skuname"; } //排序 str += " order by LotNo,LocatNo,PalletNo"; List stockList = Db.Ado.SqlQuery(str, new { isdel = "0", //是否删除 locatno = "%" + locatNo + "%", //储位编号 palletno = "%" + palletNo + "%", //托盘号 skuname = "%" + skuName + "%" //物料名称 }); return stockList; } #endregion } }