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}");
|
}
|
}
|
}
|