using Model.ModelDto; using Model.ModelVm; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using WMS.BLL.LogServer; using WMS.Entity.Context; using WMS.IBLL.IPdaServer; using WMS.DAL; using WMS.Entity.BllAsnEntity; using WMS.Entity.DataEntity; using WMS.Entity.SysEntity; using WMS.Entity.LogEntity; using WMS.Entity.BllSoEntity; using Model.ModelVm.PdaVm; using Model.ModelDto.PdaDto; namespace WMS.BLL.BllPdaServer { public class PdaAsnServer : IPdaAsnServer { private static readonly SqlSugarScope Db = DataContext.Db; // 获取单据列表 public List GetArrivalNotices(ArrivalNoticeVm model) { string sqlString = string.Empty; try { // 未关单的单据 sqlString = $"select * from BllArrivalNotice where Type in ({model.Type}) and Status != '3' and IsDel='0' order by CreateTime;"; var modelList = Db.Ado.SqlQuery(sqlString); return modelList; } catch (Exception ex) { throw ex; } } // 根据单据号获取单据明细列表 public List GetArrivalNoticeDetails(ArrivalNoticeVm model) { string sqlString = string.Empty; try { sqlString = $"select * from BllArrivalNoticeDetail where ASNNo = '{model.ASNNo}' and isdel='0' order by CreateTime;"; var modelList = Db.Ado.SqlQuery(sqlString); return modelList; } catch (Exception ex) { throw ex; } } // 根据单据明细ID获取明细详情 public ArrivalNoticeDetailDto GetArrivalNoticeDetail(ArrivalNoticeDetailVm model) { string sqlString = string.Empty; try { if (model.Id == null || model.Id == 0) { throw new Exception("明细ID不可为空!"); } sqlString = $"select * from BllArrivalNoticeDetail where Id = '{model.Id}' and isdel='0' order by CreateTime;"; var modelList = Db.Ado.SqlQuery(sqlString); if (modelList.Count > 0) { return modelList[0]; } return new ArrivalNoticeDetailDto(); } catch (Exception ex) { throw ex; } } /// /// 验证托盘是否存在 /// /// 托盘号 /// "":可使用 -1:不可使用(原因) public string IsEnablePalletNo(string palletNo) { string sqlMsg = ""; string sqlString = string.Empty; try { sqlString = $"select * from SysPallets where PalletNo = '{palletNo}' and isdel = '0';"; var models = Db.Ado.SqlQuery(sqlString); if (models.Count > 1) { sqlMsg = "-1:存在重复托盘号,请检查!"; return sqlMsg; } if (models.Count > 0) { if (models[0].Status == "1") { sqlString = $"select count(id) from DataStockDetail where PalletNo = '{palletNo}' and isnull(LocatNo,'') != '' and isdel = '0';"; int rowNum = Db.Ado.GetInt(sqlString); if (rowNum > 0) { sqlMsg = "-1:托盘使用中,此托盘应在库内请核实!"; } } } else { sqlMsg = "-1:托盘号不存在!"; } return sqlMsg; } catch (Exception ex) { throw ex; } } // 根据箱码或托盘号获取箱支信息 liudl public List GetBoxInfos(BoxInfoVm model) { try { string sqlString = string.Empty; if (model.IsHuiKu == 0) { sqlString = "select BoxNo, SkuNo,SkuName, LotNo, SUM(Qty) as Qty from BllBoxInfo where IsDel = '0' "; if (!string.IsNullOrEmpty(model.PalletNo)) { sqlString += $"and PalletNo = '{model.PalletNo}' and Status in ('0','1') "; } if (!string.IsNullOrEmpty(model.BoxNo)) { sqlString += $"and BoxNo = '{model.BoxNo}' and Status in ('0','1') "; } sqlString += $"group by BoxNo,SkuNo,SkuName,LotNo; "; } else { sqlString = "select BoxNo, SkuNo,SkuName, LotNo, SUM(Qty) as Qty from DataBoxInfo where IsDel = '0' "; if (!string.IsNullOrEmpty(model.PalletNo)) { sqlString += $"and PalletNo = '{model.PalletNo}' "; } sqlString += $"group by BoxNo,SkuNo,SkuName,LotNo; "; } var models = Db.Ado.SqlQuery(sqlString); return models; } catch (Exception ex) { throw ex; } } // 绑定物料托盘 public void BindPallet(PdaPalletBindVm model, int userId,string origin) { try { #region 判断 if (string.IsNullOrEmpty(model.AsnNo)) { throw new Exception("-1:单据号不可为空!"); } if (model.AsnDetailId == null || model.AsnDetailId == 0) { throw new Exception("-1:物料不可为空!"); } if (string.IsNullOrEmpty(model.PalletNo)) { throw new Exception("-1:托盘号不可为空!"); } if (string.IsNullOrEmpty(model.BoxNo)) { throw new Exception("-1:箱码信息不可为空!"); } if (model.IsContinue == "1") { if (string.IsNullOrWhiteSpace(model.TailBoxNo)) { throw new Exception("-1:开启连续组托时,尾箱码信息不可为空!"); } } #endregion Db.BeginTran(); //托盘是否存在 var pallet = Db.Queryable().First(m => m.IsDel == "0" && m.PalletNo == model.PalletNo); if (pallet == null) { throw new Exception("未查询到托盘信息,请核实!"); } // 验证入库单明细是否存在 var detail = Db.Queryable().First(m => m.IsDel == "0" && m.Id == model.AsnDetailId && m.ASNNo == model.AsnNo); if (detail == null) { throw new Exception("-1:当前物料及批次与单据无关联,请核实!"); } #region 包装 var package = Db.Queryable().Where(m => m.IsDel == "0"); var sku = Db.Queryable().First(m => m.IsDel == "0" && m.SkuNo == detail.SkuNo); var pack = package.First(m => m.IsDel == "0" && m.PackagNo == sku.PackagNo); if (pack == null) { throw new Exception("-1:获取物料包装失败,请核实!"); } var pNum = 0;//托盘物品数量 var bNum = 0;//箱码物品数量 if (pack.L5Num.HasValue) { pNum = (int)pack.L5Num; bNum = (int)pack.L4Num; } else if (pack.L4Num.HasValue) { pNum = (int)pack.L4Num; bNum = (int)pack.L3Num; } else if (pack.L3Num.HasValue) { pNum = (int)pack.L3Num; bNum = (int)pack.L2Num; } else if (pack.L2Num.HasValue) { pNum = (int)pack.L2Num; bNum = (int)pack.L1Num; } else if (pack.L1Num.HasValue) { pNum = (int)pack.L1Num; bNum = (int)pack.L1Num; } if (pNum == 0 || bNum == 0) { throw new Exception($"绑定失败,{detail.SkuNo}物品包装未找到!"); } #region 验证是否允许立库同托盘不同物料入库或同托盘同物料不同批次入库 var palletBind = Db.Queryable().First(m => m.IsDel == "0" && m.ASNNo == model.AsnNo && m.PalletNo == model.PalletNo && m.ASNDetailNo != model.AsnDetailId); if (palletBind != null) { var box = Db.Queryable().First(m => m.IsDel == "0" && m.BindNo == palletBind.Id && m.BitBoxMark == "0"); if (box != null && (box.SkuNo != detail.SkuNo || box.LotNo != detail.LotNo)) { var funSetting = Db.Queryable().First(a => a.IsDel == "0" && a.FunSetNo == "Fun045"); if (funSetting == null || funSetting.IsEnable == "OFF") { throw new Exception($"不允许立库同托盘不同物料入库或同托盘不同批次入库!"); } } } #endregion var bind = Db.Queryable().First(m => m.IsDel == "0" && m.ASNDetailNo == model.AsnDetailId && m.PalletNo == model.PalletNo); var bindId = 0; if (bind == null) { bind = new BllPalletBind { ASNNo = model.AsnNo, ASNDetailNo = (int)model.AsnDetailId, PalletNo = model.PalletNo, PalletNo2 = "", PalletNo3 = "", Qty = 0, FullQty = pNum, Status = "0", Type = "0", LotNo = detail.LotNo, LotText = detail.LotText, SupplierLot = "", InspectMark = "0", BitPalletMark = "1", IsBale = "0", IsBelt = "0", CreateUser = userId }; // 插入托盘绑定表 bindId = Db.Insertable(bind).ExecuteReturnIdentity(); } else { if (bind.Status != "0") { throw new Exception("-1:当前托盘正在执行中,绑定失败,请核实!"); } bindId = bind.Id; } #region 箱码信息 var msgStr = $"箱号为{model.BoxNo}"; var boxInfoList = new List(); //首箱 var boxInfo = Db.Queryable().Where(m => m.IsDel == "0" && m.BoxNo == model.BoxNo && m.Status == "0").ToList(); if (boxInfo.Count == 0) { throw new Exception("-1:箱码信息不存在!"); } boxInfoList.AddRange(boxInfo); //是否连续组托 if (model.IsContinue == "1") { //尾箱 var boxInfo2 = Db.Queryable().Where(m => m.IsDel == "0" && m.BoxNo == model.TailBoxNo && m.Status == "0").ToList(); if (boxInfo2.Count == 0) { throw new Exception("-1:尾箱码信息不存在!"); } boxInfoList.AddRange(boxInfo2); var sql = $"select * from BllBoxInfo where IsDel = '0' and Status = '0' and boxNo>'{model.BoxNo}' and boxNo<'{model.TailBoxNo}'; "; var list = Db.Ado.SqlQuery(sql); boxInfoList.AddRange(list); msgStr += $"尾箱号为{model.TailBoxNo}"; } #endregion #endregion // 更改箱支关系表 var factQty = 0;//托盘总数量 var boxGroup = boxInfoList.GroupBy(m => m.BoxNo).ToList(); foreach (var g in boxGroup) { var boxFullQty = 0;//箱内总数量 foreach (var box in g) { if (box.BindNo != null && box.BindNo != 0) { continue; } //箱内物料批次与单据明细不符合 if (box.SkuNo != detail.SkuNo || box.LotNo != detail.LotNo) { throw new Exception($"-1:{box.BoxNo}箱内物料及批次与单据不一致,请核实!"); } box.ASNNo = model.AsnNo; box.ASNDetailNo = model.AsnDetailId; box.BindNo = bindId; box.PalletNo = model.PalletNo; box.Status = "1"; box.CompleteTime = DateTime.Now; box.UpdateTime = DateTime.Now; box.UpdateUser = userId; factQty += box.Qty; boxFullQty += box.Qty; } if (boxFullQty > bNum) { throw new Exception($"绑定失败,{g.Key}箱码绑定数量大于该物品包装数量!"); } } Db.Updateable(boxInfoList).ExecuteCommand(); // 更新托盘绑定表 bind.Qty += factQty; if (bind.FullQty < bind.Qty) { throw new Exception("托盘绑定数量已超出该物料包装数量"); } if (bind.FullQty == bind.Qty) { bind.BitPalletMark = "0"; } Db.Updateable(bind).Where(m => m.Id == bindId).ExecuteCommand(); // 更改入库单明细已组数量 var sqlString = string.Empty; sqlString += $"update BllArrivalNoticeDetail set FactQty = FactQty + '{factQty}' where id = '{model.AsnDetailId}';"; Db.Ado.ExecuteCommand(sqlString); // 更改入库单及入库明细状态 if (detail.Status == "0") { var sqlString2 = string.Empty; sqlString2 += $"update BllArrivalNotice set Status = '1',CompleteTime= getDate() where ASNNo = '{model.AsnNo}' and Status ='0';"; sqlString2 += $"update BllArrivalNoticeDetail set Status = '1',CompleteTime= getDate() where id = '{model.AsnDetailId}' and Status ='0';"; Db.Ado.ExecuteCommand(sqlString2); } // 更改托盘使用状态 var sqlStr = $"update SysPallets set Status = '1' where PalletNo = '{model.PalletNo}';"; //添加托盘记录表数据 sqlStr += $"insert into LogPalletTrack values('{model.PalletNo}','{model.AsnNo}','组盘','0',getDate(),{userId},NULL,NULL);"; Db.Ado.ExecuteCommand(sqlStr); new OperationASNServer().AddLogOperationAsn("PDA模块", "产品组托", model.AsnNo, "添加", $"添加了托盘码为:{model.PalletNo}、{msgStr}的组盘信息", userId); Db.CommitTran(); } catch (Exception ex) { Db.Ado.RollbackTran(); throw ex; } } // 绑定空托盘 public string BindNullPallet(PalletBindVm model) { string strMsg = ""; try { var datetime = Db.GetDate(); //获取托盘绑定信息 string str = "select * from BllPalletBind where IsDel = '0' and PalletNo = @palletno and Status = '0' "; List list = Db.Ado.SqlQuery(str, new { palletno = model.PalletNo //托盘号 }); //判断是否已绑定该托盘 if (list.Count > 0) { strMsg = "-1:该托盘已被绑定!"; return strMsg; } if (string.IsNullOrEmpty(model.PalletNo)) { strMsg = "-1:托盘号不可为空!"; return strMsg; } if (model.Qty == null || model.Qty == 0) { strMsg = "-1:空托盘数量不可为空!"; return strMsg; } //获取托盘信息 var pallet = Db.Queryable().First(a => a.IsDel == "0" && a.PalletNo == model.PalletNo); if (pallet == null) { strMsg = "-1:托盘信息为空!"; return strMsg; } if (pallet.Status != "0") { strMsg = "-1:该托盘正在使用!"; return strMsg; } Db.BeginTran(); //var taskNo = new Common().GetMaxNo("TK"); //var exTask = new LogTask //入库任务 //{ // TaskNo = taskNo, // Sender = "WMS", // Receiver = "", // IsSuccess = 1, //是否下发成功 0失败 1成功 // SendDate = DateTime.Now, //发送时间 // BackDate = DateTime.Now, //返回时间 // StartLocat = "",//起始位置 // EndLocat = "",//目标位置 // PalletNo = model.PalletNo,//托盘码 // IsSend = 1,//是否可再次下发 // IsCancel = 1,//是否可取消 // IsFinish = 1,//是否可完成 // Type = "0",//任务类型 0 入库任务 1 出库任务 2 移库任务 // Status = "0",//任务状态0:等待执行1正在执行2执行完成 // OrderType = "0",//0 入库单 1 出库单 2 盘点单 3 移库单 // Msg = "母托盘的入库任务", //}; //Db.Insertable(exTask).ExecuteCommand(); // 插入托盘绑定表 var modelpb = new BllPalletBind { ASNNo = "", ASNDetailNo = 0, TaskNo = "", //任务号 PalletNo = model.PalletNo, PalletNo2 = model.PalletNo2, PalletNo3 = model.PalletNo3, Qty = (int)model.Qty, FullQty = model.FullQty, Status = "0", //等待执行 Type = "1", //0 物料托 1 空托 LotNo = "", LotText = "", SupplierLot = "", InspectMark = "0", //0 否 1 是 BitPalletMark = "0", IsBale = "0", IsBelt = "0", CreateUser = (int)model.CreateUser, CreateTime = Db.GetDate() }; var id = Db.Insertable(modelpb).ExecuteReturnIdentity(); var modelbb = new BllBoxInfo { ASNNo = "", ASNDetailNo = null, BindNo = id, PalletNo = model.PalletNo, PalletNo2 = model.PalletNo2, PalletNo3 = model.PalletNo3, Status = "1", CompleteTime = DateTime.Now, Qty = (int)model.Qty, FullQty = null, SkuNo = "100099", SkuName = "托盘", LotNo = "", LotText = "", SupplierLot = "", InspectStatus = "1", Origin = "PDA", BoxNo = "", BoxNo2 = "", BoxNo3 = "", InspectMark = "", BitBoxMark = "0", CreateUser = (int)model.CreateUser, CreateTime = datetime }; Db.Insertable(modelbb).ExecuteCommand(); // 更改托盘使用状态 string sqlStr = string.Empty; sqlStr = $"update SysPallets set Status = '1' where PalletNo = '{model.PalletNo}';"; Db.Ado.ExecuteCommand(sqlStr); Db.CommitTran(); // 插入操作日志 new OperationASNServer().AddLogOperationAsn("PDA模块", "空托入库", model.PalletNo, "添加", $"在PDA上添加了空托盘跺", (int)model.CreateUser); return strMsg; } catch (Exception ex) { Db.Ado.RollbackTran(); throw ex; } } /// /// 解绑空托盘 /// /// 解绑托盘号 /// 创建人 /// public string UnBindNullPallet(string upBindPalletNo, int createUser) { string strMsg = ""; //捕获异常 try { //获取任务信息 var logtask = Db.Queryable().First(a => a.PalletNo == upBindPalletNo && a.IsDel == "0" && a.Status == "1"); if (logtask == null) { strMsg = "该托盘任务已完成 或未成功创建任务 请核实!"; return strMsg; } string bindstr = "select * from BllPalletBind Where IsDel = @isdel and PalletNo = @palletno and ASNDetailNo = 0 and ASNNo = ''"; //获取绑定托盘表信息 List bindVms = Db.Ado.SqlQuery(bindstr, new { isdel = "0", //是否删除 palletno = upBindPalletNo //托盘号 }); //获取箱码信息 var box = Db.Queryable().First(a => a.PalletNo == upBindPalletNo && a.IsDel == "0" && a.Status != "2" && a.BindNo == bindVms[0].Id); //判断空托入库的托盘是否有该托盘 if (bindVms.Count != 1) { strMsg = "该托盘不是空托托盘 或未绑定 请核实托盘"; return strMsg; } //删除绑定托盘表信息 string delstr = "delete from BllPalletBind Where PalletNo = @palletno"; int i = Db.Ado.ExecuteCommand(delstr, new { palletno = upBindPalletNo }); //修改托盘状态 Db.BeginTran(); // 插入解绑托盘表 BllPalletUnbind modelpb = new BllPalletUnbind { UpbindPalletNo = upBindPalletNo, PalletNo2 = bindVms[0].PalletNo2, PalletNo3 = bindVms[0].PalletNo3, Qty = (int)bindVms[0].Qty, LotNo = bindVms[0].LotNo, LotText = bindVms[0].LotText, SupplierLot = bindVms[0].SupplierLot, CreateUser = createUser, CreateTime = Db.GetDate() }; Db.Insertable(modelpb).ExecuteCommand(); //修改箱码信息 box.Status = "3"; box.UpdateTime = DateTime.Now; box.UpdateUser = createUser; box.IsDel = "1"; Db.Updateable(box).ExecuteCommand(); //修改任务状态 logtask.IsDel = "1"; logtask.Status = "4"; //3 已取消 logtask.UpdateUser = createUser; //取消人 logtask.UpdateTime = DateTime.Now; //取消时间 Db.Updateable(logtask).ExecuteCommand(); //更改库存数量 //string str = $"update DataStock set Qty = Qty - {(int)bindVms[0].Qty} Where SkuNo = '100099'"; // 更改托盘使用状态 string sqlStr = string.Empty; sqlStr = $"update SysPallets set Status = '0' where PalletNo = '{upBindPalletNo}';"; Db.Ado.ExecuteCommand(sqlStr); Db.CommitTran(); // 插入操作日志 new OperationASNServer().AddLogOperationAsn("PDA模块", "空托入库", upBindPalletNo, "添加", $"在PDA上解绑了空托盘跺", createUser); return strMsg; } catch (Exception ex) { //抛出异常 Db.Ado.RollbackTran(); throw ex; } } // 删除已组信息 public string DelBoxInfo(BoxInfoVm model) { string strMsg = ""; string sqlString = string.Empty; try { if (model.Id == null || model.Id == 0) { strMsg = "-1:箱支ID不可为空!"; return strMsg; } // 获取箱支信息和托盘状态(已组未入库的可删除;入库成功又出库的不可删除) sqlString = $"select * from BllBoxInfo where id = '{model.Id}' and Status='1' and isdel = '0';"; var boxModel = Db.Ado.SqlQuery(sqlString); if (boxModel.Count <= 0) { strMsg = "-1:箱支信息状态已变更或已存在库存信息,请检查!"; } // 查询托盘上其他物料数量 sqlString = string.Empty; sqlString += $"select count(id) from BllBoxInfo where PalletNo = '{boxModel[0].PalletNo}' and isdel = '0' and id != '{model.Id}';"; int rowNum = Db.Ado.GetInt(sqlString); // 查询入库单明细是否有其他托盘绑定信息 sqlString = string.Empty; sqlString += $"select count(id) from BllBoxInfo where ASNDetailNo = '{boxModel[0].ASNDetailNo}' and isdel = '0' and id != '{model.Id}';"; int asnDetailNum = Db.Ado.GetInt(sqlString); // 查询入库单明细是否有其他托盘绑定信息 sqlString = string.Empty; sqlString += $"select count(id) from BllBoxInfo where ASNNo = '{boxModel[0].ASNNo}' and isdel = '0' and id != '{model.Id}';"; int asnNum = Db.Ado.GetInt(sqlString); Db.BeginTran(); // 解除箱支和托盘的关联 sqlString = string.Empty; sqlString = $"Update BllBoxInfo set ASNNo = '',ASNDetailNo='',BindNo = '',PalletNo='' "; sqlString += $",UpdateTime=GETDATE(),UpdateUser='{model.CreateUser} where id = '{model.Id}';"; // 判断托盘上是否还有物料 无:删除绑定的托盘信息并更改托盘状态 if (rowNum <= 0) { // 删除托盘绑定信息 sqlString = string.Empty; sqlString = $"Update BllPalletBind set IsDel = '1' where id = '{model.Id}';"; // 判断入库单明细是否存在其他已组托盘的 if (asnDetailNum <= 0) { // 更改入库单明细状态 sqlString = string.Empty; sqlString += $"update BllArrivalNoticeDetail set FactQty = FactQty - '{boxModel[0].Qty}',Status = '0', "; sqlString += $"CompleteTime=GETDATE() where id = '{boxModel[0].ASNDetailNo}';"; Db.Ado.ExecuteCommand(sqlString); // 判断入库单是否有其他组托信息 if (asnNum <= 0) { // 更改入库单状态 sqlString = string.Empty; sqlString += $"update BllArrivalNotice set Status = '0',CompleteTime=GETDATE() where ASNNo = '{boxModel[0].ASNNo}';"; Db.Ado.ExecuteCommand(sqlString); } } // 更改托盘状态 sqlString = string.Empty; sqlString = $"update SysPallets set Status = '0' where PalletNo = '{boxModel[0].PalletNo}';"; Db.Ado.ExecuteCommand(sqlString); } Db.CommitTran(); return strMsg; } catch (Exception ex) { Db.RollbackTran(); throw ex; } } // 平库完成入库操作 public string CompleteInStock(PalletBindVm model) { //string sttr = "select * from BllArrivalNoticeDetail where id in (select ASNDetailNo from BllBoxInfo where ASNNo = 'ASN2023042400002' and PalletNo = 'T2300004' and Status = '1');"; //var noticeDetaila = Db.Ado.SqlQuery(sttr); string strMsg = ""; string sqlString = string.Empty; try { ///平库入库业务 ///1:判断一系列条件 ///1.1:判断托盘状态 是否为使用中 ///1.2:判断组托、箱码信息 是否已入库 ///1.3:判断单据是否关单 已关单无法入库 请重新创建其它单据 ///1.4:判断任务信息是否为已完成(先判断 等确定组托后是否创建任务再决定是否注释) ///2:更改库存 ///2.1:更改前判断库存是否存在该物料 如存在 直接增加数量 不存在 新增库存信息 增加库存明细信息 ///3:更改单据 ///3.1:更改单据时判断单据状态是否为已完成 如已完成 则只增加完成数量 ///3.1.1:如正在执行 则判断完成数量加入库数量是否等于或大于入库单数量 ///3.2:如正在执行或等待执行 则判断完成数量加入库数量是否等于或大于入库单数量 ///3.2.1:不大于或等于 则变更状态为正在执行 ///3.2.2:如大于或等于 则变更状态为已完成 ///4:更改组托信息和箱码信息 ///4.1:组托信息更改为已入库 ///4.2:更改任务信息 //获取当前时间 DateTime serverTime = Db.Ado.GetDateTime("select GETDATE();"); #region 判断 #region 是否回流入库 int iscount = 0; //库存明细信息 var stockDetail = Db.Queryable().Where(a => a.IsDel == "0" && a.PalletNo == model.PalletNo).ToList(); //验证库存是否拥有该托信息 if (stockDetail != null && stockDetail.Count > 0) { foreach (var item in stockDetail) { if (!string.IsNullOrEmpty(item.WareHouseNo)) { strMsg = "-1:该托盘未在库外,请核查!"; return strMsg; } } iscount = 1; //回流入库 } #endregion #region 组托信息 // 验证组托信息 var palletbind = Db.Queryable().Where(p => p.IsDel == "0" && p.ASNNo == model.ASNNo && p.PalletNo == model.PalletNo && p.Status != "2").ToList(); if (iscount == 0) { //验证组托信息是否为空 if (palletbind == null || palletbind.Count <= 0) { strMsg = "-1:组托信息为空,请核查!"; return strMsg; } } #endregion #region 箱码信息 //获取箱码信息 var boxinfo = new List(); if (iscount == 0) { string boxstr = $"select * from BLLBoxInfo where IsDel = '0' and ASNNo = '{model.ASNNo}'"; boxinfo = Db.Ado.SqlQuery(boxstr).ToList(); //验证箱码信息是否存在 if (boxinfo.Count <= 0) { strMsg = "-1:箱码信息不存在,请核查!"; return strMsg; } } #endregion #region 单据信息 //获取入库单据总单 var arrival = new BllArrivalNotice(); if (iscount == 0) { arrival = Db.Queryable().First(a => a.IsDel == "0" && a.Status != "3" && a.ASNNo == model.ASNNo); //验证入库单总单是否关闭 if (arrival == null) { strMsg = "-1:入库单总单为空,请核查!"; return strMsg; } //判断入库单总单是否为已关闭 if (arrival.Status == "3") { strMsg = "-1:入库单总单已关闭,请核查!"; return strMsg; } } //获取入库单明细信息 var arrivalnotice = new List(); if (iscount == 0) { arrivalnotice = Db.Queryable().Where(d => d.IsDel == "0" && d.ASNNo == arrival.ASNNo && d.Status == "1").ToList(); //验证入库单明细是否存在 if (arrivalnotice == null || arrivalnotice.Count <= 0) { strMsg = "-1:入库单明细为空,请核查!"; return strMsg; } } #endregion #region 任务 //var task = Db.Queryable().First(t => t.IsDel == "0" && t.TaskNo == palletbind.TaskNo && t.Status == "0" || t.Status == "1"); ////验证任务信息是否存在 //if (task == null) //{ // strMsg = "-1:任务信息不存在,请核查!"; // return strMsg; //} #endregion #endregion Db.BeginTran();//开启事务 //判断是否回流入库 if (iscount == 0) { #region 正常入库 bool isFinsh = true;//入库单明细是否全部完成 //遍历入库单详情 foreach (var noticeItem in arrivalnotice) { #region 物料信息 var sku = Db.Queryable().First(s => s.SkuNo == noticeItem.SkuNo && s.IsDel == "0" && s.SkuName == noticeItem.SkuName); //判断物料信息是否为空 if (sku == null) { strMsg = "-1:物料信息为空,请核查!"; return strMsg; } #endregion var pallQty = 0;//托盘上数量 var boxinfo2 = boxinfo.Where(w => w.SkuNo == noticeItem.SkuNo && w.LotNo == noticeItem.LotNo && w.PalletNo == model.PalletNo).ToList(); if (boxinfo2.Count <= 0) { strMsg = "-1:箱码信息不存在,请核查!"; return strMsg; } else { // 改变箱支关系表状态:已入库 sqlString = $"Update BllBoxInfo set Status = '2' where PalletNo = '{model.PalletNo}' and ASNNo = '{model.ASNNo}' and Status = '1'"; Db.Ado.ExecuteCommand(sqlString); pallQty = boxinfo2.Sum(w => w.Qty); //入库单明细完成数量增加 noticeItem.CompleteQty += pallQty; } //判断入库数量增加后是否大于等于单据数量 if (noticeItem.CompleteQty >= noticeItem.Qty) { noticeItem.Status = "2"; noticeItem.CompleteTime = serverTime; } else { noticeItem.Status = "1"; isFinsh = false; } noticeItem.UpdateUser = model.CreateUser; noticeItem.UpdateTime = serverTime; Db.Updateable(arrivalnotice).ExecuteCommand(); #region 库存总表 // 判断当前物料库存表是否已存在 string str = $"select * from DataStock where SkuNo = '{noticeItem.SkuNo}' and LotNo = '{noticeItem.LotNo}' and Standard = '{noticeItem.Standard}' and SkuName = '{noticeItem.SkuName}' and IsDel = '0'"; var stockModel = Db.Ado.SqlQuerySingle(str); if (stockModel == null || stockModel.Id == 0) { stockModel = new DataStock { LotNo = noticeItem.LotNo, LotText = noticeItem.LotText, SupplierLot = noticeItem.SupplierLot, SkuNo = noticeItem.SkuNo, SkuName = noticeItem.SkuName, Qty = pallQty, Standard = noticeItem.Standard, CreateUser = (int)model.CreateUser, CreateTime = serverTime }; Db.Insertable(stockModel).ExecuteCommand(); } else { sqlString = $"update DataStock set Qty = Qty + {pallQty}," + $"UpdateTime = GETDATE(),UpdateUser='{model.CreateUser}' where id = '{stockModel.Id}';"; Db.Ado.ExecuteCommand(sqlString); } #endregion #region 库存明细表 var palletbindInfo = palletbind.First(w => w.ASNDetailNo == noticeItem.Id); // 判断当前托盘是否已存在(拣货回库托盘) var detailModel = Db.Queryable() .First(it => it.PalletNo == palletbindInfo.PalletNo && it.LotNo == noticeItem.LotNo && it.SkuNo == noticeItem.SkuNo && it.Standard == noticeItem.Standard && it.IsDel == "0"); var stId = 0; if (detailModel == null || detailModel.Id == 0) { // 获取可抽检数量 sqlString = "select sum(qty) from BllBoxInfo where isdel = 0 and "; sqlString += $"BindNo = '{palletbindInfo.Id}'"; int inspectQty = Db.Ado.GetInt(sqlString); // 添加库存明细表 detailModel = new DataStockDetail() { LotNo = noticeItem.LotNo, LotText = noticeItem.LotText, SupplierLot = noticeItem.SupplierLot, SkuNo = noticeItem.SkuNo, SkuName = noticeItem.SkuName, Standard = noticeItem.Standard, Qty = pallQty, LockQty = 0, FrozenQty = 0, InspectQty = inspectQty, ASNNo = noticeItem.ASNNo, ASNDetailNo = (int)palletbindInfo.ASNDetailNo, WareHouseNo = "W02", RoadwayNo = "", AreaNo = "", LocatNo = model.LocatNo, PalletNo = model.PalletNo, PalletNo2 = palletbindInfo.PalletNo2, PalletNo3 = palletbindInfo.PalletNo3, CompleteTime = serverTime, ProductionTime = palletbindInfo.ProductionTime, ExpirationTime = palletbindInfo.ExpirationTime, Status = "0", InspectMark = palletbindInfo.InspectMark, BitPalletMark = palletbindInfo.BitPalletMark, InspectStatus = sku.IsInspect, // 组盘的时候就要默认设定好是否合格 PackagNo = sku.PackagNo, IsBale = palletbindInfo.IsBale, IsBelt = palletbindInfo.IsBelt, CreateUser = (int)model.CreateUser, CreateTime = serverTime }; stId = Db.Insertable(detailModel).ExecuteReturnIdentity(); } else { stId = detailModel.Id; detailModel.LocatNo = model.LocatNo; detailModel.UpdateTime = serverTime; detailModel.UpdateUser = (int)model.CreateUser; // 变更储位地址 Db.Updateable(detailModel).UpdateColumns(it => new { it.LocatNo, it.UpdateTime, it.UpdateUser }).ExecuteCommand(); } #endregion #region 任务及组托信息 //创建任务信息 var taskNo = new Common().GetMaxNo("TK"); var exTask = new LogTask //入库任务 { TaskNo = taskNo, Sender = "WMS", Receiver = "PDA", IsSuccess = 1, //是否下发成功 0失败 1成功 SendDate = DateTime.Now, //发送时间 BackDate = DateTime.Now, //返回时间 StartLocat = "",//起始位置 EndLocat = "零箱库",//目标位置 PalletNo = palletbindInfo.PalletNo,//托盘码 IsSend = 0,//是否可再次下发 IsCancel = 0,//是否可取消 IsFinish = 0,//是否可完成 Type = "0",//任务类型 0 入库任务 1 出库任务 2 移库任务 Status = "2",//任务状态0:等待执行1正在执行2执行完成 OrderType = "0",//0 入库单 1 出库单 2 盘点单 3 移库单 Msg = "零箱库的入库任务", }; Db.Insertable(exTask).ExecuteCommand(); //修改组托状态 palletbindInfo.Status = "2"; //2 入库完成 palletbindInfo.UpdateTime = serverTime; palletbindInfo.UpdateUser = model.CreateUser; palletbindInfo.CompleteTime = serverTime; //完成时间 palletbindInfo.TaskNo = taskNo; //任务号 Db.Updateable(palletbind).ExecuteCommand(); #endregion #region 库存箱支明细表 // 插入新组的箱支信息 var comTime = DateTime.Now; foreach (var item in boxinfo2) { var info = new DataBoxInfo() { StockDetailId = stId, BindNo = palletbindInfo.Id, BoxNo = item.BoxNo, BoxNo2 = item.BoxNo2, BoxNo3 = item.BoxNo3, PalletNo = item.PalletNo, PalletNo2 = item.PalletNo2, PalletNo3 = item.PalletNo3, Qty = item.Qty, FullQty = item.FullQty, Status = "2", LotNo = item.LotNo, LotText = item.LotText, SkuNo = item.SkuNo, SkuName = item.SkuName, Standard = sku.Standard, ProductionTime = item.ProductionTime, SupplierLot = item.SupplierLot, InspectMark = item.InspectMark, BitBoxMark = item.BitBoxMark, InspectStatus = item.InspectStatus, //InspectTime = item., IsDel = "0", CreateUser = 0, CreateTime = comTime }; Db.Insertable(info).ExecuteCommand(); } //sqlString = $"insert into DataBoxInfo select a.Id StockDetailId,b.BindNo,b.BoxNo,b.BoxNo2,b.BoxNo3,b.PalletNo,b.PalletNo2,b.PalletNo3,b.Qty,b.FullQty,b.Status,b.LotNo,b.LotText,b.SkuNo,b.SkuName,a.Standard,a.ProductionTime,a.SupplierLot,a.InspectMark,b.BitBoxMark,a.InspectStatus,a.InspectTime,'0' IsDel,GETDATE() CreateTime,{model.CreateUser} CreateUser,null UpdateTime,null UpdateUser from DataStockDetail a left join BllBoxInfo b on a.SkuNo=b.skuno where b.isdel = '0' and b.Status='2' and b.BindNo = '{palletbind.Id}' and b.PalletNo = '{model.PalletNo}'"; //Db.Ado.ExecuteCommand(sqlString); //sqlString = $"insert into DataBoxInfo select stock.Id StockDetailId,box.BindNo,box.BoxNo,box.BoxNo2,box.BoxNo3,box.PalletNo,box.PalletNo2,box.PalletNo3,box.Qty,box.FullQty,box.Status,box.LotNo,box.LotText,box.SkuNo,box.SkuName,stock.Standard,stock.ProductionTime,stock.SupplierLot,stock.InspectMark,box.BitBoxMark,stock.InspectStatus,stock.InspectTime,'0' IsDel,GETDATE() CreateTime,{model.CreateUser} CreateUser,null UpdateTime,null UpdateUser from DataStockDetail stock left join BllBoxInfo box on stock.PalletNo = box.PalletNo where box.isdel = '0' and box.Status='2' and box.BindNo = '{palletbind.Id}' and stock.WareHouseNo = 'W02' and box.PalletNo = '{model.PalletNo}'"; //sqlString = $"select stock.Id StockDetailId,box.BindNo,box.BoxNo,box.BoxNo2,box.BoxNo3,box.PalletNo,box.PalletNo2,box.PalletNo3,box.Qty,box.FullQty,box.Status,box.LotNo,box.LotText,box.SkuNo,box.SkuName,stock.Standard,stock.ProductionTime,stock.SupplierLot,stock.InspectMark,box.BitBoxMark,stock.InspectStatus,stock.InspectTime,'0' IsDel,GETDATE() CreateTime,{model.CreateUser} CreateUser from DataStockDetail stock left join BllBoxInfo box on stock.PalletNo = box.PalletNo where box.isdel = '0' and box.Status='2' and box.BindNo = '{palletbind.Id}' and stock.WareHouseNo = 'W02' and box.PalletNo = '{model.PalletNo}'"; ////and a.LocatNo = '{model.LocatNo},null UpdateTime,null UpdateUser' //var databox = Db.Ado.SqlQuery(sqlString); //foreach (var item in databox) //{ // var boxdata = Db.Queryable().First(b => b.BoxNo == item.BoxNo); // if (boxdata == null) // { // Db.Insertable(item).ExecuteCommand(); // } // else // { // boxdata.Qty += item.Qty; // Db.Updateable(boxdata).ExecuteCommand(); // } //} //sqlString = $"insert into DataBoxInfo "; //sqlString += "select BindNo,BoxNo,BoxNo2,BoxNo3,PalletNo,PalletNo2,PalletNo3, "; //sqlString += "Qty,FullQty,'0' as Status,LotNo,LotText,ProductionTime,SupplierLot,"; //sqlString += "InspectMark,BitBoxMark,InspectStatus "; //sqlString += $"from BllBoxInfo where isdel = 0 and Status='1' and BindNo = '{bindModel.Id}';"; #endregion } if (isFinsh)//入库单明细全部完成 { //修改入库单总单信息 arrival.Status = "2"; arrival.UpdateUser = model.CreateUser; arrival.UpdateTime = serverTime; Db.Updateable(arrival).ExecuteCommand(); } else { //判断总单状态是否为正在执行 if (arrival.Status == "0") { //修改入库单总单信息 arrival.Status = "1"; arrival.UpdateUser = model.CreateUser; arrival.UpdateTime = serverTime; Db.Updateable(arrival).ExecuteCommand(); } } #endregion } if (iscount == 1) { //回流入库 #region 回流入库 //不修改库存 入库单据不做更改 //修改库存明细信息 //修改拣货信息为已完成 //修改库存明细信息 foreach (var item in stockDetail) { item.Status = "0"; //状态更改为待分配 item.WareHouseNo = "W02"; //所属仓库 item.UpdateTime = serverTime; //修改时间 item.UpdateUser = model.CreateUser; //修改人 //修改库存明细信息 Db.Updateable(item).ExecuteCommand(); } //获取拣货信息 var alotr = Db.Queryable().First(a => a.IsDel == "0" && a.PalletNo == model.PalletNo && a.Status == "4"); if (alotr != null) { alotr.Status = "5"; //5 已完成 alotr.UpdateUser = model.CreateUser; //修改人 alotr.UpdateTime = serverTime; //修改时间 //修改拣货信息 Db.Updateable(alotr).ExecuteCommand(); } #region 任务及组托信息 //创建任务信息 var taskNo = new Common().GetMaxNo("TK"); var exTask = new LogTask //入库任务 { TaskNo = taskNo, Sender = "WMS", Receiver = "PDA", IsSuccess = 1, //是否下发成功 0失败 1成功 SendDate = DateTime.Now, //发送时间 BackDate = DateTime.Now, //返回时间 StartLocat = "",//起始位置 EndLocat = "零箱库",//目标位置 PalletNo = model.PalletNo,//托盘码 IsSend = 0,//是否可再次下发 IsCancel = 0,//是否可取消 IsFinish = 0,//是否可完成 Type = "0",//任务类型 0 入库任务 1 出库任务 2 移库任务 Status = "2",//任务状态0:等待执行1正在执行2执行完成 OrderType = "0",//0 入库单 1 出库单 2 盘点单 3 移库单 Msg = "零箱库的回库任务", }; Db.Insertable(exTask).ExecuteCommand(); //修改组托状态 //palletbind.Status = "2"; //2 入库完成 //palletbind.UpdateTime = serverTime; //palletbind.UpdateUser = model.CreateUser; //palletbind.CompleteTime = serverTime; //完成时间 //palletbind.TaskNo = taskNo; //任务号 //Db.Updateable(palletbind).ExecuteCommand(); #endregion #endregion } new OperationASNServer().AddLogOperationAsn("PDA模块", "平库入库", model.PalletNo, "完成", $"在PDA上完成单据号为:{model.ASNNo}的托盘码为:{model.PalletNo}的平库入库操作", (int)model.CreateUser); Db.CommitTran(); #region 平库入库注释代码 // 改变储位状态; 有货物 //sqlString = $"Update SysStorageLocat set Status = '1' where LocatNo = '{model.LocatNo}' and WareHouseNo = 'W01';"; //Db.Ado.ExecuteCommand(sqlString); //// 改变箱支关系表状态:已入库 //sqlString = $"Update BllBoxInfo set Status = '2' where PalletNo = '{model.PalletNo}' and ASNNo = '{model.ASNNo}' and Status = '1';"; //Db.Ado.ExecuteCommand(sqlString); //// 改变托盘绑定表状态:已入库 完成时间:当前时间 //sqlString = $"Update BllPalletBind set LocatNo = '{model.LocatNo}',Status = '2',CompleteTime=GETDATE() where PalletNo = '{model.PalletNo}' and ASNNo = '{model.ASNNo}';"; //Db.Ado.ExecuteCommand(sqlString); // 改变入库明细表状态:若完成数量和数量相等:执行完成 不相等:正在执行; //foreach (PalletBindVm bindModel in bindModels) //{ // // 判断入库明细是否完成 // sqlString = $"select count(id) from BllArrivalNoticeDetail where isdel = '0' "; // sqlString += $"and id = '{bindModel.ASNDetailNo}';";/*Qty = CompleteQty + {bindModel.Qty} and*/ // int detailNum = Db.Ado.GetInt(sqlString); // if (detailNum > 0) // { // // 改变入库单明细状态和完成时间 // sqlString = $"Update BllArrivalNoticeDetail set Status = '2',CompleteTime=GETDATE() "; // sqlString += $"where id = '{bindModel.ASNDetailNo}';"; // Db.Ado.ExecuteCommand(sqlString); // // 判断入库单总表是否完成 // sqlString = $"select count(id) from BllArrivalNoticeDetail where isdel = '0' and Status != '2' "; // sqlString += $"and ASNNo = '{bindModel.ASNNo}' and id !='{bindModel.ASNDetailNo}';"; // int asnNum = Db.Ado.GetInt(sqlString); // if (detailNum <= 0) // { // // 改变入库单状态和完成时间 若入库明细表所有状态为执行完毕:执行完毕 否:正在执行; // sqlString = $"Update BllArrivalNotice set CompleteQty = CompleteQty+{bindModel.Qty},Status = '2',CompleteTime=GETDATE() "; // sqlString += $"where ASNNo = '{bindModel.ASNNo}';"; // Db.Ado.ExecuteCommand(sqlString); // } // } // #region 库存总表 // // var stockModel = Db.Queryable() // //.First(it => it.SkuNo == bindModel.SkuNo && it.LotNo == bindModel.LotNo // // && it.Standard == bindModel.Standard && it.SupplierLot == bindModel.SupplierLot && it.IsDel == "0"); // //获取当前入库物料信息 // string str = string.Empty; // str += $"select * from BllArrivalNoticeDetail where id in (select ASNDetailNo from BllBoxInfo where ASNNo = '{bindModel.ASNNo}' and PalletNo = '{bindModel.PalletNo}' and Status = '1');"; // //string sttr = "select * from BllArrivalNoticeDetail where id in (select ASNDetailNo from BllBoxInfo where ASNNo = 'ASN2023042400002' and PalletNo = 'T2300004' and Status = '1');"; // var noticeDetail = Db.Ado.SqlQuery(str); // // 判断当前物料库存表是否已存在 // str = $"select * from DataStock where SkuNo = '{noticeDetail[0].SkuNo}' and LotNo = '{noticeDetail[0].LotNo}' and Standard = '{noticeDetail[0].Standard}' and SkuName = '{noticeDetail[0].SkuName}' and IsDel = '0'"; // var stockModel = Db.Ado.SqlQuerySingle(str); // if (stockModel == null || stockModel.Id == 0) // { // stockModel = new DataStock // { // LotNo = bindModel.LotNo, // LotText = bindModel.LotText, // SupplierLot = bindModel.SupplierLot, // SkuNo = bindModel.SkuNo, // SkuName = bindModel.SkuName, // Qty = (int)bindModel.Qty, // Standard = bindModel.Standard, // CreateUser = (int)model.CreateUser // }; // Db.Insertable(stockModel).ExecuteCommand(); // } // else // { // sqlString = $"update DataStock set Qty = Qty + {bindModel.Qty}," + // $"UpdateTime = GETDATE(),UpdateUser='{model.CreateUser}' where id = '{stockModel.Id}';"; // Db.Ado.ExecuteCommand(sqlString); // } // #endregion // #region 库存明细表 // // 判断当前托盘是否已存在(拣货回库托盘) // var detailModel = Db.Queryable() // .First(it => it.PalletNo == bindModel.PalletNo && it.LotNo == noticeDetail[0].LotNo && it.SkuNo == noticeDetail[0].SkuNo // && it.Standard == noticeDetail[0].Standard && it.IsDel == "0"); // if (detailModel == null || detailModel.Id == 0) // { // // 获取可抽检数量 // sqlString = "select sum(qty) from BllBoxInfo where isdel = 0 and "; // sqlString += $"BindNo = '{bindModel.Id}'"; // int inspectQty = Db.Ado.GetInt(sqlString); // // 添加库存明细表 // detailModel = new DataStockDetail() // { // LotNo = noticeDetail[0].LotNo, // LotText = noticeDetail[0].LotText, // SupplierLot = noticeDetail[0].SupplierLot, // SkuNo = noticeDetail[0].SkuNo, // SkuName = noticeDetail[0].SkuName, // Standard = noticeDetail[0].Standard, // Qty = noticeDetail[0].Qty, // LockQty = 0, // FrozenQty = 0, // InspectQty = inspectQty, // ASNNo = bindModel.ASNNo, // ASNDetailNo = (int)bindModel.ASNDetailNo, // WareHouseNo = locatModel.WareHouseNo, // RoadwayNo = locatModel.RoadwayNo, // AreaNo = locatModel.AreaNo, // LocatNo = model.LocatNo, // PalletNo = model.PalletNo, // PalletNo2 = bindModel.PalletNo2, // PalletNo3 = bindModel.PalletNo3, // CompleteTime = serverTime, // ProductionTime = bindModel.ProductionTime, // ExpirationTime = bindModel.ExpirationTime, // Status = "0", // InspectMark = bindModel.InspectMark, // BitPalletMark = bindModel.BitPalletMark, // InspectStatus = bindModel.InspectMark, // 组盘的时候就要默认设定好是否合格 // PackagNo = bindModel.PackagNo, // IsBale = bindModel.IsBale, // IsBelt = bindModel.IsBelt, // CreateUser = (int)model.CreateUser // }; // Db.Insertable(detailModel).ExecuteCommand(); // } // else // { // detailModel.LocatNo = model.LocatNo; // detailModel.UpdateTime = serverTime; // detailModel.UpdateUser = (int)model.CreateUser; // // 变更储位地址 // Db.Updateable(detailModel).UpdateColumns(it => new { it.LocatNo, it.UpdateTime, it.UpdateUser }).ExecuteCommand(); // } // #endregion //} #endregion return strMsg; } catch (Exception ex) { Db.RollbackTran(); throw ex; } } //根据托盘号获取入库单号 public string GetASNNoByPalletNo(string palletNo) { try { //入库中 var aSNNoList= Db.Ado.SqlQuery($"SELECT DISTINCT ASNNo from BllPalletBind where IsDel=0 and Status=0 and PalletNo='{palletNo}' ").ToList(); if (aSNNoList.Count <= 0) { //库外托盘或平库托盘 var dataStockList = Db.Ado.SqlQuery($"select DISTINCT PalletNo from DataStockDetail where IsDel=0 and isnull(LocatNo,'') = '' and PalletNo='{palletNo}' ").ToList(); if (dataStockList.Count <= 0) { throw new Exception("托盘信息不存在或托盘在立库中!"); } return ""; } if (aSNNoList.Count > 1) { throw new Exception("同一个托盘号存在多个入库单,请检查!"); } return aSNNoList[0]; } catch (Exception ex) { throw new Exception(ex.Message); } } //根据箱码获取物料、批次、数量等信息 public PdaPalletNoCheckDto GetBoxInfoByBoxNo(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 CompleteInStockLing(PdaLingAsnVm model, int userId) { try { if (string.IsNullOrWhiteSpace(model.AsnNo)) { throw new Exception("-1:盘点单据不能为空!"); } if (model.AsnDetailId == null || model.AsnDetailId == 0) { throw new Exception("-1:物料批次不能为空!"); } if (string.IsNullOrWhiteSpace(model.PalletNo)) { throw new Exception("-1:托盘条码不能为空!"); } if (string.IsNullOrWhiteSpace(model.BoxNo)) { throw new Exception("-1:箱码不能为空!"); } //获取当前时间 DateTime serverTime = Db.Ado.GetDateTime("select GETDATE();"); Db.BeginTran();//开启事务 #region 箱码信息 //获取箱码信息 string boxstr = $"select * from BLLBoxInfo where IsDel = '0' and BoxNo = '{model.BoxNo}'"; List boxinfo = Db.Ado.SqlQuery(boxstr).ToList(); //验证箱码信息是否存在 if (boxinfo.Count <= 0) { throw new Exception("-1:箱码信息不存在,请核查!"); } var bNum = 0;//数量 //验证箱码是否已绑定托盘 foreach (var item in boxinfo) { if (!string.IsNullOrEmpty(item.PalletNo)) { throw new Exception("-1:该箱码已绑定其他托盘,请先解绑托盘!"); } bNum += item.Qty; } if (bNum == boxinfo[0].FullQty) { throw new Exception("-1:该箱子不是零箱,不能入零箱库!"); } #endregion #region 单据信息 //获取入库单据总单 var isFinsh = true; var arrival = new BllArrivalNotice(); arrival = Db.Queryable().First(a => a.IsDel == "0" && a.ASNNo == model.AsnNo); //验证入库单总单是否关闭 if (arrival == null) { throw new Exception("-1:入库单总单为空,请核查!"); } //判断入库单总单是否为已关闭 if (arrival.Status == "3") { throw new Exception("-1:入库单总单已关闭,请核查!"); } // 验证入库单明细是否存在 var arrivalnotice = Db.Queryable().First(m => m.IsDel == "0" && m.Id == model.AsnDetailId && m.ASNNo == model.AsnNo); if (arrivalnotice == null) { throw new Exception("-1:当前物料及批次与单据无关联,请核实!"); } arrivalnotice.FactQty += bNum; arrivalnotice.CompleteQty += bNum; //判断入库数量增加后是否大于等于单据数量 if (arrivalnotice.CompleteQty >= arrivalnotice.Qty) { arrivalnotice.Status = "2"; arrivalnotice.CompleteTime = serverTime; } else { arrivalnotice.Status = "1"; isFinsh = false; } arrivalnotice.UpdateUser = userId; arrivalnotice.UpdateTime = serverTime; Db.Updateable(arrivalnotice).ExecuteCommand(); var arrivalnoticeList = Db.Queryable().Where(m => m.IsDel == "0" && m.ASNNo == model.AsnNo).ToList(); foreach (var item in arrivalnoticeList) { if (item.CompleteQty < item.Qty) { isFinsh = false; break; } } if (isFinsh) { //修改入库单总单信息 arrival.Status = "2"; arrival.CompleteTime = serverTime; arrival.UpdateUser =userId; arrival.UpdateTime = serverTime; Db.Updateable(arrival).ExecuteCommand(); } else { //判断总单状态是否为正在执行 if (arrival.Status == "0") { //修改入库单总单信息 arrival.Status = "1"; arrival.UpdateUser = userId; arrival.UpdateTime = serverTime; Db.Updateable(arrival).ExecuteCommand(); } } #endregion #region 托盘信息 //托盘是否存在 var pallet = Db.Queryable().First(m => m.IsDel == "0" && m.PalletNo == model.PalletNo); if (pallet == null) { throw new Exception("-1:未查询到托盘信息,请核实!"); } if (pallet.Status == "0") { // 更改托盘使用状态 var sqlStr = $"update SysPallets set Status = '1' where PalletNo = '{model.PalletNo}';"; Db.Ado.ExecuteCommand(sqlStr); } var palletStockDetail = Db.Ado.SqlQuery($"select * from DataStockDetail where PalletNo='{model.PalletNo}' and ISNULL(LocatNo,'')<>''").ToList(); if (palletStockDetail != null && palletStockDetail.Count > 0) { throw new Exception("-1:托盘在立库中不允许拼托,请核查!"); } #endregion #region 物料信息 var sku = Db.Queryable().First(s => s.SkuNo == arrivalnotice.SkuNo && s.IsDel == "0" && s.SkuName == arrivalnotice.SkuName); //判断物料信息是否为空 if (sku == null) { throw new Exception("-1:物料信息为空,请核查!"); } #endregion #region 绑定托盘 var bindId = 0; var bind = new BllPalletBind { ASNNo = model.AsnNo, ASNDetailNo = (int)model.AsnDetailId, PalletNo = model.PalletNo, PalletNo2 = "", PalletNo3 = "", Qty = bNum, FullQty = 0,//整托数量,托盘上可能放的是不同包装的箱子 Status = "2", CompleteTime = serverTime, Type = "0", LotNo = arrivalnotice.LotNo, LotText = arrivalnotice.LotText, SupplierLot = "", InspectMark = "0", BitPalletMark = "1", IsBale = "0", IsBelt = "0", CreateUser = userId }; // 插入托盘绑定表 bindId = Db.Insertable(bind).ExecuteReturnIdentity(); #endregion #region 库存总表 // 判断当前物料库存表是否已存在 string str = $"select * from DataStock where SkuNo = '{arrivalnotice.SkuNo}' and LotNo = '{arrivalnotice.LotNo}' and Standard = '{arrivalnotice.Standard}' and SkuName = '{arrivalnotice.SkuName}' and IsDel = '0'"; var stockModel = Db.Ado.SqlQuerySingle(str); if (stockModel == null || stockModel.Id == 0) { stockModel = new DataStock { LotNo = arrivalnotice.LotNo, LotText = arrivalnotice.LotText, SupplierLot = arrivalnotice.SupplierLot, SkuNo = arrivalnotice.SkuNo, SkuName = arrivalnotice.SkuName, Qty = bNum, Standard = arrivalnotice.Standard, CreateUser = userId, CreateTime = serverTime }; Db.Insertable(stockModel).ExecuteCommand(); } else { string sqlString = $"update DataStock set Qty = Qty + {bNum}," + $"UpdateTime = GETDATE(),UpdateUser='{userId}' where id = '{stockModel.Id}';"; Db.Ado.ExecuteCommand(sqlString); } #endregion #region 库存明细表 var boxinfoItem = boxinfo.First(); var detailModel = Db.Queryable() .First(it => it.PalletNo == model.PalletNo && it.LotNo == arrivalnotice.LotNo && it.SkuNo == arrivalnotice.SkuNo && it.Standard == arrivalnotice.Standard && it.IsDel == "0"); var stId = 0; if (detailModel == null || detailModel.Id == 0) { // 添加库存明细表 detailModel = new DataStockDetail() { LotNo = arrivalnotice.LotNo, LotText = arrivalnotice.LotText, SupplierLot = arrivalnotice.SupplierLot, SkuNo = arrivalnotice.SkuNo, SkuName = arrivalnotice.SkuName, Standard = arrivalnotice.Standard, Qty = bNum, LockQty = 0, FrozenQty = 0, InspectQty = bNum, ASNNo = arrivalnotice.ASNNo, ASNDetailNo = (int)bind.ASNDetailNo, WareHouseNo = "W02", RoadwayNo = "", AreaNo = "", LocatNo = "", PalletNo = model.PalletNo, PalletNo2 = "", PalletNo3 = "", CompleteTime = serverTime, ProductionTime = boxinfoItem.ProductionTime, ExpirationTime = boxinfoItem.ProductionTime.Value.AddDays((int)sku.Warranty),//过期时间 Status = "0", InspectMark = boxinfoItem.InspectMark, BitPalletMark = "1", InspectStatus = sku.IsInspect,// 组盘的时候就要默认设定好是否合格 PackagNo = sku.PackagNo, IsBale = null, IsBelt = null, CreateUser = userId, CreateTime = serverTime }; stId = Db.Insertable(detailModel).ExecuteReturnIdentity(); } else { stId = detailModel.Id; detailModel.Qty += bNum; detailModel.InspectQty += bNum; detailModel.LocatNo = ""; detailModel.UpdateTime = serverTime; detailModel.UpdateUser = userId; // 变更储位地址 Db.Updateable(detailModel).UpdateColumns(it => new { it.Qty, it.InspectQty, it.LocatNo, it.UpdateTime, it.UpdateUser }).ExecuteCommand(); } #endregion #region 库存箱支明细表 var comTime = DateTime.Now; foreach (var item in boxinfo) { // 维护箱支关系表 string sqlString = $"Update BLLBoxInfo set ASNNo='{model.AsnNo}',ASNDetailNo='{model.AsnDetailId}',BindNo='{bindId}',PalletNo='{model.PalletNo}',Status='2' where IsDel = '0' and BoxNo = '{model.BoxNo}'"; Db.Ado.ExecuteCommand(sqlString); // 插入新组的箱支信息 var info = new DataBoxInfo() { StockDetailId = stId, BindNo = bindId, BoxNo = item.BoxNo, BoxNo2 = item.BoxNo2, BoxNo3 = item.BoxNo3, PalletNo = model.PalletNo, PalletNo2 = item.PalletNo2, PalletNo3 = item.PalletNo3, Qty = item.Qty, FullQty = item.FullQty, Status = "2", LotNo = item.LotNo, LotText = item.LotText, SkuNo = item.SkuNo, SkuName = item.SkuName, Standard = sku.Standard, ProductionTime = item.ProductionTime, SupplierLot = item.SupplierLot, InspectMark = item.InspectMark, BitBoxMark = item.BitBoxMark, InspectStatus = item.InspectStatus, IsDel = "0", CreateUser = 0, CreateTime = comTime }; Db.Insertable(info).ExecuteCommand(); } #endregion new OperationASNServer().AddLogOperationAsn("PDA模块", "零箱入库", model.PalletNo, "完成", $"在PDA上完成单据号为:{model.AsnNo}的托盘码为:{model.PalletNo}的零箱入库操作", userId); Db.CommitTran(); } catch (Exception ex) { Db.Ado.RollbackTran();//事务回滚 throw ex; } } } }