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.DAL; using WMS.Entity.BllAsnEntity; using WMS.Entity.BllCheckEntity; using WMS.Entity.BllSoEntity; using WMS.Entity.Context; using WMS.Entity.DataEntity; using WMS.Entity.LogEntity; 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, string isContinue) { 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 skuinfo = Db.Queryable().First(m => m.IsDel == "0" && m.SkuNo == sku); //判断是否存在物料消息 if (skuinfo == null) { throw new Exception("托盘码不能为空"); } int isQtySku = 0; if (skuinfo.Type == "4" && isContinue == "1") { isQtySku = 1; } 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); } List data = new List(); //判断是否为无码物料 if (isQtySku == 1) { //获取库存信息 var stockDetail = Db.Queryable().First(a => a.IsDel == "0" && a.Status == "3" && a.SkuNo == sku && a.PalletNo == palletNo); var model = new StockCheckLogDto() { PalletNo = palletNo, SkuNo = sku, Qty = (int?)stockDetail.Qty, CheckResult = 4, }; data.Add(model); } else { 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, string isContinue, 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 && isContinue == "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; checkDetail.CheckResult = 0; //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 && isContinue == "0") { throw new Exception("未查询到箱支信息"); } // if (isContinue == "1") { if (qty == null || qty <= 0) { throw new Exception("数量盘点时、盘亏数量不能为空且需大于0"); } } 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; if (isContinue == "1") { checkDetail.RealQty = qty; } checkDetail.CheckResult = 1; var checkInfo = Db.Queryable().First(m => m.IsDel == "0" && m.CRNo == crNo && m.PalletNo == palletNo && m.SkuNo == sku && m.LotNo == lotNo); checkInfo.RealQty = qty; checkInfo.CheckResult = 1; checkInfo.CheckUserId = userId; checkInfo.CheckDate = time; checkInfo.UpdateUser = userId; checkInfo.UpdateTime = time; Db.Updateable(checkInfo).ExecuteCommand(); Db.Updateable(checkDetail).ExecuteCommand(); Db.Updateable(list).ExecuteCommand(); } //盘盈 else if (result == "2") { if (isContinue == "0") { if (string.IsNullOrWhiteSpace(boxNo) || string.IsNullOrWhiteSpace(boxNo3)) { throw new Exception("盘盈时箱码与支码不能为空"); } } if (qty == null || qty <= 0) { throw new Exception("盘盈时数量不能为空且需大于0"); } if (isContinue == "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("当前库存中已存在该箱支信息"); } } BllStockCheckLog crLog = new BllStockCheckLog(); if (isContinue == "0") { 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 }; } else { var checkInfo = Db.Queryable().First(m => m.IsDel == "0" && m.CRNo == crNo && m.PalletNo == palletNo && m.SkuNo == sku && m.LotNo == lotNo); checkInfo.RealQty = qty; checkInfo.CheckResult = 2; checkInfo.CheckUserId = userId; checkInfo.CheckDate = time; checkInfo.UpdateUser = userId; checkInfo.UpdateTime = time; Db.Updateable(checkInfo).ExecuteCommand(); } if (checkDetail.RealQty == null && isContinue == "0") { checkDetail.RealQty = 0; } checkDetail.RealQty += qty; if (isContinue == "1") { checkDetail.RealQty = qty; } checkDetail.CheckResult = 2; Db.Updateable(checkDetail).ExecuteCommand(); if (isContinue == "0") { Db.Insertable(crLog).ExecuteCommand(); } } else { Db.RollbackTran(); 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 #region AGV转运 /// /// 获取托盘所在储位地址 /// /// /// public string GetPalletLocatNo(string palletNo) { try { var models = Db.Queryable().First(w => w.IsDel == "0" && w.PalletNo == palletNo); if (models == null) { throw new Exception("托盘库存信息不存在,请检查!"); } if (string.IsNullOrEmpty(models.LocatNo)) { throw new Exception("托盘储位信息不存在,请检查!"); } if (models.WareHouseNo != "W02") { throw new Exception("该托盘未在平库内,请检查!"); } return models.LocatNo; } catch (Exception ex) { throw new Exception(ex.Message); } } /// /// 获取托盘所在楼层所有区域 /// /// /// public List GetStorageArea(string palletNo) { try { var models = Db.Queryable().First(w => w.IsDel == "0" && w.PalletNo == palletNo); if (models == null) { throw new Exception("托盘库存信息不存在,请检查!"); } if (string.IsNullOrEmpty(models.LocatNo)) { throw new Exception("托盘储位信息不存在,请检查!"); } if (models.WareHouseNo != "W02") { throw new Exception("该托盘未在平库内,请检查!"); } var storageLocat = Db.Queryable().First(w => w.IsDel == "0" && w.LocatNo == models.LocatNo); if (storageLocat == null) { throw new Exception("储位信息不存在,请检查!"); } var storageArea = new List(); if (storageLocat.AreaNo.Contains("B0")) { storageArea = Db.Queryable().Where(w => w.AreaNo.Contains("B0")).ToList(); } else { storageArea = Db.Queryable().Where(w => w.AreaNo.Contains("B1")).ToList(); } return storageArea; } catch (Exception ex) { throw new Exception(ex.Message); } } /// /// 获取已分配的出库单据 /// /// public List GetRunSoNoticeList() { try { var allotList = Db.Queryable().Where(m => m.IsDel == "0" && m.Status == "2").Select(m => m.SONo).Distinct().ToList(); return allotList; } catch (Exception ex) { throw new Exception(ex.Message); } } /// /// 根据托盘号获取托盘上物料信息 /// /// /// public List GetSkuInfoByPalletNo(string palletNo) { try { if (string.IsNullOrEmpty(palletNo)) { throw new Exception("请扫描托盘条码!"); } var skuInfoList = Db.Queryable().Where(m => m.IsDel == "0" && m.PalletNo == palletNo).ToList(); return skuInfoList; } catch (Exception ex) { throw new Exception(ex.Message); } } /// /// 根据出库单号获取分配的托盘信息 /// /// /// public List GetPalletNoListBySoNo(string soNo) { try { if (string.IsNullOrEmpty(soNo)) { throw new Exception("请选择出库单号!"); } var palletNoList = Db.Queryable().Where(m => m.IsDel == "0" && m.SONo == soNo).Select(m => m.PalletNo).Distinct().ToList(); return palletNoList; } catch (Exception ex) { throw new Exception(ex.Message); } } /// /// agv转运呼叫小车-开发未完成待确认 /// /// /// /// public void AgvTransport(string palletNo, string areaNo, string ruku, int userId) { if (string.IsNullOrEmpty(palletNo)) { throw new Exception("请扫描托盘条码!"); } if (string.IsNullOrEmpty(areaNo) && string.IsNullOrEmpty(ruku)) { throw new Exception("请选择目标区域或入库口!"); } if (!string.IsNullOrEmpty(areaNo) && !string.IsNullOrEmpty(ruku)) { throw new Exception("目标区域和入库口不能同时选择!"); } try { string EndLocat = string.Empty;//目标位置 var stockDetail = Db.Queryable().First(w => w.IsDel == "0" && w.PalletNo == palletNo); if (stockDetail == null) { throw new Exception("托盘上物料库存明细信息不存在,请检查!"); } if (!string.IsNullOrEmpty(areaNo)) { var storageArea = Db.Queryable().First(w => w.IsDel == "0" && w.AreaNo == areaNo); if (storageArea == null) { throw new Exception("所选区域信息不存在,请检查!"); } EndLocat = GetLocat(areaNo, stockDetail.SkuNo, stockDetail.LotNo); } else { EndLocat = ruku; } var stock = Db.Queryable().First(w => w.IsDel == "0" && w.SkuNo == stockDetail.SkuNo && w.LotNo == stockDetail.LotNo); if (stock == null) { throw new Exception("托盘上物料库存信息不存在,请检查!"); } if (string.IsNullOrEmpty(stockDetail.LocatNo)) { throw new Exception("托盘储位信息不存在,请检查!"); } if (stockDetail.WareHouseNo != "W02") { throw new Exception("该托盘未在平库内,请检查!"); } var storageLocat = Db.Queryable().First(w => w.IsDel == "0" && w.LocatNo == stockDetail.LocatNo); if (storageLocat == null) { throw new Exception("储位信息不存在,请检查!"); } //开启事务 Db.BeginTran(); //添加出库任务 var taskNo = new Common().GetMaxNo("TK"); var exTask = new LogTask { TaskNo = taskNo, Sender = "WMS", Receiver = "AGV", IsSuccess = 0, //是否下发成功 0失败 1成功 StartLocat = stockDetail.LocatNo,//起始位置 EndLocat = EndLocat,//目标位置 PalletNo = palletNo,//托盘码 IsSend = 1,//是否可再次下发 IsCancel = 1,//是否可取消 IsFinish = 1,//是否可完成 Type = "2",//任务类型 0 入库任务 1 出库任务 2 移库任务 Status = "0",//任务状态0:等待执行1正在执行2执行完成 OrderType = "3",//0 入库单 1 出库单 2 盘点单 3 移库单 CreateTime = DateTime.Now }; Db.Insertable(exTask).ExecuteCommand(); //修改库存明细信息 stockDetail.Status = "4";//移库锁定 stockDetail.LockQty = stockDetail.Qty;//锁定库存数量 Db.Updateable(stockDetail).ExecuteCommand(); //修改库存信息 stock.LockQty += (decimal)stockDetail.Qty; Db.Updateable(stock).ExecuteCommand(); //修改储位地址状态 storageLocat.Status = "5";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中 Db.Updateable(storageLocat).ExecuteCommand(); //添加操作日志记录 var k = new OperationCrServer().AddLogOperationCr("PDA模块", "AGV转运", palletNo, "移库", $"PDA呼叫小车对托盘号:{palletNo}发起转运", userId); //提交事务 Db.CommitTran(); #region 呼叫小车代码 #endregion } catch (Exception ex) { Db.RollbackTran(); throw new Exception(ex.Message); } } /// /// agv转运呼叫小车取货-开发未完成待确认 /// /// /// /// /// public void AgvTransport2(string soNo,string palletNo, string areaNo, int userId) { if (string.IsNullOrEmpty(soNo)) { throw new Exception("请选择出库单据!"); } if (string.IsNullOrEmpty(palletNo)) { throw new Exception("请扫描托盘条码!"); } if (string.IsNullOrEmpty(areaNo)) { throw new Exception("请选择目标区域!"); } try { var notice = Db.Queryable().First(w => w.IsDel == "0" && w.SONo == soNo); if (notice == null) { throw new Exception("出库单据信息不存在,请检查!"); } var allot = Db.Queryable().First(w => w.IsDel == "0" && w.SONo == soNo && w.PalletNo == palletNo); if (allot == null) { throw new Exception("该托盘出库分配信息不存在,请检查!"); } var stockDetail = Db.Queryable().First(w => w.IsDel == "0" && w.PalletNo == palletNo); if (stockDetail == null) { throw new Exception("托盘上物料库存信息不存在,请检查!"); } var stock = Db.Queryable().First(w => w.IsDel == "0" && w.SkuNo == stockDetail.SkuNo && w.LotNo == stockDetail.LotNo); if (stock == null) { throw new Exception("托盘上物料库存信息不存在,请检查!"); } if (string.IsNullOrEmpty(stockDetail.LocatNo)) { throw new Exception("托盘储位信息不存在,请检查!"); } if (stockDetail.WareHouseNo != "W02") { throw new Exception("该托盘未在平库内,请检查!"); } var storageLocat = Db.Queryable().First(w => w.IsDel == "0" && w.LocatNo == stockDetail.LocatNo); if (storageLocat == null) { throw new Exception("储位信息不存在,请检查!"); } var storageArea = Db.Queryable().First(w => w.IsDel == "0" && w.AreaNo == areaNo); if (storageArea == null) { throw new Exception("所选区域信息不存在,请检查!"); } string EndLocat = string.Empty;//目标位置 EndLocat= GetLocat(areaNo, stockDetail.SkuNo, stockDetail.LotNo); //开启事务 Db.BeginTran(); //添加出库任务 var taskNo = new Common().GetMaxNo("TK"); var exTask = new LogTask { TaskNo = taskNo, Sender = "WMS", Receiver = "AGV", IsSuccess = 0, //是否下发成功 0失败 1成功 StartLocat = stockDetail.LocatNo,//起始位置 EndLocat = EndLocat,//目标位置 PalletNo = palletNo,//托盘码 IsSend = 1,//是否可再次下发 IsCancel = 1,//是否可取消 IsFinish = 1,//是否可完成 Type = "2",//任务类型 0 入库任务 1 出库任务 2 移库任务 Status = "0",//任务状态0:等待执行1正在执行2执行完成 OrderType = "3",//0 入库单 1 出库单 2 盘点单 3 移库单 CreateTime = DateTime.Now }; Db.Insertable(exTask).ExecuteCommand(); //修改库存明细信息 stockDetail.Status = "4";//移库锁定 stockDetail.LockQty = stockDetail.Qty;//锁定库存数量 Db.Updateable(stockDetail).ExecuteCommand(); //修改库存信息 stock.LockQty += (decimal)stockDetail.Qty; Db.Updateable(stock).ExecuteCommand(); //修改储位地址状态 storageLocat.Status = "5";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中 Db.Updateable(storageLocat).ExecuteCommand(); //添加操作日志记录 var k = new OperationCrServer().AddLogOperationCr("PDA模块", "AGV转运", palletNo, "移库", $"PDA呼叫小车对托盘号:{palletNo}发起转运", userId); //提交事务 Db.CommitTran(); #region 呼叫小车代码 #endregion } catch (Exception ex) { Db.RollbackTran(); throw new Exception(ex.Message); } } /// /// 根据区域分配储位 /// /// /// /// /// private string GetLocat(string areaNo,string skuNo,string lotNo) { try { string endLocat = string.Empty;//目标储位 //当然区域所有储位信息 var storageLocatList = Db.Queryable().Where(w => w.WareHouseNo == "W02" && w.AreaNo == areaNo).ToList(); //同区域同批次物料的储位信息 List locatList = Db.Queryable().Where(w => w.IsDel == "0" && w.SkuNo == skuNo && w.LotNo == lotNo && w.WareHouseNo == "W02" && w.AreaNo == areaNo) .OrderByDescending(o=>o.LocatNo).Select(s=>s.LocatNo).Distinct().ToList(); foreach (var item in locatList) { var locatInfo = storageLocatList.Where(w => w.LocatNo == item).First(); var locatInfo2 = storageLocatList.Where(w => w.IsDel == "0" && w.Status == "0" && w.Flag == "0" && w.LocatNo != locatInfo.LocatNo && w.Row == locatInfo.Row) .OrderByDescending(o => o.Column).First(); if (locatInfo2 != null) { endLocat = locatInfo2.LocatNo; } } if (string.IsNullOrEmpty(endLocat)) { var locatInfo3 = storageLocatList.Where(w => w.IsDel == "0" && w.Flag == "0" && w.Status == "0") .OrderByDescending(m => new { m.Layer, m.Column, m.Row }).First(); if (locatInfo3 != null) { endLocat = locatInfo3.LocatNo; } } return endLocat; } catch (Exception ex) { throw new Exception(ex.Message); } } #endregion } }