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; /// /// 工单状态管理类,负责工单状态相关的数据操作 /// 继承自Repository基类,包含基础的CRUD操作 /// public class MesCutterLedgerManager : Repository { //private readonly MesQaItemsDetect02Manager //mesQaItemsDetect02Manager = new(); /// /// 刀具查询(支持编号或名称模糊查询) /// 上机、报废、维修出库不查询 /// /// 查询关键字 /// 页码 /// 每页大小 /// 刀具查询结果 public MesCutterLedger QueryTools(string searchKey, int pageIndex, int pageSize) { var excludeTypes = new[] { "上机", "报废", "维修出库" }; var query = Db.Queryable() .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 }; } /// /// 上下刀操作(上刀type=0,下刀type=1) /// 仅负责参数转发,所有数据写入由存储过程完成。 /// /// 机台编号 /// 刀具编号 /// 操作类型(上刀、下刀) /// 使用上限 /// 存储过程执行结果 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( "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}"); } } /// /// 获取工单表单数据(通过工单编号和机台编号查询)。 /// 使用 Oracle.ManagedDataAccess.Client 调用存储过程并读取 REF CURSOR,返回动态对象列表。 /// public List GetFormData(string workOrderNo, string machineNo) { var result = new List(); 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 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}"); } } }