FlowInstanceService.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. namespace Admin.NET.Plugin.ApprovalFlow.Service;
  2. /// <summary>
  3. /// 流程实例服务
  4. /// </summary>
  5. [ApiDescriptionSettings(ApprovalFlowConst.GroupName, Order = 95)]
  6. public class FlowInstanceService : IDynamicApiController, ITransient
  7. {
  8. private readonly FlowEngineService _engine;
  9. private readonly SqlSugarRepository<ApprovalFlowInstance> _instanceRep;
  10. private readonly SqlSugarRepository<ApprovalFlowTask> _taskRep;
  11. private readonly SqlSugarRepository<ApprovalFlowLog> _logRep;
  12. private readonly SqlSugarRepository<ApprovalFlowCompletedNode> _completedNodeRep;
  13. public FlowInstanceService(
  14. FlowEngineService engine,
  15. SqlSugarRepository<ApprovalFlowInstance> instanceRep,
  16. SqlSugarRepository<ApprovalFlowTask> taskRep,
  17. SqlSugarRepository<ApprovalFlowLog> logRep,
  18. SqlSugarRepository<ApprovalFlowCompletedNode> completedNodeRep)
  19. {
  20. _engine = engine;
  21. _instanceRep = instanceRep;
  22. _taskRep = taskRep;
  23. _logRep = logRep;
  24. _completedNodeRep = completedNodeRep;
  25. }
  26. /// <summary>
  27. /// 发起流程
  28. /// </summary>
  29. [HttpPost]
  30. [ApiDescriptionSettings(Name = "Start")]
  31. [DisplayName("发起流程")]
  32. public async Task<long> Start(StartFlowInput input)
  33. {
  34. return await _engine.StartFlow(input);
  35. }
  36. /// <summary>
  37. /// 查询实例详情
  38. /// </summary>
  39. [HttpGet]
  40. [ApiDescriptionSettings(Name = "Detail")]
  41. [DisplayName("流程实例详情")]
  42. public async Task<FlowInstanceDetailOutput?> GetDetail([FromQuery] long id)
  43. {
  44. var instance = await _instanceRep.GetByIdAsync(id);
  45. if (instance == null) return null;
  46. var tasks = await _taskRep.AsQueryable()
  47. .Where(t => t.InstanceId == id)
  48. .OrderBy(t => t.CreateTime)
  49. .ToListAsync();
  50. var completedNodeIds = await _completedNodeRep.AsQueryable()
  51. .Where(c => c.InstanceId == id)
  52. .Select(c => c.NodeId)
  53. .ToListAsync();
  54. var currentNodeIds = tasks
  55. .Where(t => t.Status == FlowTaskStatusEnum.Pending)
  56. .Select(t => t.NodeId)
  57. .Distinct()
  58. .ToList();
  59. return new FlowInstanceDetailOutput
  60. {
  61. Id = instance.Id,
  62. FlowId = instance.FlowId,
  63. BizType = instance.BizType,
  64. BizId = instance.BizId,
  65. BizNo = instance.BizNo,
  66. Title = instance.Title,
  67. InitiatorId = instance.InitiatorId,
  68. InitiatorName = instance.InitiatorName,
  69. Status = instance.Status,
  70. CurrentNodeId = instance.CurrentNodeId,
  71. StartTime = instance.StartTime,
  72. EndTime = instance.EndTime,
  73. FlowJsonSnapshot = instance.FlowJsonSnapshot,
  74. Tasks = tasks.Select(t => new FlowTaskOutput
  75. {
  76. Id = t.Id,
  77. NodeId = t.NodeId,
  78. NodeName = t.NodeName,
  79. AssigneeId = t.AssigneeId,
  80. AssigneeName = t.AssigneeName,
  81. Status = t.Status,
  82. Comment = t.Comment,
  83. ActionTime = t.ActionTime,
  84. IsDelegate = t.IsDelegate,
  85. DelegateForUserId = t.DelegateForUserId,
  86. DelegateForUserName = t.DelegateForUserName,
  87. }).ToList(),
  88. CompletedNodeIds = completedNodeIds,
  89. CurrentNodeIds = currentNodeIds,
  90. };
  91. }
  92. /// <summary>
  93. /// 根据业务单据查询流程实例
  94. /// </summary>
  95. [HttpGet]
  96. [ApiDescriptionSettings(Name = "GetByBiz")]
  97. [DisplayName("按业务查流程")]
  98. public async Task<FlowInstanceDetailOutput?> GetByBiz([FromQuery] string bizType, [FromQuery] long bizId)
  99. {
  100. var instance = await _instanceRep.AsQueryable()
  101. .Where(i => i.BizType == bizType && i.BizId == bizId)
  102. .OrderByDescending(i => i.CreateTime)
  103. .FirstAsync();
  104. if (instance == null) return null;
  105. return await GetDetail(instance.Id);
  106. }
  107. /// <summary>
  108. /// 审批时间线
  109. /// </summary>
  110. [HttpGet]
  111. [ApiDescriptionSettings(Name = "Timeline")]
  112. [DisplayName("审批时间线")]
  113. public async Task<List<FlowTimelineItem>> GetTimeline([FromQuery] long instanceId)
  114. {
  115. return await _logRep.AsQueryable()
  116. .LeftJoin<ApprovalFlowTask>((l, t) => l.TaskId == t.Id)
  117. .Where((l, t) => l.InstanceId == instanceId)
  118. .OrderBy((l, t) => l.CreateTime)
  119. .Select((l, t) => new FlowTimelineItem
  120. {
  121. Id = l.Id,
  122. NodeId = l.NodeId,
  123. NodeName = t.NodeName,
  124. Action = l.Action,
  125. OperatorId = l.OperatorId,
  126. OperatorName = l.OperatorName,
  127. Comment = l.Comment,
  128. CreateTime = l.CreateTime,
  129. })
  130. .ToListAsync();
  131. }
  132. }