kyy
2025-10-15 f6321d61c82a2837c1a488754b5d5b6ec6918a45
Merge branch 'master' of http://git.gs-mes.com:8080/r/~cnf/JH/JH_PdaService
已修改2个文件
1853 ■■■■ 文件已修改
Dto/service/WarehouseQuery.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/Warehouse/MesInvItemInCDetailsManager.cs 1850 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Dto/service/WarehouseQuery.cs
@@ -48,5 +48,8 @@
    //克重
    public decimal? weight { get; set; }
    //克重
    public decimal? weight { get; set; }
}
service/Warehouse/MesInvItemInCDetailsManager.cs
@@ -1,4 +1,5 @@
using Masuit.Tools.Models;
using Microsoft.AspNetCore.SignalR.Protocol;
using NewPdaSqlServer.DB;
using NewPdaSqlServer.Dto.service;
using NewPdaSqlServer.entity;
@@ -18,870 +19,1003 @@
{
    //当前类已经继承了 Repository 增、删、查、改的方法
    public ItemInBaseModel SaveBarCodes(WarehouseQuery entity)
    {
        string functionName = "采购入库", fieldName = null, inFieldVal = null;
        string user = entity.userName,
            sectionCode = entity.sectionCode,
            itemBarcode = entity.barcode;
        var transactionNo = "101";
        int? billTypeId = 100, num = 0, num2 = 0;
        var freeze = 0;
        decimal cSyQty = 0;
        ItemInBaseModel res = new ItemInBaseModel();
        string connectionString = DbHelperSQL.strConn;
        if (string.IsNullOrEmpty(sectionCode))
            throw new Exception("请扫库位条码!");
        // 参数验证
        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), "条码不允许为空");
        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)
        using (var conn = new SqlConnection(connectionString))
        {
            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)
            using (var cmd = new SqlCommand("[prc_pda_inv_cgrk]", conn))
            {
                // 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
                try
                {
                    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();
            }
                    conn.Open();
                    cmd.CommandType = CommandType.StoredProcedure;
            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)
                    // 设置存储过程参数
                    SqlParameter[] parameters =
                    {
                        // Update detail
                        db.Updateable<MesInvItemArnDetail>()
                            .SetColumns(d => new MesInvItemArnDetail
                            {
                                OkRkqty = (int)d.Quantity,
                                IsdepsIn = true
                            })
                            .Where(d => d.Guid == detail.Guid)
                            .IgnoreColumns(true)
                            .ExecuteCommand();
                        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 }
                    };
                        // 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();
                    cmd.Parameters.AddRange(parameters);
                    cmd.ExecuteNonQuery();
                        cSyQty -= remainingQty.Value;
                    // 获取输出参数
                    string? outMessage = parameters[4].Value?.ToString();
                    string? outSum = parameters[5].Value?.ToString();
                        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
                    // 检查参数是否为空,并在异常中显示实际值
                    if (string.IsNullOrEmpty(outMessage) || string.IsNullOrEmpty(outSum))
                    {
                        // 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
                        // 拼接参数实际值(处理 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;
                }
                db.Insertable(new MesInvBusiness2
                catch (Exception ex)
                {
                    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
                    // 记录异常日志(建议添加日志记录)
                    res.Message = $"操作失败: {ex.Message}";
                    res.SumQuantity = -1;
                    return res;
                }
            }
            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 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
@@ -1181,9 +1315,9 @@
            // 将查询到的条码信息赋值给返回模型
            res.itemBarcodeDetails = itemBarcode;
            res.Message = "查询成功";
            return res;
        }
@@ -1240,7 +1374,7 @@
            string strMsg = "";
            string intSum = "";
            string cfBar = "";
            using (var conn = new SqlConnection(DbHelperSQL.strConn))
            {
                using (var cmd = new SqlCommand("[prc_pda_bar_cf_before]", conn))
@@ -1276,7 +1410,7 @@
            string ytMsg = "";
            string ytSum = "";
            string ytdh = "";
            using (var conn = new SqlConnection(DbHelperSQL.strConn))
            {
                using (var cmd = new SqlCommand("prc_pda_scan_CGYT", conn))
@@ -1294,7 +1428,7 @@
                    cmd.Parameters.AddRange(ytParameters);
                    cmd.ExecuteNonQuery();
                    ytMsg = ytParameters[2].Value.ToString();
                    ytSum = ytParameters[3].Value.ToString();
                    ytdh = ytParameters[4].Value.ToString();
@@ -1306,7 +1440,7 @@
            // 调用入库存储过程 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))
@@ -1318,13 +1452,14 @@
                        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[3].Value.ToString();
                    rkSum = rkParameters[4].Value.ToString();
@@ -1332,7 +1467,7 @@
                }
            }
            // 优化查询(去除空格并忽略大小写)
            var mesInvItemInCDetails = Db.Queryable<MesInvItemInCDetails>()
@@ -1374,9 +1509,18 @@
            res.ItemBarCDetails = Db.Ado.SqlQuery<dynamic>(sql2, new { cId, itemId = itemBarcode.ItemId });
            res.Message = $"验退操作成功,拆分后条码:{cfBar},验退单号:{ytdh}";
            res.SumQuantity = res.ItemBarCDetails?.Count ?? 0;
            //查询已入库总数
            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)