OrderReviewBizHandler.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. using System.Text.Json;
  2. using Admin.NET.Plugin.AiDOP.Entity.DataPlatform;
  3. using Admin.NET.Plugin.ApprovalFlow;
  4. using Admin.NET.Plugin.ApprovalFlow.Service;
  5. namespace Admin.NET.Plugin.AiDOP.Order;
  6. /// <summary>
  7. /// 订单评审审批业务回调
  8. /// 注册 BizType = "ORDER_REVIEW"
  9. /// </summary>
  10. public class OrderReviewBizHandler : IFlowBizHandler, ITransient
  11. {
  12. public string BizType => "ORDER_REVIEW";
  13. private readonly SqlSugarRepository<SeOrder> _seOrderRep;
  14. private readonly ISqlSugarClient _db;
  15. private readonly UserManager _userManager;
  16. public OrderReviewBizHandler(SqlSugarRepository<SeOrder> seOrderRep, ISqlSugarClient db, UserManager userManager)
  17. {
  18. _seOrderRep = seOrderRep;
  19. _db = db;
  20. _userManager = userManager;
  21. }
  22. public async Task OnFlowStarted(long bizId, long instanceId)
  23. {
  24. try
  25. {
  26. await _seOrderRep.AsUpdateable()
  27. .SetColumns(o => o.FlowState == "审批中")
  28. .Where(o => o.Id == bizId)
  29. .ExecuteCommandAsync();
  30. }
  31. catch (Exception) { /* 表不存在时静默跳过 */ }
  32. }
  33. public async Task OnFlowCompleted(long bizId, long instanceId, FlowInstanceStatusEnum finalStatus, long? lastApproverId)
  34. {
  35. var state = finalStatus switch
  36. {
  37. FlowInstanceStatusEnum.Approved => "已通过",
  38. FlowInstanceStatusEnum.Rejected => "已拒绝",
  39. FlowInstanceStatusEnum.Cancelled => "已撤销",
  40. _ => "已终止",
  41. };
  42. try
  43. {
  44. await _seOrderRep.AsUpdateable()
  45. .SetColumns(o => o.FlowState == state)
  46. .Where(o => o.Id == bizId)
  47. .ExecuteCommandAsync();
  48. }
  49. catch (Exception) { /* 表不存在时静默跳过 */ }
  50. if (finalStatus == FlowInstanceStatusEnum.Approved)
  51. await TryEnqueueOrderStatusOutboxAsync(bizId);
  52. }
  53. /// <summary>评审通过写 mdp_outbox(幂等);失败不阻断主流程。</summary>
  54. private async Task TryEnqueueOrderStatusOutboxAsync(long orderId)
  55. {
  56. try
  57. {
  58. var order = await _seOrderRep.GetByIdAsync(orderId);
  59. if (order == null) return;
  60. string billNo = string.IsNullOrWhiteSpace(order.BillNo) ? orderId.ToString() : order.BillNo!;
  61. long tenantId = order.TenantId is > 0 ? order.TenantId.Value : _userManager.TenantId;
  62. var payload = JsonSerializer.Serialize(new
  63. {
  64. path = "/order/status",
  65. method = "POST",
  66. body = new
  67. {
  68. orderId,
  69. billNo,
  70. flowState = "已通过",
  71. action = "S1_ORDER_STATUS_PUSH"
  72. }
  73. });
  74. var exists = await _db.Ado.GetIntAsync(
  75. "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",
  76. new List<SugarParameter> { new("@tid", tenantId), new("@idem", billNo) }) > 0;
  77. if (exists) return;
  78. await _db.Insertable(new MdpOutbox
  79. {
  80. TenantId = tenantId,
  81. TargetSourceCode = "WMS_API",
  82. ActionCode = "S1_ORDER_STATUS_PUSH",
  83. IdemKey = billNo,
  84. PayloadJson = payload,
  85. Status = 0,
  86. RetryCount = 0,
  87. CreateTime = DateTime.Now,
  88. UpdateTime = DateTime.Now
  89. }).ExecuteCommandAsync();
  90. }
  91. catch { /* Outbox 失败不影响审批闭环 */ }
  92. }
  93. public Task OnNodeCompleted(long bizId, long instanceId, string nodeId, string nodeName, long? approverUserId)
  94. {
  95. return Task.CompletedTask;
  96. }
  97. public async Task<Dictionary<string, object>> GetBizData(long bizId)
  98. {
  99. try
  100. {
  101. var order = await _seOrderRep.GetByIdAsync(bizId);
  102. if (order == null) return new Dictionary<string, object>();
  103. return new Dictionary<string, object>
  104. {
  105. ["urgent"] = order.Urgent ?? 0,
  106. ["customLevel"] = order.CustomLevel ?? 0,
  107. ["orderType"] = order.OrderType ?? 0,
  108. };
  109. }
  110. catch (Exception) { return new Dictionary<string, object>(); }
  111. }
  112. }