SmartOpsImprovementBizHandler.cs 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using Admin.NET.Plugin.AiDOP.Entity;
  2. using Admin.NET.Plugin.AiDOP.Infrastructure;
  3. using Admin.NET.Plugin.AiDOP.SmartOps;
  4. using Admin.NET.Plugin.ApprovalFlow;
  5. using Admin.NET.Plugin.ApprovalFlow.Service;
  6. namespace Admin.NET.Plugin.AiDOP.Service;
  7. /// <summary>
  8. /// 智慧运营改善计划审批回调。
  9. /// </summary>
  10. public class SmartOpsImprovementBizHandler : IFlowBizHandler, ITransient
  11. {
  12. public const string BizTypeCode = "SMART_OPS_IMPROVEMENT";
  13. public string BizType => BizTypeCode;
  14. private readonly SqlSugarRepository<AdoSmartOpsImprovementPlan> _rep;
  15. private readonly SmartOpsImprovementActionService _actions;
  16. public SmartOpsImprovementBizHandler(
  17. SqlSugarRepository<AdoSmartOpsImprovementPlan> rep,
  18. SmartOpsImprovementActionService actions)
  19. {
  20. _rep = rep;
  21. _actions = actions;
  22. }
  23. public async Task OnFlowStarted(long bizId, long instanceId)
  24. {
  25. var plan = await _rep.GetByIdAsync(bizId);
  26. if (plan == null) return;
  27. await _rep.AsUpdateable()
  28. .SetColumns(x => x.Status == "approving")
  29. .SetColumns(x => x.FlowInstanceId == instanceId)
  30. .SetColumns(x => x.UpdateTime == DateTime.Now)
  31. .Where(x => x.Id == bizId && x.TenantId == plan.TenantId)
  32. .ExecuteCommandAsync();
  33. }
  34. public async Task OnFlowCompleted(long bizId, long instanceId, FlowInstanceStatusEnum finalStatus, long? lastApproverId)
  35. {
  36. var plan = await _rep.GetByIdAsync(bizId);
  37. if (plan == null) return;
  38. var status = SmartOpsImprovementApprovalRules.MapCompletedStatus(finalStatus);
  39. var ownerId = plan.OwnerUserId;
  40. if (status == "approved" && ownerId is not > 0)
  41. ownerId = await _actions.ResolveOwnerUserIdAsync(plan);
  42. if (ownerId is > 0 && plan.OwnerUserId != ownerId)
  43. {
  44. await _rep.AsUpdateable()
  45. .SetColumns(x => x.Status == status)
  46. .SetColumns(x => x.OwnerUserId == ownerId)
  47. .SetColumns(x => x.UpdateTime == DateTime.Now)
  48. .Where(x => x.Id == bizId && x.TenantId == plan.TenantId)
  49. .ExecuteCommandAsync();
  50. plan.OwnerUserId = ownerId;
  51. }
  52. else
  53. {
  54. await _rep.AsUpdateable()
  55. .SetColumns(x => x.Status == status)
  56. .SetColumns(x => x.UpdateTime == DateTime.Now)
  57. .Where(x => x.Id == bizId && x.TenantId == plan.TenantId)
  58. .ExecuteCommandAsync();
  59. }
  60. if (status != "approved") return;
  61. plan.Status = status;
  62. await _actions.NotifyOwnerToStartAsync(plan, lastApproverId ?? 0);
  63. }
  64. public async Task<Dictionary<string, object>> GetBizData(long bizId)
  65. {
  66. var plan = await _rep.GetByIdAsync(bizId);
  67. if (plan == null) return new Dictionary<string, object>();
  68. var route = SmartOpsImprovementApprovalRules.ResolveRoute(plan);
  69. return new Dictionary<string, object>
  70. {
  71. ["moduleCode"] = plan.ModuleCode,
  72. ["metricCode"] = plan.MetricCode ?? "",
  73. ["problemLevel"] = plan.ProblemLevel,
  74. ["problemName"] = plan.ProblemName,
  75. ["problemDept"] = plan.ProblemDept ?? "",
  76. ["problemSeverity"] = SmartOpsImprovementApprovalRules.NormalizeSeverity(plan.ProblemSeverity),
  77. ["isCrossDept"] = plan.IsCrossDept ? 1 : 0,
  78. ["route"] = route,
  79. ["status"] = plan.Status,
  80. };
  81. }
  82. }