快乐的昕的电脑
2025-12-04 4f33ac39577a3a20860e3895f748d6f10bd39b23
Services/MesCutterLedgerManager.cs
@@ -8,6 +8,7 @@
using System.Data;
using System.Dynamic;
using SystemDataDbType = System.Data.DbType;
using Oracle.ManagedDataAccess.Client; // 新增:直接使用 Oracle 客户端以显式传递 RefCursor
namespace PadApplication.Services;
@@ -22,6 +23,7 @@
    /// <summary>
    /// 刀具查询(支持编号或名称模糊查询)
    /// 上机、报废、维修出库不查询
    /// </summary>
    /// <param name="searchKey">查询关键字</param>
    /// <param name="pageIndex">页码</param>
@@ -29,7 +31,9 @@
    /// <returns>刀具查询结果</returns>
    public MesCutterLedger QueryTools(string searchKey, int pageIndex, int pageSize)
    {
        var excludeTypes = new[] { "上机", "报废", "维修出库" };
        var query = Db.Queryable<MesCutterLedger>()
            .Where(t => !excludeTypes.Contains(t.CutterType))
            .WhereIF(!string.IsNullOrEmpty(searchKey),
                t => t.CutterId.Contains(searchKey) || t.CutterName.Contains(searchKey));
@@ -54,7 +58,15 @@
    /// <param name="type">操作类型(上刀、下刀)</param>
    /// <param name="useLimit">使用上限</param>
    /// <returns>存储过程执行结果</returns>
    public object SubmitToolAction(string workOrderNo, string machineNo, string toolNo, string type, int? useLimit)
    public object SubmitToolAction(
        string workOrderNo,
        string machineNo,
        string toolNo,
        string type,
        int? useLimit,
        decimal? sdjs = null,
        decimal? xdjs = null,
        decimal? modlLifeWorning = null) // 新增:寿命比预警值(0~1的小数)
    {
        var parameters = new[]
        {
@@ -63,15 +75,17 @@
        new SugarParameter("V_TOOL_NO", toolNo),
        new SugarParameter("V_TYPE", type),
        new SugarParameter("V_USE_LIMIT", useLimit ?? (object)DBNull.Value),
        new SugarParameter("V_SDJS", sdjs ?? (object)DBNull.Value),
        new SugarParameter("V_XDJS", xdjs ?? (object)DBNull.Value),
        new SugarParameter("PO_OUTMSG", null) { Direction = ParameterDirection.Output, DbType = System.Data.DbType.String, Size = 200 },
        new SugarParameter("PO_OUTSUM", null) { Direction = ParameterDirection.Output, DbType = System.Data.DbType.Int32 }
        new SugarParameter("PO_OUTSUM", null) { Direction = ParameterDirection.Output, DbType = System.Data.DbType.Int32 },
        new SugarParameter("V_MODL_LIFE_WORNING", modlLifeWorning ?? (object)DBNull.Value) // 新增
    };
        try
        {
            Db.Ado.UseStoredProcedure().SqlQuery<object>(
                "PROC_TOOL_ACTION", parameters);
            var outMsg = parameters[5].Value?.ToString();
            var outSum = parameters[6].Value;
            Db.Ado.UseStoredProcedure().SqlQuery<object>("PROC_TOOL_ACTION", parameters);
            var outMsg = parameters[7].Value?.ToString();
            var outSum = parameters[8].Value;
            // 这里 outMsg 已经包含了存储过程每步DML的详细错误信息
            return new { outMsg, outSum };
        }
@@ -83,33 +97,54 @@
    }
    /// <summary>
    ///     获取工单表单数据(通过工单编号和机台编号查询)。
    ///     仅负责参数转发,所有数据读取由存储过程完成。
    /// 获取工单表单数据(通过工单编号和机台编号查询)。
    /// 使用 Oracle.ManagedDataAccess.Client 调用存储过程并读取 REF CURSOR,返回动态对象列表。
    /// </summary>
    /// <param name="workOrderNo">工单编号</param>
    /// <param name="machineNo">机台编号</param>
    /// <returns>表单数据的动态列表</returns>
    public List<dynamic> GetFormData(string workOrderNo, string machineNo)
    {
        var parameters = new[]
        var result = new List<dynamic>();
        var connStr = Db.Ado.Connection?.ConnectionString;
        if (string.IsNullOrEmpty(connStr)) throw new Exception("无法获取数据库连接字符串。");
        try
        {
            new SugarParameter("V_WORK_ORDER_NO", workOrderNo),
            new SugarParameter("V_MACHINE_NO", machineNo),
            new SugarParameter("PO_CURSOR", null) { Direction = ParameterDirection.Output, DbType = SystemDataDbType.Object }
        };
        // 假设存储过程名为 PROC_GET_FORM_DATA,返回游标
        var result = Db.Ado.UseStoredProcedure().GetDataTable("PROC_GET_FORM_DATA", parameters);
        // DataTable 转 List<dynamic>
        var list = new List<dynamic>();
        foreach (DataRow row in result.Rows)
        {
            IDictionary<string, object> expando = new ExpandoObject();
            foreach (DataColumn col in result.Columns)
            using var oracleConn = new OracleConnection(connStr);
            using var cmd = oracleConn.CreateCommand();
            cmd.CommandText = "PROC_GET_FORM_DATA";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("V_WORK_ORDER_NO", OracleDbType.Varchar2).Value =
                string.IsNullOrEmpty(workOrderNo) ? (object)DBNull.Value : workOrderNo;
            cmd.Parameters.Add("V_MACHINE_NO", OracleDbType.Varchar2).Value =
                string.IsNullOrEmpty(machineNo) ? (object)DBNull.Value : machineNo;
            var pCursor = cmd.Parameters.Add("PO_CURSOR", OracleDbType.RefCursor);
            pCursor.Direction = ParameterDirection.Output;
            oracleConn.Open();
            using var reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                expando[col.ColumnName] = row[col];
                IDictionary<string, object> row = new ExpandoObject();
                for (int i = 0; i < reader.FieldCount; i++)
                {
                    var name = reader.GetName(i);
                    var val = reader.IsDBNull(i) ? null : reader.GetValue(i);
                    row[name] = val;
                }
                result.Add(row);
            }
            list.Add(expando);
            return result;
        }
        return list;
        catch (OracleException oex)
        {
            throw new Exception($"调用存储过程 PROC_GET_FORM_DATA 失败(OracleException):{oex.Message}");
        }
        catch (Exception ex)
        {
            throw new Exception($"调用存储过程 PROC_GET_FORM_DATA 失败:{ex.Message}");
        }
    }
}