FlowInstanceService.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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. [RequirePcMenuPath("/aidop/flowManage/approvalFlowCenter")]
  43. public async Task<FlowInstanceDetailOutput?> GetDetail([FromQuery] long id)
  44. {
  45. var instance = await _instanceRep.GetByIdAsync(id);
  46. if (instance == null) return null;
  47. var tasks = await _taskRep.AsQueryable()
  48. .Where(t => t.InstanceId == id)
  49. .OrderBy(t => t.CreateTime)
  50. .ToListAsync();
  51. var completedNodeIds = await _completedNodeRep.AsQueryable()
  52. .Where(c => c.InstanceId == id)
  53. .Select(c => c.NodeId)
  54. .ToListAsync();
  55. var currentNodeIds = tasks
  56. .Where(t => t.Status == FlowTaskStatusEnum.Pending)
  57. .Select(t => t.NodeId)
  58. .Distinct()
  59. .ToList();
  60. return new FlowInstanceDetailOutput
  61. {
  62. Id = instance.Id,
  63. FlowId = instance.FlowId,
  64. BizType = instance.BizType,
  65. BizId = instance.BizId,
  66. BizNo = instance.BizNo,
  67. Title = instance.Title,
  68. InitiatorId = instance.InitiatorId,
  69. InitiatorName = instance.InitiatorName,
  70. Status = instance.Status,
  71. CurrentNodeId = instance.CurrentNodeId,
  72. StartTime = instance.StartTime,
  73. EndTime = instance.EndTime,
  74. FlowJsonSnapshot = instance.FlowJsonSnapshot,
  75. Tasks = tasks.Select(t => new FlowTaskOutput
  76. {
  77. Id = t.Id,
  78. NodeId = t.NodeId,
  79. NodeName = t.NodeName,
  80. AssigneeId = t.AssigneeId,
  81. AssigneeName = t.AssigneeName,
  82. Status = t.Status,
  83. Comment = t.Comment,
  84. ActionTime = t.ActionTime,
  85. IsDelegate = t.IsDelegate,
  86. DelegateForUserId = t.DelegateForUserId,
  87. DelegateForUserName = t.DelegateForUserName,
  88. }).ToList(),
  89. CompletedNodeIds = completedNodeIds,
  90. CurrentNodeIds = currentNodeIds,
  91. };
  92. }
  93. /// <summary>
  94. /// 根据业务单据查询流程实例
  95. /// </summary>
  96. [HttpGet]
  97. [ApiDescriptionSettings(Name = "GetByBiz")]
  98. [DisplayName("按业务查流程")]
  99. public async Task<FlowInstanceDetailOutput?> GetByBiz([FromQuery] string bizType, [FromQuery] long bizId)
  100. {
  101. var instance = await _instanceRep.AsQueryable()
  102. .Where(i => i.BizType == bizType && i.BizId == bizId)
  103. .OrderByDescending(i => i.CreateTime)
  104. .FirstAsync();
  105. if (instance == null) return null;
  106. return await GetDetail(instance.Id);
  107. }
  108. /// <summary>
  109. /// 审批时间线
  110. /// </summary>
  111. [HttpGet]
  112. [ApiDescriptionSettings(Name = "Timeline")]
  113. [DisplayName("审批时间线")]
  114. [RequirePcMenuPath("/aidop/flowManage/approvalFlowCenter")]
  115. public async Task<List<FlowTimelineItem>> GetTimeline([FromQuery] long instanceId)
  116. {
  117. return await _logRep.AsQueryable()
  118. .LeftJoin<ApprovalFlowTask>((l, t) => l.TaskId == t.Id)
  119. .Where((l, t) => l.InstanceId == instanceId)
  120. .OrderBy((l, t) => l.CreateTime)
  121. .Select((l, t) => new FlowTimelineItem
  122. {
  123. Id = l.Id,
  124. NodeId = l.NodeId,
  125. NodeName = t.NodeName,
  126. Action = l.Action,
  127. OperatorId = l.OperatorId,
  128. OperatorName = l.OperatorName,
  129. Comment = l.Comment,
  130. CreateTime = l.CreateTime,
  131. })
  132. .ToListAsync();
  133. }
  134. }