快乐的昕的电脑
2025-10-18 9f815134b902d19605c753616765cedb598e323f
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));
@@ -85,42 +89,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[]
        {
        new SugarParameter("V_WORK_ORDER_NO", string.IsNullOrEmpty(workOrderNo) ? (object)DBNull.Value : workOrderNo),
        new SugarParameter("V_MACHINE_NO", string.IsNullOrEmpty(machineNo) ? (object)DBNull.Value : machineNo),
        new SugarParameter("PO_CURSOR", null) { Direction = ParameterDirection.Output, DbType = SystemDataDbType.Object }
    };
        var result = new List<dynamic>();
        var connStr = Db.Ado.Connection?.ConnectionString;
        if (string.IsNullOrEmpty(connStr)) throw new Exception("无法获取数据库连接字符串。");
        try
        {
            // 假设存储过程名为 PROC_GET_FORM_DATA,返回游标
            var result = Db.Ado.UseStoredProcedure().GetDataTable("PROC_GET_FORM_DATA", parameters);
            using var oracleConn = new OracleConnection(connStr);
            using var cmd = oracleConn.CreateCommand();
            cmd.CommandText = "PROC_GET_FORM_DATA";
            cmd.CommandType = CommandType.StoredProcedure;
            // DataTable 转 List<dynamic>
            var list = new List<dynamic>();
            foreach (DataRow row in result.Rows)
            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())
            {
                IDictionary<string, object> expando = new ExpandoObject();
                foreach (DataColumn col in result.Columns)
                IDictionary<string, object> row = new ExpandoObject();
                for (int i = 0; i < reader.FieldCount; i++)
                {
                    expando[col.ColumnName] = row[col] == DBNull.Value ? null : row[col];
                    var name = reader.GetName(i);
                    var val = reader.IsDBNull(i) ? null : reader.GetValue(i);
                    row[name] = val;
                }
                list.Add(expando);
                result.Add(row);
            }
            return list;
            return result;
        }
        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}");
            throw new Exception($"调用存储过程 PROC_GET_FORM_DATA 失败:{ex.Message}");
        }
    }
}