WorkflowAuditAppServiceBase.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. using Abp.Application.Services.Dto;
  2. using Abp.Authorization;
  3. using Abp.Domain.Repositories;
  4. using Abp.UI;
  5. using Microsoft.EntityFrameworkCore;
  6. using VberZero.AppService.Base;
  7. using VberZero.AppService.Base.Dto;
  8. using VberZero.AppService.Workflows.Dto;
  9. using VberZero.Authorization.Users;
  10. using VberZero.BaseSystem;
  11. using VberZero.Workflow;
  12. using VberZero.Workflow.Persistence;
  13. namespace VberZero.AppService.Workflows;
  14. [AbpAuthorize]
  15. public class WorkflowAuditAppServiceBase : VzAppServiceBase, IWorkflowAuditAppServiceBase
  16. {
  17. private readonly IVberWorkflowManager _workflowManager;
  18. private readonly IRepository<CommonWorkflowAuditorInfo, string> _auditorRepository;
  19. private readonly IRepository<WorkflowInfo, string> _workflowRepository;
  20. private readonly VzUserManager _userManager;
  21. public WorkflowAuditAppServiceBase(IVberWorkflowManager workflowManager, IRepository<CommonWorkflowAuditorInfo, string> auditorRepository, IRepository<WorkflowInfo, string> workflowRepository, VzUserManager userManager)
  22. {
  23. _workflowManager = workflowManager;
  24. _auditorRepository = auditorRepository;
  25. _workflowRepository = workflowRepository;
  26. _userManager = userManager;
  27. }
  28. /// <summary>
  29. /// 获取我的审批流程
  30. /// </summary>
  31. /// <param name="input"></param>
  32. /// <returns></returns>
  33. public async Task<PagedResultDto<MyAuditWorkflowListOutput>> GetAllAsync(VzPagedRequestDto input)
  34. {
  35. var query = _auditorRepository.GetAll().Where(u => u.UserId == AbpSession.UserId);
  36. query = ApplyFilter(query, input);
  37. var totalCount = await query.CountAsync();
  38. query = query.OrderByDescending(u => u.CreationTime);
  39. var entities = query.Skip(input.SkipCount).Take(input.MaxResultCount);
  40. return new PagedResultDto<MyAuditWorkflowListOutput>(totalCount, entities.Select(a => new MyAuditWorkflowListOutput()
  41. {
  42. Id = a.Id,
  43. ExecutionPointerId = a.ExecutionPointerId,
  44. CreationTime = a.Workflow.CreationTime,
  45. Title = a.Workflow.WorkflowDefinitionInfo.Title,
  46. UserName = a.Workflow.CreateUserIdentityName,
  47. WorkflowDefinitionId = a.Workflow.WorkflowDefinitionId,
  48. Version = a.Workflow.WorkflowDefinitionInfo.Version,
  49. WorkflowId = a.WorkflowId,
  50. Status = a.Status,
  51. AuditTime = a.AuditTime
  52. }).ToList());
  53. }
  54. /// <summary>
  55. /// 获取详情
  56. /// </summary>
  57. /// <param name="input">流程ID</param>
  58. /// <returns></returns>
  59. public async Task<WorkflowAuditDto> GetAuditRecordsAsync(EntityDto<string> input)
  60. {
  61. var query = _auditorRepository.GetAll().Where(u => u.WorkflowId == input.Id).Select(a => new
  62. {
  63. a.ExecutionPointerId,
  64. a.AuditTime,
  65. a.Status,
  66. a.Remark,
  67. a.UserIdentityName,
  68. a.UserHeadPhoto,
  69. a.UserId,
  70. });
  71. var data = await query.ToListAsync();
  72. //审核记录
  73. var records = data.GroupBy(i => i.ExecutionPointerId).Select(u => new
  74. {
  75. ExecutionPointerId = u.Key,
  76. AuditRecords = u.Select(a => new WorkflowAuditRecord()
  77. {
  78. UserId = a.UserId,
  79. AuditTime = a.AuditTime,
  80. Status = a.Status,
  81. Remark = a.Remark,
  82. UserIdentityName = a.UserIdentityName,
  83. UserHeadPhoto = a.UserHeadPhoto,
  84. })
  85. })
  86. .ToDictionary(a => a.ExecutionPointerId, a => a.AuditRecords);
  87. return new WorkflowAuditDto() { NeedAudit = data.Any(i => i.UserId == AbpSession.UserId && i.Status == VzDefinition.WorkflowAuditStatus.UnAudited), AuditRecords = records };
  88. }
  89. /// <summary>
  90. /// 审核
  91. /// </summary>
  92. /// <param name="input"></param>
  93. /// <returns></returns>
  94. public async Task AuditAsync(WorkflowAuditInput input)
  95. {
  96. var entity = await _auditorRepository.FirstOrDefaultAsync(u => u.ExecutionPointerId == input.ExecutionPointerId && u.UserId == AbpSession.UserId);
  97. if (entity == null)
  98. {
  99. throw new UserFriendlyException("不需要您审核");
  100. }
  101. var user = await _userManager.GetUserByIdAsync(AbpSession.UserId ?? 0);
  102. entity.Status = input.Pass ? VzDefinition.WorkflowAuditStatus.Pass : VzDefinition.WorkflowAuditStatus.UnApprove;
  103. entity.Remark = input.Remark;
  104. entity.AuditTime = DateTime.Now;
  105. entity.UserIdentityName = user.FullName;
  106. entity.UserHeadPhoto = user.AvatarPath;
  107. entity.TenantId = AbpSession.TenantId;
  108. await CurrentUnitOfWork.SaveChangesAsync();
  109. //终止流程
  110. if (!input.Pass)
  111. {
  112. await _workflowManager.TerminateWorkflow(entity.WorkflowId);
  113. return;
  114. }
  115. //if (!_auditorRepository.GetAll().Any(u => u.ExecutionPointerId == input.ExecutionPointerId && u.Status == VzDefinition.WorkflowAuditStatus.UnAudited))
  116. //{
  117. // var pointer = await _workflowManager.PersistenceProvider.GetPersistedExecutionPointer(input.ExecutionPointerId);
  118. // await _workflowManager.PublishEventAsync(pointer.EventName, pointer.EventKey, null);
  119. //}
  120. var pointer = await _workflowManager.PersistenceProvider.GetPersistedExecutionPointer(input.ExecutionPointerId);
  121. await _workflowManager.PublishEventAsync(pointer.EventName, pointer.EventKey, null);
  122. }
  123. }