using Model.InterFaceModel; using Model.ModelDto; using Model.ModelDto.BllAsnDto; using Model.ModelDto.SysDto; using Model.ModelVm; using Model.ModelVm.SysVm; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; using WMS.BLL.LogServer; using WMS.DAL; using WMS.Entity.BllAsnEntity; using WMS.Entity.BllSoEntity; using WMS.Entity.Context; using WMS.Entity.DataEntity; using WMS.Entity.SysEntity; using WMS.IBLL.IBllAsnServer; namespace WMS.BLL.BllAsnServer { public class ArrivalNoticeServer : DbHelper, IArrivalNoticeServer { #region 依赖注入 private static readonly SqlSugarScope Db = DataContext.Db; private readonly object AsnLock = new object(); public ArrivalNoticeServer() : base(Db) { } #endregion #region 事件方法 public async Task> GetArrivalNoticeList(ArrivalNoticeVm model, RefAsync count) { var modelList = await Db.Queryable((tb1, tb2, tb3, tb4,tb5) => new JoinQueryInfos( JoinType.Left, tb1.ASNNo == tb2.ASNNo, JoinType.Left, tb1.CreateUser == tb3.Id, JoinType.Left, tb1.UpdateUser == tb4.Id, JoinType.Left, tb1.CheckUser == tb5.Id)) .WhereIF(!string.IsNullOrWhiteSpace(model.ASNNo), tb1 => tb1.ASNNo.Contains(model.ASNNo)) .WhereIF(!string.IsNullOrWhiteSpace(model.LotNo), (tb1,tb2) => tb2.LotNo.Contains(model.LotNo)) .WhereIF(!string.IsNullOrWhiteSpace(model.SkuNo), (tb1,tb2) => tb2.SkuNo.Contains(model.SkuNo)) .WhereIF(!string.IsNullOrWhiteSpace(model.SkuName), (tb1,tb2) => tb2.SkuName.Contains(model.SkuName)) .WhereIF(!string.IsNullOrWhiteSpace(model.CustomerName), tb1 => tb1.CustomerName.Contains(model.CustomerName)) .WhereIF(!string.IsNullOrWhiteSpace(model.OrderCode), tb1 => tb1.OrderCode.Contains(model.OrderCode)) .WhereIF(!string.IsNullOrWhiteSpace(model.Status), tb1 => tb1.Status == model.Status) .WhereIF(!string.IsNullOrWhiteSpace(model.Type), tb1 => tb1.Type == model.Type) .WhereIF(!string.IsNullOrWhiteSpace(model.StartTime), tb1 => tb1.CreateTime >= Convert.ToDateTime(model.StartTime)) .WhereIF(!string.IsNullOrWhiteSpace(model.EndTime), tb1 => tb1.CreateTime <= Convert.ToDateTime(model.EndTime).AddDays(1)) .WhereIF(!string.IsNullOrWhiteSpace(model.CustomerName), tb1 => tb1.CustomerName.Contains(model.CustomerName)) .Where(tb1 => tb1.IsDel == "0") .OrderByDescending(tb1 => tb1.ASNNo) .Distinct() .Select((tb1, tb2, tb3, tb4, tb5) => new ArrivalNoticeDto() { Id = tb1.Id, ASNNo = tb1.ASNNo, Type = tb1.Type, Status = tb1.Status, Origin = tb1.Origin, CustomerNo = tb1.CustomerNo, CustomerName = tb1.CustomerName, LotNo = tb1.LotNo, LotText = tb1.LotText, CheckTime = ((DateTime)tb1.CheckTime).ToString("yyyy-MM-dd HH:mm:ss"), CheckUserName = tb5.RealName, SupplierLot = tb1.SupplierLot, Demo = tb1.Demo, OrderCode = tb1.OrderCode, CompleteTime = tb1.CompleteTime, CreateTime = tb1.CreateTime, CreateUserName = tb3.RealName, UserName=tb1.UserName, UpdateTime = ((DateTime)tb1.UpdateTime).ToString("yyyy-MM-dd HH:mm:ss"), UpdateUserName = tb4.RealName }).ToPageListAsync(model.Page, model.Limit, count); return modelList; } public async Task> GetArrivalNoticeDetailList(ArrivalNoticeDetailVm model, RefAsync count) { var item = Expressionable.Create() .AndIF(!string.IsNullOrWhiteSpace(model.ASNNo), it => it.ASNNo == model.ASNNo) .AndIF(true, it => it.IsDel == "0") .ToExpression();//注意 这一句 不能少 var modelList = await Db.Queryable().Where(item) .LeftJoin((tb1, tb2) => tb1.ASNNo == tb2.ASNNo) .LeftJoin((tb1, tb2,tb3) => tb1.CreateUser == tb3.Id) .LeftJoin((tb1,tb2,tb3,tb4) => tb1.UpdateUser == tb4.Id) .LeftJoin((tb1, tb2, tb3, tb4,tb5) => tb1.SkuNo == tb5.SkuNo && tb5.IsDel == "0") .LeftJoin((tb1, tb2, tb3, tb4, tb5,tb6) => tb5.UnitNo == tb6.UnitNo && tb6.IsDel == "0") .LeftJoin((tb1, tb2, tb3, tb4, tb5, tb6,tb7) => tb1.PackagNo == tb7.PackagNo && tb7.IsDel == "0") .Select((tb1, tb2, tb3, tb4, tb5,tb6, tb7) => new ArrivalNoticeDetailDto() { Id = tb1.Id, ASNNo = tb1.ASNNo, SkuNo = tb1.SkuNo, SkuName = tb1.SkuName, Standard = tb1.Standard, LotNo = tb1.LotNo, LotText = tb1.LotText, Qty = tb1.Qty, FactQty = tb1.FactQty, CompleteQty = tb1.CompleteQty, IsSampling = tb1.IsSampling, InspectStatus = tb1.InspectStatus, PackagNo = tb1.PackagNo, PackagName = tb7.PackagName, UnitName = tb6.UnitName, IsBale = tb1.IsBale, IsBelt = tb1.IsBelt, SupplierLot = tb1.SupplierLot, Status = tb1.Status, AsnType = tb2.Type, AsnStatus = tb2.Status, IsPasteCode = tb5.IsPasteCode, Lot1 = tb1.Lot1, Lot2 = tb1.Lot2, UDF1 = tb1.UDF1, UDF2 = tb1.UDF2, UDF3 = tb1.UDF3, UDF4 = tb1.UDF4, UDF5 = tb1.UDF5, CompleteTime = tb1.CompleteTime, CreateTime = tb1.CreateTime, CreateUserName = tb3.RealName, UpdateTime = ((DateTime)tb1.UpdateTime).ToString("yyyy-MM-dd HH:mm:ss"), UpdateUserName = tb4.RealName }).ToPageListAsync(model.Page, model.Limit, count); return modelList; } //获取入库单明细剩余打印数量 public LabelPrintInfoDto GetAsnDetailQtyList(int id) { try { var detail = Db.Queryable().First(m => m.IsDel == "0" && m.Id == id); if (detail == null) { throw new Exception("未查询到入库单明细"); } var data = new LabelPrintInfoDto(); data.ProductionTime = string.IsNullOrEmpty(detail.Lot1) ? "" : Convert.ToDateTime(detail.Lot1).ToString("yyyy-MM-dd"); data.ExpirationTime = string.IsNullOrEmpty(detail.Lot2) ? "" : Convert.ToDateTime(detail.Lot2).ToString("yyyy-MM-dd"); data.SupplierLot = detail.SupplierLot; var labelQty = Db.Queryable().Where(m => m.IsDel == "0" && m.ASNDetailNo == id).Sum(m => m.Qty + (m.SamplingQty == null? 0: m.SamplingQty)); if (labelQty == null) { labelQty = 0; } var qty = detail.Qty - labelQty; if (qty<0) { qty = 0; } data.Qty = qty.ToString(); return data; } catch (Exception e) { throw new Exception(e.Message); } } //获取物料信息(添加入库单明细使用) public List GetMaterialsList(GetMaterialsVm model) { try { string skuType = string.Empty; int IsPack = 2; // 0:不贴 1:贴 2:不管 /** model.type (单据类型) * 成品入库 0 * 采购入库 1 * 中间品不贴 2 * 退货入库 3 * 余料退回入库 4 */ switch (model.Type)//0:原料 1:包材 2:成品 3:耗材 4:半成品 { case "0"://成品入库 skuType = "(2)"; break; case "1"://采购入库 skuType = "(0,1,3)"; break; case "2"://中间品入库 skuType = "(4)"; break; case "3"://退货入库 skuType = "(2)"; break; case "4"://车间余料退回入库 skuType = "(0,1,2,3)"; break; default: //其它 skuType = "(0,1,2,3,4)"; break; } Expression> item = Expressionable.Create() .AndIF(model.Type != "7", it => skuType.Contains(it.Type)) .AndIF(model.Type == "7", it => it.SkuNo == "100088") .AndIF(IsPack != 2, it => it.IsPasteCode == IsPack.ToString()) .AndIF(true, it => it.IsDel == "0") .And(it => it.SkuNo != "100099") .AndIF(!string.IsNullOrWhiteSpace(model.SkuNo), (it => it.SkuNo.Contains(model.SkuNo.Trim()) || it.SkuName.Contains(model.SkuNo.Trim()) || it.Standard.Contains(model.SkuNo.Trim()))) .ToExpression();//注意 这一句 不能少 var data = DataContext.Db.Queryable().Where(item) .Includes(x => x.TypeInfo) .Includes(x => x.EnvironmentInfo) .Includes(x => x.UnitInfo) .Includes(x => x.PackagInfo) .ToList(); return data.Select(m => new MaterialsDto() { //Id = m.Id, SkuNo = m.SkuNo, SkuName = m.SkuName, Standard = m.Standard, AuditStatusNo = m.AuditStatusNo, Type = m.Type, TypeName = m.TypeInfo == null ? "" : m.TypeInfo.DictName, IsControlled = m.IsControlled, IsInspect = m.IsInspect, Origin = m.Origin, UnitNo = m.UnitNo, UnitName = m.UnitInfo == null ? "" : m.UnitInfo.UnitName, PackagNo = m.PackagNo, PackagName = m.PackagInfo == null ? "" : m.PackagInfo.PackagName, Environment = m.Environment, EnvironmentName = m.EnvironmentInfo == null ? "" : m.EnvironmentInfo.DictName, Weight = m.Weight, Warranty = m.Warranty, Price = m.Price, Demo = m.Demo, }).ToList(); } catch (Exception e) { throw e; } } //添加入库单据 public string AddArrivalNotice(ArrivalNoticeVm model) { string strMessage = ""; /** model.type (单据类型) * 成品入库 0 * 采购入库 1 * 退货入库 3 * 余料退回入库 4 * 生产退料入库 8 */ var TypeLot = "1, 5, 6, 7"; //批次可为空单据类型 try { if (model.Origin == "录入") { model.ASNNo = new Common().GetMaxNo("ASN"); } else { if (string.IsNullOrEmpty(model.ASNNo)) { throw new Exception("单据号不可为空!"); } if (string.IsNullOrEmpty(model.Type)) { throw new Exception("单据类型不可为空!"); } } lock (AsnLock) { // 总表实体赋值 BllArrivalNotice ASNModel = new BllArrivalNotice() { ASNNo = model.ASNNo, Type = model.Type, Origin = model.Origin, CustomerNo = model.CustomerNo, CustomerName = model.CustomerName, Status = "0", LotNo = model.LotNo, LotText = model.LotText, SupplierLot = model.SupplierLot, CreateUser = (int)model.CreateUser }; List details = new List(); var skuList = Db.Queryable().Where(m => m.IsDel == "0").ToList(); foreach (ArrivalNoticeDetailVm detailModel in model.AsnDetail) { if (string.IsNullOrEmpty(detailModel.SkuNo)) { strMessage = "-1:物料编码不可为空;"; continue; } if (string.IsNullOrEmpty(detailModel.SkuName)) { strMessage = "-1:物料名称不可为空;"; continue; } if (detailModel.Qty == null || detailModel.Qty <= 0) { strMessage = "-1:数量必须大于0;"; continue; } if ( model.Type == "5" || model.Type == "6" || model.Type == "7") { if (!string.IsNullOrWhiteSpace(detailModel.LotNo)) { throw new Exception("当前单据类型不可输入批次,不可编辑!"); } string toDayTime = DateTime.Now.ToString("yyyyMMdd"); //生成自有批次 if (detailModel.Id == 0 || detailModel.Id == null || string.IsNullOrWhiteSpace(detailModel.LotNo)) { var notice = Db.Queryable().Where(m => m.IsDel == "0" && TypeLot.Contains(m.Type)).Select(m => m.ASNNo).ToList(); var maxLotNo = Db.Queryable().Where(m => m.IsDel == "0" && !string.IsNullOrWhiteSpace(m.LotNo) && notice.Contains(m.ASNNo)).Max(m => m.LotNo); if (string.IsNullOrWhiteSpace(maxLotNo)) { maxLotNo = toDayTime.Substring(2, 6) + "0001"; } else { var lotStr = maxLotNo.Substring(0, 6); var timeStr = toDayTime.Substring(2, 6); if (lotStr == timeStr) { maxLotNo = toDayTime.Substring(2, 6) + (int.Parse(maxLotNo.Substring(6, 4)) + 1).ToString().PadLeft(4, '0'); } else { maxLotNo = timeStr + "0001"; } } detailModel.LotNo = maxLotNo; } } //if (model.Type == "0" || model.Type == "1" || model.Type == "2" || model.Type == "3" || model.Type == "4" && model.Type == "8") //{ // if (string.IsNullOrWhiteSpace(detailModel.LotNo)) // { // throw new Exception("当前单据类型批次不可为空!"); // } //} detailModel.BoxCodeStr = detailModel.LotNo; if (string.IsNullOrWhiteSpace(detailModel.LotNo)) { string toDayTime = DateTime.Now.ToString("yyyyMM"); var maxBoxCodeStr = Db.Queryable().Where(m => m.IsDel == "0" && m.BoxCodeStr.Contains("BK") && m.CreateTime.ToString("yyyyMMdd") == DateTime.Now.ToString("yyyyMMdd")).Max(m => m.BoxCodeStr); if(string.IsNullOrWhiteSpace(maxBoxCodeStr)) { maxBoxCodeStr = "BK" + toDayTime.Substring(2, 4) + "0001"; } else { maxBoxCodeStr = "BK" + (int.Parse(maxBoxCodeStr.Replace("BK", "")) + 1).ToString(); } detailModel.BoxCodeStr = maxBoxCodeStr; } // 判断是否已存在当前明细 int com = Db.Queryable() .Where(m => m.ASNNo == model.ASNNo && m.SkuNo == detailModel.SkuNo && m.LotNo == detailModel.LotNo && m.Id != (int)detailModel.Id && m.IsDel == "0").ToList().Count(); if (com > 0) { strMessage = "-1:物料和批次号重复;"; continue; } if (detailModel.Price == null) { detailModel.Price = 0; } var sku = skuList.FirstOrDefault(m => m.SkuNo == detailModel.SkuNo); if (sku == null) { throw new Exception("未查询出物料信息!"); } string lot1 = detailModel.Lot1; string lot2 = detailModel.Lot2; if (sku.IsPasteCode == "0") { //不贴标物料 生产日期、有效期不能为空 DateTime lot12; DateTime lot22; if (!DateTime.TryParse(detailModel.Lot1, out lot12)) { throw new Exception("非贴标物料生产日期转换失败"); } if (!DateTime.TryParse(detailModel.Lot2, out lot22)) { throw new Exception("非贴标物料过期日期转换失败"); } lot1 = lot12.ToString(); lot2 = lot22.ToString(); } if (string.IsNullOrWhiteSpace(detailModel.PackagNo)) { throw new Exception("包装不能为空"); } // 计算出总金额 detailModel.Money = detailModel.Price * detailModel.Qty; BllArrivalNoticeDetail detail = new BllArrivalNoticeDetail() { ASNNo = model.ASNNo, SkuNo = detailModel.SkuNo, SkuName = detailModel.SkuName, Standard = detailModel.Standard, LotNo = detailModel.LotNo == null ? "" : detailModel.LotNo.Trim(), LotText = detailModel.LotText, Qty = (decimal)detailModel.Qty, PackagNo = detailModel.PackagNo, FactQty = 0, // 已组数量 CompleteQty = 0, // 完成数量 Price = detailModel.Price, Money = detailModel.Money, IsBale = detailModel.IsBale, IsBelt = detailModel.IsBelt, SupplierLot = detailModel.SupplierLot, Status = "0", IsSampling = "0", InspectStatus = "0", Lot1 = lot1, //生产日期 Lot2 = lot2, // 过期日期 BoxCodeStr = detailModel.BoxCodeStr, UDF1 = detailModel.UDF1, UDF2 = detailModel.UDF2, UDF3 = detailModel.UDF3, UDF4 = detailModel.UDF4, UDF5 = detailModel.UDF5, CreateUser = (int)model.CreateUser, }; details.Add(detail); } // 判断是否存在被过滤掉的明细 if (details.Count <= 0) { return strMessage; } Db.Ado.BeginTran(); var rowCount = Db.Insertable(ASNModel).ExecuteCommand(); var rowDetailCount = 0; if (details.Count > 0) { rowDetailCount = Db.Insertable(details).ExecuteCommand(); } Db.Ado.CommitTran(); if (rowCount > 0 && rowDetailCount > 0) { new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", model.ASNNo, "添加", $"添加了单据号为{model.ASNNo}的单据信息", Convert.ToInt32(model.CreateUser)); return strMessage; } else { Db.Ado.RollbackTran(); return "-2:添加失败数据回滚!"; } } } catch (Exception ex) { throw new Exception(ex.Message); } } //编辑入库单据 public string EditArrivalNotice(ArrivalNoticeVm model) { string strMessage = ""; string sqlString = string.Empty; string sqlDetailStr = string.Empty; try { lock (AsnLock) { //判断是否为采购入库单据或车间余料退回入库 // 0:成品入库 1:采购入库 2:中间品入库 3:退货入库 4:车间余料退回入库 5:其它入库 6:代储入库 7:寄存入库 8 生产退料入库 //0、2、3、4 批次不能为空 //1、添加必须为空、编辑不可为空,不能更改 //5、6 批次可为空可不为空 //7 必须为空 var TypeLot = " 5, 6, 7"; //批次为生成批次单据类型 var asnInfo = Db.Queryable().First(m => m.ASNNo == model.ASNNo && m.IsDel == "0"); if (asnInfo == null) { strMessage = "-1:单号不存在,或已删除!;"; return strMessage; } if (asnInfo.Status != "0") { strMessage = "-1:单据状态变更,不可编辑;"; return strMessage; } var dateTime = DateTime.Now; // 编辑总单 asnInfo.CustomerNo = model.CustomerNo; asnInfo.CustomerName = model.CustomerName; asnInfo.LotNo = model.LotNo; asnInfo.LotText = model.LotText; asnInfo.UpdateTime = dateTime; asnInfo.UpdateUser = model.CreateUser; var detailModels = model.AsnDetail; sqlDetailStr += $"SELECT * FROM BllArrivalNoticeDetail WHERE ASNNo = '{model.ASNNo}' and isDel = '0';"; //var dbDetailModels = DataContext.Db.Ado.SqlQuery(sqlDetailStr); var dbDetailModels = Db.Queryable().Where(m => m.ASNNo == model.ASNNo && m.IsDel == "0").ToList(); sqlDetailStr = string.Empty; // 处理已删除的明细 foreach (BllArrivalNoticeDetail dbDetailModel in dbDetailModels) { if (detailModels.Count(it => it.Id == dbDetailModel.Id) == 0) { dbDetailModel.IsDel = "1"; dbDetailModel.UpdateTime = dateTime; dbDetailModel.UpdateUser = model.CreateUser; } } // 处理修改和添加的明细 string toDayTime = dateTime.ToString("yyyymmdd"); List addDetails = new List(); List editDetails = new List(); var maxLotNo = ""; foreach (ArrivalNoticeDetailVm detailModel in detailModels) { if (string.IsNullOrEmpty(detailModel.SkuNo)) { strMessage = "-1:物料编码不可为空;"; return strMessage; } if (string.IsNullOrEmpty(detailModel.SkuName)) { strMessage = "-1:物料名称不可为空;"; return strMessage; } if (detailModel.Qty == null || detailModel.Qty <= 0) { strMessage = "-1:数量必须大于0;"; return strMessage; } //if (model.Type == "0" || model.Type == "2" || model.Type == "3" || model.Type == "4") //{ // if (string.IsNullOrWhiteSpace(detailModel.LotNo)) // { // throw new Exception("当前单据类型批次不可为空!"); // } //} if (TypeLot.Contains(model.Type)) { if (string.IsNullOrWhiteSpace(detailModel.Lot1)) { throw new Exception("生产日期不可为空!"); } if (string.IsNullOrWhiteSpace(detailModel.Lot2)) { throw new Exception("过期日期不可为空!"); } } // 判断是否已存在当前明细 var com = dbDetailModels.Where(m => m.SkuNo == detailModel.SkuNo && m.LotNo == detailModel.LotNo && m.Id != detailModel.Id && m.IsDel == "0").Count(); if (com > 0) { strMessage = "-1:物料和批次号重复;"; return strMessage; } if (detailModel.Price == null) { detailModel.Price = 0; } //生成自有批次 if (detailModel.Id == 0 || detailModel.Id == null || string.IsNullOrWhiteSpace(detailModel.LotNo)) { //var notice = Db.Queryable().Where(m => m.IsDel == "0" && TypeLot.Contains(m.Type)).Select(m => m.ASNNo).ToList(); //if (string.IsNullOrWhiteSpace(maxLotNo)) //{ // maxLotNo = Db.Queryable().Where(m => m.IsDel == "0" && !string.IsNullOrWhiteSpace(m.LotNo) && notice.Contains(m.ASNNo)).Max(m => m.LotNo); //} //if (string.IsNullOrWhiteSpace(maxLotNo)) //{ // maxLotNo = toDayTime.Substring(2, 6) + "0001"; //} //else //{ // var lotStr = maxLotNo.Substring(0, 6); // var timeStr = toDayTime.Substring(2, 6); // if (lotStr == timeStr) // { // maxLotNo = toDayTime.Substring(2, 6) + (int.Parse(maxLotNo.Substring(6, 4)) + 1).ToString().PadLeft(4, '0'); // } // else // { // maxLotNo = timeStr + "0001"; // } //} //detailModel.LotNo = maxLotNo; var maxBoxCodeStr = Db.Queryable().Where(m => m.IsDel == "0" && m.BoxCodeStr.Contains("BK") && m.CreateTime.ToString("yyyyMMdd") == DateTime.Now.ToString("yyyyMMdd")).Max(m => m.BoxCodeStr); if (string.IsNullOrWhiteSpace(maxBoxCodeStr)) { maxBoxCodeStr = "BK" + toDayTime.Substring(2, 4) + "0001"; } else { maxBoxCodeStr = "BK" + (int.Parse(maxBoxCodeStr.Replace("BK", "")) + 1).ToString(); } detailModel.BoxCodeStr = maxBoxCodeStr; } if (detailModel.Id == 0 || detailModel.Id == null) { //if (model.Type == "1") //{ // strMessage = "-1:采购入库不可更改明细,只可编辑数量;"; // return strMessage; //} // 计算出总金额 detailModel.Money = detailModel.Price * detailModel.Qty; BllArrivalNoticeDetail addModel = new BllArrivalNoticeDetail() { ASNNo = model.ASNNo, SkuNo = detailModel.SkuNo, SkuName = detailModel.SkuName, Standard = detailModel.Standard, LotNo = detailModel.LotNo == null ? "" : detailModel.LotNo.Trim(), LotText = detailModel.LotText, Qty = (decimal)detailModel.Qty, PackagNo = detailModel.PackagNo, Price = detailModel.Price, Money = detailModel.Money, FactQty = 0, // 已组数量 CompleteQty = 0, // 完成数量 IsBale = detailModel.IsBale, IsBelt = detailModel.IsBelt, SupplierLot = detailModel.SupplierLot, Status = "0", IsSampling = "0", InspectStatus = "0", Lot1 = detailModel.Lot1, Lot2 = detailModel.Lot2, BoxCodeStr = detailModel.BoxCodeStr, UDF1 = detailModel.UDF1, UDF2 = detailModel.UDF2, UDF3 = detailModel.UDF3, UDF4 = detailModel.UDF4, UDF5 = detailModel.UDF5, CreateUser=(int)model.CreateUser }; addDetails.Add(addModel); } else { //判断是否更改 int rowNum = dbDetailModels .Count(it => it.Id == detailModel.Id && it.Qty == detailModel.Qty && it.LotNo == detailModel.LotNo && it.LotText == detailModel.LotText && it.SupplierLot == detailModel.SupplierLot && it.IsBale == detailModel.IsBale && it.IsBelt == detailModel.IsBelt && it.Lot1 == detailModel.Lot1 // 生产日期 && it.Lot2 == detailModel.Lot2 // 过期日期 && it.UDF1 == detailModel.UDF1 && it.UDF2 == detailModel.UDF2 && it.UDF3 == detailModel.UDF3 && it.UDF4 == detailModel.UDF4 && it.UDF5 == detailModel.UDF5); if (rowNum > 0) { continue; } var dbDetail = dbDetailModels.First(m => m.Id == detailModel.Id); if (TypeLot.Contains(model.Type)) { if (!string.IsNullOrWhiteSpace(dbDetail.LotNo)) { if (dbDetail.LotNo != detailModel.LotNo) { strMessage = "-1:当前单据类型不可更改批次;"; continue; } } } // 计算出总金额 detailModel.Money = detailModel.Price * detailModel.Qty; dbDetail.Qty = (decimal)detailModel.Qty; dbDetail.LotNo = detailModel.LotNo == null ? "" : detailModel.LotNo.Trim(); dbDetail.Money = detailModel.Money; dbDetail.LotText = detailModel.LotText; dbDetail.SupplierLot = detailModel.SupplierLot; dbDetail.IsBale = detailModel.IsBale; dbDetail.Lot1 = detailModel.Lot1; dbDetail.Lot2 = detailModel.Lot2; dbDetail.UDF1 = detailModel.UDF1; dbDetail.UDF2 = detailModel.UDF2; dbDetail.UDF3 = detailModel.UDF3; dbDetail.UDF4 = detailModel.UDF4; dbDetail.UDF5 = detailModel.UDF5; dbDetail.UpdateTime = dateTime; dbDetail.UpdateUser = model.CreateUser; editDetails.Add(dbDetail); } } Db.Ado.BeginTran(); Db.Updateable(dbDetailModels).ExecuteCommand(); int rowCount = Db.Updateable(asnInfo).ExecuteCommand(); var rowDetailCount = 1; if (addDetails.Count > 0) { rowDetailCount = Db.Insertable(addDetails).ExecuteCommand(); } if (editDetails.Count > 0) { rowDetailCount += Db.Updateable(editDetails).ExecuteCommand(); } Db.Ado.CommitTran(); if (rowCount > 0 && rowDetailCount > 0) { new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", model.ASNNo, "编辑", $"编辑了单据号为{model.ASNNo}的单据信息", Convert.ToInt32(model.CreateUser)); return strMessage; } else { Db.Ado.RollbackTran(); return "-2:添加失败数据回滚!"; } } } catch (Exception ex) { throw ex; } } //删除入库单 public string DelArrivalNotice(ArrivalNoticeVm model) { try { var asnModel = Db.Queryable().First(m => m.ASNNo == model.ASNNo && m.IsDel == "0" && m.Status == "0"); if (asnModel == null) { return "-1:入库单状态已变更,不可删除!"; } if (asnModel.Origin != "录入" && asnModel.Origin != "采购单") { return "-1:上游系统下发的单据,不可删除;"; } // 删除总单 var editDateTime = DateTime.Now; asnModel.IsDel = "1"; asnModel.UpdateTime = editDateTime; asnModel.UpdateUser = model.CreateUser; // 删除明细单 var asnDetails = Db.Queryable().Where(m => m.ASNNo == model.ASNNo && m.IsDel =="0").ToList(); foreach (BllArrivalNoticeDetail asnDetail in asnDetails) { asnDetail.IsDel = "1"; asnDetail.UpdateTime = editDateTime; asnDetail.UpdateUser = model.CreateUser; } #region liudl Edit JC26物料不贴吗无需删除 //判断是否为采购入库单据或车间余料退回入库 // 0:成品入库 1:采购入库 2:中间品入库 3:退货入库 4:车间余料退回入库 5:其它入库 6:代储入库 7:寄存入库 //int notdel = 0; //if (model.Type == "1" || model.Type == "4") //{ // //获取单据生成对应标签 // var list = Db.Queryable().Where(a => a.IsDel == "0" && a.Status == "0" && a.BindNo == null); // //验证对应箱支信息是否存在 // if (list == null) // { // return "-1:已有箱码已绑定托盘或已入库,不可删除!"; // } // // 删除对应箱支信息 // sqlString += $"UPDATE BllBoxInfo SET IsDel = '1',"; // sqlString += $"UpdateTime = GETDATE(),UpdateUser = '{model.CreateUser}' "; // sqlString += $"WHERE ASNNo = '{model.ASNNo}';"; // notdel = 1; //} #endregion Db.Ado.BeginTran(); //int rowCount = Db.Ado.ExecuteCommand(sqlString); int rowCount = Db.Updateable(asnModel).ExecuteCommand(); rowCount += Db.Updateable(asnDetails).ExecuteCommand(); Db.Ado.CommitTran(); new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", model.ASNNo, "删除", $"删除了单据号为{model.ASNNo}的单据信息", Convert.ToInt32(model.CreateUser)); return ""; } catch (Exception ex) { Db.RollbackTran(); throw ex; } } //删除入库单明细 public string DelArrivalNoticeDetail(ArrivalNoticeDetailVm model) { string sqlString = string.Empty; try { var asnModel = Db.Queryable().First(m => m.ASNNo == model.ASNNo && m.IsDel == "0" && m.Status == "0"); if (asnModel == null) { return "-1:入库单状态已变更,不可删除!"; } if (asnModel.Origin != "录入" )//&& asnModel.Origin != "采购单" { return "-1:上游系统下发的单据,不可删除;"; } var asnDetail = Db.Queryable().First(m => m.ASNNo == model.ASNNo && m.IsDel == "0" && m.Id == model.Id); if (asnDetail == null) { return "-1:明细状态已变更,不可删除!"; } var detailModel = Db.Queryable() .Where(m => m.ASNNo == model.ASNNo && m.IsDel == "0" && m.Id != model.Id).ToList(); var editDateTime = DateTime.Now; if (detailModel.Count <= 0) { asnModel.IsDel = "1"; asnModel.UpdateTime = editDateTime; asnModel.UpdateUser = model.CreateUser; } else { asnModel.UpdateTime = editDateTime; asnModel.UpdateUser = model.CreateUser; } asnDetail.IsDel = "1"; asnDetail.UpdateTime = editDateTime; asnDetail.UpdateUser = model.CreateUser; //生成的标签 var boxList = Db.Queryable().Where(m => m.IsDel == "0" && m.ASNDetailNo == asnDetail.Id && m.Origin == "WMS生成").ToList(); Db.Ado.BeginTran(); int rowCount = Db.Updateable(asnModel).ExecuteCommand(); rowCount += Db.Updateable(asnDetail).ExecuteCommand(); if (boxList.Count>0) { rowCount += Db.Deleteable(boxList).ExecuteCommand(); } if (rowCount < 2) { Db.RollbackTran(); return "-1:删除失败!"; } Db.Ado.CommitTran(); var detail = Db.Queryable().First(m => m.Id == model.Id); new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", model.ASNNo, "删除", $"删除了单据号为{model.ASNNo}、物料为{detail.SkuNo}、批次号为{detail.LotNo}的单据信息", Convert.ToInt32(model.CreateUser)); return ""; } catch (Exception ex) { Db.RollbackTran(); throw new Exception(ex.Message); } } //关闭入库单 public string CloseArrivalNotice(int id, int userId) { try { var notice = Db.Queryable().Where(m => m.IsDel == "0" && m.Id == id).ToList().FirstOrDefault(); if (notice == null) { throw new Exception("未查询到入库单据信息"); } var palletBind = Db.Queryable() .Where(m => m.IsDel == "0" && m.ASNNo == notice.ASNNo && m.Status != "2" && m.Status != "3").ToList(); if (palletBind != null && palletBind.Count > 0) { throw new Exception("存在未入库完成托盘信息,不允许关单"); } var comTime = DateTime.Now; // 总单关单 var asnModel = Db.Queryable().First(m => m.Id == id); if (asnModel != null) { asnModel.Status = "3"; asnModel.CompleteTime = comTime; asnModel.UpdateTime = comTime; asnModel.UpdateUser = userId; } // 将未完成的明细改为已完成 var asnDetails = Db.Queryable().Where(m => m.Id == id && m.Status == "2").ToList(); foreach (BllArrivalNoticeDetail asnDetail in asnDetails) { asnDetail.Status = "2"; asnDetail.CompleteTime = comTime; asnDetail.UpdateTime = comTime; asnDetail.UpdateUser = userId; } Db.Ado.BeginTran(); int rowCount = Db.Updateable(asnModel).ExecuteCommand(); rowCount += Db.Updateable(asnDetails).ExecuteCommand(); if (rowCount <= 0) { Db.RollbackTran(); return "-1:关单失败!"; } #region 采购计划,若是采购订单根据采购计划单自动生成入库单信息 if (notice.Type == "1" && !string.IsNullOrEmpty(notice.OrderCode)) { // 获取采购总单信息 var planOrd = Db.Queryable().First(it => it.OrderCode == notice.OrderCode && it.IsDel == "0"); //入库单明细 var noticeDetailList = Db.Queryable() .Where(m => m.IsDel == "0" && m.ASNNo == notice.ASNNo).ToList(); foreach (var item in noticeDetailList) { //采购单明细 var planDetail = Db.Queryable() .First(it => it.ParentId == planOrd.Id && it.SkuNo == item.SkuNo && it.IsDel == "0"); planDetail.CompleteQty += item.CompleteQty; if (planDetail.CompleteQty >= planDetail.Qty) { planDetail.Status = "2"; planDetail.CompleteTime = comTime; } else { planDetail.Status = "1"; } Db.Updateable(planDetail).ExecuteCommand(); } // 维护采购总单信息 var planDetailNum = Db.Queryable().Count(m => m.IsDel == "0" && m.ParentId == planOrd.Id && m.Status != "2"); if (planDetailNum == 0) { planOrd.Status = "2"; planOrd.CompleteTime = comTime; Db.Updateable(planOrd).ExecuteCommand(); } else { if (planOrd.Status == "0") { planOrd.Status = "1"; Db.Updateable(planOrd).ExecuteCommand(); } } //采购单明细 var planDetailList = Db.Queryable() .Where(it => it.ParentId == planOrd.Id && it.IsDel == "0" && it.CompleteQty < it.Qty).ToList(); foreach (var item in planDetailList) { //判断有无正在执行的 var noticeDetail = Db.Queryable().First(it => it.OrderDetailCode == item.OrderDetailCode && it.IsDel == "0" && it.Status == "0"); if (noticeDetail != null) { continue; } // 获取物料详细信息 var skuModel = Db.Queryable().First(it => it.SkuNo == item.SkuNo && it.IsDel == "0"); if (skuModel == null) { continue; } // 验证包装信息是否存在 var packagModel = Db.Queryable().First(it => it.PackagNo == item.PackagNo && it.IsDel == "0"); if (packagModel == null) { continue; } // 入库总表信息 string asnNo = new Common().GetMaxNo("ASN"); var asnModel1 = new BllArrivalNotice() { ASNNo = asnNo, Status = "0",//执行状态,0:等待执行 Type = "1",//单据类型,1:采购入库 Origin = "采购单", CustomerNo = item.CustomerNo, CustomerName = item.CustomerName, OrderCode = planOrd.OrderCode, CreateUser = 0 }; // 插入入库总表信息 Db.Insertable(asnModel1).ExecuteCommand(); //入库单明细 var arrDetailModel = new BllArrivalNoticeDetail() { ASNNo = asnNo, SkuNo = skuModel.SkuNo, SkuName = skuModel.SkuName, Standard = skuModel.Standard, LotNo = "", LotText = "", Qty = 0, FactQty = 0, CompleteQty = 0, PackagNo = packagModel.PackagNo, SupplierLot = "", Status = "0", IsSampling = "0", InspectStatus = "0", OrderDetailCode = item.OrderDetailCode, CreateUser = 0 }; // 插入入库总表信息 Db.Insertable(arrDetailModel).ExecuteCommand(); } } #endregion Db.Ado.CommitTran(); new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", notice.ASNNo, "关单", $"关闭了单据号为{notice.ASNNo}的单据信息", userId); return ""; } catch (Exception ex) { Db.RollbackTran(); throw ex; } } //入库单撤销申请 public void CancelOrder(int id, string reason, int userId) { try { var notice = Db.Queryable().First(m => m.IsDel == "0" && m.Id == id); if (notice == null) { throw new Exception("未查询到入库单据信息"); } if (notice.Status != "1" && notice.Status != "2") { throw new Exception("入库单据状态不是正在执行或执行完成,不能撤销"); } var bind = Db.Queryable().Where(m => m.IsDel == "0" && m.ASNNo == notice.ASNNo).ToList(); if (bind.Count == 0) { throw new Exception("未查询到入库单据的托盘绑定信息"); } if (bind.Count(m => m.Status == "1") > 0) { throw new Exception("当前入库单据的托盘绑定信息有正在执行的,请稍后完成后再撤销"); } var auditLog = Db.Queryable().Where(m => m.IsDel == "0" && m.Status == "0"); var boxInfo = Db.Queryable().Where(m => m.IsDel == "0" && m.ASNNo == notice.ASNNo); if (auditLog.Count(m => m.OrderNo == notice.ASNNo) > 0) { throw new Exception("当前入库单据已有撤销审核,请等待审核完成"); } var startStatusName = ""; var endStatusName = ""; switch (notice.Status) { case "1": startStatusName = "正在执行"; endStatusName = "等待执行"; break; case "2": startStatusName = "执行完成"; endStatusName = "正在执行"; break; default: throw new Exception("单据状态错误"); } var palletStr = ""; var msgS = ""; var msgL = ""; foreach (var item in bind) { if (auditLog.Count(m => m.OrderNo == item.ASNNo && m.PalletNo.Contains(item.PalletNo)) > 0) { continue; } if (!palletStr.Contains(item.PalletNo)) { palletStr += item.PalletNo + ";"; } var info = boxInfo.First(m => m.BindNo == item.Id); //获取托盘绑定对应单据 var noticeDetail = Db.Queryable().First(a => a.IsDel == "0" && a.Id == item.ASNDetailNo); if (info != null) { if (!msgS.Contains(info.SkuNo)) { msgS += info.SkuNo + ";"; } if (!msgL.Contains(info.LotNo)) { msgL += info.LotNo + ";"; } } else { if (!msgS.Contains(noticeDetail.SkuNo)) { msgS += noticeDetail.SkuNo + ";"; } if (!msgL.Contains(noticeDetail.LotNo)) { msgL += noticeDetail.LotNo + ";"; } } } var time = DateTime.Now; var log = new BllAuditLog() { OrderNo = notice.ASNNo, PalletNo = palletStr, Msg = $"物料:{msgS} 批次:{msgL}", Reason = reason, Status = "0", Opinion = "", StartStatus = startStatusName, EndStatus = endStatusName, FunctionCode = "001", IsDel = "0", CreateUser = userId, CreateTime = time }; Db.Insertable(log).ExecuteCommand(); new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", notice.ASNNo, "添加", $"添加了单据号为{notice.ASNNo}的单据撤销申请", userId); } catch (Exception e) { throw new Exception(e.Message); } } /// /// 维护入库单备注信息 /// /// /// /// public void EditNoticeDemo(int id, string demo, int userId) { try { var notice = Db.Queryable().First(m => m.IsDel == "0" && m.Id == id); if (notice == null) { throw new Exception("未查询到入库单据信息"); } notice.Demo = demo + "".Trim(); notice.UpdateUser = userId; notice.UpdateTime = DateTime.Now; int i = Db.Updateable(notice).ExecuteCommand(); if (i > 0) { //添加操作日志 new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", notice.ASNNo, "编辑", $"编辑了单据号为{notice.ASNNo}的备注信息", userId); } } catch (Exception ex) { throw new Exception(ex.Message); } } #endregion #region 接口方法 /// /// 创建入库单据(上游系统) /// /// /// public ErpModel CreateAsn(AsnInfo model) { try { var resultModel = new ErpModel() { Success = -1, Message = "" }; if (string.IsNullOrEmpty(model.AsnType)) { resultModel.Message = "单据类型不可为空!"; return resultModel; } if (string.IsNullOrEmpty(model.Customer)) { resultModel.Message = "客户不可为空!"; return resultModel; } if (string.IsNullOrEmpty(model.OrderCode)) { resultModel.Message = "上游系统单号不可为空!"; return resultModel; } if (model.AsnDetails.Count <= 0) { resultModel.Message = "入库单明细不可为空!"; return resultModel; } // 根据客户编号获取客户名称 var CustomerModel = Db.Queryable().First(it => it.CustomerNo == model.Customer && it.IsDel == "0"); if (CustomerModel == null) { resultModel.Message = "客户编号不存在!"; return resultModel; } // 入库总表信息 string asnNo = new Common().GetMaxNo("ASN"); var asnModel = new BllArrivalNotice() { ASNNo = asnNo, Status = "0",//等待执行 Type = model.AsnType, Origin = string.IsNullOrEmpty(model.Origin) ? "ERP" : model.Origin, CustomerNo = model.Customer, CustomerName = CustomerModel.CustomerName, OrderCode = model.OrderCode, UserName = model.Username }; // 入库明细表信息 List detailModels = new List(); foreach (AsnDetail asnDetailModel in model.AsnDetails) { if (string.IsNullOrEmpty(asnDetailModel.SkuNo)) { resultModel.Message = "物料编码不可为空!"; return resultModel; } if (asnDetailModel.Qty <= 0) { resultModel.Message = "数量应为正整数!"; return resultModel; } if (string.IsNullOrEmpty(asnDetailModel.LotNo)) { resultModel.Message = "批次号不可为空!"; return resultModel; } // 获取物料详细信息 var skuModel = Db.Queryable().First(it => it.SkuNo == asnDetailModel.SkuNo && it.IsDel == "0"); if (skuModel == null) { resultModel.Message = "不存在当前物料信息!"; return resultModel; } // 验证包装信息是否存在 var detailModel = new BllArrivalNoticeDetail() { ASNNo = asnNo, SkuNo = asnDetailModel.SkuNo, SkuName = skuModel.SkuName, Standard = skuModel.Standard, LotNo = asnDetailModel.LotNo, LotText = "", Qty = (decimal)asnDetailModel.Qty, FactQty=0, CompleteQty=0, PackagNo = skuModel.PackagNo, SupplierLot = asnDetailModel.SupplierLot, Status = "0", IsSampling = "0", InspectStatus = "0", CreateUser = 0 }; detailModels.Add(detailModel); } Db.BeginTran(); // 插入入库单总表 Db.Insertable(asnModel).ExecuteCommand(); // 插入入库单明细表 Db.Insertable(detailModels).ExecuteCommand(); Db.CommitTran(); resultModel.Success = 0; resultModel.Message = "成功"; return resultModel; } catch (Exception ex) { Db.RollbackTran(); throw ex; } } //订单回传上游系统 public bool FinishAsn(int id, string url, int userId) { try { Db.BeginTran(); var notice = Db.Queryable().First(m => m.Id == id && m.IsDel == "0"); if (notice == null) { throw new Exception("未查询到单据信息"); } if (notice.Status != "3") { throw new Exception("复核失败,单据非关闭状态"); } var detail = Db.Queryable().Where(m => m.ASNNo == notice.ASNNo && m.IsDel == "0").ToList(); if (detail.Count == 0) { throw new Exception("未查询到单据明细信息"); } if (userId == notice.UpdateUser) { throw new Exception("复核失败,复核人员和关闭订单人员不能相同!"); } var list = new List(); foreach (var d in detail) { var item = new AsnDetail() { SkuNo = d.SkuNo, LotNo = d.LotNo, Qty = d.CompleteQty, PackagNo = d.PackagNo, SupplierLot = d.SupplierLot }; list.Add(item); } var soInfo = new AsnInfo() { OrderCode = notice.OrderCode, AsnDetails = list }; #region 通过接口发送至erp //系统对接后放开 /*var jsonData = JsonConvert.SerializeObject(soInfo); var response = HttpHelper.DoPost(url, jsonData, "入库单完成上传", "ERP"); var obj = JsonConvert.DeserializeObject(response);//解析返回数据 if (obj.Success != 0) { throw new Exception("上传失败" + obj.Message); }*/ #endregion notice.Status = "4"; notice.CheckTime = DateTime.Now; notice.CheckUser = userId; Db.Updateable(notice).ExecuteCommand(); new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", notice.ASNNo, "复核", $"复核了单据号为{notice.ASNNo}的单据信息", userId); Db.CommitTran(); return true; } catch (Exception e) { Db.RollbackTran(); throw new Exception(e.Message); } } //订单回传上游系统 public bool ByPdaFinish(string code, string url, int userId) { try { Db.BeginTran(); if (code.Substring(0,2) == "AS") { var notice = Db.Queryable().First(m => m.ASNNo == code && m.IsDel == "0"); if (notice == null) { throw new Exception("未查询到单据信息"); } if (notice.Status != "3") { throw new Exception("复核失败,单据非关闭状态"); } var detail = Db.Queryable().Where(m => m.ASNNo == notice.ASNNo && m.IsDel == "0").ToList(); if (detail.Count == 0) { throw new Exception("未查询到单据明细信息"); } if (userId == notice.UpdateUser) { throw new Exception("复核失败,复核人员和关闭订单人员不能相同!"); } var list = new List(); foreach (var d in detail) { var item = new AsnDetail() { SkuNo = d.SkuNo, LotNo = d.LotNo, Qty = d.CompleteQty, PackagNo = d.PackagNo, SupplierLot = d.SupplierLot }; list.Add(item); } var soInfo = new AsnInfo() { OrderCode = notice.OrderCode, AsnDetails = list }; #region 通过接口发送至erp //系统对接后放开 /*var jsonData = JsonConvert.SerializeObject(soInfo); var response = HttpHelper.DoPost(url, jsonData, "入库单完成上传", "ERP"); var obj = JsonConvert.DeserializeObject(response);//解析返回数据 if (obj.Success != 0) { throw new Exception("上传失败" + obj.Message); }*/ #endregion notice.Status = "4"; notice.CheckTime = DateTime.Now; notice.CheckUser = userId; Db.Updateable(notice).ExecuteCommand(); new OperationASNServer().AddLogOperationAsn("PDA模块", "复核单据", code, "复核", $"复核了单据号为{code}的单据信息", userId); } else if (code.Substring(0,2) == "SO") { var notice = Db.Queryable().First(m => m.SONo == code && m.IsDel == "0"); if (notice == null) { throw new Exception("未查询到单据信息"); } if (notice.Status != "5") { throw new Exception("复核失败,单据非关闭状态"); } var detail = Db.Queryable().Where(m => m.SONo == notice.SONo && m.IsDel == "0").ToList(); if (detail.Count == 0) { throw new Exception("未查询到单据明细信息"); } if (userId == notice.UpdateUser) { throw new Exception("复核失败,复核人员和关闭订单人员不能相同!"); } var list = new List(); foreach (var d in detail) { var item = new SoDetail() { SkuNo = d.SkuNo, LotNo = d.LotNo, Qty = (decimal)d.CompleteQty }; list.Add(item); } var soInfo = new SoInfo() { OrderCode = notice.OrderCode, SoDetails = list }; #region 通过接口发送至erp //系统对接后放开 /*var jsonData = JsonConvert.SerializeObject(soInfo); var response = HttpHelper.DoPost(url, jsonData, "出库单完成上传", "ERP"); var obj = JsonConvert.DeserializeObject(response);//解析返回数据 if (obj.Success != 0) { throw new Exception("上传失败" + obj.Message); }*/ #endregion notice.Status = "6"; notice.CheckTime = DateTime.Now; notice.CheckUser = userId; Db.Updateable(notice).ExecuteCommand(); new OperationSOServer().AddLogOperationSo("PDA模块", "复核单据", code, "复核", $"复核了单据号为{code}的单据信息", userId); } Db.CommitTran(); return true; } catch (Exception e) { Db.RollbackTran(); throw new Exception(e.Message); } } #region 余料退回入库单 /// /// 余料退回入库单据下发 /// /// /// public ErpModel CreateAsnYuLiao(AsnYuLiaoModel model) { try { var resultModel = new ErpModel() { Success = -1, Message = "" }; if (string.IsNullOrEmpty(model.SONo)) { resultModel.Message = "出库单号不可为空!"; return resultModel; } if (model.UseSkuList.Count <= 0) { resultModel.Message = "已消耗物料信息不可为空!"; return resultModel; } var _dateTime = DateTime.Now; //开启事务 Db.BeginTran(); //出库单信息 var notice = Db.Queryable().First(m => m.IsDel == "0" && m.SONo == model.SONo); if (notice == null) { resultModel.Message = "不存在出库单信息!"; return resultModel; } //拣货明细 var completeDetail = Db.Queryable().Where(w => w.IsDel == "0" && w.SONo == model.SONo).ToList(); //入库总表信息 string asnNo = new Common().GetMaxNo("ASN"); var asnModel = new BllArrivalNotice() { ASNNo = asnNo, Type = "4",//余料退回 Status = "2",//执行完成 Origin = "MES", OrderCode = model.OrderCode, CustomerNo = notice.CustomerNo, CustomerName = notice.CustomerName }; //插入入库单总表 Db.Insertable(asnModel).ExecuteCommand(); //剩余的拣货明细信息 var completeDetailYuList = new List(); //退回托盘集合 var PalletNoList = model.UseSkuList.GroupBy(s => s.PalletNo).Select(s => s.Key).ToList(); foreach (var item in PalletNoList) { //退回托盘物料信息 var useSkuInfo = model.UseSkuList.First(w => w.PalletNo == item); if (useSkuInfo.UseBoxList.Count > 0) { //拣货明细信息 var completeDetailList = completeDetail.Where(w => w.PalletNo == item).ToList(); foreach (var completeDetailModel in completeDetailList) { if (completeDetailModel.SkuNo != useSkuInfo.SkuNo) { resultModel.Message = "退回物料信息和领料物料信息不一致!"; return resultModel; } completeDetailModel.BoxNo2 = completeDetailModel.BoxNo2 == null ? "" : completeDetailModel.BoxNo2; completeDetailModel.BoxNo3 = completeDetailModel.BoxNo3 == null ? "" : completeDetailModel.BoxNo3; var boxModel = useSkuInfo.UseBoxList.FirstOrDefault(w => w.BoxNo == completeDetailModel.BoxNo && w.BoxNo2 == completeDetailModel.BoxNo2 && w.BoxNo3 == completeDetailModel.BoxNo3); if (boxModel == null) { completeDetailYuList.Add(completeDetailModel); } else { if (completeDetailModel.CompleteQty - boxModel.Qty > 0) { completeDetailModel.CompleteQty -= boxModel.Qty; completeDetailYuList.Add(completeDetailModel); } } } } else { //拣货明细信息 var completeDetailInfo = completeDetail.First(w => w.PalletNo == item); completeDetailInfo.CompleteQty = completeDetailInfo.CompleteQty - useSkuInfo.Qty; if (completeDetailInfo.CompleteQty > 0) { completeDetailYuList.Add(completeDetailInfo); } } } //将剩余的拣货明细按照出库单明细id进行分组(相当于按照物料+批次分组) var skuModelList = completeDetailYuList.GroupBy(g => g.SODetailNo).Select(s => s.Key).ToList(); foreach (var item in skuModelList) { var completeDetailYuModelList = completeDetailYuList.Where(w => w.SODetailNo == item).ToList(); decimal bindQty = (decimal)completeDetailYuModelList.Sum(s => s.CompleteQty); //获取物料详细信息 var skuModel = Db.Queryable().First(it => it.SkuNo == completeDetailYuModelList[0].SkuNo && it.IsDel == "0"); //获取包装信息 var pack = Db.Queryable().First(m => m.IsDel == "0" && m.PackagNo == skuModel.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; } //入库单明细信息 var asnDetailModel = new BllArrivalNoticeDetail() { ASNNo = asnNo, SkuNo = completeDetailYuModelList[0].SkuNo, SkuName = completeDetailYuModelList[0].SkuName, Standard = completeDetailYuModelList[0].Standard, LotNo = completeDetailYuModelList[0].LotNo, LotText = completeDetailYuModelList[0].LotText, Qty = bindQty, FactQty = bindQty, CompleteQty = bindQty, PackagNo = skuModel.PackagNo, SupplierLot = completeDetailYuModelList[0].SupplierLot, Status = "0", IsSampling = "0", InspectStatus = "0", CreateUser = 0 }; // 插入入库单明细表 int asnDetailId = Db.Insertable(asnDetailModel).ExecuteReturnIdentity(); //绑定托盘信息 var bindPalletNoList = completeDetailYuModelList.GroupBy(s => s.PalletNo).Select(s => s.Key).ToList(); string hasLocatNoList = string.Empty; foreach (var bindPalletNoItem in bindPalletNoList) { //托盘储位信息 var palletLocatInfo = Db.Queryable().First(w => w.IsDel == "0" && w.PalletNo == bindPalletNoItem); if (palletLocatInfo == null) { resultModel.Message = "托盘所在储位信息不存在!"; return resultModel; } palletLocatInfo.Status = "3";//出库中 //更新储位状态 Db.Updateable(palletLocatInfo).ExecuteCommand(); //获取目标储位地址 SysStorageLocat EndLocat = GetLocat(asnDetailModel.SkuNo, asnDetailModel.LotNo, bindPalletNoItem,hasLocatNoList); if (EndLocat == null) { resultModel.Message = "未找到目标储位地址信息!"; return resultModel; } hasLocatNoList += $"{EndLocat.LocatNo},"; //插入托盘绑定信息 decimal bindPalletQty = (decimal)completeDetailYuList.Where(w => w.PalletNo == bindPalletNoItem).Sum(s => s.CompleteQty); var bind = new BllPalletBind { ASNNo = asnNo, ASNDetailNo = asnDetailId, PalletNo = bindPalletNoItem, PalletNo2 = "", PalletNo3 = "", Qty = bindPalletQty, FullQty = pNum, Status = "0", Type = "0", LotNo = asnDetailModel.LotNo, LotText = asnDetailModel.LotText, SupplierLot = asnDetailModel.SupplierLot, BitPalletMark = "1", IsBale = "0", IsBelt = "0", WareHouseNo= EndLocat.WareHouseNo,//所属仓库 LocatNo=EndLocat.LocatNo,//储位地址 CreateUser = 0 }; // 插入托盘绑定表 int bindId = Db.Insertable(bind).ExecuteReturnIdentity(); List boxInfoList = new List(); var palletCompleteDetailYuModelList = completeDetailYuModelList.Where(w => w.PalletNo == bindPalletNoItem).ToList(); foreach (var completeDetailYuItem in palletCompleteDetailYuModelList) { Expression> exp = Expressionable.Create() .And(it => it.BoxNo== completeDetailYuItem.BoxNo) .AndIF(!string.IsNullOrEmpty(completeDetailYuItem.BoxNo2), it => it.BoxNo2 == completeDetailYuItem.BoxNo2) .AndIF(!string.IsNullOrEmpty(completeDetailYuItem.BoxNo3), it => it.BoxNo3 == completeDetailYuItem.BoxNo3) .ToExpression();//注意 这一句 不能少 var boxinfo = Db.Queryable().Where(exp).OrderByDescending(o => o.CreateTime).First(); if (boxinfo != null) { //箱支明细 var labelModel = new BllBoxInfo() { ASNNo = asnNo, ASNDetailNo = asnDetailId, BoxNo = completeDetailYuItem.BoxNo, BoxNo2 = completeDetailYuItem.BoxNo2, BoxNo3 = completeDetailYuItem.BoxNo3, Qty = (decimal)completeDetailYuItem.CompleteQty, FullQty = boxinfo.FullQty, Status = "2",//已入库 BindNo = bindId, PalletNo = bindPalletNoItem, SkuNo = completeDetailYuItem.SkuNo, SkuName = completeDetailYuItem.SkuName, LotNo = completeDetailYuItem.LotNo, Standard = completeDetailYuItem.Standard, PackageStandard = boxinfo.PackageStandard, SupplierLot = completeDetailYuItem.SupplierLot, InspectMark = boxinfo.InspectMark, BitBoxMark = boxinfo.FullQty > completeDetailYuItem.CompleteQty ? "1" : "0", InspectStatus = "0", ProductionTime = boxinfo.ProductionTime, StoreTime = boxinfo.StoreTime, ExpirationTime = boxinfo.ExpirationTime, Origin = "余料退回", CreateUser = 0, CreateTime = _dateTime, }; boxInfoList.Add(labelModel); } } //插入箱支明细表 Db.Insertable(boxInfoList).ExecuteCommand(); List dataBoxInfoList = new List(); //库存明细 var sd = new DataStockDetail() { LotNo = asnDetailModel.LotNo, LotText = asnDetailModel.LotText, SupplierLot = asnDetailModel.SupplierLot, SkuNo = asnDetailModel.SkuNo, SkuName = asnDetailModel.SkuName, Standard = asnDetailModel.Standard, Qty = bindPalletQty, LockQty = 0, FrozenQty = 0, InspectQty = 0, ASNNo = asnDetailModel.ASNNo, ASNDetailNo = asnDetailId, WareHouseNo = "", RoadwayNo = "", AreaNo = "", LocatNo = "", PalletNo = bindPalletNoItem, PalletNo2 = "", PalletNo3 = "", PalletTags = "1", CompleteTime = _dateTime, ProductionTime = boxInfoList[0].ProductionTime, ExpirationTime = boxInfoList[0].ExpirationTime, Status = "0", InspectMark = "0", InspectStatus = "1", BitPalletMark = "1", PackagNo = asnDetailModel.PackagNo, IsBale = asnDetailModel.IsBale, IsBelt = asnDetailModel.IsBelt, OwnerNo = asnModel.CustomerNo, OwnerName = asnModel.CustomerName, IsDel = "0", CreateUser = 0, CreateTime = _dateTime }; //新增库存明细信息 var sdId = Db.Insertable(sd).ExecuteReturnIdentity(); foreach (var boxItem in boxInfoList) { //库存箱支明细 var box = new DataBoxInfo() { StockDetailId = sdId, BindNo = bindId, BoxNo = boxItem.BoxNo, BoxNo2 = boxItem.BoxNo2, BoxNo3 = boxItem.BoxNo3, PalletNo = boxItem.PalletNo, PalletNo2 = boxItem.PalletNo2, PalletNo3 = boxItem.PalletNo3, Qty = boxItem.Qty, FullQty = boxItem.FullQty, Status = "2", LotNo = boxItem.LotNo, LotText = boxItem.LotText, SkuNo = boxItem.SkuNo, SkuName = boxItem.SkuName, Standard = boxItem.Standard, ProductionTime = boxItem.ProductionTime, SupplierLot = boxItem.SupplierLot, InspectStatus = boxItem.InspectStatus, InspectMark = boxItem.InspectMark, BitBoxMark = boxItem.BitBoxMark, CreateUser = 0, CreateTime = _dateTime }; dataBoxInfoList.Add(box); } //插入库存箱支明细表 Db.Insertable(dataBoxInfoList).ExecuteCommand(); } //库存 var dataStock = Db.Queryable().First(m => m.IsDel == "0" && m.SkuNo == asnDetailModel.SkuNo && m.LotNo == asnDetailModel.LotNo); if (dataStock != null) { dataStock.Qty += bindQty; Db.Updateable(dataStock).ExecuteCommand(); } else { var stock = new DataStock() { SkuNo = asnDetailModel.SkuNo, SkuName = asnDetailModel.SkuName, Standard = asnDetailModel.Standard, LotNo = asnDetailModel.LotNo, LotText = asnDetailModel.LotText, Qty = bindQty, LockQty = 0, FrozenQty = 0, IsSampling = "0", IsDel = "0", CreateUser = 0, CreateTime = _dateTime, OwnerNo = asnModel.CustomerNo,//货主编码 OwnerName = asnModel.CustomerName//货主名称 }; Db.Insertable(stock).ExecuteCommand(); } } #region 调度AGV代码 #endregion //提交事务 Db.CommitTran(); resultModel.Success = 0; resultModel.Message = "成功"; return resultModel; } catch (Exception ex) { Db.RollbackTran(); throw ex; } } private SysStorageLocat GetLocat(string skuNo, string lotNo, string palletNo, string hasLocatNoList = "") { try { var endLocat = new SysStorageLocat();//目标储位 //当然区域所有储位信息 var storageLocatList = Db.Queryable().Where(w => w.WareHouseNo == "W02").ToList(); //同区域同批次物料的储位信息 List locatList = Db.Queryable().Where(w => w.IsDel == "0" && w.SkuNo == skuNo && w.LotNo == lotNo && w.WareHouseNo == "W02" && w.PalletNo != palletNo) .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 && !hasLocatNoList.Contains(w.LocatNo)) .OrderByDescending(o => o.Column).First(); if (locatInfo2 != null) { endLocat = locatInfo2; } } if (endLocat != null) { var locatInfo3 = storageLocatList.Where(w => w.IsDel == "0" && w.Flag == "0" && w.Status == "0" && !hasLocatNoList.Contains(w.LocatNo)) .OrderByDescending(m => m.Layer).OrderByDescending(m => m.Column).OrderByDescending(m => m.Row).First(); if (locatInfo3 != null) { endLocat = locatInfo3; } } return endLocat; } catch (Exception ex) { throw new Exception(ex.Message); } } #endregion #endregion #region 数据归档 public List GetArchivingArrivalNoticeList(ArrivalNoticeVm model, out int count) { string sqlString = string.Empty; string sqlCount = string.Empty; string sqlPub = string.Empty; try { sqlCount += "SELECT DISTINCT COUNT(tb1.ID) FROM ArchivingArrivalNotice AS tb1 "; sqlString += "SELECT DISTINCT tb1.*,tb3.RealName as CreateUserName,tb4.RealName as UpdateUserName,tb5.RealName as CheckUserName FROM ArchivingArrivalNotice AS tb1 "; sqlPub += "LEFT JOIN ArchivingArrivalNoticeDetail AS tb2 ON tb1.ASNNo = tb2.ASNNo "; sqlPub += "LEFT JOIN SysUserInfor AS tb3 ON tb1.CreateUser = tb3.Id "; sqlPub += "LEFT JOIN SysUserInfor AS tb4 ON tb1.UpdateUser = tb4.Id "; sqlPub += "LEFT JOIN SysUserInfor AS tb5 ON tb1.CheckUser = tb5.Id "; sqlPub += $"WHERE tb1.ASNNo LIKE '%{model.ASNNo}%' AND tb2.LotNo LIKE '%{model.LotNo}%' "; sqlPub += $"AND tb2.SkuNo LIKE '%{model.SkuNo}%' AND tb2.SkuName LIKE '%{model.SkuName}%' "; sqlPub += $"AND tb1.CustomerName LIKE '%{model.CustomerName}%' "; if (!string.IsNullOrEmpty(model.Status)) { sqlPub += $"AND tb1.Status = '{model.Status}' "; } if (!string.IsNullOrEmpty(model.Type)) { if (model.Type == "3") { sqlPub += $"AND tb1.Type = '{model.Type}' "; } else { sqlPub += $"AND tb1.Type = '{model.Type}' AND tb1.Type != '3' "; } } else { sqlPub += " AND tb1.Type != '3'"; } if (!string.IsNullOrEmpty(model.StartTime)) { sqlPub += $"AND tb1.CreateTime >= '{model.StartTime}' "; } if (!string.IsNullOrEmpty(model.EndTime)) { sqlPub += $"AND tb1.CreateTime <= '{model.EndTime}' "; } sqlCount += sqlPub + "AND tb1.IsDel = '0' "; sqlPub += "AND tb1.IsDel = '0' order by tb1.ASNNo desc "; if (model.Page == 0) { model.Page = 1; } sqlString += sqlPub + $" offset {((model.Page - 1) * model.Limit)} rows fetch next {model.Limit} rows only;"; var com = new Common(); count = com.GetRowCount(sqlCount); var modelList = Db.Ado.SqlQuery(sqlString); return modelList; } catch (Exception ex) { throw ex; } } public List GetArchivingArrivalNoticeDetailList(ArrivalNoticeDetailVm model, out int count) { string sqlString = string.Empty; string sqlCount = string.Empty; int rowCount = 1; try { if (model.Page == 0) { model.Page = 1; } sqlCount += $"SELECT COUNT(ID) FROM ArchivingArrivalNoticeDetail where ASNNo = '{model.ASNNo}' and isdel = '0';"; var com = new Common(); count = com.GetRowCount(sqlCount); if (count != 0) { rowCount = count; } sqlString += "SELECT DISTINCT tb1.*,tb2.Type as AsnType,tb2.Status as AsnStatus,tb3.RealName as CreateUserName, "; sqlString += "tb4.RealName as UpdateUserName,isnull(tb6.UnitName,tb5.UnitNo) as UnitName,tb7.PackagName "; sqlString += "FROM ArchivingArrivalNoticeDetail AS tb1 "; sqlString += "LEFT JOIN ArchivingArrivalNotice AS tb2 ON tb1.ASNNo = tb2.ASNNo "; sqlString += "LEFT JOIN SysUserInfor AS tb3 ON tb1.CreateUser = tb3.Id "; sqlString += "LEFT JOIN SysUserInfor AS tb4 ON tb1.UpdateUser = tb4.Id "; sqlString += "LEFT JOIN SysMaterials AS tb5 on tb1.SkuNo = tb5.SkuNo "; sqlString += "LEFT JOIN SysUnit AS tb6 on tb5.UnitNo = tb6.UnitNo "; sqlString += "LEFT JOIN SysPackag AS tb7 on tb1.PackagNo = tb7.PackagNo "; sqlString += $"WHERE tb1.ASNNo = '{model.ASNNo}' AND tb1.IsDel = '0' order by tb1.SkuNo desc "; sqlString += $"offset {((model.Page - 1) * model.Limit)} rows fetch next {rowCount} rows only;"; var modelList = Db.Ado.SqlQuery(sqlString); return modelList; } catch (Exception ex) { throw ex; } } #endregion } }