wbc
6 天以前 50269b4df8c311908bca39aedad08f22d44f1ec6
service/Wom/MesWorkProdManager.cs
@@ -1,11 +1,12 @@
using NewPdaSqlServer.DB;
using NewPdaSqlServer.Dto.service;
using NewPdaSqlServer.entity;
using NewPdaSqlServer.util;
using NewPdaSqlServer.entity.Base;
using SharpCompress;
using SqlSugar;
using System.Data;
using System.Data.SqlClient;
using DbHelperSQL = NewPdaSqlServer.DB.DbHelperSQL;
using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
namespace NewPdaSqlServer.service.Wom;
@@ -294,11 +295,75 @@
        var po_womInBarSum = parameters[4].Value != DBNull.Value ? Convert.ToDecimal(parameters[4].Value) : 0m;
        
        // 声明变量在外层,确保在所有分支中都可访问
        MesInvItemIns rksqOrder = null;
        List<MesInvItemInRksqDetails> rksqDetails = new List<MesInvItemInRksqDetails>();
        List<MesInvItemInRksqDetails> itemDetails = new List<MesInvItemInRksqDetails>();
        if (po_outSum == 1)
        {
            rksqOrder = Db.Queryable<MesInvItemIns>()
        .LeftJoin<Womdaa>((a, daa) => a.TaskNo == daa.Daa001)
        .Where(a => a.Status == 0)
        .Where(a => a.TransctionNo == "181")
        .Where((a, daa) => daa.Daa029 == item.ItemNo)
        .Where((a, daa) => daa.Daa015 == workOrder.Daa015)
        .Where(a => a.InsDate.Value.Date == DateTime.Today)
        .First();
            if (rksqOrder != null)
            {
                var sql = string.Format(@"SELECT A.item_barcode ItemBarcode,B.QUANTITY BgQuantity,c.item_no ItemNo,c.item_name ItemName,c.item_model ItemModel
FROM MES_INV_ITEM_IN_RKSQ_DETAILS A
LEFT JOIN MES_INV_ITEM_BARCODES B ON A.item_barcode = B.ITEM_BARCODE
LEFT JOIN MES_ITEMS C ON  B.ITEM_ID = C.item_id
WHERE A.bill_no= '{0}' ORDER BY A.create_date DESC", rksqOrder.BillNo);
                var sql1 = string.Format(@"SELECT
    SUM(ISNULL(B.QUANTITY,0)) as BgQuantity,
    c.item_no as ItemNo,
    c.item_name as ItemName,
    c.item_model as ItemModel,
    MAX(A.create_date) as LatestCreateDate  -- 添加这个字段
FROM MES_INV_ITEM_IN_RKSQ_DETAILS A
LEFT JOIN MES_INV_ITEM_BARCODES B ON A.item_barcode = B.ITEM_BARCODE
LEFT JOIN MES_ITEMS C ON B.ITEM_ID = C.item_id
WHERE A.bill_no = '{0}'
GROUP BY c.item_no, c.item_name, c.item_model
ORDER BY MAX(A.create_date) DESC", rksqOrder.BillNo);
                rksqDetails = Db.Ado.SqlQuery<MesInvItemInRksqDetails>(sql).ToList();
                itemDetails = Db.Ado.SqlQuery<MesInvItemInRksqDetails>(sql1).ToList();
            }
        }
        else if (po_outSum == 2)
        {
            rksqOrder = Db.Queryable<MesInvItemIns>()
        .LeftJoin<Womdaa>((a, daa) => a.TaskNo == daa.Daa001)
        .Where(a => a.Status == 0)
        .Where(a => a.TransctionNo == "181")
        .Where((a, daa) => daa.Daa029 == item.ItemNo)
        .Where((a, daa) => daa.Daa015 == workOrder.Daa015)
        .Where(a => a.InsDate.Value.Date == DateTime.Today)
        .First();
            if (rksqOrder != null)
            {
                rksqOrder.BillNo = "";
            }
            rksqDetails = new List<MesInvItemInRksqDetails>();
            itemDetails = new List<MesInvItemInRksqDetails>();
        }
        // Check if the procedure failed
        if (po_outSum == -1)
        {
            throw new Exception(po_outMsg);
        }
        // 处理rksqOrder为null的情况
        string sjBillNo = rksqOrder?.BillNo ?? "";
        // 15. Return processing result
        return new ScanWorkResult
@@ -312,8 +377,9 @@
            ItemName = item.ItemName,
            ItemModel = workOrder.Daa004,
            Message = po_outMsg,
            //sjBillNo = sjBillNo,
            //BarcodesDetail = rksqDetails,
            sjBillNo = sjBillNo,
            BarcodesDetail = rksqDetails,
            itemDetail = itemDetails
        };
    }
