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