using Masuit.Tools.Models; using Microsoft.AspNetCore.SignalR.Protocol; 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 System; using System.Data; using System.Data.SqlClient; using static Microsoft.EntityFrameworkCore.DbLoggerCategory; namespace NewPdaSqlServer.service.Warehouse; public class MesInvItemInCDetailsManager : Repository { //当前类已经继承了 Repository 增、删、查、改的方法 public ItemInBaseModel SaveBarCodes(WarehouseQuery entity) { ItemInBaseModel res = new ItemInBaseModel(); string connectionString = DbHelperSQL.strConn; // 参数验证 if (string.IsNullOrEmpty(entity.userName)) throw new ArgumentNullException(nameof(entity.userName), "用户名不允许为空"); if (string.IsNullOrEmpty(entity.sectionCode)) throw new ArgumentNullException(nameof(entity.sectionCode), "库位编号不允许为空"); if (string.IsNullOrEmpty(entity.barcode)) throw new ArgumentNullException(nameof(entity.barcode), "条码不允许为空"); using (var conn = new SqlConnection(connectionString)) { using (var cmd = new SqlCommand("[prc_pda_inv_cgrk]", conn)) { //try //{ conn.Open(); cmd.CommandType = CommandType.StoredProcedure; // 设置存储过程参数 SqlParameter[] parameters = { new SqlParameter("@pi_user", SqlDbType.NVarChar, 100) { Value = entity.userName }, new SqlParameter("@pi_barcode", SqlDbType.NVarChar, 100) { Value = entity.barcode.Trim().ToLower() }, new SqlParameter("@pi_sectionCode", SqlDbType.NVarChar, 30) { Value = entity.sectionCode }, new SqlParameter("@pi_weight", SqlDbType.Decimal) { Value = entity.weight }, new SqlParameter("@po_outMsg", SqlDbType.NVarChar, 300) { Direction = ParameterDirection.Output }, new SqlParameter("@po_outSum", SqlDbType.NVarChar, 300) { Direction = ParameterDirection.Output } }; cmd.Parameters.AddRange(parameters); cmd.ExecuteNonQuery(); // 获取输出参数 string? outMessage = parameters[4].Value?.ToString(); string? outSum = parameters[5].Value?.ToString(); // 检查参数是否为空,并在异常中显示实际值 if (string.IsNullOrEmpty(outMessage) || string.IsNullOrEmpty(outSum)) { // 拼接参数实际值(处理 null 的情况) string messageValue = outMessage ?? "null"; string sumValue = outSum ?? "null"; throw new InvalidOperationException( $"存储过程返回参数异常:输出消息为【{messageValue}】,输出数量为【{sumValue}】" ); } // 验证结果 if (!int.TryParse(outSum, out int result) || result <= 0) throw new InvalidOperationException(outMessage); // 调试输出 Console.WriteLine($"查询的条码值: '{entity.barcode}' (长度: {entity.barcode.Length})"); // 使用参数化查询并忽略大小写(适用于支持的数据库) var itemBarcodeDetails = Db.Queryable() .Where(it => it.ItemBarcode.Trim().ToLower() == entity.barcode.Trim().ToLower()) .First() ?? throw new InvalidOperationException($"未找到条码 '{entity.barcode}' 的匹配信息"); // 调试输出(检查值和长度) Console.WriteLine($"查询的条码值: '{entity.barcode}' (长度: {entity.barcode.Length})"); // 优化查询(去除空格并忽略大小写) var MesInvItemInCDetails = Db.Queryable() .Where(it => it.ItemBarcode.Trim().ToLower() == entity.barcode.Trim().ToLower()) .First() ?? throw new InvalidOperationException($"未找到条码 '{entity.barcode}' 的匹配的入库信息"); // 从入库条码中获取有效的ItemInId var cId = MesInvItemInCDetails.ItemInId; // 假设存在ItemInId属性 // 查询物料汇总明细 var sql = string.Format(@" SELECT b.Item_No AS ItemNo, b.Item_Name AS ItemName, b.Item_Model AS ItemModel, a.Quantity AS FQty, b.Item_Id AS FMaterialId, CONVERT(VARCHAR(36), b.Guid) AS Id FROM MES_INV_ITEM_IN_C_ITEMS a LEFT JOIN Mes_Items b ON a.Item_Id = b.Item_Id WHERE a.Item_In_Id = '{0}' AND a.Item_Id = '{1}'", cId, itemBarcodeDetails.ItemId); res.ItemInDetails = Db.Ado.SqlQuery(sql); // 查询入库条码明细 var sql2 = string.Format(@" SELECT b.Item_No AS ItemNo, b.Item_Name AS ItemName, b.Item_Model AS ItemModel, a.Quantity AS FQty, b.Item_Id AS FMaterialId, CONVERT(VARCHAR(36), a.Guid) AS Id, a.Depot_Section_Code AS kw, a.Item_Barcode AS barcode FROM Mes_Inv_Item_In_C_Details a LEFT JOIN Mes_Items b ON a.Item_Id = b.Item_Id WHERE a.Item_In_Id = '{0}' AND a.Item_Id = '{1}'", cId, itemBarcodeDetails.ItemId); res.ItemBarCDetails = Db.Ado.SqlQuery(sql2); //查询已入库总数 var totalCDetailsQuantity = Db.Queryable() .Where(it => it.ItemInId == cId) .Sum(it => it.Quantity); res.SumQuantity = Convert.ToDecimal(totalCDetailsQuantity); // 设置返回信息 res.Message = outMessage; return res; //} //catch (Exception ex) //{ // // 记录异常日志(建议添加日志记录) // res.Message = $"操作失败: {ex.Message}"; // res.SumQuantity = -1; // return res; //} } } } /* 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 && it.Fstatus == true ) .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 (cgddDetails == null) throw new Exception("此条码找不到对应采购订单明细!"); if (inventoryDetails == null) throw new Exception("此条码找不到对应收货单明细!"); //获取到货检验明细 var sqlParams = new List { new("@dhmxGuid", itemBarcodeDetails.AboutGuid) }; var sql1 = @"SELECT *FROM v_dhmx WHERE dhmxGuid = @dhmxGuid "; var dhjymx = Db.Ado.SqlQuery(sql1, sqlParams).First(); //判定检验能否入库 if (dhjymx.CanStore!= 1) { throw new Exception($"该条码对应的收料单检验结果:【{dhjymx.InspectionResult}】,判定结果:【{dhjymx.JudgmentResult}】,处理意见:【{dhjymx.HandlingSuggestion}】,无法入库"); } 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 && depotCode != null) { mesDepost = Db.Queryable() .Where(s => s.DepotId.ToString() == depotCode).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.GetValueOrDefault() ? "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 == mesDepost.DepotId.ToString() && 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 = mesDepost.DepotId.ToString(), 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 == mesDepost.DepotId.ToString() && 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 == mesDepost.DepotId.ToString() && 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 = mesDepost.DepotId.ToString() }).IgnoreColumns(true).ExecuteCommand(); else db.Updateable() .SetColumns(it => it.Quantity == it.Quantity + cSyQty) .Where(it => it.ItemInId == cId && it.ItemId == detail.ItemId && it.DepotId == mesDepost.DepotId.ToString() && 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 == mesDepost.DepotId.ToString() && 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 = mesDepost.DepotId.ToString(), 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 == mesDepost.DepotId.ToString() && 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(mesDepost.DepotId.ToString()) }).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(mesDepost.DepotId), 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, barcode = a.ItemBarcode }) .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; } // 验退扫码 public ItemInBaseModel GetReturnBarcodeInfo(WarehouseQuery entity) { ItemInBaseModel res = new ItemInBaseModel(); // 参数验证 if (string.IsNullOrEmpty(entity.userName)) throw new ArgumentNullException(nameof(entity.userName), "用户名不允许为空"); if (string.IsNullOrEmpty(entity.sectionCode)) throw new ArgumentNullException(nameof(entity.sectionCode), "库位编号不允许为空"); if (string.IsNullOrEmpty(entity.returnBarcode)) throw new ArgumentNullException(nameof(entity.returnBarcode), "条码不允许为空"); //try //{ // 检查条码是否已入库 var isInStock = Db.Queryable() .Where(it => it.ItemBarcode == entity.returnBarcode) .Any(); if (isInStock) throw new Exception($"该条码物料[{entity.returnBarcode}]已入库,不能再次扫描!"); // 检查条码是否已扫描验退 var sqlParams = new List { new("@barcode", entity.returnBarcode) }; var isReturnScanned = Db.Ado.SqlQuery( "SELECT 1 FROM MES_INV_ITEM_CGYT_C_DETAILS WHERE ITEM_BARCODE = @barcode", sqlParams); if (isReturnScanned.Count > 0) throw new Exception($"该条码物料[{entity.returnBarcode}]已扫描验退,请核对!"); // 使用参数化查询并忽略大小写(适用于支持的数据库) var itemBarcode = Db.Queryable() .Where(it => it.ItemBarcode.Trim().ToLower() == entity.returnBarcode.Trim().ToLower()) .First() ?? throw new InvalidOperationException($"未找到条码 '{entity.returnBarcode}' 的匹配信息"); // 获取到货明细ID(假设从条码信息中可以获取到dhmxGuid) var dhmxGuid = itemBarcode.AboutGuid; // 查询检验信息(对应SQL中的视图查询逻辑) var checkParams = new List { new("@dHdMx", dhmxGuid), new("@JYZT", null, true), // 输出参数:检验状态 new("@JYJG", null, true), // 输出参数:检验结果 new("@PDJG", null, true), // 输出参数:判定结果 new("@ISRK", null, true), // 输出参数:是否能入库 new("@CLYS", null, true) // 输出参数:处理意见 }; // 执行查询获取检验信息 Db.Ado.ExecuteCommand(@" SELECT @JYZT = ISNULL(检验状态, '未知'), @JYJG = ISNULL(检验结果, '未知'), @PDJG = ISNULL(判定结果, '未知'), @ISRK = ISNULL(是否能入库, 0), @CLYS = ISNULL(处理意见, '无') FROM v_dhmx WHERE dhmxGuid = @dHdMx", checkParams); // 解析输出参数 var jyzt = checkParams[1].Value?.ToString() ?? "未知"; var jyjg = checkParams[2].Value?.ToString() ?? "未知"; var pdjg = checkParams[3].Value?.ToString() ?? "未知"; var isRk = checkParams[4].Value != DBNull.Value ? Convert.ToInt32(checkParams[4].Value) : 0; var clys = checkParams[5].Value?.ToString() ?? "无"; // 检查是否查询到检验记录 if (string.IsNullOrEmpty(jyzt) && string.IsNullOrEmpty(jyjg)) throw new Exception($"未找到到货明细id为[{dhmxGuid}]的检验记录"); // 检查是否允许验退(异常直接抛出) if (isRk != 1) throw new Exception($"该条码对应的收料单检验结果:[{jyjg}],判定结果:[{pdjg}],处理意见:[{clys}],不能进行验退操作"); // 将查询到的条码信息赋值给返回模型 res.itemBarcodeDetails = itemBarcode; res.Message = "查询成功"; return res; //} //catch (Exception ex) //{ // // 记录异常日志(建议补充具体日志记录代码) // res.Message = $"操作失败: {ex.Message}"; // res.SumQuantity = -1; // return res; //} } // 验退 public ItemInBaseModel ConfirmReturn(WarehouseQuery entity) { ItemInBaseModel res = new ItemInBaseModel(); // 参数验证 if (string.IsNullOrEmpty(entity.userName)) throw new ArgumentNullException(nameof(entity.userName), "用户名不允许为空"); if (string.IsNullOrEmpty(entity.sectionCode)) throw new ArgumentNullException(nameof(entity.sectionCode), "库位编号不允许为空"); if (string.IsNullOrEmpty(entity.returnBarcode)) throw new ArgumentNullException(nameof(entity.returnBarcode), "条码不允许为空"); if (entity.returnQuantity <= 0) throw new ArgumentException("验退数量必须大于0", nameof(entity.returnQuantity)); //try //{ // 检查条码是否已入库 var isInStock = Db.Queryable() .Where(it => it.ItemBarcode == entity.returnBarcode) .Any(); if (isInStock) throw new Exception($"该条码物料[{entity.returnBarcode}]已入库,不能再次扫描!"); // 检查条码是否已扫描验退 var sqlParams = new List { new("@barcode", entity.returnBarcode) }; var isReturnScanned = Db.Ado.SqlQuery( "SELECT 1 FROM MES_INV_ITEM_CGYT_C_DETAILS WHERE ITEM_BARCODE = @barcode", sqlParams); // 使用参数化查询并忽略大小写(适用于支持的数据库) var itemBarcode = Db.Queryable() .Where(it => it.ItemBarcode.Trim().ToLower() == entity.returnBarcode.Trim().ToLower()) .First() ?? throw new InvalidOperationException($"未找到条码 '{entity.returnBarcode}' 的匹配信息"); // 判断验退数量是否大于条码的数量(假设条码数量字段为Quantity) if (entity.returnQuantity > itemBarcode.Quantity) { throw new ArgumentException($"验退数量不能大于条码的数量,当前条码数量为: {itemBarcode.Quantity}", nameof(entity.returnQuantity)); } // 将查询到的条码信息赋值给返回模型 res.itemBarcodeDetails = itemBarcode; // 调用存储过程 prc_pda_bar_cf_before string strMsg = ""; string intSum = ""; string cfBar = ""; using (var conn = new SqlConnection(DbHelperSQL.strConn)) { using (var cmd = new SqlCommand("[prc_pda_bar_cf_before]", conn)) { conn.Open(); cmd.CommandType = CommandType.StoredProcedure; SqlParameter[] parameters = { new("@outMsg", SqlDbType.NVarChar, 300), new("@outSum", SqlDbType.NVarChar, 300), new("@barcode_new", SqlDbType.NVarChar, 300), new("@c_user", entity.userName), new("@p_old_barcode", entity.returnBarcode), new("@p_qty", entity.returnQuantity), }; parameters[0].Direction = ParameterDirection.Output; parameters[1].Direction = ParameterDirection.Output; parameters[2].Direction = ParameterDirection.Output; foreach (var parameter in parameters) cmd.Parameters.Add(parameter); cmd.ExecuteNonQuery(); strMsg = parameters[0].Value.ToString(); intSum = parameters[1].Value.ToString(); cfBar = parameters[2].Value.ToString(); var result = Convert.ToInt32(intSum); if (result <= 0) throw new Exception(strMsg); } } // 调用验退存储过程 prc_pda_scan_CGYT,使用拆分后的新条码 string ytMsg = ""; string ytSum = ""; string ytdh = ""; using (var conn = new SqlConnection(DbHelperSQL.strConn)) { using (var cmd = new SqlCommand("prc_pda_scan_CGYT", conn)) { conn.Open(); cmd.CommandType = CommandType.StoredProcedure; SqlParameter[] ytParameters = { new("@pi_user", SqlDbType.NVarChar, 100) { Value = entity.userName }, new("@pi_barcode", SqlDbType.NVarChar, 100) { Value = cfBar }, // 使用拆分后的新条码 new("@po_outMsg", SqlDbType.NVarChar, 2000) { Direction = ParameterDirection.Output }, new("@po_outSum", SqlDbType.Int) { Direction = ParameterDirection.Output }, new("@po_ygdh", SqlDbType.NVarChar, 200) { Direction = ParameterDirection.Output } }; cmd.Parameters.AddRange(ytParameters); cmd.ExecuteNonQuery(); ytMsg = ytParameters[2].Value.ToString(); ytSum = ytParameters[3].Value.ToString(); ytdh = ytParameters[4].Value.ToString(); if (ytSum == "-1") throw new Exception(ytMsg); } } // 调用入库存储过程 prc_pda_inv_cgrk,使用原始条码 string rkMsg = ""; string rkSum = ""; using (var conn = new SqlConnection(DbHelperSQL.strConn)) { using (var cmd = new SqlCommand("prc_pda_inv_cgrk", conn)) { conn.Open(); cmd.CommandType = CommandType.StoredProcedure; SqlParameter[] rkParameters = { new("@pi_user", SqlDbType.NVarChar, 100) { Value = entity.userName }, new("@pi_barcode", SqlDbType.NVarChar, 100) { Value = entity.returnBarcode }, // 使用原始条码 new("@pi_sectionCode", SqlDbType.NVarChar, 100) { Value = entity.sectionCode }, new("@pi_weight", SqlDbType.Decimal) { Value = entity.weight }, new("@po_outMsg", SqlDbType.NVarChar, 2000) { Direction = ParameterDirection.Output }, new("@po_outSum", SqlDbType.Int) { Direction = ParameterDirection.Output } }; cmd.Parameters.AddRange(rkParameters); cmd.ExecuteNonQuery(); rkMsg = rkParameters[4].Value.ToString(); rkSum = rkParameters[5].Value.ToString(); if (rkSum == "-1") throw new Exception(rkMsg); } } // 优化查询(去除空格并忽略大小写) var mesInvItemInCDetails = Db.Queryable() .Where(it => it.ItemBarcode.Trim().ToLower() == entity.returnBarcode.Trim().ToLower()) .First() ?? throw new InvalidOperationException($"未找到条码 '{entity.returnBarcode}' 的匹配的入库信息"); // 从入库条码中获取有效的ItemInId var cId = mesInvItemInCDetails.ItemInId; // 假设存在ItemInId属性 // 查询物料汇总明细(使用参数化查询防止SQL注入) var sql = @" SELECT b.Item_No AS ItemNo, b.Item_Name AS ItemName, b.Item_Model AS ItemModel, a.Quantity AS FQty, b.Item_Id AS FMaterialId, CONVERT(VARCHAR(36), b.Guid) AS Id FROM MES_INV_ITEM_IN_C_ITEMS a LEFT JOIN Mes_Items b ON a.Item_Id = b.Item_Id WHERE a.Item_In_Id = @cId AND a.Item_Id = @itemId"; res.ItemInDetails = Db.Ado.SqlQuery(sql, new { cId, itemId = itemBarcode.ItemId }); // 查询入库条码明细(使用参数化查询防止SQL注入) var sql2 = @" SELECT b.Item_No AS ItemNo, b.Item_Name AS ItemName, b.Item_Model AS ItemModel, a.Quantity AS FQty, b.Item_Id AS FMaterialId, CONVERT(VARCHAR(36), a.Guid) AS Id, a.Depot_Section_Code AS kw, a.Item_Barcode AS barcode FROM Mes_Inv_Item_In_C_Details a LEFT JOIN Mes_Items b ON a.Item_Id = b.Item_Id WHERE a.Item_In_Id = @cId AND a.Item_Id = @itemId"; res.ItemBarCDetails = Db.Ado.SqlQuery(sql2, new { cId, itemId = itemBarcode.ItemId }); //查询已入库总数 var totalCDetailsQuantity = Db.Queryable() .Where(it => it.ItemInId == cId) .Sum(it => it.Quantity); res.SumQuantity = Convert.ToDecimal(totalCDetailsQuantity); res.Message = $"验退操作成功,拆分后条码:{cfBar},验退单号:{ytdh}"; // res.SumQuantity = res.ItemBarCDetails?.Count ?? 0; res.SumQuantity = Convert.ToDecimal(totalCDetailsQuantity); return res; //} //catch (Exception ex) //{ // // 记录异常日志(建议补充具体日志记录代码) // res.Message = $"操作失败: {ex.Message}"; // res.SumQuantity = -1; // return res; //} } }