WorkflowAppServiceBase.cs 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. using System.Dynamic;
  2. using Abp.Application.Services.Dto;
  3. using Abp.Domain.Repositories;
  4. using Abp.Json;
  5. using Microsoft.AspNetCore.Authorization;
  6. using Microsoft.EntityFrameworkCore;
  7. using Newtonsoft.Json;
  8. using VberZero.AppService.Base;
  9. using VberZero.AppService.Base.Dto;
  10. using VberZero.AppService.Workflows.Dto;
  11. using VberZero.Workflow;
  12. using VberZero.Workflow.DesignInfo;
  13. using VberZero.Workflow.Persistence;
  14. using VberZero.Workflow.StepBodies;
  15. namespace VberZero.AppService.Workflows;
  16. [Authorize]
  17. public class WorkflowAppServiceBase : VzCrudAppServiceBase<WorkflowDefinitionInfo, WorkflowDefinitionDto, string, VzPagedRequestDto, WorkflowDefinitionCreateDto, WorkflowDefinitionUpdateDto>, IWorkflowAppServiceBase
  18. {
  19. private readonly IVberWorkflowManager _workflowManager;
  20. private readonly IRepository<WorkflowInfo, string> _workflowRepository;
  21. public WorkflowAppServiceBase(IRepository<WorkflowDefinitionInfo, string> repository, IVberWorkflowManager workflowManager, IRepository<WorkflowInfo, string> workflowRepository, string keyFiledName = null) : base(repository, keyFiledName)
  22. {
  23. _workflowManager = workflowManager;
  24. _workflowRepository = workflowRepository;
  25. }
  26. /// <summary>
  27. /// 获取所有分组
  28. /// </summary>
  29. /// <returns></returns>
  30. public async Task<IEnumerable<string>> GetAllGroupAsync()
  31. {
  32. var data = await AsyncQueryableExecuter.ToListAsync(_workflowManager.WorkflowDefinitions.GroupBy(u => u.Group).Select(u => u.Key));
  33. return data.Where(u => u != null || u != "");
  34. }
  35. /// <summary>
  36. /// 我发起的流程
  37. /// </summary>
  38. /// <param name="input"></param>
  39. /// <returns></returns>
  40. public async Task<PagedResultDto<MyWorkflowListOutput>> GetMyWorkflowAsync(VzPagedRequestDto input)
  41. {
  42. var query = _workflowRepository.GetAll().Where(u => u.CreatorUserId == AbpSession.UserId);
  43. query = ApplyFilter(query, input);
  44. int totalCount = await query.CountAsync();
  45. query = query.OrderByDescending(u => u.CreationTime);
  46. query = query.Skip(input.SkipCount).Take(input.MaxResultCount);
  47. var dto = await query.Select(u => new MyWorkflowListOutput()
  48. {
  49. Title = u.WorkflowDefinitionInfo.Title,
  50. Version = u.Version,
  51. Id = u.Id,
  52. Status = u.Status,
  53. CompleteTime = u.CompleteTime,
  54. CreationTime = u.CreationTime,
  55. CurrentStepName = (u.ExecutionPointers.FirstOrDefault(i => i.EndTime == null) ?? u.ExecutionPointers.OrderBy(i => i.EndTime).Last()).StepName,
  56. Nodes = u.WorkflowDefinitionInfo.Nodes
  57. }).ToListAsync();
  58. return new PagedResultDto<MyWorkflowListOutput>(totalCount, dto);
  59. }
  60. // protected override IQueryable<T> KeyWordFilter<T>(IQueryable<T> query, IVzPagedRequestDto pagedInput)
  61. // {
  62. // return base.KeyWordFilter(query, pagedInput);
  63. // }
  64. /// <summary>
  65. /// 获取所有的StepBody
  66. /// </summary>
  67. /// <returns></returns>
  68. public IEnumerable<VberWorkflowStepBody> GetAllStepBodies()
  69. {
  70. return _workflowManager.GetAllStepBodies();
  71. }
  72. /// <summary>
  73. /// 获取所有分组的流程
  74. /// </summary>
  75. /// <param name="input"></param>
  76. /// <returns></returns>
  77. public async Task<Dictionary<string, IEnumerable<WorkflowDefinitionDto>>> GetAllWithGroupAsync(VzPagedRequestDto input)
  78. {
  79. var list = await AsyncQueryableExecuter.ToListAsync(CreateFilteredQuery(input).Select(a => a));
  80. var group = list.GroupBy(a => a.Group).OrderBy(a => a.Key);
  81. return group.ToDictionary(a => a.Key, a => a.Select(MapToEntityDto));
  82. }
  83. public async Task<WorkflowDefinitionDto> GetByVersion(WorkflowDefinitionVersionDto input)
  84. {
  85. var entity = await Repository.FirstOrDefaultAsync(a => a.Id == input.Id && a.Version == input.Version);
  86. var dto = MapToEntityDto(entity);
  87. return dto;
  88. }
  89. public override async Task Create(WorkflowDefinitionCreateDto input)
  90. {
  91. //input.Id = await AppGuidManager.GetGuidFromFileAsync(AppGuidType.Workflow) + "";
  92. var entity = await Repository.FirstOrDefaultAsync(a => a.Id == input.Id && a.Version == input.Version);
  93. if (entity != null)
  94. {
  95. CheckErrors($"编号为{input.Id},版本为V{input.Version}的流程已存在");
  96. return;
  97. }
  98. //await CreateEntity(input, false);
  99. entity = MapToEntity(input);
  100. entity.TenantId = AbpSession.TenantId;
  101. await _workflowManager.CreateAsync(entity);
  102. }
  103. public override async Task Update(WorkflowDefinitionUpdateDto input)
  104. {
  105. var entity = await Repository.FirstOrDefaultAsync(a => a.Id == input.Id && a.Version == input.Version);
  106. if (entity == null)
  107. {
  108. CheckErrors($"编号为{input.Id},版本为{input.Version}的流程不存在");
  109. return;
  110. }
  111. MapToEntity(input, entity);
  112. await _workflowManager.UpdateAsync(entity);
  113. }
  114. public override async Task Delete(VzEntityDto<string> input)
  115. {
  116. await _workflowManager.DeleteAsync(input.Id);
  117. }
  118. /// <summary>
  119. /// 删除指定编号指定版本的
  120. /// </summary>
  121. /// <param name="input"></param>
  122. /// <returns></returns>
  123. public async Task DeleteByVersion(WorkflowDefinitionVersionDto input)
  124. {
  125. var entity = await Repository.FirstOrDefaultAsync(a => a.Id == input.Id && a.Version == input.Version);
  126. if (entity == null)
  127. {
  128. CheckErrors($"编号为{input.Id},版本为{input.Version}的流程不存在");
  129. return;
  130. }
  131. await _workflowManager.DeleteAsync(input.Id, input.Version.Value);
  132. }
  133. /// <summary>
  134. /// 获取执行的工作流详情
  135. /// </summary>
  136. /// <param name="id"></param>
  137. /// <returns></returns>
  138. public async Task<WorkflowDto> GetDetailsAsync(string id)
  139. {
  140. var workflow = await _workflowRepository.GetAll().Where(u => u.Id == id).Select(u => new
  141. {
  142. u.Id,
  143. u.Version,
  144. u.WorkflowDefinitionId,
  145. u.WorkflowDefinitionInfo.Title,
  146. u.CreateUserIdentityName,
  147. u.CreationTime,
  148. u.WorkflowDefinitionInfo.Inputs,
  149. u.Data,
  150. u.CompleteTime,
  151. u.Status,
  152. u.WorkflowDefinitionInfo.Nodes,
  153. ExecutionRecords = u.ExecutionPointers.OrderBy(i => i.StartTime).Select(i => new WorkflowExecutionRecord()
  154. {
  155. ExecutionPointerId = i.Id,
  156. EndTime = i.EndTime,
  157. StartTime = i.StartTime,
  158. StepId = i.StepId,
  159. StepName = i.StepName
  160. })
  161. }).FirstOrDefaultAsync();
  162. if (workflow == null)
  163. {
  164. CheckErrors("没有查询到工作流!");
  165. return null;
  166. }
  167. var dto = new WorkflowDto()
  168. {
  169. Id = workflow.Id,
  170. Version = workflow.Version,
  171. Data = workflow.Data.FromJsonString<Dictionary<string, object>>(),
  172. CompleteTime = workflow.CompleteTime,
  173. Status = workflow.Status,
  174. Title = workflow.Title,
  175. CreationTime = workflow.CreationTime,
  176. WorkflowDefinitionId = workflow.WorkflowDefinitionId,
  177. Inputs = workflow.Inputs,
  178. ExecutionRecords = workflow.ExecutionRecords,
  179. UserName = workflow.CreateUserIdentityName,
  180. };
  181. foreach (var executionRecord in dto.ExecutionRecords)
  182. {
  183. executionRecord.StepTitle = workflow.Nodes.FirstOrDefault(a => a.Key == executionRecord.StepName)?.Title;
  184. }
  185. return dto;
  186. }
  187. /// <summary>
  188. /// 启动工作流
  189. /// </summary>
  190. /// <param name="input"></param>
  191. /// <returns></returns>
  192. public async Task StartAsync(StartWorkflowInput input)
  193. {
  194. string id = DateTime.Now.ToString("yyyyMMddHHmmssffff");
  195. dynamic data = new ExpandoObject();
  196. data.WorkflowId = id;
  197. await _workflowManager.StartWorkflow(input.Id, input.Version, input.Inputs, JsonConvert.SerializeObject(data));
  198. }
  199. /// <summary>
  200. /// 发布事件
  201. /// </summary>
  202. /// <param name="input"></param>
  203. public async Task PublicEvent(PublishEventInput input)
  204. {
  205. await _workflowManager.PublishEventAsync(input.EventName, input.EventKey, input.EventData);
  206. }
  207. }