南骏 池
6 小时以前 b727409bf046acea9533065da35e8e3872cac783
service/Warehouse/TransferOutManager.cs
@@ -1,25 +1,28 @@
using NewPdaSqlServer.DB;
using System.Data;
using System.Data.SqlClient;
using MES.Service.Modes;
using NewPdaSqlServer.DB;
using NewPdaSqlServer.Dto.service;
using NewPdaSqlServer.entity;
using NewPdaSqlServer.util;
using NewPdaSqlServer.entity.Base;
using SqlSugar;
namespace NewPdaSqlServer.service.Warehouse;
/// <summary>
/// 调拨出库管理类
/// 负责处理调拨出库相关的业务逻辑
///     调拨出入库管理类
///     负责处理调拨出库相关的业务逻辑
/// </summary>
public class TransferOutManager : Repository<TransferOut>
public class TransferOutManager : Repository<MesDbck>
{
    /// <summary>
    /// 获取未完成的调拨出库单号列表
    ///     获取未完成的调拨出库单号列表
    /// </summary>
    /// <returns>未完成的调拨出库单号列表</returns>
    public List<string> GetTransferOutNoList()
    {
        // 先从数据库获取Transfer_Out_ETAIL表的数据
        var transferOutDetails = Db.Queryable<TransferOutDetail>().ToList();
        var transferOutDetails = Db.Queryable<MesDbckDetail>().ToList();
        // 使用LINQ对获取的数据进行分组和筛选
        // 筛选条件:申请数量(sq)不等于已扫数量(ys)的记录
@@ -28,28 +31,170 @@
            .Select(g => new
            {
                pid = g.Key,
                sq = g.Sum(x => x.ShNum),  // 申请数量合计
                ys = g.Sum(x => x.YsNum)   // 已扫数量合计
                sq = g.Sum(x => x.FQty), // 申请数量合计
                ys = g.Sum(x => x.SQty), // 调出已扫数量合计
                rs = g.Sum(x => x.RQty), // 调入已扫数量合计
            })
            .Where(x => (x.sq ?? 0) != (x.ys ?? 0))
            .Where(x => !((x.sq ?? 0) == (x.ys ?? 0) && (x.sq ?? 0) == (x.rs ?? 0)))
            .Select(x => x.pid)
            .ToList();
        // 根据pid查询对应的出库单号
        var billNos = Db.Queryable<TransferOut>()
            .Where(x => result.Contains(x.Guid))
            .Select(x => x.BillNo)
        var billNos = Db.Queryable<MesDbck>()
            .Where(x => result.Contains(x.Id) && x.FApproveStatus == 1)
            .OrderBy(x => x.FCreateDate)
            .Select(x => x.FBillNo)
            .ToList();
        return billNos;
    }
    /// <summary>
    /// 根据单据号获取待处理的调拨出库明细列表
    ///     根据单据号获取待处理的调拨出库明细列表
    /// </summary>
    /// <param name="query">查询参数,包含单据号</param>
    /// <returns>待处理的调拨出库明细列表</returns>
    public List<TransferOutDetail> GetTransferOutDetailListByBillNo(
    public ProductionPickDto GetTransferOutDetailListByBillNo(
        WarehouseQuery query)
    {
        if (string.IsNullOrEmpty(query.billNo)) throw new Exception("调拨单号为空");
        var sql1 = string.Format(@"SELECT * FROM MES_DBCK WHERE FDocumentStatus = 'C' AND FBillNo = '{0}'", query.billNo);
        var dbck = Db.Ado.SqlQuery<ItemDetailModel>(sql1);
        if (dbck.Count < 1) throw new Exception("调拨单号不存在或未审核!");
        var sql2 = string.Format(@"SELECT c.item_no ItemNo,c.item_name ItemName,c.item_model ItemModel,b.FQty FQty,b.SQty SQty,b.FQty - b.SQty DSQty ,
       dbo.F_QX_GETRECODEPOTSE(B.FMATERIALID,'','','') as RecoKw
    FROM MES_DBCK_DETAIL B
    LEFT JOIN MES_DBCK A ON A.ID = B.pid
    LEFT JOIN MES_ITEMS C ON  B.FMATERIALID = C.item_id
    LEFT JOIN WOMCAB D ON B.erpid = D.ERPID
    WHERE A.FBillNo = '{0}'  ORDER BY FSEQ", query.billNo);
        var womdabs = Db.Ado.SqlQuery<ItemDetailModel>(sql2);
        var DS_list = womdabs.Where(s => s.DSQty > 0).ToList();
        var YS_list = womdabs.Where(s => s.SQty > 0).ToList();
        //var p_bill_no = query.billNo;
        //// 根据SQL查询条件获取待处理的出库明细
        //// 关联查询TransferOutDetail、TransferOut和MesItems三张表
        //// 筛选条件:未完成数量大于0且单据已审核
        //var result = Db.Queryable<MesDbckDetail, MesDbck, MesItems>(
        //        (b, a, s) => new JoinQueryInfos(
        //            JoinType.Left, b.Pid == a.Id,
        //            JoinType.Left, b.FMaterialId == s.Id.ToString()))
        //    .Where((b, a, s) =>
        //        !((b.FQty ?? 0) == (b.SQty ?? 0) && (b.FQty ?? 0) == (b.RQty ?? 0))
        //        && a.FBillNo == p_bill_no // 匹配单据号
        //        && a.FApproveStatus == 1) // 单据已审核
        //    .OrderBy((b, a, s) => s.ItemNo)
        //    .Select((b, a, s) => new ItemDetailModel
        //    {
        //        ItemNo = s.ItemNo,
        //        ItemName = s.ItemName,
        //        ItemModel = s.ItemModel,
        //        FQty = b.FQty, // 申请数量
        //        SQty = b.SQty, // 已扫数量
        //        RQty = b.RQty, // 已扫数量
        //        // 保留其他必要字段...
        //        Pid = b.Pid.ToString(),
        //        FMaterialId = b.FMaterialId,
        //        Id = b.Id.ToString()
        //    })
        //    .ToList();
        //if(result.Count < 1) throw new Exception("该调拨单不存在或已扫完,请重新扫描");
        var dto = new ProductionPickDto
        {
            items = DS_list,
            Ysitems = YS_list
            // yisao = mesInvItemOutCDetailsList
        };
        return dto;
    }
    /// <summary>
    ///     根据单据号获取待处理的调拨出库明细列表
    /// </summary>
    /// <param name="query">查询参数,包含单据号</param>
    /// <returns>待处理的调拨出库明细列表</returns>
    public ProductionPickDto GetTransferInDetailListByBillNo(
        WarehouseQuery query)
    {
        if (string.IsNullOrEmpty(query.billNo)) throw new Exception("调拨单号为空");
        var sql1 = string.Format(@"SELECT * FROM MES_DBCK WHERE FDocumentStatus = 'C' AND FBillNo = '{0}'", query.billNo);
        var dbck = Db.Ado.SqlQuery<ItemDetailModel>(sql1);
        if (dbck.Count < 1) throw new Exception("调拨单号不存在或未审核!");
        var sql2 = string.Format(@"SELECT c.item_no ItemNo,c.item_name ItemName,c.item_model ItemModel,b.FQty FQty,b.SQty SQty,b.RQty RQty,b.SQty - b.RQty DSQty ,
       dbo.F_QX_GETRECODEPOTSE(B.FMATERIALID,'','','') as RecoKw
    FROM MES_DBCK_DETAIL B
    LEFT JOIN MES_DBCK A ON A.ID = B.pid
    LEFT JOIN MES_ITEMS C ON  B.FMATERIALID = C.item_id
    LEFT JOIN WOMCAB D ON B.erpid = D.ERPID
    WHERE A.FBillNo = '{0}'  ORDER BY FSEQ", query.billNo);
        var womdabs = Db.Ado.SqlQuery<ItemDetailModel>(sql2);
        var DS_list = womdabs.Where(s => s.DSQty > 0).ToList();
        var YS_list = womdabs.Where(s => s.RQty > 0).ToList();
        //var p_bill_no = query.billNo;
        //// 根据SQL查询条件获取待处理的出库明细
        //// 关联查询TransferOutDetail、TransferOut和MesItems三张表
        //// 筛选条件:未完成数量大于0且单据已审核
        //var result = Db.Queryable<MesDbckDetail, MesDbck, MesItems>(
        //        (b, a, s) => new JoinQueryInfos(
        //            JoinType.Left, b.Pid == a.Id,
        //            JoinType.Left, b.FMaterialId == s.Id.ToString()))
        //    .Where((b, a, s) =>
        //        !((b.FQty ?? 0) == (b.SQty ?? 0) && (b.FQty ?? 0) == (b.RQty ?? 0))
        //        && a.FBillNo == p_bill_no // 匹配单据号
        //        && a.FApproveStatus == 1) // 单据已审核
        //    .OrderBy((b, a, s) => s.ItemNo)
        //    .Select((b, a, s) => new ItemDetailModel
        //    {
        //        ItemNo = s.ItemNo,
        //        ItemName = s.ItemName,
        //        ItemModel = s.ItemModel,
        //        FQty = b.FQty, // 申请数量
        //        SQty = b.SQty, // 已扫数量
        //        RQty = b.RQty, // 已扫数量
        //        // 保留其他必要字段...
        //        Pid = b.Pid.ToString(),
        //        FMaterialId = b.FMaterialId,
        //        Id = b.Id.ToString()
        //    })
        //    .ToList();
        //if(result.Count < 1) throw new Exception("该调拨单不存在或已扫完,请重新扫描");
        var dto = new ProductionPickDto
        {
            items = DS_list,
            Ysitems = YS_list
            // yisao = mesInvItemOutCDetailsList
        };
        return dto;
    }
    public List<ItemDetailModel> GetDBCKDetal(
        WarehouseQuery query)
    {
        var p_bill_no = query.billNo;
@@ -57,25 +202,27 @@
        // 根据SQL查询条件获取待处理的出库明细
        // 关联查询TransferOutDetail、TransferOut和MesItems三张表
        // 筛选条件:未完成数量大于0且单据已审核
        var result = Db.Queryable<TransferOutDetail, TransferOut, MesItems>(
        var result = Db.Queryable<MesDbckDetail, MesDbck, MesItems>(
                (b, a, s) => new JoinQueryInfos(
                    JoinType.Left, b.Pid == a.Guid,
                    JoinType.Left, b.ItemId == s.Id))
                    JoinType.Left, b.Pid == a.Id,
                    JoinType.Left, b.FMaterialId == s.Id.ToString()))
            .Where((b, a, s) =>
                (b.ShNum ?? 0) - (b.YsNum ?? 0) > 0  // 未完成数量大于0
                && a.BillNo == p_bill_no             // 匹配单据号
                && a.Status == 1)                    // 单据已审核
                !((b.FQty ?? 0) == (b.SQty ?? 0) && (b.FQty ?? 0) == (b.RQty ?? 0)) // 未完成数量大于0
                && a.FBillNo == p_bill_no // 匹配单据号
                && a.FApproveStatus == 1) // 单据已审核
            .OrderBy((b, a, s) => s.ItemNo)
            .Select((b, a, s) => new TransferOutDetail
            .Select((b, a, s) => new ItemDetailModel
            {
                ItemNo = s.ItemNo,
                ItemName = s.ItemName,
                ItemModel = s.ItemModel,
                ShNum = b.ShNum,      // 申请数量
                YsNum = b.YsNum,      // 已扫数量
                FQty = b.FQty, // 申请数量
                SQty = b.SQty, // 已扫数量
                RQty = b.RQty,
                // 保留其他必要字段...
                Pid = b.Pid,
                ItemId = b.ItemId,
                Guid = b.Guid
                Pid = b.Pid.ToString(),
                FMaterialId = b.FMaterialId,
                Id = b.Id.ToString()
            })
            .ToList();
@@ -83,299 +230,288 @@
    }
    /// <summary>
    /// 扫描条码进行调拨出库处理
    ///     扫描条码进行调拨出库处理
    /// </summary>
    /// <param name="query">包含单据号、用户名和条码信息的查询参数</param>
    /// <returns>处理后的表单和待处理明细列表</returns>
    public (WarehouseQuery form, List<TransferOutDetail> items)
    public ProductionPickDto
        ScanMoveBarcode(WarehouseQuery query)
    {
        var p_bill_no = query.billNo;
        var c_user = query.userName;
        var p_item_barcode = query.barcode;
        var p_bill_type_id = 300;     // 单据类型ID
        var p_transaction_no = 301;    // 交易编号
        // 验证单据号
        if (string.IsNullOrEmpty(p_bill_no))
        {
            throw new Exception("请选取单据号!");
        }
        if (string.IsNullOrEmpty(p_bill_no)) throw new Exception("请选取单据号!");
        // 查询出库单并验证状态
        var transferOut = Db.Queryable<TransferOut>()
            .Where(x => x.BillNo == p_bill_no && x.Status == 1)
        var transferOut = Db.Queryable<MesDbck>()
            .Where(x => x.FBillNo == p_bill_no && x.FApproveStatus == 1)
            .First();
        if (transferOut == null)
        {
            throw new Exception("未找到调拨申请单或者调拨申请单没审核");
        }
        if (transferOut == null) throw new Exception("未找到调拨申请单或者调拨申请单没审核");
        // 查询条码库存信息并验证
        var stock = Db.Queryable<MesInvItemStocks>()
            .Where(x => x.ItemBarcode == p_item_barcode
                        && x.Quantity > 0
                        && !string.IsNullOrEmpty(x.DepotsCode))
                        && x.Quantity > 0)
            .First();
        if (stock == null)
        {
            throw new Exception($"库存中无此条码,请核对!{p_item_barcode}");
        }
        // 验证仓库一致性
        if (stock.DepotsCode != transferOut.InvCode)
        {
            throw new Exception(
                $"条码库存仓库{stock.DepotsCode}和申请仓库不一致{transferOut.InvCode}");
        }
        if (stock == null) throw new Exception($"库存中无此条码,请核对!{p_item_barcode}");
        // 查询物料信息
        var item = Db.Queryable<MesItems>()
            .Where(x => x.Id == stock.ItemId)
            .First();
        if (item == null)
        {
            throw new Exception("未找到物料");
        }
        if (item == null) throw new Exception("未找到物料");
        // 查询调拨明细并验证
        var detail = Db.Queryable<TransferOutDetail>()
            .Where(x => x.ItemId == stock.ItemId && x.Pid == transferOut.Guid)
            .First();
        if (detail == null)
        var _strMsg = "";
        var _intSum = "";
        using (var conn = new SqlConnection(DbHelperSQL.strConn))
        {
            throw new Exception("未找到条码物料相应的调拨申请");
        }
        // 验证数量是否超出未扫数量
        if ((detail.ShNum ?? 0) - (detail.YsNum ?? 0) < stock.Quantity)
        {
            throw new Exception("条码数量大于申请未扫数量,请拆分了再扫码");
        }
        // 使用事务处理数据更新
        UseTransaction(db =>
        {
            // 查询现有移库记录
            var existingMove = db.Queryable<MesInvItemMoves>()
                .Where(x => x.TaskNo == p_bill_no
                            && x.TransactionNo == p_transaction_no
                            && (x.Status ?? 0) == 0)
                .First();
            var commit = 0;  // 记录更新操作次数
            var c_id = Guid.Empty;
            // 处理移库主表记录
            if (existingMove != null)
            using (var cmd = new SqlCommand("[prc_pda_DBCK]", conn))
            {
                // 更新现有记录的最后修改信息
                commit += db.Updateable<MesInvItemMoves>()
                    .SetColumns(s => s.LastupdateDate == DateTime.Now)
                    .SetColumns(s => s.LastupdateBy == c_user)
                    .Where(s => s.Guid == existingMove.Guid)
                    .ExecuteCommand();
                c_id = existingMove.Guid;
            }
            else
            {
                // 查询相关仓库信息
                var mesDepots = db.Queryable<MesDepots>()
                    .Where(s => s.DepotCode == transferOut.FromCode)
                    .First();
                var invMesDepots = db.Queryable<MesDepots>()
                    .Where(s => s.DepotCode == transferOut.InvCode)
                    .First();
                c_id = Guid.NewGuid();
                // 创建新的移库记录
                var newMove = new MesInvItemMoves
                try
                {
                    Guid = c_id,
                    BillNo = BillNo.GetBillNo("DBCKD"),
                    CreateBy = c_user,
                    CreateDate = DateTime.Now,
                    BillTypeId = p_bill_type_id,
                    TransactionNo = p_transaction_no,
                    InvDepotSectionsId = mesDepots.DepotId,
                    // InvDepotSectionsCode = transferOut.FromCode,
                    // FromDepotsCode = transferOut.InvCode,
                    FromDepotsId = invMesDepots.DepotId.ToString(),
                    TaskNo = p_bill_no
                };
                commit += db.Insertable(newMove).IgnoreColumns(true)
                    .ExecuteCommand();
            }
                    conn.Open();
                    cmd.CommandType = CommandType.StoredProcedure;
                    SqlParameter[] parameters =
                    {
                        new("@outMsg", SqlDbType.NVarChar, 300),
                        new("@outSum", SqlDbType.NVarChar, 300),
                        new("@barcode_num", SqlDbType.NVarChar, 300),
                        new("@split_num", SqlDbType.NVarChar, 300),
                        new("@c_user", query.userName),
                        new("@p_bill_no", p_bill_no),
                        new("@p_item_barcode", p_item_barcode),
                    };
                    parameters[0].Direction = ParameterDirection.Output;
                    parameters[1].Direction = ParameterDirection.Output;
                    parameters[2].Direction = ParameterDirection.Output;
                    parameters[3].Direction = ParameterDirection.Output;
                    foreach (var parameter in parameters)
                        cmd.Parameters.Add(parameter);
                    cmd.ExecuteNonQuery();
                    _strMsg = parameters[0].Value.ToString();
                    _intSum = parameters[1].Value.ToString();
            // 写入老条码交易明细
            var business = new MesInvBusiness2
            {
                Guid = Guid.NewGuid(),
                Status = 1,
                BillTypeId = p_bill_type_id,
                TransactionCode = p_transaction_no.ToString(),
                BusinessType = -1,
                ItemBarcode = p_item_barcode,
                ItemNo = item.ItemNo,
                LotNo = stock.LotNo,
                EpFlag = true,
                Quantity = stock.Quantity,
                FromInvDepotsCode = stock.DepotsCode,
                FromInvDepotSectionsCode = stock.DepotSectionsCode,
                ToInvDepotsCode = transferOut.FromCode,
                ToInvDepotSectionsCode = stock.DepotSectionsCode,
                CreateBy = c_user,
                CreateDate = DateTime.Now,
                LastupdateBy = c_user,
                LastupdateDate = DateTime.Now,
                Factory = stock.Factory,
                Company = stock.Company,
                TaskNo = stock.TaskNo,
                BillNo = p_bill_no,
                WorkNo = stock.WorkNo,
                WorkLine = stock.WorkLine,
                SuppNo = stock.SuppNo,
                ItemId = stock.ItemId,
                EbelnK3id = stock.EbelnK3id,
                LineK3id = stock.LineK3id,
                // RkDepot = transferOut.RkDepot,
                // CkDepot = transferOut.CkDepot
            };
                    var barcodeNum = parameters[2].Value.ToString();
                    var splitNum = parameters[3].Value.ToString();
                    var result = Convert.ToInt32(_intSum);
                    if (result <= 0) throw new Exception(_strMsg);
            commit += db.Insertable(business).IgnoreColumns(true)
                .ExecuteCommand();
                    query.itemNo = item.ItemNo;
                    query.Num = Convert.ToDecimal(barcodeNum);
                    query.Fum = Convert.ToDecimal(splitNum);
            // 写入新条码交易明细
            var moveDetail = new MesInvItemMovesCDetails
            {
                Guid = Guid.NewGuid(),
                ItemMoveGuid = c_id,
                ItemBarcode = p_item_barcode,
                CItemCode = stock.CItemCode,
                ItemNo = item.ItemNo,
                LotNo = stock.LotNo,
                Quantity = stock.Quantity,
                EpFlag = stock.EpFlag,
                CreateBy = c_user,
                CreateDate = DateTime.Now,
                LastupdateBy = c_user,
                LastupdateDate = DateTime.Now,
                // CustomerNo = stock.CustomerNo,
                TaskNo = stock.TaskNo,
                FromDepotsCode = stock.DepotsCode,
                FromDepotSectionsCode = stock.DepotSectionsCode,
                Factory = stock.Factory,
                Company = stock.Company,
                InvDepotsCode = transferOut.FromCode,
                // InvDepotSectionsCode = p_sectioncode,
                IqcStatus = stock.IqcStatus,
                Fcar = stock.Fcar,
                IndepDate = stock.IndepDate,
                VisableSubmit = stock.VisableSubmit,
                VisableSubmitBy = stock.VisableSubmitBy,
                VisableSubmitDate = stock.VisableSubmitDate,
                BoardStyle = stock.BoardStyle,
                WorkNo = stock.WorkNo,
                WorkLine = stock.WorkLine,
                SuppNo = stock.SuppNo,
                ItemId = (int)stock.ItemId,
                EbelnK3id = stock.EbelnK3id,
                LineK3id = stock.LineK3id,
                // RkDepot = transferOut.RkDepot,
                // CkDepot = transferOut.CkDepot
            };
                    // 返回更新后的表单和待处理明细
                    //return (query, GetDBCKDetal(query));
                    var dto = new ProductionPickDto
                    {
                        itemNo = item.ItemNo,
                        barcodeNum = barcodeNum,
                        splitNum = splitNum,
                        barcode = query.barcode,
                        strMsg = _strMsg,
                        result = _intSum
                    };
            commit += db.Insertable(moveDetail).IgnoreColumns(true)
                .ExecuteCommand();
            // 更新或插入出库明细记录
            var outItem = db.Queryable<MesInvItemOutItems>()
                .Where(x => x.ItemOutId == c_id && x.ItemId == stock.ItemId)
                .First();
            if (outItem != null)
            {
                // 更新现有记录的数量
                outItem.Quantity += stock.Quantity;
                commit += db.Updateable<MesInvItemOutItems>()
                    .SetColumns(x => x.Quantity == outItem.Quantity)
                    .Where(x => x.Guid == outItem.Guid)
                    .ExecuteCommand();
            }
            else
            {
                // 插入新记录
                var newOutItem = new MesInvItemOutItems
                    return dto;
                }
                catch (Exception ex)
                {
                    Guid = Guid.NewGuid(),
                    ItemOutId = c_id,
                    ItemId = stock.ItemId,
                    CreateBy = c_user,
                    CreateDate = DateTime.Now,
                    TaskNo = stock.TaskNo,
                    WorkNo = stock.WorkNo,
                    WorkLine = stock.WorkLine,
                    EbelnK3id = (int)stock.EbelnK3id,
                    LineK3id = (int)stock.LineK3id,
                    Quantity = stock.Quantity,
                    // Unit = stock.ItemUnit
                };
                commit += db.Insertable(newOutItem).IgnoreColumns(true)
                    .ExecuteCommand();
                    throw new Exception(ex.Message);
                }
                finally
                {
                    conn.Close();
                }
            }
            // 更新调拨申请已扫数量
            detail = db.Queryable<TransferOutDetail>()
                .Where(x => x.Guid == detail.Guid)
                .First();
            if (detail != null)
            {
                detail.YsNum = (detail.YsNum ?? 0) + stock.Quantity as int?;
                commit += db.Updateable<TransferOutDetail>()
                    .SetColumns(x => x.YsNum == detail.YsNum)
                    .Where(x => x.Guid == detail.Guid)
                    .ExecuteCommand();
            }
            // 检查是否所有明细都已完成
            var totals = db.Queryable<TransferOutDetail, TransferOut>((b, a) =>
                new JoinQueryInfos(JoinType.Left, b.Pid == a.Guid))
                .Where((b, a) => a.BillNo == p_bill_no)
                .Select((b, a) => new {
                    ShNum = SqlFunc.AggregateSum(b.ShNum),  // 申请总数量
                    YsNum = SqlFunc.AggregateSum(b.YsNum)   // 已扫总数量
                })
                .First();
            // 如果申请数量等于已扫数量,更新单据完成状态
            if (totals.ShNum == totals.YsNum)
            {
                commit += db.Updateable<TransferOut>()
                    .SetColumns(x => x.IsWc == 1)
                    .Where(x => x.BillNo == p_bill_no)
                    .ExecuteCommand();
            }
            // 更新返回参数
            query.itemNo = item.ItemNo;
            query.Num = stock.Quantity;
            // 验证更新操作是否全部成功
            if (commit < 4)
            {
                throw new Exception("更新失败");
            }
            return commit;
        });
        // 返回更新后的表单和待处理明细
        return (query, GetTransferOutDetailListByBillNo(query));
        }
    }
    /// <summary>
    ///     扫描条码进行调拨入库处理
    /// </summary>
    /// <param name="query">包含单据号、用户名和条码信息的查询参数</param>
    /// <returns>处理后的表单和待处理明细列表</returns>
    public (WarehouseQuery form, List<ItemDetailModel> items)
        ScanReceiveBarcode(WarehouseQuery query)
    {
        var p_bill_no = query.billNo;
        var p_item_barcode = query.barcode;
        var barinfo = Db.Queryable<MesInvItemStocks>()
            .Where(x => x.ItemBarcode == p_item_barcode)
            .First();
        //// 验证单据号
        //if (string.IsNullOrEmpty(p_bill_no)) throw new Exception("请选取单据号!");
        //// 查询出库单并验证状态
        //var transferOut = Db.Queryable<MesDbck>()
        //    .Where(x => x.FBillNo == p_bill_no && x.FApproveStatus == 1)
        //    .First();
        //if (transferOut == null) throw new Exception("未找到调拨申请单或者调拨申请单没审核");
        // 查询条码库存信息并验证
        var stock = Db.Queryable<MesDbckDetail>()
            .Where(x => x.FMaterialId == barinfo.ItemId.ToString()
                        && x.FQty > 0
                        && !string.IsNullOrEmpty(x.FStockInId)
                        && !string.IsNullOrEmpty(x.FOwnerInId))
            .First();
        if (stock == null) throw new Exception($"调拨明细中 【物料】或 【调入仓库】或【调入货主】信息不存在,请核对!{p_item_barcode}");
        // 查询物料信息
        var item = Db.Queryable<MesItems>()
            .Where(x => x.Id.ToString() == stock.FMaterialId)
            .First();
        if (item == null) throw new Exception("未找到物料");
        var _strMsg = "";
        var _intSum = "";
        using (var conn = new SqlConnection(DbHelperSQL.strConn))
        {
            using (var cmd = new SqlCommand("[prc_pda_DBRK]", conn))
            {
                try
                {
                    conn.Open();
                    cmd.CommandType = CommandType.StoredProcedure;
                    SqlParameter[] parameters =
                    {
                        new("@outMsg", SqlDbType.NVarChar, 300),
                        new("@outSum", SqlDbType.NVarChar, 300),
                        new("@barcode_num", SqlDbType.NVarChar, 300),
                        new("@outBillNo", SqlDbType.NVarChar, 300),
                        new("@c_user", query.userName),
                        new("@p_bill_no", p_bill_no),
                        new("@p_item_barcode", p_item_barcode),
                        new("@p_depot_section_code", query.sectionCode),
                    };
                    parameters[0].Direction = ParameterDirection.Output;
                    parameters[1].Direction = ParameterDirection.Output;
                    parameters[2].Direction = ParameterDirection.Output;
                    parameters[3].Direction = ParameterDirection.Output;
                    foreach (var parameter in parameters)
                        cmd.Parameters.Add(parameter);
                    cmd.ExecuteNonQuery();
                    _strMsg = parameters[0].Value.ToString();
                    _intSum = parameters[1].Value.ToString();
                    var barcodeNum = parameters[2].Value.ToString();
                    var outBillNo = parameters[3].Value.ToString();
                    var result = Convert.ToInt32(_intSum);
                    if (result <= 0) throw new Exception(_strMsg);
                    query.itemNo = item.ItemNo;
                    query.Num = Convert.ToDecimal(barcodeNum);
                    //query.Fum = Convert.ToDecimal(splitNum);
                    query.billNo = outBillNo;
                    // 返回更新后的表单和待处理明细
                    return (query, GetDBCKDetal(query));
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
                finally
                {
                    conn.Close();
                }
            }
        }
    }
    public ProductionPickDto ScanCodeCF(WarehouseQuery query)
    {
        var p_bill_no = query.daa001;
        var p_item_barcode = query.barcode;
        var barinfo = Db.Queryable<MesInvItemStocks>()
            .Where(x => x.ItemBarcode == p_item_barcode)
            .First();
        // 验证单据号
        if (string.IsNullOrEmpty(p_bill_no)) throw new Exception("请选取单据号!");
        // 查询出库单并验证状态
        var transferOut = Db.Queryable<MesDbck>()
            .Where(x => x.FBillNo == p_bill_no && x.FApproveStatus == 1)
            .First();
        if (transferOut == null) throw new Exception("未找到调拨申请单或者调拨申请单没审核");
        // 查询条码库存信息并验证
        var stock = Db.Queryable<MesDbckDetail>()
            .Where(x => x.FMaterialId == barinfo.ItemId.ToString()
                        && x.FQty > 0
                        && !string.IsNullOrEmpty(x.FStockInId)
                        && !string.IsNullOrEmpty(x.FOwnerInId))
            .First();
        if (stock == null) throw new Exception($"调拨明细中 【物料】或 【调入仓库】或【调入货主】信息不存在,请核对!{p_item_barcode}");
        // 查询物料信息
        var item = Db.Queryable<MesItems>()
            .Where(x => x.Id.ToString() == stock.FMaterialId)
            .First();
        if (item == null) throw new Exception("未找到物料");
        var _strMsg = "";
        var _intSum = "";
        var _cfBar = "";
        using (var conn = new SqlConnection(DbHelperSQL.strConn))
        {
            using (var cmd = new SqlCommand("[prc_pda_DBCK_CF]", conn))
            {
                try
                {
                    conn.Open();
                    cmd.CommandType = CommandType.StoredProcedure;
                    SqlParameter[] parameters =
                    {
                        new("@outMsg", SqlDbType.NVarChar, 2000),
                        new("@outSum", SqlDbType.NVarChar, 300),
                        new("@outCfBar", SqlDbType.NVarChar, 300),
                        new("@c_User", query.userName),
                        new("@p_biLL_no", query.daa001),
                        new("@p_item_barcode", query.barcode),
                        new("@num", query.Num)
                    };
                    parameters[0].Direction = ParameterDirection.Output;
                    parameters[1].Direction = ParameterDirection.Output;
                    parameters[2].Direction = ParameterDirection.Output;
                    foreach (var parameter in parameters)
                        cmd.Parameters.Add(parameter);
                    cmd.ExecuteNonQuery();
                    _strMsg = parameters[0].Value.ToString();
                    _intSum = parameters[1].Value.ToString();
                    _cfBar = parameters[2].Value.ToString();
                    var result = Convert.ToInt32(_intSum);
                    if (result <= 0) throw new Exception(_strMsg);
                    var dto = new ProductionPickDto
                    {
                        daa001 = query.daa001,
                        barcode = query.barcode,//原条码
                        cfBarcode = _cfBar//拆分后条码
                    };
                    return dto;
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
                finally
                {
                    conn.Close();
                }
            }
        }
    }
}