| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- 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;
- /// <summary>
- /// 订单评审审批业务回调
- /// 注册 BizType = "ORDER_REVIEW"
- /// </summary>
- public class OrderReviewBizHandler : IFlowBizHandler, ITransient
- {
- public string BizType => "ORDER_REVIEW";
- private readonly SqlSugarRepository<SeOrder> _seOrderRep;
- private readonly ISqlSugarClient _db;
- private readonly UserManager _userManager;
- public OrderReviewBizHandler(SqlSugarRepository<SeOrder> 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);
- }
- /// <summary>评审通过写 mdp_outbox(幂等);失败不阻断主流程。</summary>
- 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<SugarParameter> { 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<Dictionary<string, object>> GetBizData(long bizId)
- {
- try
- {
- var order = await _seOrderRep.GetByIdAsync(bizId);
- if (order == null) return new Dictionary<string, object>();
- return new Dictionary<string, object>
- {
- ["urgent"] = order.Urgent ?? 0,
- ["customLevel"] = order.CustomLevel ?? 0,
- ["orderType"] = order.OrderType ?? 0,
- };
- }
- catch (Exception) { return new Dictionary<string, object>(); }
- }
- }
|