kyy
2025-10-22 9a3ee777dd7344ffabf19ac5c69bef6a2d041c62
优化采购入库
已添加1个文件
1572 ■■■■■ 文件已修改
service/Warehouse/MesInvItemInCDetailsManager.cs 1572 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/Warehouse/MesInvItemInCDetailsManager.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1572 @@
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<MesInvItemInCDetails>
{
    //当前类已经继承了 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<MesInvItemBarcodes>()
                        .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<MesInvItemInCDetails>()
                        .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<dynamic>(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<dynamic>(sql2);
                    //查询已入库总数
                    var totalCDetailsQuantity = Db.Queryable<MesInvItemInCDetails>()
                    .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<MesInvItemBarcodes>()
              .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<MesInvItemArn>()
              .Where(it => it.BillNo == itemBarcodeDetails.BillNo && it.Fstatus == true )
              .First();
          if (inventory == null)
              throw new Exception("此条码找不到对应收货单或未审核!");
          // var inventoryDetails = Db.Queryable<MesInvItemArnDetail>()
          //     .Where(it => it.ParentGuid == inventory.Guid
          //                  && it.ItemId == itemBarcodeDetails.ItemId
          //                  && it.EbelnLine == itemBarcodeDetails.WorkLine
          //                  && it.Ebeln == itemBarcodeDetails.WorkNo)
          //     .First();
          var inventoryDetails = Db.Queryable<MesInvItemArnDetail>()
              .Where(it => it.Guid == itemBarcodeDetails.AboutGuid)
              .First();
          var cgddDetails = Db.Queryable<MesRohInData>()
              .Where(it => it.EbelnK3id == inventoryDetails.LineK3id)
              .First();
          if (cgddDetails == null)
              throw new Exception("此条码找不到对应采购订单明细!");
          if (inventoryDetails == null)
              throw new Exception("此条码找不到对应收货单明细!");
          //获取到货检验明细
          var sqlParams = new List<SugarParameter> { new("@dhmxGuid", itemBarcodeDetails.AboutGuid) };
          var sql1 = @"SELECT *FROM v_dhmx WHERE dhmxGuid = @dhmxGuid ";
          var dhjymx = Db.Ado.SqlQuery<vDhmx>(sql1, sqlParams).First();
          //判定检验能否入库
          if (dhjymx.CanStore!= 1)
          {
              throw new Exception($"该条码对应的收料单检验结果:【{dhjymx.InspectionResult}】,判定结果:【{dhjymx.JudgmentResult}】,处理意见:【{dhjymx.HandlingSuggestion}】,无法入库");
          }
          var depotCode = Db.Queryable<MesDepotSections>()
              .Where(it => it.DepotSectionCode == sectionCode)
              .Select(it => it.DepotGuid)
              .First();
          var depotCode2 = Db.Queryable<MesInvItemArn>()
              .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<MesDepots>()
                  .Where(s => s.DepotId.ToString() == depotCode).First();
              // if (depotCode != mesDepost.Guid)
              //     throw new Exception("扫描库位与采购入库库位不一致!");
          }
          else
          {
              throw new Exception("库位编码 " + sectionCode + " ä¸å­˜åœ¨ï¼Œè¯·ç¡®è®¤ï¼");
          }
          //num = Db.Queryable<MesInvItemInCDetails>()
          //    .Where(it => it.ItemBarcode == itemBarcode)
          //    .Count();
          //if (num > 0)
          //    throw new Exception("此条码已扫码入库完成,请核对!");
          //num = Db.Queryable<MesInvItemStocks>()
          //    .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<MesInvItemArn>()
          //    .Where(a => a.BillNo == itemBarcodeDetails.BillNo)
          //    .InnerJoin<MesInvItemArnDetail>((a, b) =>
          //        b.ParentGuid == a.Guid &&
          //        b.ItemId == itemBarcodeDetails.ItemId && b.Ischeck == 1)
          //    .Count();
          //num2 = Db.Queryable<MesInvItemArn>()
          //    .Where(a => a.BillNo == itemBarcodeDetails.BillNo)
          //    .InnerJoin<MesInvItemArnDetail>((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<SysOrganization>().Any(x => x.Fid == cgddDetails.DemandOrg))
          // {
          //     owner_type = "BD_OwnerOrg";
          // }
          // else
          // {
          //     // ç¬¬äºŒå±‚判断:检查 MES_CUSTOMER
          //     if (Db.Queryable<MesCustomer>().Any(x => x.Id == Convert.ToInt32(cgddDetails.DemandOrg)))
          //     {
          //         owner_type = "BD_Customer";
          //     }
          //     else
          //     {
          //         // ç¬¬ä¸‰å±‚判断:检查 MES_SUPPLIER
          //         if (Db.Queryable<MesSupplier>().Any(x => x.Id == Convert.ToInt32(cgddDetails.DemandOrg)))
          //         {
          //             owner_type = "BD_Supplier";
          //         }
          //         else
          //         {
          //             // ç¬¬å››å±‚判断:再次检查 SYS_ORGANIZATION
          //             if (Db.Queryable<SysOrganization>().Any(x => x.Fid == cgddDetails.ReceivingOrg))
          //             {
          //                 owner_type = "BD_OwnerOrg";
          //             }
          //             else
          //             {
          //                 throw new Exception("入库失败,到货单据对应的需求组织有问题!");
          //             }
          //         }
          //     }
          //}
          var result = new ItemInBaseModel();
          UseTransaction(db =>
          {
              var existingRecord = db.Queryable<MesInvItemIns>()
                  .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<MesSupplier>()
                      .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<MesInvItemArnDetail>()
                      .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<MesInvItemArnDetail>()
                              .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<MesInvItemInCItems>()
                              .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<MesInvItemInCItems>()
                                  .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<MesInvItemArnDetail>()
                              .SetColumns(d => new MesInvItemArnDetail
                              {
                                  OkRkqty = (int)((d.OkRkqty ?? 0) + cSyQty)
                              })
                              .Where(d => d.Guid == detail.Guid)
                              .IgnoreColumns(true)
                              .ExecuteCommand();
                          var count = db.Queryable<MesInvItemInCItems>()
                              .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<MesInvItemInCItems>()
                                  .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<MesInvItemArnDetail>()
                      .Where(d =>
                          d.Guid == itemBarcodeDetails.AboutGuid)
                      .First();
                  // æ£€æŸ¥æ˜¯å¦å­˜åœ¨äºŽ MES_INV_ITEM_IN_C_ITEMS è¡¨
                  var existingCount = db.Queryable<MesInvItemInCItems>()
                      .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<MesInvItemInCItems>()
                          .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<MesInvItemArnDetail>()
                      .SetColumns(d => new MesInvItemArnDetail
                      {
                          OkRkqty = (int)((d.OkRkqty ?? 0) + cSyQty)
                      })
                      .Where(d => d.Guid == itemBarcodeDetails.AboutGuid)
                      .ExecuteCommand();
                  var first = db
                      .Queryable<MesInvItemArnDetail>()
                      .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<MesInvItemArnDetail>()
                          .SetColumns(s => s.IsdepsIn == true)
                          .Where(s => s.Guid == itemBarcodeDetails.AboutGuid)
                          .ExecuteCommand();
                  var totalSummary = db.Queryable<MesInvItemArnDetail>()
                      .InnerJoin<MesInvItemArn>((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<MesInvItemArn>()
                          .SetColumns(it => it.Status == 1)
                          .Where(it => it.BillNo == itemBarcodeDetails.BillNo)
                          .ExecuteCommand();
                  var totalCDetailsQuantity = db.Queryable<MesInvItemInCDetails>()
                      .Where(it => it.ItemId == itemBarcodeDetails.ItemId &&
                                   it.WorkNo == itemBarcodeDetails.WorkNo &&
                                   it.ItemInId == cId)
                      .Sum(it => it.Quantity);
                  var detailSummary = db.Queryable<MesInvItemArnDetail>()
                      .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<MesItems>()
                      .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<MesInvItemInCItems,MesItems>(
                      (a, b) => new JoinQueryInfos(
                      JoinType.Left,
                      a.ItemId == b.ItemId)
                      )
                      .Where(a => a.ItemInId == cId && a.ItemId == itemBarcodeDetails.ItemId)
                      .Select<dynamic>((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<MesInvItemInCDetails, MesItems>(
                      (a, b) => new JoinQueryInfos(
                      JoinType.Left,
                      a.ItemId == b.ItemId)
                      )
                      .Where(a => a.ItemInId == cId && a.ItemId == itemBarcodeDetails.ItemId)
                      .Select<dynamic>((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<MesInvItemArnDetail>()
                      .LeftJoin<MesInvItemArn>((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<MesInvItemArn>()
                          .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<MesInvItemInCDetails>()
                      .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<MesInvItemArnDetail>()
                      .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<MesItems>()
                      .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<MesInvItemIns> 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<MesInvItemIns, MesDepots, MesSupplier>(
                (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<MesInvItemInCItems> 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<MesInvItemInCDetails, MesItems, MesUnit>(
                (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<MesInvItemInCDetails> 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<MesInvItemInCDetails, MesItems, MesUnit>(
                (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<MesInvItemIns>()
            .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<MesInvItemIns>()
            .Single(x => x.BillNo == billNo);
        if (invItemIns == null) throw new Exception("入库单号不存在");
        if (invItemIns.Status == 1) throw new Exception("入库单已审核,不能重复推送");
        var materials = Db.Queryable<MesInvItemInCItems, MesItems, MesUnit,
            MesInvItemArnDetail>(
            (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<Material>(
            (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<MesInvItemInCDetails>()
                .Where(it => it.ItemBarcode == entity.returnBarcode)
                .Any();
            if (isInStock)
                throw new Exception($"该条码物料[{entity.returnBarcode}]已入库,不能再次扫描!");
            // æ£€æŸ¥æ¡ç æ˜¯å¦å·²æ‰«æéªŒé€€
            var sqlParams = new List<SugarParameter> { new("@barcode", entity.returnBarcode) };
            var isReturnScanned = Db.Ado.SqlQuery<dynamic>(
                "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<MesInvItemBarcodes>()
                .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<SugarParameter>
        {
            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<MesInvItemInCDetails>()
                .Where(it => it.ItemBarcode == entity.returnBarcode)
                .Any();
            if (isInStock)
                throw new Exception($"该条码物料[{entity.returnBarcode}]已入库,不能再次扫描!");
            // æ£€æŸ¥æ¡ç æ˜¯å¦å·²æ‰«æéªŒé€€
            var sqlParams = new List<SugarParameter> { new("@barcode", entity.returnBarcode) };
            var isReturnScanned = Db.Ado.SqlQuery<dynamic>(
                "SELECT 1 FROM MES_INV_ITEM_CGYT_C_DETAILS WHERE ITEM_BARCODE = @barcode",
                sqlParams);
            // ä½¿ç”¨å‚数化查询并忽略大小写(适用于支持的数据库)
            var itemBarcode = Db.Queryable<MesInvItemBarcodes>()
                .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<MesInvItemInCDetails>()
                .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<dynamic>(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<dynamic>(sql2, new { cId, itemId = itemBarcode.ItemId });
            //查询已入库总数
            var totalCDetailsQuantity = Db.Queryable<MesInvItemInCDetails>()
            .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;
        //}
    }
}