快乐的昕的电脑
2025-12-04 4f33ac39577a3a20860e3895f748d6f10bd39b23
Services/MesCutterLedgerManager.cs
@@ -23,6 +23,7 @@
    /// <summary>
    /// 刀具查询(支持编号或名称模糊查询)
    /// 上机、报废、维修出库不查询
    /// </summary>
    /// <param name="searchKey">查询关键字</param>
    /// <param name="pageIndex">页码</param>
@@ -30,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));
@@ -55,24 +58,32 @@
    /// <param name="type">操作类型(上刀、下刀)</param>
    /// <param name="useLimit">使用上限</param>
    /// <returns>存储过程执行结果</returns>
    public object SubmitToolAction(string workOrderNo, string machineNo, string toolNo, string type, int? useLimit, decimal? sdjs = null, decimal? xdjs = null)
    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[]
        {
            new SugarParameter("V_WORK_ORDER_NO", workOrderNo),
            new SugarParameter("V_MACHINE_NO", machineNo),
            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("V_WORK_ORDER_NO", workOrderNo),
        new SugarParameter("V_MACHINE_NO", machineNo),
        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("V_MODL_LIFE_WORNING", modlLifeWorning ?? (object)DBNull.Value) // 新增
    };
        try
        {
            Db.Ado.UseStoredProcedure().SqlQuery<object>(
                "PROC_TOOL_ACTION", parameters);
            Db.Ado.UseStoredProcedure().SqlQuery<object>("PROC_TOOL_ACTION", parameters);
            var outMsg = parameters[7].Value?.ToString();
            var outSum = parameters[8].Value;
            // 这里 outMsg 已经包含了存储过程每步DML的详细错误信息
@@ -86,77 +97,54 @@
    }
    /// <summary>
    ///     获取工单表单数据(通过工单编号和机台编号查询)。
    ///     直接使用 Oracle.ManagedDataAccess.Client 调用存储过程并读取 REF CURSOR,避免参数绑定不匹配。
    /// 获取工单表单数据(通过工单编号和机台编号查询)。
    /// 使用 Oracle.ManagedDataAccess.Client 调用存储过程并读取 REF CURSOR,返回动态对象列表。
    /// </summary>
    /// <param name="workOrderNo">工单编号</param>
    /// <param name="machineNo">机台编号</param>
    /// <returns>表单数据的动态列表</returns>
    public List<dynamic> GetFormData(string workOrderNo, string machineNo)
    {
        // 从 SqlSugar 获取底层连接(确保对应的是 OracleConnection)
        using var conn = Db.Ado.Connection;
        if (conn == null) throw new Exception("无法获取数据库连接。");
        var result = new List<dynamic>();
        // 尝试将连接转换为 OracleConnection
        if (conn is not OracleConnection oracleConn)
        {
            // 如果不是 OracleConnection,尝试通过 ConnectionString 构建新的 OracleConnection
            oracleConn = new OracleConnection(Db.Ado.Connection.ConnectionString);
        }
        var connStr = Db.Ado.Connection?.ConnectionString;
        if (string.IsNullOrEmpty(connStr)) throw new Exception("无法获取数据库连接字符串。");
        var resultList = new List<dynamic>();
        try
        {
            using var oracleConn = new OracleConnection(connStr);
            using var cmd = oracleConn.CreateCommand();
            cmd.CommandText = "PROC_GET_FORM_DATA";
            cmd.CommandType = CommandType.StoredProcedure;
            // 注意:参数名称与存储过程签名必须完全一致(顺序也很重要)
            var pWorkOrder = new OracleParameter("V_WORK_ORDER_NO", OracleDbType.Varchar2, ParameterDirection.Input)
            {
                Value = string.IsNullOrEmpty(workOrderNo) ? (object)DBNull.Value : workOrderNo
            };
            var pMachine = new OracleParameter("V_MACHINE_NO", OracleDbType.Varchar2, ParameterDirection.Input)
            {
                Value = string.IsNullOrEmpty(machineNo) ? (object)DBNull.Value : machineNo
            };
            var pCursor = new OracleParameter("PO_CURSOR", OracleDbType.RefCursor, ParameterDirection.Output);
            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;
            cmd.Parameters.Add(pWorkOrder);
            cmd.Parameters.Add(pMachine);
            cmd.Parameters.Add(pCursor);
            var mustOpen = oracleConn.State != ConnectionState.Open;
            if (mustOpen) oracleConn.Open();
            oracleConn.Open();
            using var reader = cmd.ExecuteReader();
            var dt = new DataTable();
            dt.Load(reader);
            foreach (DataRow row in dt.Rows)
            while (reader.Read())
            {
                IDictionary<string, object> expando = new ExpandoObject();
                foreach (DataColumn col in dt.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;
                }
                resultList.Add(expando);
                result.Add(row);
            }
            return resultList;
            return result;
        }
        catch (OracleException oex)
        {
            throw new Exception($"调用存储过程 PROC_GET_FORM_DATA 失败(OracleException): {oex.Message}");
            throw new Exception($"调用存储过程 PROC_GET_FORM_DATA 失败(OracleException):{oex.Message}");
        }
        catch (Exception ex)
        {
            throw new Exception($"调用存储过程 PROC_GET_FORM_DATA 失败: {ex.Message}");
        }
        finally
        {
            try { if (oracleConn.State == ConnectionState.Open) oracleConn.Close(); } catch { }
            throw new Exception($"调用存储过程 PROC_GET_FORM_DATA 失败:{ex.Message}");
        }
    }
}