cnf
2025-08-06 546c4baeda5102c9c767831e1b74058d3383c53d
退补料修改完成
已修改2个文件
2645 ■■■■ 文件已修改
service/Warehouse/MesItemBlManager.cs 1661 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/Warehouse/MesItemTblManager.cs 984 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/Warehouse/MesItemBlManager.cs
@@ -5,6 +5,8 @@
using NewPdaSqlServer.entity.Base;
using NewPdaSqlServer.util;
using SqlSugar;
using System.Data;
using System.Data.SqlClient;
namespace NewPdaSqlServer.service.Warehouse;
@@ -111,8 +113,6 @@
        ScblScanBarcode(
            WarehouseQuery query)
    {
        //if (string.IsNullOrEmpty(query.billNo))
        //    throw new Exception("请选取单据号!");
        if (string.IsNullOrEmpty(query.barcode))
            throw new Exception("请扫描条码!");
@@ -123,355 +123,462 @@
        if (string.IsNullOrEmpty(query.blNo))
            throw new Exception("申请单号不能为空!");
        // 准备调用存储过程的参数
        string outMsg = "";
        int outSum = -1;
        decimal barcodeNum = 0;
        decimal splitNum = 0;
        // 检验是否重复扫描
        var exists = Db.Queryable<MesInvItemOutCDetails>()
            .Where(b => b.ItemBarcode == query.barcode)
            .Any();
        if (exists)
            throw new Exception("此条码已扫描,勿重复扫码!");
        // 查询条码库存信息
        var stockBarcode = Db.Queryable<MesInvItemStocks>()
            .Where(t => t.ItemBarcode == query.barcode && t.Quantity > 0)
            .First();
        if (stockBarcode == null)
            throw new Exception($"库存中无此条码,请核对!{query.barcode}");
        var depots = Db.Queryable<MesDepots>()
            .Where(t => t.DepotId == stockBarcode.DepotId)
            .First();
        // 检查补料单状态
        var mesItemBl = Db.Queryable<MesItemBl>()
            .Where(a => a.BlNo == query.blNo)
            .First();
        if (mesItemBl == null)
            throw new Exception($"申请单 {query.blNo} 已撤回!");
        if (mesItemBl.Bl018 != true)
            throw new Exception($"申请单 {query.blNo} 未审核!");
        if (mesItemBl.Bl019 == true)
            throw new Exception($"申请单 {query.blNo} 已完结!");
        // 获取补料单明细并校验
        var blDetail = Db.Queryable<MesItemBlDetail>()
            .Where(b =>
                b.Mid == mesItemBl.Id && b.Bld012 == stockBarcode.ItemId)
            .First();
        if (blDetail == null)
            throw new Exception($"申请单不存在此物料 {stockBarcode.ItemNo} 请确认!");
        // 检查待补数量
        var quantity = (blDetail.Bld007 ?? 0) - (blDetail.Bld008 ?? 0);
        if (quantity == 0)
            throw new Exception("物料已扫码完成,请核对!");
        if(stockBarcode.Quantity >  quantity)
        try
        {
            query.status = 2;
            query.message = "条码库存大于需领,请拆分!";
            query.CfNum = quantity;
            query.Num = stockBarcode.Quantity;
            return (query, []);
        }
            // 调用存储过程
            var parameters = new List<SqlParameter>
    {
        new SqlParameter("@c_user", query.userName),
        new SqlParameter("@p_bill_no", query.billNo ?? string.Empty),
        new SqlParameter("@p_item_barcode", query.barcode),
        new SqlParameter("@p_bl_no", query.blNo),
        new SqlParameter("@p_type", query.Type),
        new SqlParameter("@outMsg", SqlDbType.NVarChar, 2000) { Direction = ParameterDirection.Output },
        new SqlParameter("@outSum", SqlDbType.Int) { Direction = ParameterDirection.Output },
        new SqlParameter("@barcode_num", SqlDbType.Decimal) { Direction = ParameterDirection.Output },
        new SqlParameter("@split_num", SqlDbType.Decimal) { Direction = ParameterDirection.Output }
    };
        // 检查工单信息
        var womdaa = Db.Queryable<Womdaa>()
            .Where(a => a.Daa001 == query.billNo)
            .First();
            // 执行存储过程
            Db.Ado.ExecuteCommand(
                "EXEC PRC_PDA_SCBLCL @c_user, @p_bill_no, @p_item_barcode, @p_bl_no, @p_type, @outMsg OUTPUT, @outSum OUTPUT, @barcode_num OUTPUT, @split_num OUTPUT",
                parameters.ToArray());
        if (womdaa == null)
            throw new Exception($"工单 {query.billNo} 不存在,请确认!");
            // 获取输出参数
            outMsg = parameters[5].Value?.ToString() ?? "";
            outSum = Convert.ToInt32(parameters[6].Value);
            barcodeNum = Convert.ToDecimal(parameters[7].Value);
            splitNum = Convert.ToDecimal(parameters[8].Value);
        // 检查备料明细
        var womdab = Db.Queryable<Womdab>()
            .Where(b => b.Dab001 == query.billNo && b.Erpid == blDetail.Bld014)
            .First();
        if (womdab == null)
            throw new Exception($"备料明细不存在此物料 {stockBarcode.ItemNo} 请确认!");
        if (stockBarcode.Quantity > quantity)
        {
            // 获取待发料明细列表
            var pendingList = Db.Queryable<MesItemBl, MesItemBlDetail>((a, b) =>
                    new JoinQueryInfos(JoinType.Left, a.Id == b.Mid))
                .Where((a, b) => a.BlNo == query.blNo
                                 && (b.Bld007 ?? 0) - (b.Bld008 ?? 0) > 0)
                .Select((a, b) => new MesItemBlDetail
                {
                    Bld012 = b.Bld012,
                    Bld002 = b.Bld002,
                    Bld003 = b.Bld003,
                    Bld004 = b.Bld004,
                    Bld007 = b.Bld007,
                    Bld008 = b.Bld008
                })
                .ToList();
            query.Num = stockBarcode.Quantity;
            query.Fum = quantity;
            return (query, pendingList);
        }
        // 开启事务处理
        var success = UseTransaction(db =>
        {
            var outNoType = "";
            if(query.Type == "生产补料")
            // 处理存储过程返回的结果
            if (outSum == 2) // 需要拆分
            {
                outNoType = "SCBL(生产补料)";
            }else
            {
                outNoType = "SCCL(生产超领)";
            }
            // 获取或创建出库单
            var outId = Guid.NewGuid();
            var outNo = BillNo.GetBillNo(outNoType);
                query.status = 2;
                query.message = outMsg;
                query.CfNum = splitNum;
                query.Num = barcodeNum;
            var existingOut = db.Queryable<MesInvItemOuts>()
                .Where(a => a.TaskNo == query.blNo
                            && a.DepotId == stockBarcode.DepotId
                            && a.OutDate.Value.Date.ToString("yyyy-MM-dd") ==
                            DateTime.Now.Date.ToString("yyyy-MM-dd")
                            && a.BillTypeId == 200
                            && a.TransactionNo == 209
                            && a.Status == 0)
                .First();
            if (existingOut != null)
            {
                outId = existingOut.Guid;
                outNo = existingOut.ItemOutNo;
            }
            else
            {
                // 插入出库单主表
                db.Insertable(new MesInvItemOuts
                {
                    Guid = outId,
                    ItemOutNo = outNo,
                    TaskNo = query.blNo,
                    CreateBy = query.userName,
                    CreateDate = DateTime.Now,
                    LastupdateBy = query.userName,
                    LastupdateDate = DateTime.Now,
                    BillTypeId = 200,
                    TransactionNo = 209,
                    Remark = mesItemBl.Bl007,
                    DepotCode = depots.DepotCode,
                    OutPart = womdaa.Daa013,
                    OutType = query.Type,
                    FType = 0,
                    Factory = stockBarcode.Factory,
                    Company = stockBarcode.Company,
                    WorkNo = womdaa.Daa021,
                    BoardItem = womdaa.Daa002,
                    PbillNo = womdaa.Daa001,
                    OutDate = DateTime.Now,
                    Status = 0,
                    DepotId = stockBarcode.DepotId,
                    THORGID = stockBarcode.StockOrgId,
                    //BbillNo = query.billNo
                }).IgnoreColumns(true).ExecuteCommand();
            }
            // 检查并更新出库单物料明细
            var itemCount = db.Queryable<MesInvItemOutItems>()
                .Where(i =>
                    i.ItemOutId == outId && i.ItemId == stockBarcode.ItemId && i.ItemOutId == outId && i.DepotId == stockBarcode.DepotsId.ToString())
                .Count();
            if (itemCount > 0)
                // 更新已存在的物料明细数量
                db.Updateable<MesInvItemOutItems>()
                    .SetColumns(i =>
                        i.TlQty == i.TlQty + stockBarcode.Quantity)
                    .Where(i =>
                        i.ItemOutId == outId && i.ItemId == stockBarcode.ItemId && i.ItemOutId == outId && i.DepotId == stockBarcode.DepotsId.ToString())
                    .ExecuteCommand();
            else
                // 插入新的物料明细记录
                db.Insertable(new MesInvItemOutItems
                {
                    Guid = Guid.NewGuid(),
                    ItemOutId = outId,
                    ItemNo = blDetail.Bld002,
                    Quantity = stockBarcode.Quantity,
                    TlQty = stockBarcode.Quantity,
                    CreateBy = query.userName,
                    CreateDate = DateTime.Now,
                    LastupdateBy = query.userName,
                    LastupdateDate = DateTime.Now,
                    Factory = stockBarcode.Factory,
                    Company = stockBarcode.Company,
                    DepotCode = depots.DepotCode,
                    TaskNo = query.blNo,
                    WorkNo = womdaa.Daa021,
                    WorkLine = blDetail.Bld013,
                    ErpItemNo = womdab.Dab003,
                    ErpId = womdab.Eid,
                    ErpAutoid = womdab.Erpid,
                    PbillNo = query.billNo,
                    ItemId = blDetail.Bld012,
                    DepotId = stockBarcode.DepotId.ToString(),
                    ItemDabid = blDetail.Id,
                    // Unit = blDetail.Bld009,
                    // DepotId = (int)stockBarcode.DepotsId
                }).IgnoreColumns(true).ExecuteCommand();
            // 插入出库单条码明细
            db.Insertable(new MesInvItemOutCDetails
            {
                Guid = Guid.NewGuid(),
                ItemOutId = outId,
                ItemBarcode = stockBarcode.ItemBarcode,
                ItemNo = stockBarcode.ItemNo,
                LotNo = stockBarcode.LotNo,
                Quantity = stockBarcode.Quantity,
                ForceOutFlag = 0,
                CreateBy = query.userName,
                CreateDate = DateTime.Now,
                LastupdateBy = query.userName,
                LastupdateDate = DateTime.Now,
                DepotCode = depots.DepotCode,
                DepotSectionCode = stockBarcode.DepotSectionsCode,
                Remark = blDetail.Bld010,
                Factory = stockBarcode.Factory,
                Company = stockBarcode.Company,
                TaskNoy = mesItemBl.Bl013,
                BoardStyle = mesItemBl.Bl002,
                TaskNo = query.blNo,
                WorkNo = blDetail.Bld001,
                WorkLine = blDetail.Bld013,
                SuppNo = stockBarcode.SuppNo,
                PbillNo = query.billNo,
                ItemId = blDetail.Bld012,
                Unit = blDetail.Bld009,
                DepotId = (int)stockBarcode.DepotId,
                EbelnK3id = womdab.Eid,
                LineK3id = womdab.Erpid
            }).IgnoreColumns(true).ExecuteCommand();
            // 插入业务交易记录
            db.Insertable(new MesInvBusiness2
            {
                Guid = Guid.NewGuid(),
                Status = 1,
                BillTypeId = 200, // p_bill_type_id
                TransactionCode = "209", // p_transaction_no
                BusinessType = -1,
                ItemBarcode = stockBarcode.ItemBarcode,
                ItemNo = stockBarcode.ItemNo,
                LotNo = stockBarcode.LotNo,
                EpFlag = true,
                Quantity = stockBarcode.Quantity,
                FromInvDepotsCode = stockBarcode.DepotsCode,
                FromInvDepotSectionsCode = stockBarcode.DepotSectionsCode,
                CreateBy = query.userName,
                CreateDate = DateTime.Now,
                LastupdateBy = query.userName,
                LastupdateDate = DateTime.Now,
                Factory = stockBarcode.Factory,
                Company = stockBarcode.Company,
                TaskNo = mesItemBl.Bl012, // Matches C_QTCK.Bl012
                BillNo = query.blNo,
                WorkNo = blDetail.Bld001, // Matches C_QTCK_D.Bld001
                WorkLine = blDetail.Bld013, // Matches C_QTCK_D.Bld013
                SuppNo = stockBarcode.SuppNo,
                ItemId = stockBarcode.ItemId
                // CkDepot = stockBarcode.DepotsId
            }).IgnoreColumns(true).ExecuteCommand();
            // 更新工单表数量
            db.Updateable<Womdab>()
                .SetColumns(it => new Womdab
                {
                    Dab007 = (it.Dab007 ?? 0) + stockBarcode.Quantity,
                    Dab020 = (it.Dab020 ?? 0) + stockBarcode.Quantity,
                    Dab021 = (it.Dab021 ?? 0) + stockBarcode.Quantity
                })
                .Where(it => it.Guid == womdab.DaaGuid && it.Dab003 == womdab.Dab003)
                .ExecuteCommand();
            // 更新补料单明细已补数量
            db.Updateable<MesItemBlDetail>()
                .SetColumns(it => new MesItemBlDetail
                {
                    Bld008 = (it.Bld008 ?? 0) + (int)stockBarcode.Quantity
                })
                .Where(it => it.Id == blDetail.Id)
                .ExecuteCommand();
            // 检查补料单明细是否完成
            var blDetail1 = db.Queryable<MesItemBlDetail>()
                .Where(it => it.Id == blDetail.Id)
                .First();
            if ((blDetail1.Bld007 ?? 0) <= (blDetail1.Bld008 ?? 0))
                // 更新明细完成状态
                db.Updateable<MesItemBlDetail>()
                    .SetColumns(it => it.Bld011 == 1)
                    .Where(it => it.Id == blDetail1.Id)
                    .ExecuteCommand();
            // 更新库存数量为0
            db.Updateable<MesInvItemStocks>()
                .SetColumns(it => it.Quantity == 0)
                .Where(it => it.Guid == stockBarcode.Guid)
                .ExecuteCommand();
            // 检查是否所有明细都已完成
            var unfinishedDetail = db.Queryable<MesItemBlDetail>()
                .LeftJoin<MesItemBl>((b, a) => a.Id == b.Mid)
                .Where((b, a) => a.BlNo == query.blNo && (b.Bld011 ?? 0) == 0)
                .Select((b, a) => b)
                .First();
            if (unfinishedDetail == null)
                // 如果没有未完成的明细,更新补料单状态为已完成
                db.Updateable<MesItemBl>()
                    .SetColumns(it => new MesItemBl
                // 获取待发料明细列表
                var pendingList = Db.Queryable<MesItemBl, MesItemBlDetail>((a, b) =>
                        new JoinQueryInfos(JoinType.Left, a.Id == b.Mid))
                    .Where((a, b) => a.BlNo == query.blNo
                                    && (b.Bld007 ?? 0) - (b.Bld008 ?? 0) > 0)
                    .Select((a, b) => new MesItemBlDetail
                    {
                        Bl019 = true,
                        WcUser = query.userName,
                        WcTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
                        Bld012 = b.Bld012,
                        Bld002 = b.Bld002,
                        Bld003 = b.Bld003,
                        Bld004 = b.Bld004,
                        Bld007 = b.Bld007,
                        Bld008 = b.Bld008
                    })
                    .Where(it => it.Id == mesItemBl.Id)
                    .ExecuteCommand();
                    .ToList();
            return 1;
        });
        // 获取最终的待发料明细列表
        var finalPendingList = Db.Queryable<MesItemBl, MesItemBlDetail>(
                (a, b) =>
                    new JoinQueryInfos(JoinType.Left, a.Id == b.Mid))
            .Where((a, b) => a.BlNo == query.blNo
                             && (b.Bld007 ?? 0) - (b.Bld008 ?? 0) > 0)
            .Select((a, b) => new MesItemBlDetail
                return (query, pendingList);
            }
            else if (outSum == -1) // 处理失败
            {
                Bld012 = b.Bld012,
                Bld002 = b.Bld002,
                Bld003 = b.Bld003,
                Bld004 = b.Bld004,
                Bld007 = b.Bld007,
                Bld008 = b.Bld008
            })
            .ToList();
                throw new Exception(outMsg);
            }
            else if (outSum == 1) // 处理成功
            {
                // 获取最终的待发料明细列表
                var finalPendingList = Db.Queryable<MesItemBl, MesItemBlDetail>(
                        (a, b) => new JoinQueryInfos(JoinType.Left, a.Id == b.Mid))
                    .Where((a, b) => a.BlNo == query.blNo
                                    && (b.Bld007 ?? 0) - (b.Bld008 ?? 0) > 0)
                    .Select((a, b) => new MesItemBlDetail
                    {
                        Bld012 = b.Bld012,
                        Bld002 = b.Bld002,
                        Bld003 = b.Bld003,
                        Bld004 = b.Bld004,
                        Bld007 = b.Bld007,
                        Bld008 = b.Bld008
                    })
                    .ToList();
        return (query, finalPendingList);
                query.status = 1;
                query.message = outMsg;
                return (query, finalPendingList);
            }
            else
            {
                throw new Exception("未知的处理结果状态");
            }
        }
        catch (Exception ex)
        {
            throw new Exception($"调用存储过程PRC_PDA_SCBLCL失败: {ex.Message}");
        }
        //if (string.IsNullOrEmpty(query.billNo))
        //    throw new Exception("请选取单据号!");
        //if (string.IsNullOrEmpty(query.barcode))
        //    throw new Exception("请扫描条码!");
        //if (string.IsNullOrEmpty(query.userName))
        //    throw new Exception("用户名不能为空!");
        //if (string.IsNullOrEmpty(query.blNo))
        //    throw new Exception("申请单号不能为空!");
        //// 检验是否重复扫描
        //var exists = Db.Queryable<MesInvItemOutCDetails>()
        //    .Where(b => b.ItemBarcode == query.barcode)
        //    .Any();
        //if (exists)
        //    throw new Exception("此条码已扫描,勿重复扫码!");
        //// 查询条码库存信息
        //var stockBarcode = Db.Queryable<MesInvItemStocks>()
        //    .Where(t => t.ItemBarcode == query.barcode && t.Quantity > 0)
        //    .First();
        //if (stockBarcode == null)
        //    throw new Exception($"库存中无此条码,请核对!{query.barcode}");
        //var depots = Db.Queryable<MesDepots>()
        //    .Where(t => t.DepotId == stockBarcode.DepotId)
        //    .First();
        //// 检查补料单状态
        //var mesItemBl = Db.Queryable<MesItemBl>()
        //    .Where(a => a.BlNo == query.blNo)
        //    .First();
        //if (mesItemBl == null)
        //    throw new Exception($"申请单 {query.blNo} 已撤回!");
        //if (mesItemBl.Bl018 != true)
        //    throw new Exception($"申请单 {query.blNo} 未审核!");
        //if (mesItemBl.Bl019 == true)
        //    throw new Exception($"申请单 {query.blNo} 已完结!");
        //// 获取补料单明细并校验
        //var blDetail = Db.Queryable<MesItemBlDetail>()
        //    .Where(b =>
        //        b.Mid == mesItemBl.Id && b.Bld012 == stockBarcode.ItemId)
        //    .First();
        //if (blDetail == null)
        //    throw new Exception($"申请单不存在此物料 {stockBarcode.ItemNo} 请确认!");
        //// 检查待补数量
        //var quantity = (blDetail.Bld007 ?? 0) - (blDetail.Bld008 ?? 0);
        //if (quantity == 0)
        //    throw new Exception("物料已扫码完成,请核对!");
        //if(stockBarcode.Quantity >  quantity)
        //{
        //    query.status = 2;
        //    query.message = "条码库存大于需领,请拆分!";
        //    query.CfNum = quantity;
        //    query.Num = stockBarcode.Quantity;
        //    return (query, []);
        //}
        //// 检查工单信息
        //var womdaa = Db.Queryable<Womdaa>()
        //    .Where(a => a.Daa001 == query.billNo)
        //    .First();
        //if (womdaa == null)
        //    throw new Exception($"工单 {query.billNo} 不存在,请确认!");
        //// 检查备料明细
        //var womdab = Db.Queryable<Womdab>()
        //    .Where(b => b.Dab001 == query.billNo && b.Erpid == blDetail.Bld014)
        //    .First();
        //if (womdab == null)
        //    throw new Exception($"备料明细不存在此物料 {stockBarcode.ItemNo} 请确认!");
        //if (stockBarcode.Quantity > quantity)
        //{
        //    // 获取待发料明细列表
        //    var pendingList = Db.Queryable<MesItemBl, MesItemBlDetail>((a, b) =>
        //            new JoinQueryInfos(JoinType.Left, a.Id == b.Mid))
        //        .Where((a, b) => a.BlNo == query.blNo
        //                         && (b.Bld007 ?? 0) - (b.Bld008 ?? 0) > 0)
        //        .Select((a, b) => new MesItemBlDetail
        //        {
        //            Bld012 = b.Bld012,
        //            Bld002 = b.Bld002,
        //            Bld003 = b.Bld003,
        //            Bld004 = b.Bld004,
        //            Bld007 = b.Bld007,
        //            Bld008 = b.Bld008
        //        })
        //        .ToList();
        //    query.Num = stockBarcode.Quantity;
        //    query.Fum = quantity;
        //    return (query, pendingList);
        //}
        //// 开启事务处理
        //var success = UseTransaction(db =>
        //{
        //    var outNoType = "";
        //    if(query.Type == "生产补料")
        //    {
        //        outNoType = "SCBL(生产补料)";
        //    }else
        //    {
        //        outNoType = "SCCL(生产超领)";
        //    }
        //    // 获取或创建出库单
        //    var outId = Guid.NewGuid();
        //    var outNo = BillNo.GetBillNo(outNoType);
        //    var existingOut = db.Queryable<MesInvItemOuts>()
        //        .Where(a => a.TaskNo == query.blNo
        //                    && a.DepotId == stockBarcode.DepotId
        //                    && a.OutDate.Value.Date.ToString("yyyy-MM-dd") ==
        //                    DateTime.Now.Date.ToString("yyyy-MM-dd")
        //                    && a.BillTypeId == 200
        //                    && a.TransactionNo == 209
        //                    && a.Status == 0)
        //        .First();
        //    if (existingOut != null)
        //    {
        //        outId = existingOut.Guid;
        //        outNo = existingOut.ItemOutNo;
        //    }
        //    else
        //    {
        //        // 插入出库单主表
        //        db.Insertable(new MesInvItemOuts
        //        {
        //            Guid = outId,
        //            ItemOutNo = outNo,
        //            TaskNo = query.blNo,
        //            CreateBy = query.userName,
        //            CreateDate = DateTime.Now,
        //            LastupdateBy = query.userName,
        //            LastupdateDate = DateTime.Now,
        //            BillTypeId = 200,
        //            TransactionNo = 209,
        //            Remark = mesItemBl.Bl007,
        //            DepotCode = depots.DepotCode,
        //            OutPart = womdaa.Daa013,
        //            OutType = query.Type,
        //            FType = 0,
        //            Factory = stockBarcode.Factory,
        //            Company = stockBarcode.Company,
        //            WorkNo = womdaa.Daa021,
        //            BoardItem = womdaa.Daa002,
        //            PbillNo = womdaa.Daa001,
        //            OutDate = DateTime.Now,
        //            Status = 0,
        //            DepotId = stockBarcode.DepotId,
        //            THORGID = stockBarcode.StockOrgId,
        //            //BbillNo = query.billNo
        //        }).IgnoreColumns(true).ExecuteCommand();
        //    }
        //    // 检查并更新出库单物料明细
        //    var itemCount = db.Queryable<MesInvItemOutItems>()
        //        .Where(i =>
        //            i.ItemOutId == outId && i.ItemId == stockBarcode.ItemId && i.ItemOutId == outId && i.DepotId == stockBarcode.DepotsId.ToString())
        //        .Count();
        //    if (itemCount > 0)
        //        // 更新已存在的物料明细数量
        //        db.Updateable<MesInvItemOutItems>()
        //            .SetColumns(i =>
        //                i.TlQty == i.TlQty + stockBarcode.Quantity)
        //            .Where(i =>
        //                i.ItemOutId == outId && i.ItemId == stockBarcode.ItemId && i.ItemOutId == outId && i.DepotId == stockBarcode.DepotsId.ToString())
        //            .ExecuteCommand();
        //    else
        //        // 插入新的物料明细记录
        //        db.Insertable(new MesInvItemOutItems
        //        {
        //            Guid = Guid.NewGuid(),
        //            ItemOutId = outId,
        //            ItemNo = blDetail.Bld002,
        //            Quantity = stockBarcode.Quantity,
        //            TlQty = stockBarcode.Quantity,
        //            CreateBy = query.userName,
        //            CreateDate = DateTime.Now,
        //            LastupdateBy = query.userName,
        //            LastupdateDate = DateTime.Now,
        //            Factory = stockBarcode.Factory,
        //            Company = stockBarcode.Company,
        //            DepotCode = depots.DepotCode,
        //            TaskNo = query.blNo,
        //            WorkNo = womdaa.Daa021,
        //            WorkLine = blDetail.Bld013,
        //            ErpItemNo = womdab.Dab003,
        //            ErpId = womdab.Eid,
        //            ErpAutoid = womdab.Erpid,
        //            PbillNo = query.billNo,
        //            ItemId = blDetail.Bld012,
        //            DepotId = stockBarcode.DepotId.ToString(),
        //            ItemDabid = blDetail.Id,
        //            // Unit = blDetail.Bld009,
        //            // DepotId = (int)stockBarcode.DepotsId
        //        }).IgnoreColumns(true).ExecuteCommand();
        //    // 插入出库单条码明细
        //    db.Insertable(new MesInvItemOutCDetails
        //    {
        //        Guid = Guid.NewGuid(),
        //        ItemOutId = outId,
        //        ItemBarcode = stockBarcode.ItemBarcode,
        //        ItemNo = stockBarcode.ItemNo,
        //        LotNo = stockBarcode.LotNo,
        //        Quantity = stockBarcode.Quantity,
        //        ForceOutFlag = 0,
        //        CreateBy = query.userName,
        //        CreateDate = DateTime.Now,
        //        LastupdateBy = query.userName,
        //        LastupdateDate = DateTime.Now,
        //        DepotCode = depots.DepotCode,
        //        DepotSectionCode = stockBarcode.DepotSectionsCode,
        //        Remark = blDetail.Bld010,
        //        Factory = stockBarcode.Factory,
        //        Company = stockBarcode.Company,
        //        TaskNoy = mesItemBl.Bl013,
        //        BoardStyle = mesItemBl.Bl002,
        //        TaskNo = query.blNo,
        //        WorkNo = blDetail.Bld001,
        //        WorkLine = blDetail.Bld013,
        //        SuppNo = stockBarcode.SuppNo,
        //        PbillNo = query.billNo,
        //        ItemId = blDetail.Bld012,
        //        Unit = blDetail.Bld009,
        //        DepotId = (int)stockBarcode.DepotId,
        //        EbelnK3id = womdab.Eid,
        //        LineK3id = womdab.Erpid
        //    }).IgnoreColumns(true).ExecuteCommand();
        //    // 插入业务交易记录
        //    db.Insertable(new MesInvBusiness2
        //    {
        //        Guid = Guid.NewGuid(),
        //        Status = 1,
        //        BillTypeId = 200, // p_bill_type_id
        //        TransactionCode = "209", // p_transaction_no
        //        BusinessType = -1,
        //        ItemBarcode = stockBarcode.ItemBarcode,
        //        ItemNo = stockBarcode.ItemNo,
        //        LotNo = stockBarcode.LotNo,
        //        EpFlag = true,
        //        Quantity = stockBarcode.Quantity,
        //        FromInvDepotsCode = stockBarcode.DepotsCode,
        //        FromInvDepotSectionsCode = stockBarcode.DepotSectionsCode,
        //        CreateBy = query.userName,
        //        CreateDate = DateTime.Now,
        //        LastupdateBy = query.userName,
        //        LastupdateDate = DateTime.Now,
        //        Factory = stockBarcode.Factory,
        //        Company = stockBarcode.Company,
        //        TaskNo = mesItemBl.Bl012, // Matches C_QTCK.Bl012
        //        BillNo = query.blNo,
        //        WorkNo = blDetail.Bld001, // Matches C_QTCK_D.Bld001
        //        WorkLine = blDetail.Bld013, // Matches C_QTCK_D.Bld013
        //        SuppNo = stockBarcode.SuppNo,
        //        ItemId = stockBarcode.ItemId
        //        // CkDepot = stockBarcode.DepotsId
        //    }).IgnoreColumns(true).ExecuteCommand();
        //    // 更新工单表数量
        //    db.Updateable<Womdab>()
        //        .SetColumns(it => new Womdab
        //        {
        //            Dab007 = (it.Dab007 ?? 0) + stockBarcode.Quantity,
        //            Dab020 = (it.Dab020 ?? 0) + stockBarcode.Quantity,
        //            Dab021 = (it.Dab021 ?? 0) + stockBarcode.Quantity
        //        })
        //        .Where(it => it.Guid == womdab.DaaGuid && it.Dab003 == womdab.Dab003)
        //        .ExecuteCommand();
        //    // 更新补料单明细已补数量
        //    db.Updateable<MesItemBlDetail>()
        //        .SetColumns(it => new MesItemBlDetail
        //        {
        //            Bld008 = (it.Bld008 ?? 0) + (int)stockBarcode.Quantity
        //        })
        //        .Where(it => it.Id == blDetail.Id)
        //        .ExecuteCommand();
        //    // 检查补料单明细是否完成
        //    var blDetail1 = db.Queryable<MesItemBlDetail>()
        //        .Where(it => it.Id == blDetail.Id)
        //        .First();
        //    if ((blDetail1.Bld007 ?? 0) <= (blDetail1.Bld008 ?? 0))
        //        // 更新明细完成状态
        //        db.Updateable<MesItemBlDetail>()
        //            .SetColumns(it => it.Bld011 == 1)
        //            .Where(it => it.Id == blDetail1.Id)
        //            .ExecuteCommand();
        //    // 更新库存数量为0
        //    db.Updateable<MesInvItemStocks>()
        //        .SetColumns(it => it.Quantity == 0)
        //        .Where(it => it.Guid == stockBarcode.Guid)
        //        .ExecuteCommand();
        //    // 检查是否所有明细都已完成
        //    var unfinishedDetail = db.Queryable<MesItemBlDetail>()
        //        .LeftJoin<MesItemBl>((b, a) => a.Id == b.Mid)
        //        .Where((b, a) => a.BlNo == query.blNo && (b.Bld011 ?? 0) == 0)
        //        .Select((b, a) => b)
        //        .First();
        //    if (unfinishedDetail == null)
        //        // 如果没有未完成的明细,更新补料单状态为已完成
        //        db.Updateable<MesItemBl>()
        //            .SetColumns(it => new MesItemBl
        //            {
        //                Bl019 = true,
        //                WcUser = query.userName,
        //                WcTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
        //            })
        //            .Where(it => it.Id == mesItemBl.Id)
        //            .ExecuteCommand();
        //    return 1;
        //});
        //// 获取最终的待发料明细列表
        //var finalPendingList = Db.Queryable<MesItemBl, MesItemBlDetail>(
        //        (a, b) =>
        //            new JoinQueryInfos(JoinType.Left, a.Id == b.Mid))
        //    .Where((a, b) => a.BlNo == query.blNo
        //                     && (b.Bld007 ?? 0) - (b.Bld008 ?? 0) > 0)
        //    .Select((a, b) => new MesItemBlDetail
        //    {
        //        Bld012 = b.Bld012,
        //        Bld002 = b.Bld002,
        //        Bld003 = b.Bld003,
        //        Bld004 = b.Bld004,
        //        Bld007 = b.Bld007,
        //        Bld008 = b.Bld008
        //    })
        //    .ToList();
        //return (query, finalPendingList);
    }
    /// <summary>
