using Masuit.Tools.Models; using NewPdaSqlServer.DB; using NewPdaSqlServer.Dto.service; using NewPdaSqlServer.entity; using NewPdaSqlServer.entity.Base; using NewPdaSqlServer.service.@base; using NewPdaSqlServer.util; using Newtonsoft.Json; using SqlSugar; using static Microsoft.EntityFrameworkCore.DbLoggerCategory; namespace NewPdaSqlServer.service.Warehouse; public class MesInvItemInCDetailsManager : Repository { //当前类已经继承了 Repository 增、删、查、改的方法 public ItemInBaseModel SaveBarCodes(WarehouseQuery entity) { string functionName = "采购入库", fieldName = null, inFieldVal = null; string user = entity.userName, sectionCode = entity.sectionCode, itemBarcode = entity.barcode; var transactionNo = "101"; int? billTypeId = 100, num = 0, num2 = 0; var freeze = 0; decimal cSyQty = 0; //if (string.IsNullOrEmpty(sectionCode)) // throw new Exception("请扫库位条码!"); var itemBarcodeDetails = Db.Queryable() .Where(it => it.ItemBarcode == itemBarcode) .First(); //if (itemBarcodeDetails == null) // throw new Exception("条码不存在,请核对!"); if (string.IsNullOrEmpty(itemBarcodeDetails.Memo) || itemBarcodeDetails.Memo != "采购入库") throw new Exception("此条码不属于到货条码,无法用采购入库!"); var inventory = Db.Queryable() .Where(it => it.BillNo == itemBarcodeDetails.BillNo) .First(); if (inventory == null) throw new Exception("此条码找不到对应收货单!"); // var inventoryDetails = Db.Queryable() // .Where(it => it.ParentGuid == inventory.Guid // && it.ItemId == itemBarcodeDetails.ItemId // && it.EbelnLine == itemBarcodeDetails.WorkLine // && it.Ebeln == itemBarcodeDetails.WorkNo) // .First(); var inventoryDetails = Db.Queryable() .Where(it => it.Guid == itemBarcodeDetails.AboutGuid) .First(); var cgddDetails = Db.Queryable() .Where(it => it.EbelnK3id == inventoryDetails.LineK3id) .First(); if (inventoryDetails == null) throw new Exception("此条码找不到对应收货单明细!"); //if (string.IsNullOrEmpty(inventoryDetails.CheckRes) || inventoryDetails.CheckRes != "Y:合格") //{ // throw new Exception("该条码对应的收料单检验不合格或未检验!"); //} var depotCode = Db.Queryable() .Where(it => it.DepotSectionCode == sectionCode) .Select(it => it.DepotGuid) .First(); var depotCode2 = Db.Queryable() .Where(it => it.BillNo == itemBarcodeDetails.BillNo) .Select(it => it.DepotsId) .First(); MesDepots mesDepost = null; var checkGuid = UtilityHelper.CheckGuid(depotCode); if (checkGuid && depotCode2 != null) { mesDepost = Db.Queryable() .Where(s => s.DepotId.ToString() == depotCode2).First(); // if (depotCode != mesDepost.Guid) // throw new Exception("扫描库位与采购入库库位不一致!"); } else { throw new Exception("库位编码 " + sectionCode + " 不存在,请确认!"); } //num = Db.Queryable() // .Where(it => it.ItemBarcode == itemBarcode) // .Count(); //if (num > 0) // throw new Exception("此条码已扫码入库完成,请核对!"); //num = Db.Queryable() // .Where(it => it.ItemBarcode == itemBarcode) // .Count(); //if (num > 0) // throw new Exception("此条码已扫码入库,请核对!"); var wmsManager = new WmsBaseMangeer(); // 新增入库校验(调用存储过程) var checkResult = wmsManager.pdaInvJY( db: Db, edtUserNo: entity.userName, barcode: entity.barcode, sectionCode: sectionCode, stockId: mesDepost.DepotId.ToString(), stockOrgId: mesDepost.FSubsidiary, billNo: "", // 根据实际单据号传值 transactionNo: "101" // 事务类型与存储过程匹配 ); if (Convert.ToInt32(checkResult.result) < 1) throw new Exception($"入库校验失败:{checkResult.strMsg}"); //num = Db.Queryable() // .Where(a => a.BillNo == itemBarcodeDetails.BillNo) // .InnerJoin((a, b) => // b.ParentGuid == a.Guid && // b.ItemId == itemBarcodeDetails.ItemId && b.Ischeck == 1) // .Count(); //num2 = Db.Queryable() // .Where(a => a.BillNo == itemBarcodeDetails.BillNo) // .InnerJoin((a, b) => b.ParentGuid == a.Guid // && b.ItemId == itemBarcodeDetails.ItemId // && (b.CheckRes == "合格" || b.CheckStates == "特采直接使用")) // .Count(); //switch (num) //{ // case 0 when num2 == 0: // case > 0 when num2 == 0: // freeze = 1; // break; // case 0 when num2 > 0: // throw new Exception("入库失败,到货单据有问题!"); //} // 判断货主类型 var owner_type = wmsManager.GetOwnerType(cgddDetails.DemandOrg); // if (Db.Queryable().Any(x => x.Fid == cgddDetails.DemandOrg)) // { // owner_type = "BD_OwnerOrg"; // } // else // { // // 第二层判断:检查 MES_CUSTOMER // if (Db.Queryable().Any(x => x.Id == Convert.ToInt32(cgddDetails.DemandOrg))) // { // owner_type = "BD_Customer"; // } // else // { // // 第三层判断:检查 MES_SUPPLIER // if (Db.Queryable().Any(x => x.Id == Convert.ToInt32(cgddDetails.DemandOrg))) // { // owner_type = "BD_Supplier"; // } // else // { // // 第四层判断:再次检查 SYS_ORGANIZATION // if (Db.Queryable().Any(x => x.Fid == cgddDetails.ReceivingOrg)) // { // owner_type = "BD_OwnerOrg"; // } // else // { // throw new Exception("入库失败,到货单据对应的需求组织有问题!"); // } // } // } //} var result = new ItemInBaseModel(); UseTransaction(db => { var existingRecord = db.Queryable() .Where(it => it.InsDate.Value.ToString("yyyy-MM-dd") == DateTime.Now.ToString("yyyy-MM-dd") && it.TaskNo == itemBarcodeDetails.BillNo && it.Status == 0 && it.TransctionNo == transactionNo && it.CreateBy == entity.userName && it.BillTypeId == billTypeId && it.DepotsId == mesDepost.DepotId) .Select(it => new { it.Guid, it.BillNo }) .First(); var cId = Guid.Empty; string cBillNo = null; if (existingRecord != null) { // If record exists, assign values cId = existingRecord.Guid; cBillNo = existingRecord.BillNo; } else { cId = Guid.NewGuid(); cBillNo = BillNo.GetBillNo("CGRK(采购入库)"); var suppNo = db.Queryable() .Where(s => s.Id.ToString() == inventory.SuppId).First(); db.Insertable(new MesInvItemIns { Guid = cId, BillNo = cBillNo, BillTypeId = billTypeId, InsDate = DateTime.Now, DepotsId = mesDepost.DepotId, DepotsCode = mesDepost.DepotCode, TransctionNo = transactionNo, SuppId = suppNo.Id.ToString(), SuppNo = suppNo.SuppNo, CreateBy = user, CreateDate = DateTime.Now, LastupdateBy = user, LastupdateDate = DateTime.Now, UrgentFlag = itemBarcodeDetails.UrgentFlag.Value ? "1" : "0", CbillNo = itemBarcodeDetails.BillNo, Fstatus = 0, Status = 0, ReceiveOrgId = inventory.ReceiveOrgId, InType = "采购入库", TaskNo = itemBarcodeDetails.BillNo //WorkNo = itemBarcodeDetails.WorkNo }).IgnoreColumns(true).ExecuteCommand(); } cSyQty = itemBarcodeDetails.Quantity.Value; entity.id = cId.ToString(); entity.PageIndex = 1; entity.Limit = 1; itemBarcodeDetails.Hbdy ??= 0; if (itemBarcodeDetails.Hbdy == 1) { var details = db.Queryable() .Where(d => d.CbillNo == itemBarcodeDetails.BillNo && d.Quantity != d.OkRkqty && d.ItemId == itemBarcodeDetails.ItemId) .ToList(); foreach (var detail in details) { if (cSyQty == 0) break; var remainingQty = detail.Quantity - (detail.OkRkqty ?? 0); if (remainingQty <= cSyQty) { // Update detail db.Updateable() .SetColumns(d => new MesInvItemArnDetail { OkRkqty = (int)d.Quantity, IsdepsIn = true }) .Where(d => d.Guid == detail.Guid) .IgnoreColumns(true) .ExecuteCommand(); // Check if already inserted var count = db.Queryable() .Where(it => it.ItemInId == cId && it.ItemId == detail.ItemId && it.DepotId == depotCode2 && it.EbelnK3id == detail.EbelnK3id && it.LineK3id == detail.LineK3id) .Count(); cSyQty -= remainingQty.Value; if (count == 0) // Insert new item into MES_INV_ITEM_IN_C_ITEMS db.Insertable(new MesInvItemInCItems { ItemInId = cId, Quantity = remainingQty, CreateBy = user, CreateDate = DateTime.Now, ItemId = detail.ItemId, DepotCode = mesDepost.DepotCode, ItemSname = itemBarcodeDetails.ItemSname, Unit = itemBarcodeDetails.Unit, Ebeln = detail.Ebeln, BillNo = cBillNo, WorkNo = detail.WorkNo, CbillNo = detail.CbillNo, WorkLine = detail.WorkLine, SuppId = itemBarcodeDetails.SuppId, SuppNo = itemBarcodeDetails.SuppNo, Remark = itemBarcodeDetails.Memo, EbelnK3id = detail.EbelnK3id, LineK3id = detail.LineK3id, DepotId = depotCode2, itemDabid = itemBarcodeDetails.AboutGuid.ToString() }).IgnoreColumns(true).ExecuteCommand(); else db.Updateable() .SetColumns(it => it.Quantity == it.Quantity + remainingQty) .Where(it => it.ItemInId == cId && it.ItemId == detail.ItemId && it.DepotId == depotCode2 && it.EbelnK3id == detail.EbelnK3id && it.LineK3id == detail.LineK3id) .IgnoreColumns(true) .ExecuteCommand(); // Insert new detail into MES_INV_ITEM_IN_C_DETAILS db.Insertable(new MesInvItemInCDetails { ItemInId = cId, BillNo = cBillNo, ItemBarcode = itemBarcode, Quantity = remainingQty, BarcodeFlag = true, EpFlag = true, WorkType = 1, ItemNo = detail.ItemNo, SuppId = itemBarcodeDetails.SuppId, SuppNo = itemBarcodeDetails.SuppNo, DepotCode = mesDepost.DepotCode, DepotSectionCode = sectionCode, ItemSname = itemBarcodeDetails.ItemSname, Unit = itemBarcodeDetails.Unit, CreateBy = user, CreateDate = DateTime.Now, LastupdateBy = user, LastupdateDate = DateTime.Now, Remark = itemBarcodeDetails.Memo, Ebeln = detail.WorkNo, WorkNo = detail.WorkNo, WorkLine = detail.WorkLine, CbillNo = itemBarcodeDetails.BillNo, UrgentFlag = detail.UrgentFlag, BoardStyle = detail.BoardStyle, TaskNo = detail.WorkNo, EbelnK3id = detail.EbelnK3id, LineK3id = detail.LineK3id, ItemId = detail.ItemId, ReceiveOrgId = inventory.ReceiveOrgId, LotNo = cgddDetails.BatchNumber }).IgnoreColumns(true).ExecuteCommand(); } else { // Partially fulfill remaining quantity db.Updateable() .SetColumns(d => new MesInvItemArnDetail { OkRkqty = (int)((d.OkRkqty ?? 0) + cSyQty) }) .Where(d => d.Guid == detail.Guid) .IgnoreColumns(true) .ExecuteCommand(); var count = db.Queryable() .Where(it => it.ItemInId == cId && it.ItemId == detail.ItemId && it.DepotId == depotCode2 && it.EbelnK3id == detail.EbelnK3id && it.LineK3id == detail.LineK3id) .Count(); if (count == 0) db.Insertable(new MesInvItemInCItems { ItemInId = cId, Quantity = cSyQty, CreateBy = user, CreateDate = DateTime.Now, ItemNo = detail.ItemNo, DepotCode = mesDepost.DepotCode, ItemSname = itemBarcodeDetails.ItemSname, Unit = itemBarcodeDetails.Unit, Ebeln = detail.WorkNo, BillNo = cBillNo, WorkNo = detail.WorkNo, EbelnLineNo = detail.EbelnLine, CbillNo = detail.CbillNo, WorkLine = detail.WorkLine, SuppId = itemBarcodeDetails.SuppId, SuppNo = itemBarcodeDetails.SuppNo, Remark = itemBarcodeDetails.Memo, EbelnK3id = detail.EbelnK3id, LineK3id = detail.LineK3id, ItemId = detail.ItemId, DepotId = depotCode2 }).IgnoreColumns(true).ExecuteCommand(); else db.Updateable() .SetColumns(it => it.Quantity == it.Quantity + cSyQty) .Where(it => it.ItemInId == cId && it.ItemId == detail.ItemId && it.DepotId == depotCode2 && it.EbelnK3id == detail.EbelnK3id && it.LineK3id == detail.LineK3id) .IgnoreColumns(true) .ExecuteCommand(); db.Insertable(new MesInvItemInCDetails { ItemInId = cId, BillNo = cBillNo, ItemBarcode = itemBarcode, Quantity = cSyQty, BarcodeFlag = true, EpFlag = true, WorkType = 1, ItemNo = detail.ItemNo, SuppId = itemBarcodeDetails.SuppId, SuppNo = itemBarcodeDetails.SuppNo, DepotCode = mesDepost.DepotCode, DepotSectionCode = sectionCode, ItemSname = itemBarcodeDetails.ItemSname, Unit = itemBarcodeDetails.Unit, CreateBy = user, CreateDate = DateTime.Now, LastupdateBy = user, LastupdateDate = DateTime.Now, Remark = itemBarcodeDetails.Memo, Ebeln = detail.WorkNo, EbelnLineNo = detail.EbelnLine, WorkNo = detail.WorkNo, WorkLine = detail.WorkLine, CbillNo = itemBarcodeDetails.BillNo, UrgentFlag = detail.UrgentFlag, BoardStyle = detail.BoardStyle, TaskNo = detail.WorkNo, EbelnK3id = detail.EbelnK3id, LineK3id = detail.LineK3id, ItemId = detail.ItemId, ReceiveOrgId = inventory.ReceiveOrgId, LotNo = cgddDetails.BatchNumber }).IgnoreColumns(true).ExecuteCommand(); cSyQty = 0; // Remaining quantity fulfilled } } db.Insertable(new MesInvBusiness2 { Status = 1, BillTypeId = billTypeId, TransactionCode = transactionNo, BusinessType = 1, ItemBarcode = itemBarcode, ItemNo = itemBarcodeDetails.ItemNo, LotNo = cgddDetails.BatchNumber, EpFlag = true, Quantity = itemBarcodeDetails.Quantity, ToInvDepotsCode = mesDepost.DepotCode, ToInvDepotSectionsCode = sectionCode, Description = "采购入库", CreateBy = user, CreateDate = DateTime.Now, LastupdateBy = user, LastupdateDate = DateTime.Now, TaskNo = itemBarcodeDetails.BillNo, BillNo = cBillNo, WorkNo = itemBarcodeDetails.WorkNo, WorkLine = itemBarcodeDetails.WorkLine, SuppId = itemBarcodeDetails.SuppId, SuppNo = itemBarcodeDetails.SuppNo, EbelnK3id = itemBarcodeDetails.EbelnK3id, LineK3id = itemBarcodeDetails.LineK3id, ItemId = itemBarcodeDetails.ItemId }).IgnoreColumns(true).ExecuteCommand(); // Insert into mes_inv_item_stocks } else { var detailone = db.Queryable() .Where(d => d.Guid == itemBarcodeDetails.AboutGuid) .First(); // 检查是否存在于 MES_INV_ITEM_IN_C_ITEMS 表 var existingCount = db.Queryable() .Where(it => it.ItemInId == cId && it.ItemId == detailone.ItemId && it.DepotId == depotCode2 && it.itemDabid == itemBarcodeDetails.AboutGuid.ToString()) .Count(); if (existingCount == 0) // 不存在时插入新记录 db.Insertable(new MesInvItemInCItems { ItemInId = cId, Quantity = itemBarcodeDetails.Quantity, CreateBy = user, CreateDate = DateTime.Now, ItemNo = itemBarcodeDetails.ItemNo, DepotCode = mesDepost.DepotCode, ItemSname = itemBarcodeDetails.ItemSname, Unit = itemBarcodeDetails.Unit, Ebeln = itemBarcodeDetails.WorkNo, BillNo = cBillNo, WorkNo = itemBarcodeDetails.WorkNo, EbelnLineNo = itemBarcodeDetails.WorkLine, CbillNo = itemBarcodeDetails.BillNo, WorkLine = itemBarcodeDetails.WorkLine, SuppId = itemBarcodeDetails.SuppId, SuppNo = itemBarcodeDetails.SuppNo, Remark = itemBarcodeDetails.Memo, EbelnK3id = itemBarcodeDetails.EbelnK3id, LineK3id = itemBarcodeDetails.LineK3id, ItemId = itemBarcodeDetails.ItemId, DepotId = depotCode2, itemDabid = itemBarcodeDetails.AboutGuid.ToString() }).IgnoreColumns(true).ExecuteCommand(); else // 存在时更新数量 db.Updateable() .SetColumns(it => new MesInvItemInCItems { Quantity = SqlFunc.IsNull(it.Quantity, 0) + itemBarcodeDetails.Quantity // 确保 Quantity 不为 null }) .Where(it => it.ItemInId == cId && it.ItemId == detailone.ItemId && it.DepotId == depotCode2 && it.itemDabid == itemBarcodeDetails.AboutGuid.ToString()) //.IgnoreColumns(true) // 保留 IgnoreColumns .ExecuteCommand(); // 插入 mes_inv_item_in_c_details 表 db.Insertable(new MesInvItemInCDetails { ItemInId = cId, BillNo = cBillNo, ItemBarcode = itemBarcode, Quantity = itemBarcodeDetails.Quantity, BarcodeFlag = true, EpFlag = true, WorkType = 1, ItemNo = itemBarcodeDetails.ItemNo, LotNo = cgddDetails.BatchNumber, SuppId = itemBarcodeDetails.SuppId, SuppNo = itemBarcodeDetails.SuppNo, DepotCode = mesDepost.DepotCode, DepotSectionCode = sectionCode, ItemSname = itemBarcodeDetails.ItemSname, Unit = itemBarcodeDetails.Unit, CreateBy = user, CreateDate = DateTime.Now, LastupdateBy = user, LastupdateDate = DateTime.Now, Remark = itemBarcodeDetails.Memo, Ebeln = itemBarcodeDetails.Mblnr, EbelnLineNo = itemBarcodeDetails.Zeile, WorkNo = itemBarcodeDetails.WorkNo, WorkLine = itemBarcodeDetails.WorkLine, CbillNo = itemBarcodeDetails.BillNo, UrgentFlag = itemBarcodeDetails.UrgentFlag, BoardStyle = itemBarcodeDetails.BoardStyle, TaskNo = itemBarcodeDetails.TaskNo, EbelnK3id = itemBarcodeDetails.EbelnK3id, LineK3id = itemBarcodeDetails.LineK3id, ItemId = itemBarcodeDetails.ItemId, Ischeck = true, CheckDate = inventoryDetails.CheckDate, CheckRes = inventoryDetails.CheckRes, CheckStates = inventoryDetails.CheckStates, ReceiveOrgId = inventory.ReceiveOrgId, DepotId = Convert.ToInt64(depotCode2) }).IgnoreColumns(true).ExecuteCommand(); // 插入 mes_inv_business2 表 db.Insertable(new MesInvBusiness2 { Status = 1, BillTypeId = billTypeId, TransactionCode = transactionNo, BusinessType = 1, ItemBarcode = itemBarcode, ItemNo = itemBarcodeDetails.ItemNo, LotNo = itemBarcodeDetails.LotNo, EpFlag = true, Quantity = itemBarcodeDetails.Quantity, FromInvDepotsCode = null, FromInvDepotSectionsCode = null, ToInvDepotsCode = mesDepost.DepotCode, ToInvDepotSectionsCode = sectionCode, Description = "采购入库", CreateBy = user, CreateDate = DateTime.Now, LastupdateBy = user, LastupdateDate = DateTime.Now, TaskNo = itemBarcodeDetails.TaskNo, BillNo = cBillNo, WorkNo = itemBarcodeDetails.WorkNo, WorkLine = itemBarcodeDetails.WorkLine, SuppId = itemBarcodeDetails.SuppId, SuppNo = itemBarcodeDetails.SuppNo, EbelnK3id = itemBarcodeDetails.EbelnK3id, LineK3id = itemBarcodeDetails.LineK3id, ItemId = itemBarcodeDetails.ItemId }).IgnoreColumns(true).ExecuteCommand(); // 插入 mes_inv_item_stocks 表 } db.Insertable(new MesInvItemStocks { TaskNo = itemBarcodeDetails.TaskNo, ItemBarcode = itemBarcode, ItemNo = cgddDetails.BatchNumber, LotNo = itemBarcodeDetails.LotNo, Quantity = itemBarcodeDetails.Quantity, DepotsCode = mesDepost.DepotCode, DepotSectionsCode = sectionCode, CheckDate = inventoryDetails.CheckDate, IndepDate = DateTime.Now, IqcStatus = inventoryDetails.CheckStates, BoardStyle = itemBarcodeDetails.BoardStyle, WorkNo = itemBarcodeDetails.WorkNo, WorkLine = itemBarcodeDetails.WorkLine, SuppId = itemBarcodeDetails.SuppId, SuppNo = itemBarcodeDetails.SuppNo, EbelnK3id = itemBarcodeDetails.EbelnK3id, LineK3id = itemBarcodeDetails.LineK3id, ItemId = itemBarcodeDetails.ItemId, BillNo = itemBarcodeDetails.BillNo, DepotId = Convert.ToInt32(depotCode2), OwnerId = cgddDetails.DemandOrg, OwnerType = owner_type, StockOrgId = mesDepost.FSubsidiary, IndepUserCode = user }).IgnoreColumns(true).ExecuteCommand(); itemBarcodeDetails.Hbdy ??= 0; if (itemBarcodeDetails.Hbdy != 1) { //更新收料单明细 db.Updateable() .SetColumns(d => new MesInvItemArnDetail { OkRkqty = (int)((d.OkRkqty ?? 0) + cSyQty) }) .Where(d => d.Guid == itemBarcodeDetails.AboutGuid) .ExecuteCommand(); var first = db .Queryable() .Where(b => b.Guid == itemBarcodeDetails.AboutGuid) .Select(b => new { TotalQuantity = SqlFunc.AggregateSum(b.Quantity), TotalOkRkQty = SqlFunc.AggregateSum(b.OkRkqty) }) .First(); var TotalQuantity = first.TotalQuantity ?? 0; var TotalOkRkQty = first.TotalOkRkQty ?? 0; if (TotalQuantity == TotalOkRkQty) db.Updateable() .SetColumns(s => s.IsdepsIn == true) .Where(s => s.Guid == itemBarcodeDetails.AboutGuid) .ExecuteCommand(); var totalSummary = db.Queryable() .InnerJoin((b, a) => a.Guid == b.ParentGuid) .Where((b, a) => a.BillNo == inventory.BillNo && b.ReturnFlag == 0) .Select((b, a) => new { TotalQuantity = SqlFunc.AggregateSum(b.Quantity), TotalOkRkQty = SqlFunc.AggregateSum(b.OkRkqty) }) .First(); if ((totalSummary.TotalQuantity ?? 0) == (totalSummary.TotalOkRkQty ?? 0)) db.Updateable() .SetColumns(it => it.Status == 1) .Where(it => it.BillNo == itemBarcodeDetails.BillNo) .ExecuteCommand(); var totalCDetailsQuantity = db.Queryable() .Where(it => it.ItemId == itemBarcodeDetails.ItemId && it.WorkNo == itemBarcodeDetails.WorkNo && it.ItemInId == cId) .Sum(it => it.Quantity); var detailSummary = db.Queryable() .Where(it => it.Guid == inventoryDetails.Guid) .Select(it => new { TotalComeQty = SqlFunc.AggregateSum(it.Quantity), TotalInvQty = SqlFunc.AggregateSum(it.OkRkqty) }) .First(); var comeQty = detailSummary.TotalComeQty ?? 0; var invQty = detailSummary.TotalInvQty ?? 0; var diffQty = comeQty - invQty; if (detailSummary == null) throw new Exception("此条码找不到对应收货单明细!"); var mesItems = db.Queryable() .Where(s => s.Id == itemBarcodeDetails.ItemId).First(); //result.Message = // $"条码数量 {itemBarcodeDetails.Quantity},采购订单 {itemBarcodeDetails.WorkNo} 项次 {itemBarcodeDetails.WorkLine} 物料 {mesItems.ItemNo} 本次入库总数:{totalCDetailsQuantity} 总到 {comeQty} 已入 {invQty} 欠 {diffQty}"; result.Message = $"物料{mesItems.ItemNo}入库成功数量{itemBarcodeDetails.Quantity.ToString()}"; result.itemDetail = mesItems; result.ItemInDetails = db.Queryable( (a, b) => new JoinQueryInfos( JoinType.Left, a.ItemId == b.ItemId) ) .Where(a => a.ItemInId == cId && a.ItemId == itemBarcodeDetails.ItemId) .Select((a, b) => new { ItemNo = b.ItemNo, ItemName = b.ItemName, ItemModel = b.ItemModel, FQty = a.Quantity, // 申请数量 FMaterialId = b.ItemId, Id = b.Guid.ToString() }) .ToList(); result.ItemBarCDetails = db.Queryable( (a, b) => new JoinQueryInfos( JoinType.Left, a.ItemId == b.ItemId) ) .Where(a => a.ItemInId == cId && a.ItemId == itemBarcodeDetails.ItemId) .Select((a, b) => new { ItemNo = b.ItemNo, ItemName = b.ItemName, ItemModel = b.ItemModel, FQty = a.Quantity, // 申请数量 FMaterialId = b.ItemId, Id = a.Guid.ToString(), kw = a.DepotSectionCode }) .ToList(); //result.ItemNo = mesItems.ItemNo; result.SumQuantity = Convert.ToDecimal(invQty); return 1; } else { // Step 1: Check if bill needs to be closed (status update) var totalSummary = db.Queryable() .LeftJoin((b, a) => a.Guid == b.ParentGuid) .Where((b, a) => a.BillNo == inventory.BillNo && b.ReturnFlag == 0) .Select((b, a) => new { TotalQuantity = SqlFunc.AggregateSum(b.Quantity), TotalOkRkQty = SqlFunc.AggregateSum(b.OkRkqty) }) .First(); if ((totalSummary.TotalQuantity ?? 0) == (totalSummary.TotalOkRkQty ?? 0)) db.Updateable() .SetColumns(it => it.Status == 1) .Where(it => it.BillNo == itemBarcodeDetails.BillNo) .ExecuteCommand(); // Step 2: Calculate total sum from `mes_inv_item_in_c_details` var totalCDetailsQuantity = db.Queryable() .Where(it => it.Guid == itemBarcodeDetails.AboutGuid) .Sum(it => it.Quantity); // Step 3: Calculate comeQty and invQty from `mes_inv_item_arn_detail` var detailSummary = db.Queryable() .Where(it => it.Guid == itemBarcodeDetails.AboutGuid) .Select(it => new { TotalComeQty = SqlFunc.AggregateSum(it.Quantity), TotalInvQty = SqlFunc.AggregateSum(it.OkRkqty) }) .First(); if (detailSummary == null) throw new Exception("此条码找不到对应收货单明细!"); var comeQty = detailSummary.TotalComeQty ?? 0; var invQty = detailSummary.TotalInvQty ?? 0; var diffQty = comeQty - invQty; var mesItems = db.Queryable() .Where(s => s.Id == itemBarcodeDetails.ItemId).First(); // Step 5: Combine final result result.Message = $" 条码数量:{itemBarcodeDetails.Quantity},物料 {mesItems.ItemNo} 本次入库总数:{totalCDetailsQuantity} 总到 {comeQty} 已入 {invQty} 欠 {diffQty}"; //result.ItemNo = mesItems.ItemNo; result.SumQuantity = Convert.ToDecimal(totalCDetailsQuantity); } var mesInvItemInCDetails = base.GetSingle(it => it.ItemBarcode == entity.barcode); if (mesInvItemInCDetails == null) throw new Exception("物料入库条码明细不存在"); // 抛出异常以供前台处理 // 创建 插入日志 var logService = new LogService(); var LogMsg = "【PDA】采购入库。条码【" + entity.barcode + "】 入库单号【" + cBillNo + "】"; logService.CreateLog(db, entity.userName, inventory.Guid.ToString(), "MES_INV_ITEM_ARN", LogMsg, inventory.BillNo); return 1; }); var purchaseInventory = getPurchaseInventory(entity); //result.ItemInDetails = purchaseInventory.ItemInDetails; //result.InvItemInCDetails = purchaseInventory.InvItemInCDetails; return result; } public ItemInBaseModel getPurchaseInventory(WarehouseQuery query) { return new ItemInBaseModel { //ItemIns = GetInvItemInsList(query).Items[0], //ItemInDetails = GetItemInDetails(query.id), //InvItemInCDetails = GetInvItemInCDetails(query.id) }; } public (List Items, int TotalCount) GetInvItemInsList( WarehouseQuery query) { var parsedGuid = Guid.Empty; if (!string.IsNullOrEmpty(query.id)) { var isValid = Guid.TryParse(query.id, out parsedGuid); if (!isValid) throw new ApplicationException("GUID转换错误"); } var totalCount = 0; var result = Db.Queryable( (a, b, c) => new JoinQueryInfos(JoinType.Left, a.DepotsId == b.DepotId, JoinType.Left, a.SuppId == c.Id.ToString())) .WhereIF(UtilityHelper.CheckGuid(parsedGuid), (a, b, c) => a.Guid == parsedGuid) .Select((a, b, c) => new MesInvItemIns { Guid = a.Guid, SuppNo = a.SuppNo, InsDate = a.InsDate, PaperBillNo = a.PaperBillNo, Remark = a.Remark, DepotsCode = a.DepotsCode, CbillNo = a.CbillNo, Status = a.Status, BillNo = a.BillNo, CreateDate = a.CreateDate, CreateBy = a.CreateBy, DepotName = b.DepotName, SuppName = c.SuppName }).ToPageList(query.PageIndex, query.Limit, ref totalCount); return (result, totalCount); } public List GetItemInDetails(string? pid) { //string转guid var parsedGuid = Guid.Empty; if (string.IsNullOrEmpty(pid)) return []; var isValid = Guid.TryParse(pid, out parsedGuid); if (!isValid) throw new ApplicationException("GUID转换错误"); var result = Db.Queryable( (g, c, d) => new JoinQueryInfos( JoinType.Left, g.ItemId == c.Id, JoinType.Inner, d.Id == Convert.ToDecimal(g.Unit) ) ).WhereIF(UtilityHelper.CheckGuid(parsedGuid), (g, c, d) => g.ItemInId == parsedGuid) .Select((g, c, d) => new MesInvItemInCItems { Guid = g.Guid, WorkNo = g.WorkNo, ItemNo = c.ItemNo, ItemSname = g.ItemSname, Quantity = g.Quantity, Unit = d.Fname }) .ToList(); return result; } public List GetInvItemInCDetails(string? pid) { //string转guid var parsedGuid = Guid.Empty; if (string.IsNullOrEmpty(pid)) return []; var isValid = Guid.TryParse(pid, out parsedGuid); if (!isValid) throw new ApplicationException("GUID转换错误"); var result = Db.Queryable( (g, c, d) => new JoinQueryInfos( JoinType.Left, g.ItemId == c.Id, JoinType.Inner, d.Id.ToString() == c.Fpurchaseunitid ) ).WhereIF(UtilityHelper.CheckGuid(parsedGuid), (g, c, d) => g.ItemInId == parsedGuid) .Select((g, c, d) => new MesInvItemInCDetails { Guid = g.Guid, ItemName = c.ItemName, ItemModel = c.ItemModel, ItemUnit = d.Fname, DepotSectionCode = g.DepotSectionCode, CbillNo = g.CbillNo, ItemBarcode = g.ItemBarcode, UrgentFlag = g.UrgentFlag, ItemNo = c.ItemNo, WorkNo = g.WorkNo, Quantity = g.Quantity }) .ToList(); return result; } public MessageCenter MesToErpParam(WarehouseQuery query) { var erpParameters = ""; var title = ""; var tableName = "MES_INV_ITEM_INS_" + query.Type; if ("A".Equals(query.Type)) { erpParameters = GetErpParameters(query.billNo); title = "采购入库单" + query.billNo + "审核"; } else if ("B".Equals(query.Type)) { erpParameters = GetDeApprovePam(query.id); title = "采购入库单" + query.billNo + "反审核"; } var ErpUrl = AppsettingsUtility.Settings.ProductionErpUrl; var newGuid = Guid.NewGuid(); var message = new MessageCenter { Guid = newGuid, //Pid = newGuid, TableName = tableName, Url = ErpUrl, Status = 1, CreateBy = query.userName, Route = query.billNo, Title = title, PageName = "Warehouse/PurchaseInventory/Add?id=" + query.id + "&billNo=" + query.billNo, CreateDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), Method = "POST", Seq = 1, Data = erpParameters, IsMessage = 0, ContentType = "application/x-www-form-urlencoded" }; return message; } public MessageCenter SaveMessageCenter(WarehouseQuery query) { var message = MesToErpParam(query); var executeReturnIdentity = Db.Insertable(message).ExecuteCommand(); if (executeReturnIdentity > 0) { message.Pid = message.Guid; return message; } throw new Exception("获取数据失败"); } //audit public bool audit(WarehouseQuery entity) { entity.date = DateTime.Now; entity.status = 1; return Update(entity); } public bool deApprove(WarehouseQuery entity) { entity.date = null; entity.status = 0; return Update(entity); } private bool Update(WarehouseQuery entity) { return Db.Updateable() .SetColumns(x => x.Status == entity.status) .SetColumns(x => x.InsDate == entity.date) .Where(x => x.BillNo == entity.billNo) .IgnoreColumns(true).ExecuteCommand() > 0; } private string GetErpParameters(string? billNo) { var invItemIns = Db.Queryable() .Single(x => x.BillNo == billNo); if (invItemIns == null) throw new Exception("入库单号不存在"); if (invItemIns.Status == 1) throw new Exception("入库单已审核,不能重复推送"); var materials = Db.Queryable( (g, c, d, a) => new JoinQueryInfos( JoinType.Left, g.ItemId == c.Id, JoinType.Inner, d.Id.ToString() == c.Fpurchaseunitid, JoinType.Inner, a.Ebeln == g.WorkNo && g.CbillNo == a.CbillNo ) ).Where((g, c, d, a) => g.BillNo == billNo).Select( (g, c, d, a) => new Material { FMaterialId = c.ItemNo, FRealQty = g.Quantity.ToString(), FStockId = g.DepotCode, FLot = a.CbillNo, FUnitID = d.Fnumber, FsrcEntryId = a.Guid.ToString(), FMesEntryid = g.Guid.ToString() }).ToList(); if (materials == null || materials.Count == 0) throw new Exception("没有找到相关数据"); // 抛出异常以供前台处理 // 构造 JSON var jsonEntries = materials.Select(d => new { d.FMaterialId, d.FRealQty, d.FStockId, d.FLot, FUintId = d.FUnitID, FSRCENTRYID = d.FsrcEntryId, F_MES_ENTRYID = d.FMesEntryid }).ToList(); var fdate = DateTime.Now.ToString("yyyy-MM-dd"); var jsonString = JsonConvert.SerializeObject(jsonEntries); var encodedUrl = "taskname=CGRK&mesid=" + invItemIns.Guid + "&optype=create&datajson={\"F_MES_ID\":\"" + invItemIns.Guid + "\",\"FDate\":\"" + fdate + "\",\"cgrkentry\":" + jsonString + "}"; return encodedUrl; } private string GetDeApprovePam(string? id) { var encodedUrl = "taskname=CGRK&mesid=" + id + "&optype=delete&datajson={}"; return encodedUrl; } }