如洲 陈
5 天以前 fba48d2d676cd9b6d493163aef9d87f6e5090aee
MES.Service/service/QC/RKJService.cs
@@ -3,6 +3,7 @@
using MES.Service.Modes;
using MES.Service.util;
using SqlSugar;
using System.Data;
namespace MES.Service.service.QC;
@@ -367,46 +368,239 @@
                return commit;
            });
        // 注释掉自动提交逻辑,改为手动提交
        // var isNull = db.Queryable<QsItemOqcItem>()
        //     .Where(s => s.Pid == detail.Gid && s.IsPass == null).Count();
        //
        // if (isNull > 0) return 1;
        //
        //
        // //获取检验单的检验项目的个数
        // var sum = db.Queryable<QsItemOqcItem>()
        //     .Where(s => s.Pid == detail.Gid).Count();
        //
        // if (sum == 0) return 1;
        //
        // //获取检验单下的合格的检验项目个数
        // var icount = db.Queryable<QsItemOqcItem>()
        //     .Where(s => s.Pid == detail.Gid && s.IsPass == 1).Count();
        //
        // var FcheckResu = "不合格";
        //
        // //实际个数等于理论个数时对检验单进行判定
        // if (sum == icount)
        //     //合格的检验结果等于总检验数视为合格
        //     FcheckResu = "合格";
        //
        // SqlSugarHelper.UseTransactionWithOracle(db =>
        // {
        //     return db.Updateable<QsItemOqcReq>()
        //         .SetColumns(s => s.FcheckResu == FcheckResu)
        //         .SetColumns(s => s.FcheckDate == DateTime.Now)
        //         .SetColumns(s => s.FcheckBy == detail.CreateBy)
        //         .SetColumns(s => s.LastupdateBy == detail.CreateBy)
        //         .SetColumns(s => s.LastupdateDate == DateTime.Now)
        //         .Where(s => s.Id == detail.Gid)
        //         .ExecuteCommand();
        // });
        //
        // if (FcheckResu.Equals("不合格"))
        //     //自动生成入库检异常对策
        //     saveDetect02(detail.Gid, detail.CreateBy);
        return useTransactionWithOracle;
    }
    /// <summary>
    /// 手动提交入库检结果
    /// </summary>
    /// <param name="gid">入库检主表ID</param>
    /// <param name="userNo">操作人</param>
    /// <returns>提交结果</returns>
    public int SubmitRKJResult(decimal? gid, string userNo)
    {
        var db = SqlSugarHelper.GetInstance();
        // 检查是否所有检验项目都已完成
        var isNull = db.Queryable<QsItemOqcItem>()
            .Where(s => s.Pid == detail.Gid && s.IsPass == null).Count();
            .Where(s => s.Pid == gid && s.IsPass == null).Count();
        if (isNull > 0) return 1;
        if (isNull > 0)
        {
            throw new Exception("还有检验项目未完成,无法提交");
        }
        //获取检验单的检验项目的个数
        // 获取检验单的检验项目的个数
        var sum = db.Queryable<QsItemOqcItem>()
            .Where(s => s.Pid == detail.Gid).Count();
            .Where(s => s.Pid == gid).Count();
        if (sum == 0) return 1;
        if (sum == 0)
        {
            throw new Exception("没有检验项目,无法提交");
        }
        //获取检验单下的合格的检验项目个数
        // 获取检验单下的合格的检验项目个数
        var icount = db.Queryable<QsItemOqcItem>()
            .Where(s => s.Pid == detail.Gid && s.IsPass == 1).Count();
            .Where(s => s.Pid == gid && s.IsPass == 1).Count();
        var FcheckResu = "不合格";
        //实际个数等于理论个数时对检验单进行判定
        // 实际个数等于理论个数时对检验单进行判定
        if (sum == icount)
            //合格的检验结果等于总检验数视为合格
            // 合格的检验结果等于总检验数视为合格
            FcheckResu = "合格";
        SqlSugarHelper.UseTransactionWithOracle(db =>
        Console.WriteLine($"检验结果判定: 总项目数={sum}, 合格项目数={icount}, 判定结果={FcheckResu}");
        var result = SqlSugarHelper.UseTransactionWithOracle(db =>
        {
            return db.Updateable<QsItemOqcReq>()
            var updateResult = db.Updateable<QsItemOqcReq>()
                .SetColumns(s => s.FcheckResu == FcheckResu)
                .SetColumns(s => s.FcheckDate == DateTime.Now)
                .SetColumns(s => s.FcheckBy == detail.CreateBy)
                .SetColumns(s => s.LastupdateBy == detail.CreateBy)
                .SetColumns(s => s.FcheckBy == userNo)
                .SetColumns(s => s.LastupdateBy == userNo)
                .SetColumns(s => s.LastupdateDate == DateTime.Now)
                .Where(s => s.Id == detail.Gid)
                .Where(s => s.Id == gid)
                .ExecuteCommand();
            // 如果不合格,在事务内调用存储过程生成异常处置单
            if (FcheckResu.Equals("不合格"))
            {
                CallRKJUnqualifiedStoredProcedureInTransaction(db, gid, userNo);
            }
            return updateResult;
        });
        if (FcheckResu.Equals("不合格"))
            //自动生成入库检异常对策
            saveDetect02(detail.Gid, detail.CreateBy);
        return result;
    }
        return useTransactionWithOracle;
    /// <summary>
    /// 调用入库检不合格存储过程(事务内调用)
    /// </summary>
    /// <param name="db">数据库连接</param>
    /// <param name="gid">入库检主表ID</param>
    /// <param name="userNo">操作人</param>
    private void CallRKJUnqualifiedStoredProcedureInTransaction(ISqlSugarClient db, decimal? gid, string userNo)
    {
        try
        {
            Console.WriteLine($"开始调用入库检不合格存储过程,gid: {gid}, userNo: {userNo}");
            // 获取入库检单信息
            var rkjInfo = db.Queryable<QsItemOqcReq>()
                .Where(s => s.Id == gid)
                .First();
            if (rkjInfo == null)
            {
                Console.WriteLine($"未找到入库检单信息,gid: {gid}");
                return;
            }
            Console.WriteLine($"找到入库检单信息,ReleaseNo: {rkjInfo.ReleaseNo}");
            // 定义输出参数
            var outputResult = new SugarParameter("o_Result", null,
                System.Data.DbType.Int32, ParameterDirection.Output, 4000);
            var outputMessage = new SugarParameter("o_Msg", null,
                System.Data.DbType.String, ParameterDirection.Output, 4000);
            // 定义输入参数
            var parameters = new List<SugarParameter>
            {
                new("p_Gid", gid, System.Data.DbType.Decimal, ParameterDirection.Input),
                new("p_Release_No", rkjInfo.ReleaseNo, System.Data.DbType.String, ParameterDirection.Input),
                new("p_User", userNo, System.Data.DbType.String, ParameterDirection.Input),
                outputResult,
                outputMessage
            };
            Console.WriteLine($"准备执行存储过程,参数: gid={gid}, releaseNo={rkjInfo.ReleaseNo}, userNo={userNo}");
            // 执行存储过程
            db.Ado.ExecuteCommand(
                "BEGIN PRC_MES_RKJ_UNQUALIFIED(:p_Gid, :p_Release_No, :p_User, :o_Result, :o_Msg); END;",
                parameters.ToArray());
            // 获取输出参数的值
            var resultValue = outputResult.Value?.ToString();
            var messageValue = outputMessage.Value?.ToString();
            Console.WriteLine($"存储过程执行完成,结果: {resultValue}, 消息: {messageValue}");
            if ("1".Equals(resultValue))
            {
                throw new Exception($"入库检异常处置单生成失败: {messageValue}");
            }
            Console.WriteLine("入库检异常处置单生成成功");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"入库检异常处置单生成失败: {ex.Message}");
            // 在事务内,如果存储过程调用失败,应该抛出异常以回滚事务
            throw new Exception($"入库检异常处置单生成失败: {ex.Message}");
        }
    }
    /// <summary>
    /// 调用入库检不合格存储过程(事务外调用,用于兼容)
    /// </summary>
    /// <param name="gid">入库检主表ID</param>
    /// <param name="userNo">操作人</param>
    private void CallRKJUnqualifiedStoredProcedure(decimal? gid, string userNo)
    {
        try
        {
            var db = SqlSugarHelper.GetInstance();
            // 获取入库检单信息
            var rkjInfo = db.Queryable<QsItemOqcReq>()
                .Where(s => s.Id == gid)
                .First();
            if (rkjInfo == null) return;
            // 定义输出参数
            var outputResult = new SugarParameter("o_Result", null,
                System.Data.DbType.Int32, ParameterDirection.Output, 4000);
            var outputMessage = new SugarParameter("o_Msg", null,
                System.Data.DbType.String, ParameterDirection.Output, 4000);
            // 定义输入参数
            var parameters = new List<SugarParameter>
            {
                new("p_Gid", gid, System.Data.DbType.Decimal, ParameterDirection.Input),
                new("p_Release_No", rkjInfo.ReleaseNo, System.Data.DbType.String, ParameterDirection.Input),
                new("p_User", userNo, System.Data.DbType.String, ParameterDirection.Input),
                outputResult,
                outputMessage
            };
            // 执行存储过程
            db.Ado.ExecuteCommand(
                "BEGIN PRC_MES_RKJ_UNQUALIFIED(:p_Gid, :p_Release_No, :p_User, :o_Result, :o_Msg); END;",
                parameters.ToArray());
            // 获取输出参数的值
            var resultValue = outputResult.Value?.ToString();
            var messageValue = outputMessage.Value?.ToString();
            if ("1".Equals(resultValue))
            {
                throw new Exception($"入库检异常处置单生成失败: {messageValue}");
            }
        }
        catch (Exception ex)
        {
            // 记录日志但不影响主流程
            Console.WriteLine($"入库检异常处置单生成失败: {ex.Message}");
            // 可以根据需要决定是否抛出异常
            // throw new Exception($"入库检异常处置单生成失败: {ex.Message}");
        }
    }
    public int saveDetect02(decimal? gid, string? createBy)