@@ -490,501 +597,501 @@
    public (bool success, List<MesItemBlDetail> pendingList) SplitBarcode(
        WarehouseQuery query)
    {
        if (string.IsNullOrEmpty(query.userName))
            throw new Exception("用户名不能为空!");
        //if (string.IsNullOrEmpty(query.userName))
        //    throw new Exception("用户名不能为空!");
        if (string.IsNullOrEmpty(query.billNo))
            throw new Exception("请选取单据号!");
        //if (string.IsNullOrEmpty(query.billNo))
        //    throw new Exception("请选取单据号!");
        if (string.IsNullOrEmpty(query.barcode))
            throw new Exception("请扫描条码!");
        //if (string.IsNullOrEmpty(query.barcode))
        //    throw new Exception("请扫描条码!");
        if ((query.Num ?? 0) <= 0)
            throw new Exception("请输入正确的发料数量!");
        //if ((query.Num ?? 0) <= 0)
        //    throw new Exception("请输入正确的发料数量!");
        if (string.IsNullOrEmpty(query.blNo))
            throw new Exception("补料单号不能为空!");
        //if (string.IsNullOrEmpty(query.blNo))
        //    throw new Exception("补料单号不能为空!");
        // 检验是否重复扫描
        var exists = Db.Queryable<MesInvItemOutCDetails>()
            .Where(b => b.ItemBarcode == query.barcode)
            .Any();
        //// 检验是否重复扫描
        //var exists = Db.Queryable<MesInvItemOutCDetails>()
        //    .Where(b => b.ItemBarcode == query.barcode)
        //    .Any();
        if (exists)
            throw new Exception("此条码已扫描,勿重复扫码!");
        //if (exists)
        //    throw new Exception("此条码已扫描,勿重复扫码!");
        // 查询条码库存信息
        var stockBarcode = Db.Queryable<MesInvItemStocks>()
            .Where(t => t.ItemBarcode == query.barcode && t.Quantity > 0)
            .First();
        //// 查询条码库存信息
        //var stockBarcode = Db.Queryable<MesInvItemStocks>()
        //    .Where(t => t.ItemBarcode == query.barcode && t.Quantity > 0)
        //    .First();
        if (stockBarcode == null)
            throw new Exception($"库存中无此条码,请核对!{query.barcode}");
        //if (stockBarcode == null)
        //    throw new Exception($"库存中无此条码,请核对!{query.barcode}");
        var totalQty = stockBarcode.Quantity;
        string newBarcode = null;
        //var totalQty = stockBarcode.Quantity;
        //string newBarcode = null;
        var outNoType = "";
        if (query.Type == "生产补料")
        {
            outNoType = "SCBL(生产补料)";
        }
        else
        {
            outNoType = "SCCL(生产超领)";
        }
        //var outNoType = "";
        //if (query.Type == "生产补料")
        //{
        //    outNoType = "SCBL(生产补料)";
        //}
        //else
        //{
        //    outNoType = "SCCL(生产超领)";
        //}
        // 开启事务处理
        var success = UseTransaction(db =>
        {
            var executeCommand = 0;
        //// 开启事务处理
        //var success = UseTransaction(db =>
        //{
        //    var executeCommand = 0;
            // 拆分条码
            if (totalQty > query.Num)
            {
                var mesItems = db.Queryable<MesItems>()
                    .Where(s => s.Id == stockBarcode.ItemId).First();
        //    // 拆分条码
        //    if (totalQty > query.Num)
        //    {
        //        var mesItems = db.Queryable<MesItems>()
        //            .Where(s => s.Id == stockBarcode.ItemId).First();
                // 生成新条码号
                newBarcode = BillNo.GetBillNo("TM(条码)", mesItems.ItemNo);
        //        // 生成新条码号
        //        newBarcode = BillNo.GetBillNo("TM(条码)", mesItems.ItemNo);
                // 写入新条码
                executeCommand += db.Insertable(new MesInvItemBarcodes
                {
                    Guid = Guid.NewGuid(),
                    ItemBarcode = newBarcode,
                    CustNo = stockBarcode.CustomerNo,
                    // ProductCode = stockBarcode.ProductCode,
                    // ItemBarcode2 = stockBarcode.ItemBarcode2,
                    // ItemCode = stockBarcode.ItemCode,
                    ItemNo = stockBarcode.ItemNo,
                    LotNo = stockBarcode.LotNo,
                    Quantity = query.Num,
                    EpFlag = true,
                    TaskNo = stockBarcode.TaskNo,
                    CreateBy = query.userName,
                    CreateDate = DateTime.Now,
                    LastupdateBy = query.userName,
                    LastupdateDate = DateTime.Now,
                    OldItemBarcode = query.barcode,
                    // Mblnr = stockBarcode.Mblnr,
                    // Zeile = stockBarcode.Zeile,
                    // RohInId = stockBarcode.RohInId,
                    Barcodestatus = false,
                    Oldqty = query.Num as long?,
                    // Unit = stockBarcode.Unit,
                    // WeightUnit = stockBarcode.WeightUnit,
                    Factory = stockBarcode.Factory,
                    Company = stockBarcode.Company,
                    BillNo = stockBarcode.BillNo,
                    BoardStyle = stockBarcode.BoardStyle,
                    // ColorName = stockBarcode.ColorName,
                    WorkNo = stockBarcode.WorkNo,
                    WorkLine = stockBarcode.WorkLine,
                    // MemoBad = stockBarcode.MemoBad,
                    ComeFlg = 5,
                    // Memo = stockBarcode.Memo,
                    SuppId = stockBarcode.SuppId,
                    SuppNo = stockBarcode.SuppNo,
                    InsDate = stockBarcode.IndepDate, // Added InsDate
                    ItemId = stockBarcode.ItemId
                    // ItemUnit = stockBarcode.ItemUnit // Added ItemUnit
                }).IgnoreColumns(true).ExecuteCommand();
        //        // 写入新条码
        //        executeCommand += db.Insertable(new MesInvItemBarcodes
        //        {
        //            Guid = Guid.NewGuid(),
        //            ItemBarcode = newBarcode,
        //            CustNo = stockBarcode.CustomerNo,
        //            // ProductCode = stockBarcode.ProductCode,
        //            // ItemBarcode2 = stockBarcode.ItemBarcode2,
        //            // ItemCode = stockBarcode.ItemCode,
        //            ItemNo = stockBarcode.ItemNo,
        //            LotNo = stockBarcode.LotNo,
        //            Quantity = query.Num,
        //            EpFlag = true,
        //            TaskNo = stockBarcode.TaskNo,
        //            CreateBy = query.userName,
        //            CreateDate = DateTime.Now,
        //            LastupdateBy = query.userName,
        //            LastupdateDate = DateTime.Now,
        //            OldItemBarcode = query.barcode,
        //            // Mblnr = stockBarcode.Mblnr,
        //            // Zeile = stockBarcode.Zeile,
        //            // RohInId = stockBarcode.RohInId,
        //            Barcodestatus = false,
        //            Oldqty = query.Num as long?,
        //            // Unit = stockBarcode.Unit,
        //            // WeightUnit = stockBarcode.WeightUnit,
        //            Factory = stockBarcode.Factory,
        //            Company = stockBarcode.Company,
        //            BillNo = stockBarcode.BillNo,
        //            BoardStyle = stockBarcode.BoardStyle,
        //            // ColorName = stockBarcode.ColorName,
        //            WorkNo = stockBarcode.WorkNo,
        //            WorkLine = stockBarcode.WorkLine,
        //            // MemoBad = stockBarcode.MemoBad,
        //            ComeFlg = 5,
        //            // Memo = stockBarcode.Memo,
        //            SuppId = stockBarcode.SuppId,
        //            SuppNo = stockBarcode.SuppNo,
        //            InsDate = stockBarcode.IndepDate, // Added InsDate
        //            ItemId = stockBarcode.ItemId
        //            // ItemUnit = stockBarcode.ItemUnit // Added ItemUnit
        //        }).IgnoreColumns(true).ExecuteCommand();
                // 更新原条码数量
                executeCommand += db.Updateable<MesInvItemBarcodes>()
                    .SetColumns(it => it.Quantity == it.Quantity - query.Num)
                    .Where(it => it.ItemBarcode == query.barcode)
                    .ExecuteCommand();
        //        // 更新原条码数量
        //        executeCommand += db.Updateable<MesInvItemBarcodes>()
        //            .SetColumns(it => it.Quantity == it.Quantity - query.Num)
        //            .Where(it => it.ItemBarcode == query.barcode)
        //            .ExecuteCommand();
                // 更新原条码数量
                executeCommand += db.Updateable<MesInvItemStocks>()
                    .SetColumns(it => it.Quantity == it.Quantity - query.Num)
                    .Where(it => it.ItemBarcode == query.barcode)
                    .ExecuteCommand();
        //        // 更新原条码数量
        //        executeCommand += db.Updateable<MesInvItemStocks>()
        //            .SetColumns(it => it.Quantity == it.Quantity - query.Num)
        //            .Where(it => it.ItemBarcode == query.barcode)
        //            .ExecuteCommand();
                //// 删除原条码库存记录
                //executeCommand += db.Deleteable<MesInvItemStocks>()
                //    .Where(it => it.ItemBarcode == query.barcode)
                //    .ExecuteCommand();
        //        //// 删除原条码库存记录
        //        //executeCommand += db.Deleteable<MesInvItemStocks>()
        //        //    .Where(it => it.ItemBarcode == query.barcode)
        //        //    .ExecuteCommand();
                // 插入剩余条码数量的新库存记录
                executeCommand += db.Insertable(new MesInvItemStocks
                {
                    Guid = Guid.NewGuid(),
                    TaskNo = stockBarcode.TaskNo,
                    ItemBarcode = newBarcode,
                    ItemNo = stockBarcode.ItemNo,
                    LotNo = stockBarcode.LotNo,
                    Quantity = query.Num,
                    EpFlag = stockBarcode.EpFlag,
                    CustomerNo = stockBarcode.CustomerNo,
                    ItemWt = stockBarcode.ItemWt,
                    DepotsCode = stockBarcode.DepotsCode,
                    DepotsId = stockBarcode.DepotsId,
                    DepotSectionsCode = stockBarcode.DepotSectionsCode,
                    CheckDate = stockBarcode.CheckDate,
                    ItemType = stockBarcode.ItemType,
                    IndepDate = stockBarcode.IndepDate,
                    Factory = stockBarcode.Factory,
                    Company = stockBarcode.Company,
                    IqcStatus = stockBarcode.IqcStatus,
                    BoardStyle = stockBarcode.BoardStyle,
                    WorkNo = stockBarcode.WorkNo,
                    WorkLine = stockBarcode.WorkLine,
                    SuppNo = stockBarcode.SuppNo,
                    ItemId = stockBarcode.ItemId
                    // UnitId = stockBarcode.ItemUnit
                }).IgnoreColumns(true).ExecuteCommand();
        //        // 插入剩余条码数量的新库存记录
        //        executeCommand += db.Insertable(new MesInvItemStocks
        //        {
        //            Guid = Guid.NewGuid(),
        //            TaskNo = stockBarcode.TaskNo,
        //            ItemBarcode = newBarcode,
        //            ItemNo = stockBarcode.ItemNo,
        //            LotNo = stockBarcode.LotNo,
        //            Quantity = query.Num,
        //            EpFlag = stockBarcode.EpFlag,
        //            CustomerNo = stockBarcode.CustomerNo,
        //            ItemWt = stockBarcode.ItemWt,
        //            DepotsCode = stockBarcode.DepotsCode,
        //            DepotsId = stockBarcode.DepotsId,
        //            DepotSectionsCode = stockBarcode.DepotSectionsCode,
        //            CheckDate = stockBarcode.CheckDate,
        //            ItemType = stockBarcode.ItemType,
        //            IndepDate = stockBarcode.IndepDate,
        //            Factory = stockBarcode.Factory,
        //            Company = stockBarcode.Company,
        //            IqcStatus = stockBarcode.IqcStatus,
        //            BoardStyle = stockBarcode.BoardStyle,
        //            WorkNo = stockBarcode.WorkNo,
        //            WorkLine = stockBarcode.WorkLine,
        //            SuppNo = stockBarcode.SuppNo,
        //            ItemId = stockBarcode.ItemId
        //            // UnitId = stockBarcode.ItemUnit
        //        }).IgnoreColumns(true).ExecuteCommand();
                // 写入新条码的交易记录
                executeCommand += db.Insertable(new MesInvBusiness2
                {
                    Guid = Guid.NewGuid(),
                    Status = 1,
                    BillTypeId = 200, // p_bill_type_id
                    TransactionCode = "209", // p_transaction_no
                    BusinessType = 0,
                    ItemBarcode = newBarcode,
                    ItemNo = stockBarcode.ItemNo,
                    LotNo = stockBarcode.LotNo,
                    EpFlag = true,
                    Quantity = query.Num,
                    FromInvDepotsCode = null,
                    FromInvDepotSectionsCode = null,
                    ToInvDepotsCode = stockBarcode.DepotsCode,
                    ToInvDepotSectionsCode = stockBarcode.DepotSectionsCode,
                    Description = query.Type + "拆分生成",
                    CreateBy = query.userName,
                    CreateDate = DateTime.Now,
                    LastupdateBy = query.userName,
                    LastupdateDate = DateTime.Now,
                    Factory = stockBarcode.Factory,
                    Company = stockBarcode.Company,
                    TaskNo = stockBarcode.TaskNo,
                    BillNo = stockBarcode.BillNo,
                    WorkNo = stockBarcode.WorkNo,
                    WorkLine = stockBarcode.WorkLine,
                    SuppNo = stockBarcode.SuppNo,
                    SuppId = stockBarcode.SuppId,
                    ItemId = stockBarcode.ItemId
                    // CkDepot = stockBarcode.DepotsId
                }).IgnoreColumns(true).ExecuteCommand();
            }
            else if (totalQty < query.Num)
            {
                throw new Exception("发料数量大于条码数,请核对!");
            }
        //        // 写入新条码的交易记录
        //        executeCommand += db.Insertable(new MesInvBusiness2
        //        {
        //            Guid = Guid.NewGuid(),
        //            Status = 1,
        //            BillTypeId = 200, // p_bill_type_id
        //            TransactionCode = "209", // p_transaction_no
        //            BusinessType = 0,
        //            ItemBarcode = newBarcode,
        //            ItemNo = stockBarcode.ItemNo,
        //            LotNo = stockBarcode.LotNo,
        //            EpFlag = true,
        //            Quantity = query.Num,
        //            FromInvDepotsCode = null,
        //            FromInvDepotSectionsCode = null,
        //            ToInvDepotsCode = stockBarcode.DepotsCode,
        //            ToInvDepotSectionsCode = stockBarcode.DepotSectionsCode,
        //            Description = query.Type + "拆分生成",
        //            CreateBy = query.userName,
        //            CreateDate = DateTime.Now,
        //            LastupdateBy = query.userName,
        //            LastupdateDate = DateTime.Now,
        //            Factory = stockBarcode.Factory,
        //            Company = stockBarcode.Company,
        //            TaskNo = stockBarcode.TaskNo,
        //            BillNo = stockBarcode.BillNo,
        //            WorkNo = stockBarcode.WorkNo,
        //            WorkLine = stockBarcode.WorkLine,
        //            SuppNo = stockBarcode.SuppNo,
        //            SuppId = stockBarcode.SuppId,
        //            ItemId = stockBarcode.ItemId
        //            // CkDepot = stockBarcode.DepotsId
        //        }).IgnoreColumns(true).ExecuteCommand();
        //    }
        //    else if (totalQty < query.Num)
        //    {
        //        throw new Exception("发料数量大于条码数,请核对!");
        //    }
            //if (string.IsNullOrEmpty(newBarcode)) newBarcode = query.barcode;
        //    //if (string.IsNullOrEmpty(newBarcode)) newBarcode = query.barcode;
            // 检查补料单状态
            var mesItemBl = Db.Queryable<MesItemBl>()
                .Where(a => a.BlNo == query.blNo && (a.Bl018 ?? false) == true)
                .First();
        //    // 检查补料单状态
        //    var mesItemBl = Db.Queryable<MesItemBl>()
        //        .Where(a => a.BlNo == query.blNo && (a.Bl018 ?? false) == true)
        //        .First();
            if (mesItemBl == null)
                throw new Exception($"申请单 {query.blNo} 已撤回!");
        //    if (mesItemBl == null)
        //        throw new Exception($"申请单 {query.blNo} 已撤回!");
            if (mesItemBl.Bl018 != true)
                throw new Exception($"申请单 {query.blNo} 未审核!");
        //    if (mesItemBl.Bl018 != true)
        //        throw new Exception($"申请单 {query.blNo} 未审核!");
            if (mesItemBl.Bl019 == true)
                throw new Exception($"申请单 {query.blNo} 已完结!");
        //    if (mesItemBl.Bl019 == true)
        //        throw new Exception($"申请单 {query.blNo} 已完结!");
            // 获取补料单明细并校验
            var blDetail = Db.Queryable<MesItemBlDetail>()
                .Where(b =>
                    b.Mid == mesItemBl.Id && b.Bld012 == stockBarcode.ItemId)
                .First();
        //    // 获取补料单明细并校验
        //    var blDetail = Db.Queryable<MesItemBlDetail>()
        //        .Where(b =>
        //            b.Mid == mesItemBl.Id && b.Bld012 == stockBarcode.ItemId)
        //        .First();
            if (blDetail == null)
                throw new Exception($"申请单不存在此物料 {stockBarcode.ItemNo} 请确认!");
        //    if (blDetail == null)
        //        throw new Exception($"申请单不存在此物料 {stockBarcode.ItemNo} 请确认!");
            var remainingQty = (blDetail.Bld007 ?? 0) - (blDetail.Bld008 ?? 0);
            if (remainingQty == 0)
                throw new Exception("物料已扫码完成,请核对!");
        //    var remainingQty = (blDetail.Bld007 ?? 0) - (blDetail.Bld008 ?? 0);
        //    if (remainingQty == 0)
        //        throw new Exception("物料已扫码完成,请核对!");
            if (query.Num > remainingQty)
                throw new Exception(
                    $"拆分数量:{query.Num} 大于待发料数量:{remainingQty},请核对!");
        //    if (query.Num > remainingQty)
        //        throw new Exception(
        //            $"拆分数量:{query.Num} 大于待发料数量:{remainingQty},请核对!");
            // 检查工单信息
            var womdaa = Db.Queryable<Womdaa>()
                .Where(a => a.Daa001 == query.billNo)
                .First();
        //    // 检查工单信息
        //    var womdaa = Db.Queryable<Womdaa>()
        //        .Where(a => a.Daa001 == query.billNo)
        //        .First();
            if (womdaa == null)
                throw new Exception($"工单 {query.billNo} 不存在,请确认!");
        //    if (womdaa == null)
        //        throw new Exception($"工单 {query.billNo} 不存在,请确认!");
            var womdab = Db.Queryable<Womdab>()
                .Where(b =>
                    b.Dab001 == query.billNo && b.Erpid == blDetail.Bld014)
                .First();
        //    var womdab = Db.Queryable<Womdab>()
        //        .Where(b =>
        //            b.Dab001 == query.billNo && b.Erpid == blDetail.Bld014)
        //        .First();
            if (womdab == null)
                throw new Exception($"备料明细不存在此物料 {stockBarcode.ItemNo} 请确认!");
        //    if (womdab == null)
        //        throw new Exception($"备料明细不存在此物料 {stockBarcode.ItemNo} 请确认!");
            // 检查已发料数量是否超过待发料数量
            var sumQty = db.Queryable<MesInvItemOutCDetails>()
                .Where(it =>
                    it.TaskNo == query.blNo && it.ItemId == stockBarcode.ItemId)
                .Sum(it => it.Quantity);
        //    // 检查已发料数量是否超过待发料数量
        //    var sumQty = db.Queryable<MesInvItemOutCDetails>()
        //        .Where(it =>
        //            it.TaskNo == query.blNo && it.ItemId == stockBarcode.ItemId)
        //        .Sum(it => it.Quantity);
            //if (sumQty > remainingQty)
            //    throw new Exception(
            //        $"拆分数量:{sumQty} 大于待发料数量:{remainingQty},请核对!");
        //    //if (sumQty > remainingQty)
        //    //    throw new Exception(
        //    //        $"拆分数量:{sumQty} 大于待发料数量:{remainingQty},请核对!");
            var depots = Db.Queryable<MesDepots>()
                .Where(t => t.DepotId == stockBarcode.DepotId)
                .First();
        //    var depots = Db.Queryable<MesDepots>()
        //        .Where(t => t.DepotId == stockBarcode.DepotId)
        //        .First();
            // 获取或创建出库单
            var itemOut = db.Queryable<MesInvItemOuts>()
                .Where(a => a.TaskNo == query.blNo
                            && a.DepotId == stockBarcode.DepotId
                            && a.OutDate.Value.Date.ToString("yyyy-MM-dd") ==
                            DateTime.Now.Date.ToString("yyyy-MM-dd")
                            && a.BillTypeId == 200
                            && a.TransactionNo == 209
                            && a.Status == 0)
                .First();
        //    // 获取或创建出库单
        //    var itemOut = db.Queryable<MesInvItemOuts>()
        //        .Where(a => a.TaskNo == query.blNo
        //                    && a.DepotId == stockBarcode.DepotId
        //                    && a.OutDate.Value.Date.ToString("yyyy-MM-dd") ==
        //                    DateTime.Now.Date.ToString("yyyy-MM-dd")
        //                    && a.BillTypeId == 200
        //                    && a.TransactionNo == 209
        //                    && a.Status == 0)
        //        .First();
            var outId = new Guid();
            var outNo = "";
            if (itemOut == null)
            {
                // 创建新的出库单
                outId = Guid.NewGuid();
                outNo = BillNo.GetBillNo(outNoType);
        //    var outId = new Guid();
        //    var outNo = "";
        //    if (itemOut == null)
        //    {
        //        // 创建新的出库单
        //        outId = Guid.NewGuid();
        //        outNo = BillNo.GetBillNo(outNoType);
                // 插入出库单主表
                executeCommand += db.Insertable(new MesInvItemOuts
                {
                    Guid = outId,
                    ItemOutNo = outNo,
                    TaskNo = query.blNo,
                    CreateBy = query.userName,
                    CreateDate = DateTime.Now,
                    LastupdateBy = query.userName,
                    LastupdateDate = DateTime.Now,
                    BillTypeId = 200,
                    TransactionNo = 209,
                    Remark = mesItemBl.Bl007,
                    DepotCode = depots.DepotCode,
                    OutPart = womdaa.Daa013,
                    FType = 0,
                    Factory = stockBarcode.Factory,
                    Company = stockBarcode.Company,
                    WorkNo = womdaa.Daa021,
                    BoardItem = womdaa.Daa002,
                    PbillNo = womdaa.Daa001,
                    OutDate = DateTime.Now,
                    Status = 0,
                    DepotId = stockBarcode.DepotId,
                    THORGID = stockBarcode.StockOrgId,
                    OutType = query.Type,
                    //BbillNo = query.blNo
                }).IgnoreColumns(true).ExecuteCommand();
            }
            else
            {
                 outId = itemOut.Guid;
                 outNo = itemOut.ItemOutNo;
            }
        //        // 插入出库单主表
        //        executeCommand += db.Insertable(new MesInvItemOuts
        //        {
        //            Guid = outId,
        //            ItemOutNo = outNo,
        //            TaskNo = query.blNo,
        //            CreateBy = query.userName,
        //            CreateDate = DateTime.Now,
        //            LastupdateBy = query.userName,
        //            LastupdateDate = DateTime.Now,
        //            BillTypeId = 200,
        //            TransactionNo = 209,
        //            Remark = mesItemBl.Bl007,
        //            DepotCode = depots.DepotCode,
        //            OutPart = womdaa.Daa013,
        //            FType = 0,
        //            Factory = stockBarcode.Factory,
        //            Company = stockBarcode.Company,
        //            WorkNo = womdaa.Daa021,
        //            BoardItem = womdaa.Daa002,
        //            PbillNo = womdaa.Daa001,
        //            OutDate = DateTime.Now,
        //            Status = 0,
        //            DepotId = stockBarcode.DepotId,
        //            THORGID = stockBarcode.StockOrgId,
        //            OutType = query.Type,
        //            //BbillNo = query.blNo
        //        }).IgnoreColumns(true).ExecuteCommand();
        //    }
        //    else
        //    {
        //         outId = itemOut.Guid;
        //         outNo = itemOut.ItemOutNo;
        //    }
            // 检查是否已存在出库单明细
            var itemOutItemCount = db.Queryable<MesInvItemOutItems>()
                .Where(it =>
                    it.ItemOutId == outId &&
                    it.ItemId == stockBarcode.ItemId &&
                    it.DepotId == stockBarcode.DepotId.ToString())
                .Count();
        //    // 检查是否已存在出库单明细
        //    var itemOutItemCount = db.Queryable<MesInvItemOutItems>()
        //        .Where(it =>
        //            it.ItemOutId == outId &&
        //            it.ItemId == stockBarcode.ItemId &&
        //            it.DepotId == stockBarcode.DepotId.ToString())
        //        .Count();
            if (itemOutItemCount == 0)
                // 插入新的出库单明细
                executeCommand += db.Insertable(new MesInvItemOutItems
                {
                    Guid = Guid.NewGuid(),
                    ItemOutId = outId,
                    ItemNo = blDetail.Bld002,
                    Quantity = query.Num,
                    TlQty = query.Num,
                    CreateBy = query.userName,
                    CreateDate = DateTime.Now,
                    LastupdateBy = query.userName,
                    LastupdateDate = DateTime.Now,
                    Factory = stockBarcode.Factory,
                    Company = stockBarcode.Company,
                    DepotCode = depots.DepotCode,
                    TaskNo = query.blNo,
                    WorkNo = womdaa.Daa021,
                    WorkLine = blDetail.Bld013,
                    ErpItemNo = womdab.Dab003,
                    ErpId = womdab.Eid,
                    ErpAutoid = womdab.Erpid,
                    PbillNo = query.billNo,
                    ItemId = blDetail.Bld012,
                    DepotId = stockBarcode.DepotId.ToString(),
                    ItemDabid = blDetail.Id,
                    // Unit = blDetail.Bld009,
                    // DepotId = (int)stockBarcode.DepotsId
                }).IgnoreColumns(true).ExecuteCommand();
            else
                // 更新已有出库单明细数量
                executeCommand += db.Updateable<MesInvItemOutItems>()
                    .SetColumns(it => it.TlQty == (it.TlQty ?? 0) + query.Num)
                    .Where(it =>
                    it.ItemOutId == outId &&
                    it.ItemId == stockBarcode.ItemId &&
                    it.DepotId == stockBarcode.DepotId.ToString())
                    .ExecuteCommand();
        //    if (itemOutItemCount == 0)
        //        // 插入新的出库单明细
        //        executeCommand += db.Insertable(new MesInvItemOutItems
        //        {
        //            Guid = Guid.NewGuid(),
        //            ItemOutId = outId,
        //            ItemNo = blDetail.Bld002,
        //            Quantity = query.Num,
        //            TlQty = query.Num,
        //            CreateBy = query.userName,
        //            CreateDate = DateTime.Now,
        //            LastupdateBy = query.userName,
        //            LastupdateDate = DateTime.Now,
        //            Factory = stockBarcode.Factory,
        //            Company = stockBarcode.Company,
        //            DepotCode = depots.DepotCode,
        //            TaskNo = query.blNo,
        //            WorkNo = womdaa.Daa021,
        //            WorkLine = blDetail.Bld013,
        //            ErpItemNo = womdab.Dab003,
        //            ErpId = womdab.Eid,
        //            ErpAutoid = womdab.Erpid,
        //            PbillNo = query.billNo,
        //            ItemId = blDetail.Bld012,
        //            DepotId = stockBarcode.DepotId.ToString(),
        //            ItemDabid = blDetail.Id,
        //            // Unit = blDetail.Bld009,
        //            // DepotId = (int)stockBarcode.DepotsId
        //        }).IgnoreColumns(true).ExecuteCommand();
        //    else
        //        // 更新已有出库单明细数量
        //        executeCommand += db.Updateable<MesInvItemOutItems>()
        //            .SetColumns(it => it.TlQty == (it.TlQty ?? 0) + query.Num)
        //            .Where(it =>
        //            it.ItemOutId == outId &&
        //            it.ItemId == stockBarcode.ItemId &&
        //            it.DepotId == stockBarcode.DepotId.ToString())
        //            .ExecuteCommand();
            // 插入出库条码明细
            executeCommand += db.Insertable(new MesInvItemOutCDetails
            {
                Guid = Guid.NewGuid(),
                ItemOutId = outId,
                ItemBarcode = newBarcode ?? query.barcode,
                ItemNo = stockBarcode.ItemNo,
                LotNo = stockBarcode.LotNo,
                Quantity = query.Num,
                ForceOutFlag = 0,
                CreateBy = query.userName,
                CreateDate = DateTime.Now,
                LastupdateBy = query.userName,
                LastupdateDate = DateTime.Now,
                DepotCode = depots.DepotCode,
                DepotSectionCode = stockBarcode.DepotSectionsCode,
                Remark = blDetail.Bld010,
                Factory = stockBarcode.Factory,
                Company = stockBarcode.Company,
                TaskNoy = mesItemBl.Bl013,
                BoardStyle = mesItemBl.Bl002,
                TaskNo = query.blNo,
                WorkNo = blDetail.Bld001,
                WorkLine = blDetail.Bld013,
                SuppNo = stockBarcode.SuppNo,
                PbillNo = query.billNo,
                ItemId = blDetail.Bld012,
                Unit = blDetail.Bld009,
                DepotId = (int)stockBarcode.DepotId,
                Dabid = womdab.Guid,
            }).IgnoreColumns(true).ExecuteCommand();
        //    // 插入出库条码明细
        //    executeCommand += db.Insertable(new MesInvItemOutCDetails
        //    {
        //        Guid = Guid.NewGuid(),
        //        ItemOutId = outId,
        //        ItemBarcode = newBarcode ?? query.barcode,
        //        ItemNo = stockBarcode.ItemNo,
        //        LotNo = stockBarcode.LotNo,
        //        Quantity = query.Num,
        //        ForceOutFlag = 0,
        //        CreateBy = query.userName,
        //        CreateDate = DateTime.Now,
        //        LastupdateBy = query.userName,
        //        LastupdateDate = DateTime.Now,
        //        DepotCode = depots.DepotCode,
        //        DepotSectionCode = stockBarcode.DepotSectionsCode,
        //        Remark = blDetail.Bld010,
        //        Factory = stockBarcode.Factory,
        //        Company = stockBarcode.Company,
        //        TaskNoy = mesItemBl.Bl013,
        //        BoardStyle = mesItemBl.Bl002,
        //        TaskNo = query.blNo,
        //        WorkNo = blDetail.Bld001,
        //        WorkLine = blDetail.Bld013,
        //        SuppNo = stockBarcode.SuppNo,
        //        PbillNo = query.billNo,
        //        ItemId = blDetail.Bld012,
        //        Unit = blDetail.Bld009,
        //        DepotId = (int)stockBarcode.DepotId,
        //        Dabid = womdab.Guid,
        //    }).IgnoreColumns(true).ExecuteCommand();
            // 插入业务流水
            executeCommand += db.Insertable(new MesInvBusiness2
            {
                Guid = Guid.NewGuid(),
                Status = 1,
                BillTypeId = 200, // p_bill_type_id
                TransactionCode = "209", // p_transaction_no
                BusinessType = 1,
                ItemBarcode = newBarcode ?? query.barcode,
                ItemNo = stockBarcode.ItemNo,
                LotNo = stockBarcode.LotNo,
                EpFlag = true,
                Quantity = query.Num,
                FromInvDepotsCode = stockBarcode.DepotsCode,
                FromInvDepotSectionsCode = stockBarcode.DepotSectionsCode,
                Description = query.Type,
                CreateBy = query.userName,
                CreateDate = DateTime.Now,
                LastupdateBy = query.userName,
                LastupdateDate = DateTime.Now,
                Factory = stockBarcode.Factory,
                Company = stockBarcode.Company,
                TaskNo = mesItemBl.Bl012,
                BillNo = query.blNo,
                WorkNo = blDetail.Bld001,
                WorkLine = blDetail.Bld013,
                SuppNo = stockBarcode.SuppNo,
                ItemId = stockBarcode.ItemId
                // CkDepot = stockBarcode.DepotsId
            }).IgnoreColumns(true).ExecuteCommand();
        //    // 插入业务流水
        //    executeCommand += db.Insertable(new MesInvBusiness2
        //    {
        //        Guid = Guid.NewGuid(),
        //        Status = 1,
        //        BillTypeId = 200, // p_bill_type_id
        //        TransactionCode = "209", // p_transaction_no
        //        BusinessType = 1,
        //        ItemBarcode = newBarcode ?? query.barcode,
        //        ItemNo = stockBarcode.ItemNo,
        //        LotNo = stockBarcode.LotNo,
        //        EpFlag = true,
        //        Quantity = query.Num,
        //        FromInvDepotsCode = stockBarcode.DepotsCode,
        //        FromInvDepotSectionsCode = stockBarcode.DepotSectionsCode,
        //        Description = query.Type,
        //        CreateBy = query.userName,
        //        CreateDate = DateTime.Now,
        //        LastupdateBy = query.userName,
        //        LastupdateDate = DateTime.Now,
        //        Factory = stockBarcode.Factory,
        //        Company = stockBarcode.Company,
        //        TaskNo = mesItemBl.Bl012,
        //        BillNo = query.blNo,
        //        WorkNo = blDetail.Bld001,
        //        WorkLine = blDetail.Bld013,
        //        SuppNo = stockBarcode.SuppNo,
        //        ItemId = stockBarcode.ItemId
        //        // CkDepot = stockBarcode.DepotsId
        //    }).IgnoreColumns(true).ExecuteCommand();
            // 更新工单表数量
            executeCommand += db.Updateable<Womdab>()
                .SetColumns(it => new Womdab
                {
                    Dab007 = (it.Dab007 ?? 0) + query.Num, // 工单数量
                    Dab020 = (it.Dab020 ?? 0) + query.Num, // 已发料数量
                    Dab021 = (it.Dab021 ?? 0) + query.Num // 已发料数量
                })
                .Where(it => it.Guid == womdab.DaaGuid && it.Dab003 == womdab.Dab003)
                .ExecuteCommand();
        //    // 更新工单表数量
        //    executeCommand += db.Updateable<Womdab>()
        //        .SetColumns(it => new Womdab
        //        {
        //            Dab007 = (it.Dab007 ?? 0) + query.Num, // 工单数量
        //            Dab020 = (it.Dab020 ?? 0) + query.Num, // 已发料数量
        //            Dab021 = (it.Dab021 ?? 0) + query.Num // 已发料数量
        //        })
        //        .Where(it => it.Guid == womdab.DaaGuid && it.Dab003 == womdab.Dab003)
        //        .ExecuteCommand();
            // 更新补料单明细已补数量
            executeCommand += db.Updateable<MesItemBlDetail>()
                .SetColumns(it => new MesItemBlDetail
                {
                    Bld008 = (it.Bld008 ?? 0) + (int)query.Num
                })
                .Where(it => it.Id == blDetail.Id)
                .ExecuteCommand();
        //    // 更新补料单明细已补数量
        //    executeCommand += db.Updateable<MesItemBlDetail>()
        //        .SetColumns(it => new MesItemBlDetail
        //        {
        //            Bld008 = (it.Bld008 ?? 0) + (int)query.Num
        //        })
        //        .Where(it => it.Id == blDetail.Id)
        //        .ExecuteCommand();
            // 获取更新后的补料单明细数量
            var updatedDetail = db.Queryable<MesItemBlDetail>()
                .Where(it => it.Id == blDetail.Id)
                .Select(it => new { it.Bld007, it.Bld008 })
                .First();
        //    // 获取更新后的补料单明细数量
        //    var updatedDetail = db.Queryable<MesItemBlDetail>()
        //        .Where(it => it.Id == blDetail.Id)
        //        .Select(it => new { it.Bld007, it.Bld008 })
        //        .First();
            if ((updatedDetail.Bld007 ?? 0) <= (updatedDetail.Bld008 ?? 0))
                // 更新明细完成状态
                executeCommand += db.Updateable<MesItemBlDetail>()
                    .SetColumns(it => new MesItemBlDetail { Bld011 = 1 })
                    .Where(it => it.Id == blDetail.Id)
                    .ExecuteCommand();
        //    if ((updatedDetail.Bld007 ?? 0) <= (updatedDetail.Bld008 ?? 0))
        //        // 更新明细完成状态
        //        executeCommand += db.Updateable<MesItemBlDetail>()
        //            .SetColumns(it => new MesItemBlDetail { Bld011 = 1 })
        //            .Where(it => it.Id == blDetail.Id)
        //            .ExecuteCommand();
            // 检查是否还有未完成的明细
        //    // 检查是否还有未完成的明细
            var unfinishedDetail = db.Queryable<MesItemBlDetail>()
                .Where(it => it.Mid == mesItemBl.Id && (it.Bld011 ?? 0) == 0)
                .First();
        //    var unfinishedDetail = db.Queryable<MesItemBlDetail>()
        //        .Where(it => it.Mid == mesItemBl.Id && (it.Bld011 ?? 0) == 0)
        //        .First();
            if (unfinishedDetail == null)
                // 如果没有找到未完成明细,则更新补料单状态为已完成
                executeCommand += db.Updateable<MesItemBl>()
                    .SetColumns(it => new MesItemBl
                    {
                        Bl019 = true,
                        WcUser = query.userName,
                        WcTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
                    })
                    .Where(it => it.Id == mesItemBl.Id)
                    .ExecuteCommand();
        //    if (unfinishedDetail == null)
        //        // 如果没有找到未完成明细,则更新补料单状态为已完成
        //        executeCommand += db.Updateable<MesItemBl>()
        //            .SetColumns(it => new MesItemBl
        //            {
        //                Bl019 = true,
        //                WcUser = query.userName,
        //                WcTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
        //            })
        //            .Where(it => it.Id == mesItemBl.Id)
        //            .ExecuteCommand();
            if (executeCommand <= 1) throw new Exception("更新失败");
        //    if (executeCommand <= 1) throw new Exception("更新失败");
            // 创建 插入日志
            var logService = new LogService();
            var LogMsg = "[PDA]" + query.Type + "。条码【" + query.barcode + "】 出库单号【" + outNo + "】";
            logService.CreateLog(db, query.userName, womdaa.Guid.ToString(), "WOMDAA", LogMsg, womdaa.Daa001);
        //    // 创建 插入日志
        //    var logService = new LogService();
        //    var LogMsg = "[PDA]" + query.Type + "。条码【" + query.barcode + "】 出库单号【" + outNo + "】";
        //    logService.CreateLog(db, query.userName, womdaa.Guid.ToString(), "WOMDAA", LogMsg, womdaa.Daa001);
            return executeCommand;
        }) > 0;
        //    return executeCommand;
        //}) > 0;
        // 获取最终的待发料明细列表
        var pendingList = Db.Queryable<MesItemBl, MesItemBlDetail>((a, b) =>
                new JoinQueryInfos(JoinType.Left, a.Id == b.Mid))
            .Where((a, b) => a.BlNo == query.blNo
                             && (b.Bld007 ?? 0) - (b.Bld008 ?? 0) > 0)
            .Select((a, b) => new MesItemBlDetail
            {
                Bld012 = b.Bld012,
                Bld002 = b.Bld002,
                Bld003 = b.Bld003,
                Bld004 = b.Bld004,
                Bld007 = b.Bld007,
                Bld008 = b.Bld008
            })
            .ToList();
        //// 获取最终的待发料明细列表
        //var pendingList = Db.Queryable<MesItemBl, MesItemBlDetail>((a, b) =>
        //        new JoinQueryInfos(JoinType.Left, a.Id == b.Mid))
        //    .Where((a, b) => a.BlNo == query.blNo
        //                     && (b.Bld007 ?? 0) - (b.Bld008 ?? 0) > 0)
        //    .Select((a, b) => new MesItemBlDetail
        //    {
        //        Bld012 = b.Bld012,
        //        Bld002 = b.Bld002,
        //        Bld003 = b.Bld003,
        //        Bld004 = b.Bld004,
        //        Bld007 = b.Bld007,
        //        Bld008 = b.Bld008
        //    })
        //    .ToList();
        return (success, pendingList);
        //return (success, pendingList);
    }
    #endregion
