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 query = Db.Queryable<MesCutterLedger>()
|
.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>
|
/// <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("无法获取数据库连接。");
|
|
// 尝试将连接转换为 OracleConnection
|
if (conn is not OracleConnection oracleConn)
|
{
|
// 如果不是 OracleConnection,尝试通过 ConnectionString 构建新的 OracleConnection
|
oracleConn = new OracleConnection(Db.Ado.Connection.ConnectionString);
|
}
|
|
var resultList = new List<dynamic>();
|
try
|
{
|
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(pWorkOrder);
|
cmd.Parameters.Add(pMachine);
|
cmd.Parameters.Add(pCursor);
|
|
var mustOpen = oracleConn.State != ConnectionState.Open;
|
if (mustOpen) oracleConn.Open();
|
|
using var reader = cmd.ExecuteReader();
|
var dt = new DataTable();
|
dt.Load(reader);
|
|
foreach (DataRow row in dt.Rows)
|
{
|
IDictionary<string, object> expando = new ExpandoObject();
|
foreach (DataColumn col in dt.Columns)
|
{
|
expando[col.ColumnName] = row[col] == DBNull.Value ? null : row[col];
|
}
|
resultList.Add(expando);
|
}
|
|
return resultList;
|
}
|
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}");
|
}
|
finally
|
{
|
try { if (oracleConn.State == ConnectionState.Open) oracleConn.Close(); } catch { }
|
}
|
}
|
}
|