ContractReviewBizHandler.cs 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using Admin.NET.Plugin.ApprovalFlow;
  2. using Admin.NET.Plugin.ApprovalFlow.Service;
  3. namespace Admin.NET.Plugin.AiDOP.Order;
  4. /// <summary>
  5. /// 合同评审审批业务回调(与流程定义 BizType = CONTRACT_REVIEW 一致)
  6. /// </summary>
  7. public class ContractReviewBizHandler : IFlowBizHandler, ITransient
  8. {
  9. public string BizType => "CONTRACT_REVIEW";
  10. private readonly SqlSugarRepository<ContractReview> _reviewRep;
  11. public ContractReviewBizHandler(SqlSugarRepository<ContractReview> reviewRep)
  12. {
  13. _reviewRep = reviewRep;
  14. }
  15. public async Task OnFlowStarted(long bizId, long instanceId)
  16. {
  17. var id = (int)bizId;
  18. var now = DateTime.Now;
  19. var row = await _reviewRep.GetByIdAsync(id);
  20. if (row == null) return;
  21. row.FlowStatus = "reviewing";
  22. row.CurrentStage = 1;
  23. row.CurrentDept = "审批流";
  24. row.UpdateTime = now;
  25. await _reviewRep.UpdateAsync(row);
  26. }
  27. public async Task OnFlowCompleted(long bizId, long instanceId, FlowInstanceStatusEnum finalStatus, long? lastApproverId)
  28. {
  29. var id = (int)bizId;
  30. var now = DateTime.Now;
  31. var row = await _reviewRep.GetByIdAsync(id);
  32. if (row == null) return;
  33. switch (finalStatus)
  34. {
  35. case FlowInstanceStatusEnum.Approved:
  36. row.FlowStatus = "completed";
  37. row.CurrentStage = 5;
  38. row.CurrentDept = "已完成";
  39. break;
  40. case FlowInstanceStatusEnum.Rejected:
  41. case FlowInstanceStatusEnum.Terminated:
  42. row.FlowStatus = "rejected";
  43. row.CurrentStage = 0;
  44. row.CurrentDept = null;
  45. break;
  46. case FlowInstanceStatusEnum.Cancelled:
  47. row.FlowStatus = "draft";
  48. row.CurrentStage = 0;
  49. row.CurrentDept = null;
  50. break;
  51. default:
  52. row.FlowStatus = "draft";
  53. row.CurrentStage = 0;
  54. row.CurrentDept = null;
  55. break;
  56. }
  57. row.UpdateTime = now;
  58. await _reviewRep.UpdateAsync(row);
  59. }
  60. public Task OnNodeCompleted(long bizId, long instanceId, string nodeId, string nodeName, long? approverUserId)
  61. {
  62. return Task.CompletedTask;
  63. }
  64. public async Task<Dictionary<string, object>> GetBizData(long bizId)
  65. {
  66. var row = await _reviewRep.GetByIdAsync((int)bizId);
  67. if (row == null) return new Dictionary<string, object>();
  68. var winRateLevel = row.WinRate switch
  69. {
  70. "高" => 3,
  71. "中" => 2,
  72. "低" => 1,
  73. _ => 0,
  74. };
  75. return new Dictionary<string, object>
  76. {
  77. ["currentStage"] = row.CurrentStage ?? 0,
  78. ["winRateLevel"] = winRateLevel,
  79. ["hasCrmNo"] = string.IsNullOrWhiteSpace(row.CrmNo) ? 0 : 1,
  80. };
  81. }
  82. }