@@ -1861,7 +1968,7 @@
fROM MES_ITEM_BL_DETAIL A
         LEFT JOIN MES_ITEM_BL B ON A.MID = B.ID
         LEFT JOIN MES_ITEMS C ON A.bld012 = CAST(C.item_id AS VARCHAR(50))
         LEFT JOIN WW_GD D ON B.about_guid = D.ID
         LEFT JOIN WOMDAA D ON B.about_guid = D.guid
WHERE B.bl_no = '{0}'", query.billNo);
        var womdabs = Db.Ado.SqlQuery<ItemDetailModel>(sql);
service/Warehouse/MesItemTblManager.cs
@@ -5,6 +5,8 @@
using NewPdaSqlServer.entity.Base;
using NewPdaSqlServer.util;
using SqlSugar;
using System.Data;
using System.Data.SqlClient;
using System.Security.Cryptography;
namespace NewPdaSqlServer.service.Warehouse;
@@ -109,477 +111,537 @@
    /// <returns>处理结果</returns>
    public WarehouseQuery SctlScanBarcode(WarehouseQuery query)
    {
        var p_item_barcode = query.barcode; // 物料条码
        var p_bill_no = query.billNo; // 单据号
        var p_section_code = query.DepotCode; // 库位编码
        var c_user = query.userName; // 用户名
        var p_bill_type_id = 100; // 单据类型ID
        var p_transction_no = 104; // 交易编号
        // 验证库位条码
        if (p_section_code.IsNullOrEmpty()) throw new Exception("请扫库位条码!");
        // 获取库位信息
        var c_depot_code = Db.Queryable<MesDepotSections, MesDepots>((a, b) =>
                new JoinQueryInfos(JoinType.Inner, a.DepotGuid == b.Guid))
            .Where((a, b) => a.DepotSectionCode == p_section_code)
            .Select((a, b) => b.DepotId).First();
        if (!c_depot_code.HasValue)
            throw new Exception("库位编码" + p_section_code + " 不存在,请确认!");
        // 获取库位分区信息
        var mesDepotSections = Db.Queryable<MesDepotSections>()
            .Where(a => a.DepotSectionCode == p_section_code).First();
        if (mesDepotSections == null)
            throw new Exception("库位编码" + p_section_code + " 不存在,请确认!");
        // 获取库位基础信息
        var c_mes_depots = Db.Queryable<MesDepots>()
            .Where(b => b.Guid == mesDepotSections.DepotGuid).First();
        if (c_mes_depots == null)
            throw new Exception("库位编码" + p_section_code + " 不存在,请确认!");
        // 检查条码是否已入库
        var c_num = Db.Queryable<MesInvItemIns, MesInvItemInCDetails>((a, b) =>
                new JoinQueryInfos(JoinType.Inner, a.Guid == b.ItemInId))
            .Where((a, b) => b.ItemBarcode == p_item_barcode
                             && a.BillTypeId == p_bill_type_id &&
                             a.TransctionNo == p_transction_no.ToString())
            .Count();
        if (c_num > 0) throw new Exception("此条码已扫入库,勿重复扫描!");
        c_num = Db.Queryable<MesInvItemStocks>()
            .Where(t => t.ItemBarcode == p_item_barcode).Count();
        if (c_num > 0) throw new Exception("此条码已扫入库,勿重复扫描!");
        // 获取条码信息
        var c_mes_inv_item_barcodes = Db.Queryable<MesInvItemBarcodes>()
            .Where(t => t.ItemBarcode == p_item_barcode).First();
        if (c_mes_inv_item_barcodes == null)
            throw new Exception("此条码不属于该退料单,请核对!");
        if (c_mes_inv_item_barcodes.Memo != "生产退料")
            throw new Exception("此条码不是生产退料条码,不可使用生产退料模块!");
        // 使用 String.Equals 方法进行字符串比较,指定比较规则为忽略大小写,提高比较的灵活性
        if (!string.Equals(c_mes_inv_item_barcodes.BillNo, p_bill_no, StringComparison.OrdinalIgnoreCase))
            throw new Exception($"该条码对应的申请号【{c_mes_inv_item_barcodes.BillNo}】与 当前申请单号【{p_bill_no}】不一致,请核对!");
        // 获取退料单信息
        var C_MES_ITEM_TBL = Db.Queryable<MesItemTbl>()
            .Where(a => a.BillNo == p_bill_no
                        && (a.Tbl013 ?? 0) == 1).First();
        // 获取退料单信息
        var tbWOMDAA = Db.Queryable<Womdaa>()
            .Where(a => a.Guid.ToString() == C_MES_ITEM_TBL.Tbl002).First();
        if (C_MES_ITEM_TBL == null) throw new Exception("申请单已撤回,无法扫码!");
        if (C_MES_ITEM_TBL.Tbl020 == 1) throw new Exception("扫码完成,申请单已完结!");
        // 获取退料单明细
        var C_MES_ITEM_TBL_DETAIL = Db.Queryable<MesItemTblDetail>()
            .Where(a => a.Tlid == c_mes_inv_item_barcodes.AboutGuid)
        // 2. 验证条码信息
        var barcode = Db.Queryable<MesInvItemBarcodes>()
            .Where(x => x.ItemBarcode == query.barcode)
            .First();
        if (barcode == null)
            throw new Exception($"无此条码,请核对!{query.barcode}");
        if (C_MES_ITEM_TBL_DETAIL == null)
            throw new Exception("条码不属于该申请单明细,无法扫码!");
        // 3. 验证物料信息
        var item = Db.Queryable<MesItems>()
            .Where(x => x.Id == barcode.ItemId)
            .First();
        if (item == null)
            throw new Exception($"无此物料,请核对!{query.barcode}");
        var CABerpid = Db.Queryable<Womdab>().Where(womdab => womdab.Guid.ToString() == C_MES_ITEM_TBL_DETAIL.Tld013).Select(womdab => womdab.Erpid).First();
        // 4. 验证退料单信息
        var returnOrder = Db.Queryable<MesItemTbl>()
            .Where(x => x.BillNo == query.billNo && (x.Tbl013 ?? 0) == 1)
            .First();
        if (returnOrder == null)
            throw new Exception("申请单已撤回,无法扫码!");
        var ownerId = Db.Queryable<Womcab>().Where(womcab => womcab.Erpid == CABerpid.Value).Select(womcab => womcab.OwnerId).First();
        if (returnOrder.Tbl020 == 1)
            throw new Exception("扫码完成,申请单已完结!");
        if (ownerId == null) throw new Exception("用料清单货主信息不存在,无法扫码,请联系管理员!");
        var owner_type = "";
        if (Db.Queryable<SysOrganization>().Any(x => x.Fid == ownerId))
        // 5. 使用存储过程处理生产退料
        var parameters = new SqlParameter[]
        {
            owner_type = "BD_OwnerOrg";
        }
        else
    new SqlParameter("@pi_user", query.userName),
    new SqlParameter("@pi_barcode", query.barcode),
    new SqlParameter("@pi_bill_no", query.billNo),
    new SqlParameter("@pi_section_code", query.DepotCode),
    new SqlParameter("@PI_INP1", DBNull.Value),  // 备用参数1
    new SqlParameter("@PI_INP2", DBNull.Value),  // 备用参数2
    new SqlParameter("@PO_OUT_MSG", SqlDbType.NVarChar, 2000) { Direction = ParameterDirection.Output },
    new SqlParameter("@PO_OUT_SUM", SqlDbType.Int) { Direction = ParameterDirection.Output },
    new SqlParameter("@PO_ITEM_NO", SqlDbType.NVarChar, 100) { Direction = ParameterDirection.Output },
    new SqlParameter("@PO_QUANTITY", SqlDbType.Decimal) { Direction = ParameterDirection.Output }
        };
        string procedureName = "PRC_PDA_SCTL";
        int res = DbHelperSQL.RunProcedure_NonQuery(procedureName, parameters);
        // 获取输出参数
        var outMsg = parameters[6].Value?.ToString() ?? string.Empty;
        var outSum = parameters[7].Value != DBNull.Value ? Convert.ToInt32(parameters[7].Value) : -1;
        var itemNo = parameters[8].Value?.ToString() ?? string.Empty;
        var quantity = parameters[9].Value != DBNull.Value ? Convert.ToDecimal(parameters[9].Value) : 0m;
        // 检查存储过程执行结果
        if (outSum == -1)
        {
            // 第二层判断:检查 MES_CUSTOMER
            if (Db.Queryable<MesCustomer>().Any(x => x.Id == Convert.ToInt32(ownerId)))
            {
                owner_type = "BD_Customer";
            }
            else
            {
                // 第三层判断:检查 MES_SUPPLIER
                if (Db.Queryable<MesSupplier>().Any(x => x.Id == Convert.ToInt32(ownerId)))
                {
                    owner_type = "BD_Supplier";
                }
                else
                {
                    throw new Exception("入库失败,用料清单货主信息存在问题,请联系管理员解决!");
                }
            }
            throw new Exception(outMsg);
        }
        var c_quantity = c_mes_inv_item_barcodes.Quantity;
        var c_bill_no = "";
        var c_id = Guid.Empty;
        // 使用事务处理数据更新
        UseTransaction(db =>
        {
            // 查询入库单
            var mesInvItemIns = db.Queryable<MesInvItemIns>()
                .Where(d =>
                    d.Status == 0 && d.TransctionNo ==
                                  p_transction_no.ToString()
                                  && d.TaskNo == c_mes_inv_item_barcodes.BillNo
                                  && d.DepotsId == c_depot_code
                                  && d.InsDate.Value.ToString("yyyyMMdd") ==
                                  DateTime.Now.ToString("yyyyMMdd")).First();
            var totalResult = 0;
            // 如果入库单不存在则创建新的入库单
            if (mesInvItemIns == null)
            {
                c_bill_no = BillNo.GetBillNo("SCTL(生产退料)");
                c_id = Guid.NewGuid();
                totalResult += db.Insertable(new MesInvItemIns
                {
                    Guid = c_id,
                    BillNo = c_bill_no,
                    BillTypeId = p_bill_type_id,
                    InsDate = DateTime.Now,
                    DepotsId = c_depot_code,
                    UserNoBack = c_user,
                    Reason = C_MES_ITEM_TBL.Tbl005,
                    Remark = C_MES_ITEM_TBL.Tbl006,
                    //InsDate = DateTime.Now,
                    DepotsCode = c_mes_depots.DepotCode,
                    TaskNo = c_mes_inv_item_barcodes.BillNo,
                    //DepotsId = c_depot_code,
                    TransctionNo = p_transction_no.ToString(),
                    CreateBy = c_user,
                    CreateDate = DateTime.Now,
                    LastupdateBy = c_user,
                    LastupdateDate = DateTime.Now,
                    CbillNo = tbWOMDAA.Daa001,
                    InType = "生产退料",
                    ReceiveOrgId = c_mes_depots.FSubsidiary,
                    Fstatus = 0,
                    Status = 0,
                    WorkNo = tbWOMDAA.Daa021
                }).IgnoreColumns(true).ExecuteCommand();
            }
            else
            {
                c_id = mesInvItemIns.Guid;
                c_bill_no = mesInvItemIns.BillNo;
            }
            // 检查是否为合并打印条码
            var hbdy = c_mes_inv_item_barcodes.Hbdy ?? 0;
            if (hbdy == 1) throw new Exception("不支持合并打印的条码:" + p_item_barcode);
            // 检查是否存在于 MES_INV_ITEM_IN_C_ITEMS 表
            var existingCount = db.Queryable<MesInvItemInCItems>()
            .Where(it =>
                it.ItemInId == c_id &&
                                it.ItemId == C_MES_ITEM_TBL_DETAIL.Tld009 &&
                                it.DepotId == c_depot_code.ToString())
                .Count();
            if (existingCount == 0)
                // 不存在时插入新记录
                db.Insertable(new MesInvItemInCItems
                {
                    ItemInId = c_id,
                    Quantity = c_mes_inv_item_barcodes.Quantity,
                    CreateBy = c_user,
                    CreateDate = DateTime.Now,
                    ItemNo = c_mes_inv_item_barcodes.ItemNo,
                    //DepotCode = mesDepost.DepotCode,
                    ItemSname = c_mes_inv_item_barcodes.ItemSname,
                    Unit = c_mes_inv_item_barcodes.Unit,
                    Ebeln = c_mes_inv_item_barcodes.WorkNo,
                    BillNo = c_bill_no,
                    WorkNo = c_mes_inv_item_barcodes.WorkNo,
                    EbelnLineNo = c_mes_inv_item_barcodes.WorkLine,
                    CbillNo = c_mes_inv_item_barcodes.BillNo,
                    WorkLine = c_mes_inv_item_barcodes.WorkLine,
                    SuppId = c_mes_inv_item_barcodes.SuppId,
                    SuppNo = c_mes_inv_item_barcodes.SuppNo,
                    Remark = c_mes_inv_item_barcodes.Memo,
                    EbelnK3id = c_mes_inv_item_barcodes.EbelnK3id,
                    LineK3id = c_mes_inv_item_barcodes.LineK3id,
                    ItemId = c_mes_inv_item_barcodes.ItemId,
                    DepotCode = c_mes_depots.DepotCode,
                    DepotId = c_depot_code.ToString(),
                    itemDabid = C_MES_ITEM_TBL_DETAIL.Tlid.ToString()
                }).IgnoreColumns(true).ExecuteCommand();
            else
                // 存在时更新数量
                db.Updateable<MesInvItemInCItems>()
                    .SetColumns(it => new MesInvItemInCItems
                    {
                        Quantity = SqlFunc.IsNull(it.Quantity, 0) + c_mes_inv_item_barcodes.Quantity // 确保 Quantity 不为 null
                    })
                .Where(it =>
                       it.ItemInId == c_id &&
                                it.ItemId == C_MES_ITEM_TBL_DETAIL.Tld009 &&
                                it.DepotId == c_depot_code.ToString())
                    //.IgnoreColumns(true) // 保留 IgnoreColumns
                    .ExecuteCommand();
            // 插入 mes_inv_item_in_c_details 表
            totalResult += db.Insertable(new MesInvItemInCDetails
            {
                ItemInId = c_id,
                BillNo = c_bill_no,
                ItemBarcode = p_item_barcode,
                Quantity = c_mes_inv_item_barcodes.Quantity,
                BarcodeFlag = true,
                EpFlag = true,
                WorkType = 1,
                ItemNo = c_mes_inv_item_barcodes.ItemNo,
                //LotNo = cgddDetails.BatchNumber,--批号,退料不设置批号
                SuppId = c_mes_inv_item_barcodes.SuppId,
                SuppNo = c_mes_inv_item_barcodes.SuppNo,
                //DepotCode = mesDepost.DepotCode,
                DepotSectionCode = p_section_code,
                ItemSname = c_mes_inv_item_barcodes.ItemSname,
                Unit = c_mes_inv_item_barcodes.Unit,
                CreateBy = c_user,
                CreateDate = DateTime.Now,
                LastupdateBy = c_user,
                LastupdateDate = DateTime.Now,
                Remark = c_mes_inv_item_barcodes.Memo,
                Ebeln = c_mes_inv_item_barcodes.Mblnr,
                EbelnLineNo = c_mes_inv_item_barcodes.Zeile,
                WorkNo = c_mes_inv_item_barcodes.WorkNo,
                WorkLine = c_mes_inv_item_barcodes.WorkLine,
                CbillNo = c_mes_inv_item_barcodes.BillNo,
                UrgentFlag = c_mes_inv_item_barcodes.UrgentFlag,
                BoardStyle = c_mes_inv_item_barcodes.BoardStyle,
                TaskNo = c_mes_inv_item_barcodes.TaskNo,
                EbelnK3id = c_mes_inv_item_barcodes.EbelnK3id,
                LineK3id = c_mes_inv_item_barcodes.LineK3id,
                ItemId = c_mes_inv_item_barcodes.ItemId,
                Ischeck = true,
                //CheckDate = C_MES_ITEM_TBL_DETAIL.CheckDate,
                //CheckRes = C_MES_ITEM_TBL_DETAIL.CheckRes,
                //CheckStates = C_MES_ITEM_TBL_DETAIL.CheckStates,--检验信息
                ReceiveOrgId = c_mes_depots.FSubsidiary,
                DepotCode = c_mes_depots.DepotCode,
                DepotId = Convert.ToInt64(c_depot_code)
            }).IgnoreColumns(true).ExecuteCommand();
            // 插入业务记录
            totalResult += db.Insertable(new MesInvBusiness2
            {
                Guid = Guid.NewGuid(),
                Status = 1,
                BillTypeId = p_bill_type_id,
                TransactionCode = p_transction_no.ToString(),
                BusinessType = 1,
                ItemBarcode = p_item_barcode,
                ItemNo = c_mes_inv_item_barcodes.ItemNo,
                LotNo = c_mes_inv_item_barcodes.LotNo,
                EpFlag = true,
                Quantity = c_mes_inv_item_barcodes.Quantity,
                ToInvDepotsCode = c_mes_depots.DepotCode,
                InvDepotId = c_depot_code,
                ToInvDepotSectionsCode = p_section_code,
                Description = "生产退料",
                CreateBy = c_user,
                CreateDate = DateTime.Now,
                LastupdateBy = c_user,
                LastupdateDate = DateTime.Now,
                TaskNo = c_mes_inv_item_barcodes.TaskNo,
                BillNo = c_bill_no,
                WorkNo = c_mes_inv_item_barcodes.WorkNo,
                WorkLine = c_mes_inv_item_barcodes.WorkLine,
                SuppId = c_mes_inv_item_barcodes.SuppId,
                SuppNo = c_mes_inv_item_barcodes.SuppNo,
                ItemId = c_mes_inv_item_barcodes.ItemId
            }).IgnoreColumns(true).ExecuteCommand();
            // 插入库存记录
            totalResult += db.Insertable(new MesInvItemStocks
            {
                Guid = Guid.NewGuid(),
                TaskNo = c_mes_inv_item_barcodes.TaskNo,
                ItemBarcode = p_item_barcode,
                ItemNo = c_mes_inv_item_barcodes.ItemNo,
                LotNo = c_mes_inv_item_barcodes.LotNo,
                Quantity = c_mes_inv_item_barcodes.Quantity,
                //EpFlag = c_mes_inv_item_barcodes.EpFlag.Value
                //    ? (byte)1
                //    : (byte)0,
                DepotId = c_mes_depots.DepotId,
                DepotsCode = c_mes_depots.DepotCode,
                DepotSectionsCode = p_section_code,
                CheckDate = c_mes_inv_item_barcodes.CreateDate,
                IndepDate = DateTime.Now,
                BoardStyle = c_mes_inv_item_barcodes.BoardStyle,
                WorkNo = c_mes_inv_item_barcodes.WorkNo,
                WorkLine = c_mes_inv_item_barcodes.WorkLine,
                SuppNo = c_mes_inv_item_barcodes.SuppNo,
                ItemId = c_mes_inv_item_barcodes.ItemId,
                BillNo = c_mes_inv_item_barcodes.BillNo,
                //DepotId = Convert.ToInt32(c_depot_code),
                OwnerId = ownerId,
                OwnerType = owner_type,
                StockOrgId = c_mes_depots.FSubsidiary,
                IndepUserCode = c_user
            }).IgnoreColumns(true).ExecuteCommand();
            // 根据退料类型(良品退料、来料不良退料、作业不良退料)更新相关数据
            if (C_MES_ITEM_TBL.Tbl005 is "良品退料" or "来料不良退料")
            {
                // 良品退料 - 更新工单表(WOMDAB)相关数量
                if (C_MES_ITEM_TBL.Tbl005 == "良品退料")
                    totalResult += Db.Updateable<Womdab>()
                        .SetColumns(it => new Womdab
                        {
                            Dab007 = it.Dab007 -
                                     c_mes_inv_item_barcodes.Quantity, // 减少工单数量
                            Dab022 = (it.Dab022 ?? 0) +
                                     c_mes_inv_item_barcodes.Quantity, // 增加退料数量
                            LpTl = (it.LpTl ?? 0) +
                                   (int)c_mes_inv_item_barcodes
                                       .Quantity, // 增加良品退料数量
                            Dab020 = (it.Dab020 ?? 0) -
                                     c_mes_inv_item_barcodes.Quantity // 减少已发料数量
                        })
                        .Where(it => it.Dab001 == c_mes_inv_item_barcodes.WorkNo
                                     && it.Dab002 == c_mes_inv_item_barcodes
                                         .WorkLine
                                     && it.Dab003 == c_mes_inv_item_barcodes
                                         .ItemId.ToString())
                        .ExecuteCommand();
                // 来料不良退料 - 更新工单表(WOMDAB)相关数量
                else if (C_MES_ITEM_TBL.Tbl005 == "来料不良退料")
                    totalResult += Db.Updateable<Womdab>()
                        .SetColumns(it => new Womdab
                        {
                            Dab007 = it.Dab007 -
                                     c_mes_inv_item_barcodes.Quantity, // 减少工单数量
                            Dab022 = (it.Dab022 ?? 0) +
                                     c_mes_inv_item_barcodes.Quantity, // 增加退料数量
                            LlBl = (it.LlBl ?? 0) +
                                   (int)c_mes_inv_item_barcodes
                                       .Quantity, // 增加来料不良数量
                            Dab020 = (it.Dab020 ?? 0) -
                                     c_mes_inv_item_barcodes.Quantity // 减少已发料数量
                        })
                        .Where(it => it.Dab001 == c_mes_inv_item_barcodes.WorkNo
                                     && it.Dab002 == c_mes_inv_item_barcodes
                                         .WorkLine
                                     && it.Dab003 == c_mes_inv_item_barcodes
                                         .ItemId.ToString())
                        .ExecuteCommand();
                // 更新退料单明细表已退数量
                totalResult += Db.Updateable<MesItemTblDetail>()
                    .SetColumns(it => new MesItemTblDetail
                    {
                        Tld006 = (it.Tld006 ?? 0) +
                                 (int)c_mes_inv_item_barcodes.Quantity // 增加已退数量
                    })
                    .Where(it => it.Tlmid == C_MES_ITEM_TBL.Id &&
                                 it.Tlid == c_mes_inv_item_barcodes.AboutGuid)
                    .ExecuteCommand();
            }
            // 作业不良退料 - 更新工单表和退料单明细表
            else if (C_MES_ITEM_TBL.Tbl005 == "作业不良退料")
            {
                totalResult += Db.Updateable<Womdab>()
                    .SetColumns(it => new Womdab
                    {
                        Dab022 = (it.Dab022 ?? 0) +
                                 c_mes_inv_item_barcodes.Quantity, // 增加退料数量
                        ZyBl = (it.ZyBl ?? 0) +
                               (int)c_mes_inv_item_barcodes
                                   .Quantity, // 增加作业不良数量
                        Dab020 = (it.Dab020 ?? 0) -
                                 c_mes_inv_item_barcodes.Quantity // 减少已发料数量
                    })
                    .Where(it => it.Dab001 == c_mes_inv_item_barcodes.WorkNo
                                 && it.Dab002 ==
                                 c_mes_inv_item_barcodes.WorkLine
                                 && it.Dab003 == c_mes_inv_item_barcodes.ItemId
                                     .ToString())
                    .ExecuteCommand();
                // 更新退料单明细表已退数量
                totalResult += Db.Updateable<MesItemTblDetail>()
                    .SetColumns(it => new MesItemTblDetail
                    {
                        Tld006 = (it.Tld006 ?? 0) +
                                 (int)c_mes_inv_item_barcodes.Quantity // 增加已退数量
                    })
                    .Where(it => it.Tlmid == C_MES_ITEM_TBL.Id &&
                                 it.Tlid == c_mes_inv_item_barcodes.AboutGuid)
                    .ExecuteCommand();
            }
            // 如果待退数量等于本次退料数量,则更新明细完成状态
            if ((C_MES_ITEM_TBL_DETAIL.Tld005 ?? 0) -
                (C_MES_ITEM_TBL_DETAIL.Tld006 ?? 0) ==
                c_mes_inv_item_barcodes.Quantity)
                totalResult += Db.Updateable<MesItemTblDetail>()
                    .SetColumns(it => new MesItemTblDetail
                    { Tld008 = 1 }) // 设置完成标志
                    .Where(it => it.Tlid == C_MES_ITEM_TBL_DETAIL.Tlid)
                    .ExecuteCommand();
            // 检查退料单是否所有明细都已完成
            var remainingCount = Db.Queryable<MesItemTbl, MesItemTblDetail>(
                    (a, b) =>
                        new JoinQueryInfos(JoinType.Left, a.Id == b.Tlmid))
                .Where((a, b) =>
                    a.BillNo == p_bill_no &&
                    (b.Tld005 ?? 0) - (b.Tld006 ?? 0) > 0)
                .Count();
            // 如果所有明细都已完成,则更新退料单状态为已完成
            if (remainingCount < 1)
                totalResult += Db.Updateable<MesItemTbl>()
                    .SetColumns(it => it.Tbl020 == 1) // 设置完成标志
                    .Where(it => it.BillNo == p_bill_no)
                    .ExecuteCommand();
            // 检查必要的插入操作是否都成功执行
            var minimumExpectedOperations = 3; // 至少需要执行的插入操作数
            if (totalResult < minimumExpectedOperations)
                throw new Exception(
                    $"关键数据插入失败,预期至少{minimumExpectedOperations}个操作,实际执行{totalResult}个操作");
            // 创建 插入日志
            var logService = new LogService();
            var LogMsg = "[PDA]生产退料。条码【" + query.barcode + "】 退料单号【" + c_bill_no + "】";
            logService.CreateLog(db, query.userName, tbWOMDAA.Guid.ToString(), "WOMDAA", LogMsg, tbWOMDAA.Daa001);
            return totalResult;
        });
        query.itemNo = c_mes_inv_item_barcodes.ItemNo;
        query.Num = c_quantity.Value;
        query.itemNo = itemNo;
        query.Num = quantity;
        return query;
        //var p_item_barcode = query.barcode; // 物料条码
        //var p_bill_no = query.billNo; // 单据号
        //var p_section_code = query.DepotCode; // 库位编码
        //var c_user = query.userName; // 用户名
        //var p_bill_type_id = 100; // 单据类型ID
        //var p_transction_no = 104; // 交易编号
        //// 验证库位条码
        //if (p_section_code.IsNullOrEmpty()) throw new Exception("请扫库位条码!");
        //// 获取库位信息
        //var c_depot_code = Db.Queryable<MesDepotSections, MesDepots>((a, b) =>
        //        new JoinQueryInfos(JoinType.Inner, a.DepotGuid == b.Guid))
        //    .Where((a, b) => a.DepotSectionCode == p_section_code)
        //    .Select((a, b) => b.DepotId).First();
        //if (!c_depot_code.HasValue)
        //    throw new Exception("库位编码" + p_section_code + " 不存在,请确认!");
        //// 获取库位分区信息
        //var mesDepotSections = Db.Queryable<MesDepotSections>()
        //    .Where(a => a.DepotSectionCode == p_section_code).First();
        //if (mesDepotSections == null)
        //    throw new Exception("库位编码" + p_section_code + " 不存在,请确认!");
        //// 获取库位基础信息
        //var c_mes_depots = Db.Queryable<MesDepots>()
        //    .Where(b => b.Guid == mesDepotSections.DepotGuid).First();
        //if (c_mes_depots == null)
        //    throw new Exception("库位编码" + p_section_code + " 不存在,请确认!");
        //// 检查条码是否已入库
        //var c_num = Db.Queryable<MesInvItemIns, MesInvItemInCDetails>((a, b) =>
        //        new JoinQueryInfos(JoinType.Inner, a.Guid == b.ItemInId))
        //    .Where((a, b) => b.ItemBarcode == p_item_barcode
        //                     && a.BillTypeId == p_bill_type_id &&
        //                     a.TransctionNo == p_transction_no.ToString())
        //    .Count();
        //if (c_num > 0) throw new Exception("此条码已扫入库,勿重复扫描!");
        //c_num = Db.Queryable<MesInvItemStocks>()
        //    .Where(t => t.ItemBarcode == p_item_barcode).Count();
        //if (c_num > 0) throw new Exception("此条码已扫入库,勿重复扫描!");
        //// 获取条码信息
        //var c_mes_inv_item_barcodes = Db.Queryable<MesInvItemBarcodes>()
        //    .Where(t => t.ItemBarcode == p_item_barcode).First();
        //if (c_mes_inv_item_barcodes == null)
        //    throw new Exception("此条码不属于该退料单,请核对!");
        //if (c_mes_inv_item_barcodes.Memo != "生产退料")
        //    throw new Exception("此条码不是生产退料条码,不可使用生产退料模块!");
        //// 使用 String.Equals 方法进行字符串比较,指定比较规则为忽略大小写,提高比较的灵活性
        //if (!string.Equals(c_mes_inv_item_barcodes.BillNo, p_bill_no, StringComparison.OrdinalIgnoreCase))
        //    throw new Exception($"该条码对应的申请号【{c_mes_inv_item_barcodes.BillNo}】与 当前申请单号【{p_bill_no}】不一致,请核对!");
        //// 获取退料单信息
        //var C_MES_ITEM_TBL = Db.Queryable<MesItemTbl>()
        //    .Where(a => a.BillNo == p_bill_no
        //                && (a.Tbl013 ?? 0) == 1).First();
        //// 获取退料单信息
        //var tbWOMDAA = Db.Queryable<Womdaa>()
        //    .Where(a => a.Guid.ToString() == C_MES_ITEM_TBL.Tbl002).First();
        //if (C_MES_ITEM_TBL == null) throw new Exception("申请单已撤回,无法扫码!");
        //if (C_MES_ITEM_TBL.Tbl020 == 1) throw new Exception("扫码完成,申请单已完结!");
        //// 获取退料单明细
        //var C_MES_ITEM_TBL_DETAIL = Db.Queryable<MesItemTblDetail>()
        //    .Where(a => a.Tlid == c_mes_inv_item_barcodes.AboutGuid)
        //    .First();
        //if (C_MES_ITEM_TBL_DETAIL == null)
        //    throw new Exception("条码不属于该申请单明细,无法扫码!");
        //var CABerpid = Db.Queryable<Womdab>().Where(womdab => womdab.Guid.ToString() == C_MES_ITEM_TBL_DETAIL.Tld013).Select(womdab => womdab.Erpid).First();
        //var ownerId = Db.Queryable<Womcab>().Where(womcab => womcab.Erpid == CABerpid.Value).Select(womcab => womcab.OwnerId).First();
        //if (ownerId == null) throw new Exception("用料清单货主信息不存在,无法扫码,请联系管理员!");
        //var owner_type = "";
        //if (Db.Queryable<SysOrganization>().Any(x => x.Fid == ownerId))
        //{
        //    owner_type = "BD_OwnerOrg";
        //}
        //else
        //{
        //    // 第二层判断:检查 MES_CUSTOMER
        //    if (Db.Queryable<MesCustomer>().Any(x => x.Id == Convert.ToInt32(ownerId)))
        //    {
        //        owner_type = "BD_Customer";
        //    }
        //    else
        //    {
        //        // 第三层判断:检查 MES_SUPPLIER
        //        if (Db.Queryable<MesSupplier>().Any(x => x.Id == Convert.ToInt32(ownerId)))
        //        {
        //            owner_type = "BD_Supplier";
        //        }
        //        else
        //        {
        //            throw new Exception("入库失败,用料清单货主信息存在问题,请联系管理员解决!");
        //        }
        //    }
        //}
        //var c_quantity = c_mes_inv_item_barcodes.Quantity;
        //var c_bill_no = "";
        //var c_id = Guid.Empty;
        //// 使用事务处理数据更新
        //UseTransaction(db =>
        //{
        //    // 查询入库单
        //    var mesInvItemIns = db.Queryable<MesInvItemIns>()
        //        .Where(d =>
        //            d.Status == 0 && d.TransctionNo ==
        //                          p_transction_no.ToString()
        //                          && d.TaskNo == c_mes_inv_item_barcodes.BillNo
        //                          && d.DepotsId == c_depot_code
        //                          && d.InsDate.Value.ToString("yyyyMMdd") ==
        //                          DateTime.Now.ToString("yyyyMMdd")).First();
        //    var totalResult = 0;
        //    // 如果入库单不存在则创建新的入库单
        //    if (mesInvItemIns == null)
        //    {
        //        c_bill_no = BillNo.GetBillNo("SCTL(生产退料)");
        //        c_id = Guid.NewGuid();
        //        totalResult += db.Insertable(new MesInvItemIns
        //        {
        //            Guid = c_id,
        //            BillNo = c_bill_no,
        //            BillTypeId = p_bill_type_id,
        //            InsDate = DateTime.Now,
        //            DepotsId = c_depot_code,
        //            UserNoBack = c_user,
        //            Reason = C_MES_ITEM_TBL.Tbl005,
        //            Remark = C_MES_ITEM_TBL.Tbl006,
        //            //InsDate = DateTime.Now,
        //            DepotsCode = c_mes_depots.DepotCode,
        //            TaskNo = c_mes_inv_item_barcodes.BillNo,
        //            //DepotsId = c_depot_code,
        //            TransctionNo = p_transction_no.ToString(),
        //            CreateBy = c_user,
        //            CreateDate = DateTime.Now,
        //            LastupdateBy = c_user,
        //            LastupdateDate = DateTime.Now,
        //            CbillNo = tbWOMDAA.Daa001,
        //            InType = "生产退料",
        //            ReceiveOrgId = c_mes_depots.FSubsidiary,
        //            Fstatus = 0,
        //            Status = 0,
        //            WorkNo = tbWOMDAA.Daa021
        //        }).IgnoreColumns(true).ExecuteCommand();
        //    }
        //    else
        //    {
        //        c_id = mesInvItemIns.Guid;
        //        c_bill_no = mesInvItemIns.BillNo;
        //    }
        //    // 检查是否为合并打印条码
        //    var hbdy = c_mes_inv_item_barcodes.Hbdy ?? 0;
        //    if (hbdy == 1) throw new Exception("不支持合并打印的条码:" + p_item_barcode);
        //    // 检查是否存在于 MES_INV_ITEM_IN_C_ITEMS 表
        //    var existingCount = db.Queryable<MesInvItemInCItems>()
        //    .Where(it =>
        //        it.ItemInId == c_id &&
        //                        it.ItemId == C_MES_ITEM_TBL_DETAIL.Tld009 &&
        //                        it.DepotId == c_depot_code.ToString())
        //        .Count();
        //    if (existingCount == 0)
        //        // 不存在时插入新记录
        //        db.Insertable(new MesInvItemInCItems
        //        {
        //            ItemInId = c_id,
        //            Quantity = c_mes_inv_item_barcodes.Quantity,
        //            CreateBy = c_user,
        //            CreateDate = DateTime.Now,
        //            ItemNo = c_mes_inv_item_barcodes.ItemNo,
        //            //DepotCode = mesDepost.DepotCode,
        //            ItemSname = c_mes_inv_item_barcodes.ItemSname,
        //            Unit = c_mes_inv_item_barcodes.Unit,
        //            Ebeln = c_mes_inv_item_barcodes.WorkNo,
        //            BillNo = c_bill_no,
        //            WorkNo = c_mes_inv_item_barcodes.WorkNo,
        //            EbelnLineNo = c_mes_inv_item_barcodes.WorkLine,
        //            CbillNo = c_mes_inv_item_barcodes.BillNo,
        //            WorkLine = c_mes_inv_item_barcodes.WorkLine,
        //            SuppId = c_mes_inv_item_barcodes.SuppId,
        //            SuppNo = c_mes_inv_item_barcodes.SuppNo,
        //            Remark = c_mes_inv_item_barcodes.Memo,
        //            EbelnK3id = c_mes_inv_item_barcodes.EbelnK3id,
        //            LineK3id = c_mes_inv_item_barcodes.LineK3id,
        //            ItemId = c_mes_inv_item_barcodes.ItemId,
        //            DepotCode = c_mes_depots.DepotCode,
        //            DepotId = c_depot_code.ToString(),
        //            itemDabid = C_MES_ITEM_TBL_DETAIL.Tlid.ToString()
        //        }).IgnoreColumns(true).ExecuteCommand();
        //    else
        //        // 存在时更新数量
        //        db.Updateable<MesInvItemInCItems>()
        //            .SetColumns(it => new MesInvItemInCItems
        //            {
        //                Quantity = SqlFunc.IsNull(it.Quantity, 0) + c_mes_inv_item_barcodes.Quantity // 确保 Quantity 不为 null
        //            })
        //        .Where(it =>
        //               it.ItemInId == c_id &&
        //                        it.ItemId == C_MES_ITEM_TBL_DETAIL.Tld009 &&
        //                        it.DepotId == c_depot_code.ToString())
        //            //.IgnoreColumns(true) // 保留 IgnoreColumns
        //            .ExecuteCommand();
        //    // 插入 mes_inv_item_in_c_details 表
        //    totalResult += db.Insertable(new MesInvItemInCDetails
        //    {
        //        ItemInId = c_id,
        //        BillNo = c_bill_no,
        //        ItemBarcode = p_item_barcode,
        //        Quantity = c_mes_inv_item_barcodes.Quantity,
        //        BarcodeFlag = true,
        //        EpFlag = true,
        //        WorkType = 1,
        //        ItemNo = c_mes_inv_item_barcodes.ItemNo,
        //        //LotNo = cgddDetails.BatchNumber,--批号,退料不设置批号
        //        SuppId = c_mes_inv_item_barcodes.SuppId,
        //        SuppNo = c_mes_inv_item_barcodes.SuppNo,
        //        //DepotCode = mesDepost.DepotCode,
        //        DepotSectionCode = p_section_code,
        //        ItemSname = c_mes_inv_item_barcodes.ItemSname,
        //        Unit = c_mes_inv_item_barcodes.Unit,
        //        CreateBy = c_user,
        //        CreateDate = DateTime.Now,
        //        LastupdateBy = c_user,
        //        LastupdateDate = DateTime.Now,
        //        Remark = c_mes_inv_item_barcodes.Memo,
        //        Ebeln = c_mes_inv_item_barcodes.Mblnr,
        //        EbelnLineNo = c_mes_inv_item_barcodes.Zeile,
        //        WorkNo = c_mes_inv_item_barcodes.WorkNo,
        //        WorkLine = c_mes_inv_item_barcodes.WorkLine,
        //        CbillNo = c_mes_inv_item_barcodes.BillNo,
        //        UrgentFlag = c_mes_inv_item_barcodes.UrgentFlag,
        //        BoardStyle = c_mes_inv_item_barcodes.BoardStyle,
        //        TaskNo = c_mes_inv_item_barcodes.TaskNo,
        //        EbelnK3id = c_mes_inv_item_barcodes.EbelnK3id,
        //        LineK3id = c_mes_inv_item_barcodes.LineK3id,
        //        ItemId = c_mes_inv_item_barcodes.ItemId,
        //        Ischeck = true,
        //        //CheckDate = C_MES_ITEM_TBL_DETAIL.CheckDate,
        //        //CheckRes = C_MES_ITEM_TBL_DETAIL.CheckRes,
        //        //CheckStates = C_MES_ITEM_TBL_DETAIL.CheckStates,--检验信息
        //        ReceiveOrgId = c_mes_depots.FSubsidiary,
        //        DepotCode = c_mes_depots.DepotCode,
        //        DepotId = Convert.ToInt64(c_depot_code)
        //    }).IgnoreColumns(true).ExecuteCommand();
        //    // 插入业务记录
        //    totalResult += db.Insertable(new MesInvBusiness2
        //    {
        //        Guid = Guid.NewGuid(),
        //        Status = 1,
        //        BillTypeId = p_bill_type_id,
        //        TransactionCode = p_transction_no.ToString(),
        //        BusinessType = 1,
        //        ItemBarcode = p_item_barcode,
        //        ItemNo = c_mes_inv_item_barcodes.ItemNo,
        //        LotNo = c_mes_inv_item_barcodes.LotNo,
        //        EpFlag = true,
        //        Quantity = c_mes_inv_item_barcodes.Quantity,
        //        ToInvDepotsCode = c_mes_depots.DepotCode,
        //        InvDepotId = c_depot_code,
        //        ToInvDepotSectionsCode = p_section_code,
        //        Description = "生产退料",
        //        CreateBy = c_user,
        //        CreateDate = DateTime.Now,
        //        LastupdateBy = c_user,
        //        LastupdateDate = DateTime.Now,
        //        TaskNo = c_mes_inv_item_barcodes.TaskNo,
        //        BillNo = c_bill_no,
        //        WorkNo = c_mes_inv_item_barcodes.WorkNo,
        //        WorkLine = c_mes_inv_item_barcodes.WorkLine,
        //        SuppId = c_mes_inv_item_barcodes.SuppId,
        //        SuppNo = c_mes_inv_item_barcodes.SuppNo,
        //        ItemId = c_mes_inv_item_barcodes.ItemId
        //    }).IgnoreColumns(true).ExecuteCommand();
        //    // 插入库存记录
        //    totalResult += db.Insertable(new MesInvItemStocks
        //    {
        //        Guid = Guid.NewGuid(),
        //        TaskNo = c_mes_inv_item_barcodes.TaskNo,
        //        ItemBarcode = p_item_barcode,
        //        ItemNo = c_mes_inv_item_barcodes.ItemNo,
        //        LotNo = c_mes_inv_item_barcodes.LotNo,
        //        Quantity = c_mes_inv_item_barcodes.Quantity,
        //        //EpFlag = c_mes_inv_item_barcodes.EpFlag.Value
        //        //    ? (byte)1
        //        //    : (byte)0,
        //        DepotId = c_mes_depots.DepotId,
        //        DepotsCode = c_mes_depots.DepotCode,
        //        DepotSectionsCode = p_section_code,
        //        CheckDate = c_mes_inv_item_barcodes.CreateDate,
        //        IndepDate = DateTime.Now,
        //        BoardStyle = c_mes_inv_item_barcodes.BoardStyle,
        //        WorkNo = c_mes_inv_item_barcodes.WorkNo,
        //        WorkLine = c_mes_inv_item_barcodes.WorkLine,
        //        SuppNo = c_mes_inv_item_barcodes.SuppNo,
        //        ItemId = c_mes_inv_item_barcodes.ItemId,
        //        BillNo = c_mes_inv_item_barcodes.BillNo,
        //        //DepotId = Convert.ToInt32(c_depot_code),
        //        OwnerId = ownerId,
        //        OwnerType = owner_type,
        //        StockOrgId = c_mes_depots.FSubsidiary,
        //        IndepUserCode = c_user
        //    }).IgnoreColumns(true).ExecuteCommand();
        //    // 根据退料类型(良品退料、来料不良退料、作业不良退料)更新相关数据
        //    if (C_MES_ITEM_TBL.Tbl005 is "良品退料" or "来料不良退料")
        //    {
        //        // 良品退料 - 更新工单表(WOMDAB)相关数量
        //        if (C_MES_ITEM_TBL.Tbl005 == "良品退料")
        //            totalResult += Db.Updateable<Womdab>()
        //                .SetColumns(it => new Womdab
        //                {
        //                    Dab007 = it.Dab007 -
        //                             c_mes_inv_item_barcodes.Quantity, // 减少工单数量
        //                    Dab022 = (it.Dab022 ?? 0) +
        //                             c_mes_inv_item_barcodes.Quantity, // 增加退料数量
        //                    LpTl = (it.LpTl ?? 0) +
        //                           (int)c_mes_inv_item_barcodes
        //                               .Quantity, // 增加良品退料数量
        //                    Dab020 = (it.Dab020 ?? 0) -
        //                             c_mes_inv_item_barcodes.Quantity // 减少已发料数量
        //                })
        //                .Where(it => it.Dab001 == c_mes_inv_item_barcodes.WorkNo
        //                             && it.Dab002 == c_mes_inv_item_barcodes
        //                                 .WorkLine
        //                             && it.Dab003 == c_mes_inv_item_barcodes
        //                                 .ItemId.ToString())
        //                .ExecuteCommand();
        //        // 来料不良退料 - 更新工单表(WOMDAB)相关数量
        //        else if (C_MES_ITEM_TBL.Tbl005 == "来料不良退料")
        //            totalResult += Db.Updateable<Womdab>()
        //                .SetColumns(it => new Womdab
        //                {
        //                    Dab007 = it.Dab007 -
        //                             c_mes_inv_item_barcodes.Quantity, // 减少工单数量
        //                    Dab022 = (it.Dab022 ?? 0) +
        //                             c_mes_inv_item_barcodes.Quantity, // 增加退料数量
        //                    LlBl = (it.LlBl ?? 0) +
        //                           (int)c_mes_inv_item_barcodes
        //                               .Quantity, // 增加来料不良数量
        //                    Dab020 = (it.Dab020 ?? 0) -
        //                             c_mes_inv_item_barcodes.Quantity // 减少已发料数量
        //                })
        //                .Where(it => it.Dab001 == c_mes_inv_item_barcodes.WorkNo
        //                             && it.Dab002 == c_mes_inv_item_barcodes
        //                                 .WorkLine
        //                             && it.Dab003 == c_mes_inv_item_barcodes
        //                                 .ItemId.ToString())
        //                .ExecuteCommand();
        //        // 更新退料单明细表已退数量
        //        totalResult += Db.Updateable<MesItemTblDetail>()
        //            .SetColumns(it => new MesItemTblDetail
        //            {
        //                Tld006 = (it.Tld006 ?? 0) +
        //                         (int)c_mes_inv_item_barcodes.Quantity // 增加已退数量
        //            })
        //            .Where(it => it.Tlmid == C_MES_ITEM_TBL.Id &&
        //                         it.Tlid == c_mes_inv_item_barcodes.AboutGuid)
        //            .ExecuteCommand();
        //    }
        //    // 作业不良退料 - 更新工单表和退料单明细表
        //    else if (C_MES_ITEM_TBL.Tbl005 == "作业不良退料")
        //    {
        //        totalResult += Db.Updateable<Womdab>()
        //            .SetColumns(it => new Womdab
        //            {
        //                Dab022 = (it.Dab022 ?? 0) +
        //                         c_mes_inv_item_barcodes.Quantity, // 增加退料数量
        //                ZyBl = (it.ZyBl ?? 0) +
        //                       (int)c_mes_inv_item_barcodes
        //                           .Quantity, // 增加作业不良数量
        //                Dab020 = (it.Dab020 ?? 0) -
        //                         c_mes_inv_item_barcodes.Quantity // 减少已发料数量
        //            })
        //            .Where(it => it.Dab001 == c_mes_inv_item_barcodes.WorkNo
        //                         && it.Dab002 ==
        //                         c_mes_inv_item_barcodes.WorkLine
        //                         && it.Dab003 == c_mes_inv_item_barcodes.ItemId
        //                             .ToString())
        //            .ExecuteCommand();
        //        // 更新退料单明细表已退数量
        //        totalResult += Db.Updateable<MesItemTblDetail>()
        //            .SetColumns(it => new MesItemTblDetail
        //            {
        //                Tld006 = (it.Tld006 ?? 0) +
        //                         (int)c_mes_inv_item_barcodes.Quantity // 增加已退数量
        //            })
        //            .Where(it => it.Tlmid == C_MES_ITEM_TBL.Id &&
        //                         it.Tlid == c_mes_inv_item_barcodes.AboutGuid)
        //            .ExecuteCommand();
        //    }
        //    // 如果待退数量等于本次退料数量,则更新明细完成状态
        //    if ((C_MES_ITEM_TBL_DETAIL.Tld005 ?? 0) -
        //        (C_MES_ITEM_TBL_DETAIL.Tld006 ?? 0) ==
        //        c_mes_inv_item_barcodes.Quantity)
        //        totalResult += Db.Updateable<MesItemTblDetail>()
        //            .SetColumns(it => new MesItemTblDetail
        //            { Tld008 = 1 }) // 设置完成标志
        //            .Where(it => it.Tlid == C_MES_ITEM_TBL_DETAIL.Tlid)
        //            .ExecuteCommand();
        //    // 检查退料单是否所有明细都已完成
        //    var remainingCount = Db.Queryable<MesItemTbl, MesItemTblDetail>(
        //            (a, b) =>
        //                new JoinQueryInfos(JoinType.Left, a.Id == b.Tlmid))
        //        .Where((a, b) =>
        //            a.BillNo == p_bill_no &&
        //            (b.Tld005 ?? 0) - (b.Tld006 ?? 0) > 0)
        //        .Count();
        //    // 如果所有明细都已完成,则更新退料单状态为已完成
        //    if (remainingCount < 1)
        //        totalResult += Db.Updateable<MesItemTbl>()
        //            .SetColumns(it => it.Tbl020 == 1) // 设置完成标志
        //            .Where(it => it.BillNo == p_bill_no)
        //            .ExecuteCommand();
        //    // 检查必要的插入操作是否都成功执行
        //    var minimumExpectedOperations = 3; // 至少需要执行的插入操作数
        //    if (totalResult < minimumExpectedOperations)
        //        throw new Exception(
        //            $"关键数据插入失败,预期至少{minimumExpectedOperations}个操作,实际执行{totalResult}个操作");
        //    // 创建 插入日志
        //    var logService = new LogService();
        //    var LogMsg = "[PDA]生产退料。条码【" + query.barcode + "】 退料单号【" + c_bill_no + "】";
        //    logService.CreateLog(db, query.userName, tbWOMDAA.Guid.ToString(), "WOMDAA", LogMsg, tbWOMDAA.Daa001);
        //    return totalResult;
        //});
        //query.itemNo = itemNo;
        //query.Num = quantity;
        //return query;
    }
}