@@ -337,124 +403,236 @@
    /// </exception>
    public bool ScanWorkProdAsync(ScanWorkRequest request)
    {
        // 1. 验证报工数量是否大于0
        if (request.Quantity <= 0)
            throw new Exception("报工数量不能小于等于 0,请核对!");
        //// 1. 验证报工数量是否大于0
        //if (request.Quantity <= 0)
        //    throw new Exception("报工数量不能小于等于 0,请核对!");
        // 2. 查询条码信息,验证条码是否存在
        var barcode = Db.Queryable<MesInvItemBarcodes>()
            .Where(x => x.ItemBarcode == request.ItemBarcode)
            .First();
        if (barcode == null)
            throw new Exception($"库存中无此条码,请核对!{request.ItemBarcode}");
        //// 2. 查询条码信息,验证条码是否存在
        //var barcode = Db.Queryable<MesInvItemBarcodes>()
        //    .Where(x => x.ItemBarcode == request.ItemBarcode)
        //    .First();
        //if (barcode == null)
        //    throw new Exception($"库存中无此条码,请核对!{request.ItemBarcode}");
        // 3. 查询工单信息,验证工单是否存在
        var womdaa = Db.Queryable<Womdaa>()
            .Where(x => x.Daa001 == barcode.BillNo)
            .First();
        if (womdaa == null)
            throw new Exception($"条码不是报工条码/无对应工单,请核对!{request.ItemBarcode}");
        //// 3. 查询工单信息,验证工单是否存在
        //var womdaa = Db.Queryable<Womdaa>()
        //    .Where(x => x.Daa001 == barcode.BillNo)
        //    .First();
        //if (womdaa == null)
        //    throw new Exception($"条码不是报工条码/无对应工单,请核对!{request.ItemBarcode}");
        // 4. 根据条码备注确定单据类型和交易号
        var billTypeId = 900; // 默认单据类型
        var transactionNo = 902; // 默认交易号(半成品工序)
        switch (barcode.Memo?.Trim() ?? "0")
        //// 4. 根据条码备注确定单据类型和交易号
        //var billTypeId = 900; // 默认单据类型
        //var transactionNo = 902; // 默认交易号(半成品工序)
        //switch (barcode.Memo?.Trim() ?? "0")
        //{
        //    case "丝印":
        //        transactionNo = 901; // 丝印工序
        //        break;
        //    case "半成品":
        //        transactionNo = 902; // 半成品工序
        //        break;
        //    case "成品":
        //    case "包装":
        //        transactionNo = 903; // 成品/包装工序
        //        break;
        //}
        //// 5. 汇总已扫条码数量,验证是否超出计划数量
        //var sumQty = Db.Queryable<MesWorkProd, MesWorkProdCDetails>((a, b) =>
        //        new JoinQueryInfos(JoinType.Inner, a.BillNo == b.BillNo))
        //    .Where((a, b) => a.BillTypeId == billTypeId
        //                     && a.TransactionNo == transactionNo
        //                     && b.SilkId == barcode.SilkId
        //                     && a.TaskNo == barcode.BillNo)
        //    .Sum((a, b) => b.Quantity);
        //sumQty = (sumQty ?? 0) + (int)request.Quantity;
        //if (sumQty > womdaa.Daa008)
        //    throw new Exception(
        //        $"本次报工数量:{request.Quantity} 大于剩余报工数量:{womdaa.Daa008 - (sumQty - request.Quantity)},请核对!");
        //// 6. 开启事务处理报工数据
        //return UseTransaction(db =>
        //{
        //    // 6.1 更新条码信息,设置已报工标记和数量
        //    db.Updateable<MesInvItemBarcodes>()
        //        .SetColumns(x => x.WorkFlg == true)
        //        .SetColumns(x => x.Quantity == request.Quantity)
        //        .Where(x => x.Guid == barcode.Guid)
        //        .ExecuteCommand();
        //    // 6.2 获取或创建报工单
        //    var workProd = db.Queryable<MesWorkProd>()
        //        .Where(x => x.TaskNo == barcode.BillNo
        //                    && x.CreateDate.Value.Date.ToString("yyyy-MM-dd") ==
        //                    DateTime.Now.Date.ToString("yyyy-MM-dd")
        //                    && x.BillTypeId == billTypeId
        //                    && x.TransactionNo == transactionNo
        //                    && x.Status == 0)
        //        .First();
        //    // 6.3 如果报工单不存在则创建新的报工单
        //    if (workProd == null)
        //    {
        //        var billNo = BillNo.GetBillNo("BG(报工编号)");
        //        workProd = new MesWorkProd
        //        {
        //            Id = Guid.NewGuid(),
        //            BillNo = billNo,
        //            LineNo = barcode.LineNo,
        //            Company = barcode.Company,
        //            Factory = barcode.Factory,
        //            CreateBy = request.UserNo,
        //            CreateDate = DateTime.Now,
        //            LastupdateBy = request.UserNo,
        //            LastupdateDate = DateTime.Now,
        //            PbillNo = barcode.BillNo,
        //            BillTypeId = billTypeId,
        //            TransactionNo = transactionNo,
        //            TaskNo = barcode.BillNo
        //        };
        //        db.Insertable(workProd).IgnoreColumns(true).ExecuteCommand();
        //    }
        //    // 6.4 插入报工明细记录
        //    var detail = new MesWorkProdCDetails
        //    {
        //        Id = Guid.NewGuid(),
        //        BillNo = workProd.BillNo,
        //        ItemBarcode = request.ItemBarcode,
        //        Quantity = (int)request.Quantity,
        //        Company = barcode.Company,
        //        Factory = barcode.Factory,
        //        CreateBy = request.UserNo,
        //        CreateDate = DateTime.Now,
        //        LastupdateBy = request.UserNo,
        //        LastupdateDate = DateTime.Now,
        //        ItemNo = barcode.ItemNo,
        //        PbillNo = barcode.BillNo,
        //        WorkLast = barcode.WorkLast,
        //        SilkPqty = barcode.SilkPqty,
        //        SilkId = barcode.SilkId,
        //        Silk = barcode.Silk
        //    };
        //    db.Insertable(detail).IgnoreColumns(true).ExecuteCommand();
        //    return 1;
        //}) > 0;
        // 调用存储过程处理生产报工审核
        var parameters = new SqlParameter[]
        {
            case "丝印":
                transactionNo = 901; // 丝印工序
                break;
            case "半成品":
                transactionNo = 902; // 半成品工序
                break;
            case "成品":
            case "包装":
                transactionNo = 903; // 成品/包装工序
                break;
        }
        // 5. 汇总已扫条码数量,验证是否超出计划数量
        var sumQty = Db.Queryable<MesWorkProd, MesWorkProdCDetails>((a, b) =>
                new JoinQueryInfos(JoinType.Inner, a.BillNo == b.BillNo))
            .Where((a, b) => a.BillTypeId == billTypeId
                             && a.TransactionNo == transactionNo
                             && b.SilkId == barcode.SilkId
                             && a.TaskNo == barcode.BillNo)
            .Sum((a, b) => b.Quantity);
        sumQty = (sumQty ?? 0) + (int)request.Quantity;
        if (sumQty > womdaa.Daa008)
            throw new Exception(
                $"本次报工数量:{request.Quantity} 大于剩余报工数量:{womdaa.Daa008 - (sumQty - request.Quantity)},请核对!");
        // 6. 开启事务处理报工数据
        return UseTransaction(db =>
        {
            // 6.1 更新条码信息,设置已报工标记和数量
            db.Updateable<MesInvItemBarcodes>()
                .SetColumns(x => x.WorkFlg == true)
                .SetColumns(x => x.Quantity == request.Quantity)
                .Where(x => x.Guid == barcode.Guid)
                .ExecuteCommand();
            // 6.2 获取或创建报工单
            var workProd = db.Queryable<MesWorkProd>()
                .Where(x => x.TaskNo == barcode.BillNo
                            && x.CreateDate.Value.Date.ToString("yyyy-MM-dd") ==
                            DateTime.Now.Date.ToString("yyyy-MM-dd")
                            && x.BillTypeId == billTypeId
                            && x.TransactionNo == transactionNo
                            && x.Status == 0)
                .First();
            // 6.3 如果报工单不存在则创建新的报工单
            if (workProd == null)
            {
                var billNo = BillNo.GetBillNo("BG(报工编号)");
                workProd = new MesWorkProd
                {
                    Id = Guid.NewGuid(),
                    BillNo = billNo,
                    LineNo = barcode.LineNo,
                    Company = barcode.Company,
                    Factory = barcode.Factory,
                    CreateBy = request.UserNo,
                    CreateDate = DateTime.Now,
                    LastupdateBy = request.UserNo,
                    LastupdateDate = DateTime.Now,
                    PbillNo = barcode.BillNo,
                    BillTypeId = billTypeId,
                    TransactionNo = transactionNo,
                    TaskNo = barcode.BillNo
             // 输出参数:返回消息(最大长度2500字符)
             new SqlParameter("@outMsg", SqlDbType.NVarChar, 2500) { Direction = ParameterDirection.Output },
             // 输出参数:返回影响行数
             new SqlParameter("@outSum", SqlDbType.Int) { Direction = ParameterDirection.Output },
             // 输入参数:操作人工号
            new SqlParameter("@userno", request.UserNo),
            // 输入参数:单据编号(这里传入了条码值)
             new SqlParameter("@inorder", request.sjBillNo),
             // 输入参数:操作类型(1为审核,0为反审核)
             new SqlParameter("@inFieldValue", 1)
            // 注:以下参数在存储过程中有默认值,可根据需要添加
            // @inFieldName nvarchar(20)=null,  // 扩展字段名
            // @in1 nvarchar(20)=null,         // 扩展字段1
            // @in2 nvarchar(20)=null          // 扩展字段2
                };
                db.Insertable(workProd).IgnoreColumns(true).ExecuteCommand();
            }
        // 存储过程名称
        string procedureName = "prc_pda_scbg_submit";
        // 执行存储过程
        int res = DbHelperSQL.RunProcedure_NonQuery(procedureName, parameters);
            // 6.4 插入报工明细记录
            var detail = new MesWorkProdCDetails
        // 获取输出参数值(带类型转换)
        var outMsg = parameters[0].Value?.ToString() ?? string.Empty;  // 返回消息
        var outSum = parameters[1].Value != DBNull.Value ? Convert.ToInt32(parameters[1].Value) : -1;  // 影响行数
        if (outSum == -1)
            {
                Id = Guid.NewGuid(),
                BillNo = workProd.BillNo,
                ItemBarcode = request.ItemBarcode,
                Quantity = (int)request.Quantity,
                Company = barcode.Company,
                Factory = barcode.Factory,
                CreateBy = request.UserNo,
                CreateDate = DateTime.Now,
                LastupdateBy = request.UserNo,
                LastupdateDate = DateTime.Now,
                ItemNo = barcode.ItemNo,
                PbillNo = barcode.BillNo,
                WorkLast = barcode.WorkLast,
                SilkPqty = barcode.SilkPqty,
                SilkId = barcode.SilkId,
                Silk = barcode.Silk
            };
            db.Insertable(detail).IgnoreColumns(true).ExecuteCommand();
            return 1;
        }) > 0;
            throw new Exception(outMsg);
    }
        else
        {
            return true;
        }
    }
    public ScanWorkResult GetRksqList(ScanWorkRequest request)
    {
        //1.验证员工信息
        var staff = Db.Queryable<MesStaff>()
            .Where(x => x.StaffNo == request.StaffNo)
            .First();
        if (staff == null)
            throw new Exception("请先选择人员");
        var rksqOrder = Db.Queryable<MesInvItemIns>()
            .Where(x => x.BillNo == request.sjBillNo && x.Status == 0)
            .First();
        if (rksqOrder == null)
            throw new Exception("该检验单已提交送检");
        var sql = string.Format(@"SELECT A.item_barcode ItemBarcode,B.QUANTITY BgQuantity,c.item_no ItemNo,c.item_name ItemName,c.item_model ItemModel
    FROM MES_INV_ITEM_IN_RKSQ_DETAILS A
    LEFT JOIN MES_INV_ITEM_BARCODES B ON A.item_barcode = B.ITEM_BARCODE
    LEFT JOIN MES_ITEMS C ON  B.ITEM_ID = C.item_id
    WHERE A.bill_no= '{0}'ORDER BY A.create_date DESC", rksqOrder.BillNo);
        var sql1 = string.Format(@"SELECT
    SUM(ISNULL(B.QUANTITY,0)) as BgQuantity,
    c.item_no as ItemNo,
    c.item_name as ItemName,
    c.item_model as ItemModel,
    MAX(A.create_date) as LatestCreateDate  -- 添加这个字段
FROM MES_INV_ITEM_IN_RKSQ_DETAILS A
LEFT JOIN MES_INV_ITEM_BARCODES B ON A.item_barcode = B.ITEM_BARCODE
LEFT JOIN MES_ITEMS C ON B.ITEM_ID = C.item_id
WHERE A.bill_no = '{0}'
GROUP BY c.item_no, c.item_name, c.item_model
ORDER BY MAX(A.create_date) DESC", rksqOrder.BillNo);
        var RKSQ = Db.Ado.SqlQuery<MesInvItemInRksqDetails>(sql);
        var wlhz = Db.Ado.SqlQuery<MesInvItemInRksqDetails>(sql1);
        var rksqDetails = RKSQ.ToList();
        var wlhzDetails = wlhz.ToList();
        //var rksqDetails = Db.Queryable<MesInvItemInRksqDetails>()
        //    .Where(x => x.BillNo == )
        //    .ToList();
        // 15. Return processing result
        return new ScanWorkResult
        {
            BarcodesDetail = rksqDetails,
            itemDetail = wlhzDetails
        };
    }
    public ScanWorkResult GetRksqSelect(ScanWorkRequest request)
    {
        //1.验证员工信息
        var staff = Db.Queryable<MesStaff>()
            .Where(x => x.StaffNo == request.StaffNo)
            .First();
        if (staff == null)
            throw new Exception("请先选择人员");
        var rksqOrder = Db.Queryable<MesInvItemIns>()
            .Where(x => x.TransctionNo == "181" && x.Status == 0)
            .ToList();
        return new ScanWorkResult
        {
            rksqOrderList = rksqOrder,
        };
    }
}