using System.Text.Json;
using Admin.NET.Plugin.AiDOP.Entity.DataPlatform;
using Admin.NET.Plugin.ApprovalFlow;
using Admin.NET.Plugin.ApprovalFlow.Service;
namespace Admin.NET.Plugin.AiDOP.Order;
///
/// 订单评审审批业务回调
/// 注册 BizType = "ORDER_REVIEW"
///
public class OrderReviewBizHandler : IFlowBizHandler, ITransient
{
public string BizType => "ORDER_REVIEW";
private readonly SqlSugarRepository _seOrderRep;
private readonly ISqlSugarClient _db;
private readonly UserManager _userManager;
public OrderReviewBizHandler(SqlSugarRepository seOrderRep, ISqlSugarClient db, UserManager userManager)
{
_seOrderRep = seOrderRep;
_db = db;
_userManager = userManager;
}
public async Task OnFlowStarted(long bizId, long instanceId)
{
try
{
await _seOrderRep.AsUpdateable()
.SetColumns(o => o.FlowState == "审批中")
.Where(o => o.Id == bizId)
.ExecuteCommandAsync();
}
catch (Exception) { /* 表不存在时静默跳过 */ }
}
public async Task OnFlowCompleted(long bizId, long instanceId, FlowInstanceStatusEnum finalStatus, long? lastApproverId)
{
var state = finalStatus switch
{
FlowInstanceStatusEnum.Approved => "已通过",
FlowInstanceStatusEnum.Rejected => "已拒绝",
FlowInstanceStatusEnum.Cancelled => "已撤销",
_ => "已终止",
};
try
{
await _seOrderRep.AsUpdateable()
.SetColumns(o => o.FlowState == state)
.Where(o => o.Id == bizId)
.ExecuteCommandAsync();
}
catch (Exception) { /* 表不存在时静默跳过 */ }
if (finalStatus == FlowInstanceStatusEnum.Approved)
await TryEnqueueOrderStatusOutboxAsync(bizId);
}
/// 评审通过写 mdp_outbox(幂等);失败不阻断主流程。
private async Task TryEnqueueOrderStatusOutboxAsync(long orderId)
{
try
{
var order = await _seOrderRep.GetByIdAsync(orderId);
if (order == null) return;
string billNo = string.IsNullOrWhiteSpace(order.BillNo) ? orderId.ToString() : order.BillNo!;
long tenantId = order.TenantId is > 0 ? order.TenantId.Value : _userManager.TenantId;
var payload = JsonSerializer.Serialize(new
{
path = "/order/status",
method = "POST",
body = new
{
orderId,
billNo,
flowState = "已通过",
action = "S1_ORDER_STATUS_PUSH"
}
});
var exists = await _db.Ado.GetIntAsync(
"SELECT COUNT(1) FROM mdp_outbox WHERE tenant_id=@tid AND target_source_code='WMS_API' AND action_code='S1_ORDER_STATUS_PUSH' AND idem_key=@idem",
new List { new("@tid", tenantId), new("@idem", billNo) }) > 0;
if (exists) return;
await _db.Insertable(new MdpOutbox
{
TenantId = tenantId,
TargetSourceCode = "WMS_API",
ActionCode = "S1_ORDER_STATUS_PUSH",
IdemKey = billNo,
PayloadJson = payload,
Status = 0,
RetryCount = 0,
CreateTime = DateTime.Now,
UpdateTime = DateTime.Now
}).ExecuteCommandAsync();
}
catch { /* Outbox 失败不影响审批闭环 */ }
}
public Task OnNodeCompleted(long bizId, long instanceId, string nodeId, string nodeName, long? approverUserId)
{
return Task.CompletedTask;
}
public async Task> GetBizData(long bizId)
{
try
{
var order = await _seOrderRep.GetByIdAsync(bizId);
if (order == null) return new Dictionary();
return new Dictionary
{
["urgent"] = order.Urgent ?? 0,
["customLevel"] = order.CustomLevel ?? 0,
["orderType"] = order.OrderType ?? 0,
};
}
catch (Exception) { return new Dictionary(); }
}
}