RoleAuditingStepBody.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. using Abp.Dependency;
  2. using Abp.Domain.Repositories;
  3. using Abp.Domain.Uow;
  4. using VberZero.Authorization.Users;
  5. using VberZero.BaseSystem;
  6. using VberZero.DomainService.Notifications;
  7. using VberZero.DomainService.Notifications.Data;
  8. using VberZero.Workflow.DesignInfo;
  9. using VberZero.Workflow.Persistence;
  10. using WorkflowCore.Interface;
  11. using WorkflowCore.Models;
  12. // ReSharper disable UnusedAutoPropertyAccessor.Global
  13. // ReSharper disable MemberCanBePrivate.Global
  14. namespace VberZero.Workflows;
  15. /// <summary>
  16. /// 指定角色审批
  17. /// </summary>
  18. public class RoleAuditingStepBody : StepBodyAsync, ITransientDependency
  19. {
  20. private const string ActionName = "RoleAuditEvent";
  21. private readonly IAppNotifier _appNotifier;
  22. private readonly VzUserManager _userManager;
  23. private readonly IRepository<CommonWorkflowAuditorInfo, string> _auditorRepository;
  24. private readonly IRepository<WorkflowDefinitionInfo, string> _WorkflowDefinitionRepository;
  25. private readonly IRepository<WorkflowInfo, string> _workflowInfoRepository;
  26. private readonly IUnitOfWorkManager _unitOfWorkManager;
  27. /// <summary>
  28. /// 审核角色
  29. /// </summary>
  30. public string RoleName { get; set; }
  31. public int CheckCount { get; set; }
  32. public RoleAuditingStepBody(IAppNotifier appNotifier, VzUserManager userManager, IRepository<CommonWorkflowAuditorInfo, string> auditorRepository, IRepository<WorkflowInfo, string> workflowInfoRepository, IRepository<WorkflowDefinitionInfo, string> workflowDefinitionRepository, IUnitOfWorkManager unitOfWorkManager)
  33. {
  34. _appNotifier = appNotifier;
  35. _userManager = userManager;
  36. _auditorRepository = auditorRepository;
  37. _workflowInfoRepository = workflowInfoRepository;
  38. _WorkflowDefinitionRepository = workflowDefinitionRepository;
  39. _unitOfWorkManager = unitOfWorkManager;
  40. }
  41. [UnitOfWork]
  42. public override async Task<ExecutionResult> RunAsync(IStepExecutionContext context)
  43. {
  44. WorkflowInfo workflow; WorkflowDefinitionInfo workflowDefinition;
  45. using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant))
  46. {
  47. workflow = await _workflowInfoRepository.FirstOrDefaultAsync(a => a.Id == context.Workflow.Id);
  48. workflowDefinition = await _WorkflowDefinitionRepository.FirstOrDefaultAsync(a => a.Id == context.Workflow.WorkflowDefinitionId && a.Version ==
  49. context.Workflow.Version);
  50. }
  51. if (workflow == null) return new ExecutionResult() { Proceed = false };
  52. using (_unitOfWorkManager.Current.SetTenantId(workflow.TenantId))
  53. {
  54. var users = _userManager.GetUsersInRoleAsync(RoleName).Result
  55. .Select(a => new { a.TenantId, a.Id, a.UserName, a.FullName, a.AvatarPath }).ToList();
  56. if (!users.Any())
  57. {
  58. context.Workflow.Status = WorkflowStatus.Complete;
  59. return ExecutionResult.Next();
  60. }
  61. if (!context.ExecutionPointer.EventPublished)
  62. {
  63. var user = await _userManager.GetUserByIdAsync(workflow.CreatorUserId ?? 0);
  64. //添加审批人
  65. foreach (var u in users)
  66. {
  67. var recordId = Guid.NewGuid().ToString("N");
  68. await _auditorRepository.InsertAsync(new CommonWorkflowAuditorInfo()
  69. {
  70. Id = recordId,
  71. WorkflowId = workflow.Id,
  72. ExecutionPointerId = context.ExecutionPointer.Id,
  73. Status = VzDefinition.WorkflowAuditStatus.UnAudited,
  74. UserIdentityName = u.FullName,
  75. UserId = u.Id,
  76. TenantId = u.TenantId,
  77. UserHeadPhoto = u.AvatarPath
  78. });
  79. //通知审批人
  80. await _appNotifier.SendWorkflowAuditNotifyAsync(u.Id, u.TenantId, new WorkflowAuditNotificationData(workflowDefinition.Title, user.Surname, workflow.Id, recordId));
  81. }
  82. return ExecutionResult.WaitForEvent(ActionName, Guid.NewGuid().ToString("N"), DateTime.MinValue);
  83. }
  84. var passCount = await _auditorRepository.CountAsync(u => u.ExecutionPointerId == context.ExecutionPointer.Id && u.Status == VzDefinition.WorkflowAuditStatus.Pass);
  85. //需 超过审核人数 通过才能启动下一步
  86. if (passCount > 0 && (passCount >= CheckCount || passCount == users.Count))
  87. {
  88. return ExecutionResult.Next();
  89. }
  90. //再次开启事件推送 等待下一次执行
  91. context.ExecutionPointer.EventPublished = false;
  92. return ExecutionResult.WaitForEvent(ActionName, Guid.NewGuid().ToString("N"), DateTime.MinValue);
  93. }
  94. }
  95. }