GeneralAuditingStepBody.cs 4.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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. namespace VberZero.Workflows;
  13. /// <summary>
  14. /// 通用审批
  15. /// </summary>
  16. public class GeneralAuditingStepBody : StepBodyAsync, ITransientDependency
  17. {
  18. private const string ActionName = "UserAuditEvent";
  19. private readonly IAppNotifier _appNotifier;
  20. private readonly VzUserManager _userManager;
  21. private readonly IRepository<CommonWorkflowAuditorInfo, string> _auditorRepository;
  22. private readonly IRepository<WorkflowDefinitionInfo, string> _WorkflowDefinitionRepository;
  23. private readonly IRepository<WorkflowInfo, string> _workflowInfoRepository;
  24. private readonly IUnitOfWorkManager _unitOfWorkManager;
  25. public GeneralAuditingStepBody(IAppNotifier appNotifier, VzUserManager userManager, IRepository<CommonWorkflowAuditorInfo, string> auditorRepository, IRepository<WorkflowDefinitionInfo, string> workflowDefinitionRepository, IRepository<WorkflowInfo, string> workflowInfoRepository, IUnitOfWorkManager unitOfWorkManager)
  26. {
  27. _appNotifier = appNotifier;
  28. _userManager = userManager;
  29. _auditorRepository = auditorRepository;
  30. _WorkflowDefinitionRepository = workflowDefinitionRepository;
  31. _workflowInfoRepository = workflowInfoRepository;
  32. _unitOfWorkManager = unitOfWorkManager;
  33. }
  34. /// <summary>
  35. /// 审核人
  36. /// </summary>
  37. // ReSharper disable once MemberCanBePrivate.Global
  38. // ReSharper disable once UnusedAutoPropertyAccessor.Global
  39. public long UserId { get; set; }
  40. [UnitOfWork]
  41. public override async Task<ExecutionResult> RunAsync(IStepExecutionContext context)
  42. {
  43. WorkflowInfo workflow; WorkflowDefinitionInfo workflowDefinition;
  44. using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant))
  45. {
  46. workflow = await _workflowInfoRepository.FirstOrDefaultAsync(a => a.Id == context.Workflow.Id);
  47. workflowDefinition = await
  48. _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. if (!context.ExecutionPointer.EventPublished)
  55. {
  56. var user = await _userManager.GetUserByIdAsync(workflow.CreatorUserId ?? 0);
  57. var auditUserInfo = await _userManager.GetUserByIdAsync(UserId);
  58. var recordId = Guid.NewGuid().ToString("N");
  59. await _auditorRepository.InsertAsync(new CommonWorkflowAuditorInfo()
  60. {
  61. Id = recordId,
  62. WorkflowId = workflow.Id,
  63. ExecutionPointerId = context.ExecutionPointer.Id,
  64. Status = VzDefinition.WorkflowAuditStatus.UnAudited,
  65. UserId = UserId,
  66. TenantId = workflow.TenantId,
  67. UserIdentityName = auditUserInfo.FullName,
  68. UserHeadPhoto = auditUserInfo.AvatarPath
  69. });
  70. //通知审批人
  71. await _appNotifier.SendWorkflowAuditNotifyAsync(UserId, workflow.TenantId, new WorkflowAuditNotificationData(workflowDefinition.Title, user.Surname, workflow.Id, recordId));
  72. DateTime effectiveDate = DateTime.MinValue;
  73. return ExecutionResult.WaitForEvent(ActionName, Guid.NewGuid().ToString("N"), effectiveDate);
  74. }
  75. var passCount = await _auditorRepository.CountAsync(u => u.ExecutionPointerId == context.ExecutionPointer.Id && u.UserId == UserId && u.Status == VzDefinition.WorkflowAuditStatus.Pass);
  76. if (passCount > 0)
  77. {
  78. return ExecutionResult.Next();
  79. }
  80. }
  81. //再次开启事件推送
  82. context.ExecutionPointer.EventPublished = false;
  83. return ExecutionResult.WaitForEvent(ActionName, Guid.NewGuid().ToString("N"), DateTime.MinValue);
  84. }
  85. }