快乐的昕的电脑
2025-10-17 08bbb75ca8a3de5d8af4252becee642d51cc90f3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
using PadApplication.DB;
using PadApplication.Entites.DbModels;
using PadApplication.Entites.Dto;
using System.Net.Http;
using System.Text;
using Newtonsoft.Json;
using SqlSugar;
using System.Data;
using System.Dynamic;
using SystemDataDbType = System.Data.DbType;
using Oracle.ManagedDataAccess.Client; // 新增:直接使用 Oracle 客户端以显式传递 RefCursor
 
namespace PadApplication.Services;
 
/// <summary>
///     工单状态管理类,负责工单状态相关的数据操作
///     继承自Repository<MesCutterLedger>基类,包含基础的CRUD操作
/// </summary>
public class MesCutterLedgerManager : Repository<MesCutterLedger>
{
    //private readonly MesQaItemsDetect02Manager
    //mesQaItemsDetect02Manager = new();
 
    /// <summary>
    /// 刀具查询(支持编号或名称模糊查询)
    /// 上机、报废、维修出库不查询
    /// </summary>
    /// <param name="searchKey">查询关键字</param>
    /// <param name="pageIndex">页码</param>
    /// <param name="pageSize">每页大小</param>
    /// <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));
 
        var total = query.Count();
        var tbBillList = query
            .OrderBy(t => t.CutterId)
            .ToPageList(pageIndex, pageSize, ref total); // 使用ToPageList分页
 
        return new MesCutterLedger
        {
            tbBillList = tbBillList,
            total = total
        };
    }
 
    /// <summary>
    ///     上下刀操作(上刀type=0,下刀type=1)
    ///     仅负责参数转发,所有数据写入由存储过程完成。
    /// </summary>
    /// <param name="machineNo">机台编号</param>
    /// <param name="toolNo">刀具编号</param>
    /// <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)
    {
        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 }
        };
        try
        {
            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 };
        }
        catch (Exception ex)
        {
            // 只有存储过程本身执行异常才会进入这里
            throw new Exception($"{ex.Message}");
        }
    }
 
    /// <summary>
    /// 获取工单表单数据(通过工单编号和机台编号查询)。
    /// 使用 Oracle.ManagedDataAccess.Client 调用存储过程并读取 REF CURSOR,返回动态对象列表。
    /// </summary>
    public List<dynamic> GetFormData(string workOrderNo, string machineNo)
    {
        var result = new List<dynamic>();
 
        var connStr = Db.Ado.Connection?.ConnectionString;
        if (string.IsNullOrEmpty(connStr)) throw new Exception("无法获取数据库连接字符串。");
 
        try
        {
            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())
            {
                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);
            }
 
            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}");
        }
    }
}