| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- using Abp.Dependency;
- using Abp.Domain.Repositories;
- using Abp.Domain.Uow;
- using VberZero.Authorization.Users;
- using VberZero.BaseSystem;
- using VberZero.DomainService.Notifications;
- using VberZero.DomainService.Notifications.Data;
- using VberZero.Workflow.DesignInfo;
- using VberZero.Workflow.Persistence;
- using WorkflowCore.Interface;
- using WorkflowCore.Models;
- // ReSharper disable UnusedAutoPropertyAccessor.Global
- // ReSharper disable MemberCanBePrivate.Global
- namespace VberZero.Workflows;
- /// <summary>
- /// 指定角色审批
- /// </summary>
- public class RoleAuditingStepBody : StepBodyAsync, ITransientDependency
- {
- private const string ActionName = "RoleAuditEvent";
- private readonly IAppNotifier _appNotifier;
- private readonly VzUserManager _userManager;
- private readonly IRepository<CommonWorkflowAuditorInfo, string> _auditorRepository;
- private readonly IRepository<WorkflowDefinitionInfo, string> _WorkflowDefinitionRepository;
- private readonly IRepository<WorkflowInfo, string> _workflowInfoRepository;
- private readonly IUnitOfWorkManager _unitOfWorkManager;
- /// <summary>
- /// 审核角色
- /// </summary>
- public string RoleName { get; set; }
- public int CheckCount { get; set; }
- public RoleAuditingStepBody(IAppNotifier appNotifier, VzUserManager userManager, IRepository<CommonWorkflowAuditorInfo, string> auditorRepository, IRepository<WorkflowInfo, string> workflowInfoRepository, IRepository<WorkflowDefinitionInfo, string> workflowDefinitionRepository, IUnitOfWorkManager unitOfWorkManager)
- {
- _appNotifier = appNotifier;
- _userManager = userManager;
- _auditorRepository = auditorRepository;
- _workflowInfoRepository = workflowInfoRepository;
- _WorkflowDefinitionRepository = workflowDefinitionRepository;
- _unitOfWorkManager = unitOfWorkManager;
- }
- [UnitOfWork]
- public override async Task<ExecutionResult> RunAsync(IStepExecutionContext context)
- {
- WorkflowInfo workflow; WorkflowDefinitionInfo workflowDefinition;
- using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant))
- {
- workflow = await _workflowInfoRepository.FirstOrDefaultAsync(a => a.Id == context.Workflow.Id);
- workflowDefinition = await _WorkflowDefinitionRepository.FirstOrDefaultAsync(a => a.Id == context.Workflow.WorkflowDefinitionId && a.Version ==
- context.Workflow.Version);
- }
- if (workflow == null) return new ExecutionResult() { Proceed = false };
- using (_unitOfWorkManager.Current.SetTenantId(workflow.TenantId))
- {
- var users = _userManager.GetUsersInRoleAsync(RoleName).Result
- .Select(a => new { a.TenantId, a.Id, a.UserName, a.FullName, a.AvatarPath }).ToList();
- if (!users.Any())
- {
- context.Workflow.Status = WorkflowStatus.Complete;
- return ExecutionResult.Next();
- }
- if (!context.ExecutionPointer.EventPublished)
- {
- var user = await _userManager.GetUserByIdAsync(workflow.CreatorUserId ?? 0);
- //添加审批人
- foreach (var u in users)
- {
- var recordId = Guid.NewGuid().ToString("N");
- await _auditorRepository.InsertAsync(new CommonWorkflowAuditorInfo()
- {
- Id = recordId,
- WorkflowId = workflow.Id,
- ExecutionPointerId = context.ExecutionPointer.Id,
- Status = VzDefinition.WorkflowAuditStatus.UnAudited,
- UserIdentityName = u.FullName,
- UserId = u.Id,
- TenantId = u.TenantId,
- UserHeadPhoto = u.AvatarPath
- });
- //通知审批人
- await _appNotifier.SendWorkflowAuditNotifyAsync(u.Id, u.TenantId, new WorkflowAuditNotificationData(workflowDefinition.Title, user.Surname, workflow.Id, recordId));
- }
- return ExecutionResult.WaitForEvent(ActionName, Guid.NewGuid().ToString("N"), DateTime.MinValue);
- }
- var passCount = await _auditorRepository.CountAsync(u => u.ExecutionPointerId == context.ExecutionPointer.Id && u.Status == VzDefinition.WorkflowAuditStatus.Pass);
- //需 超过审核人数 通过才能启动下一步
- if (passCount > 0 && (passCount >= CheckCount || passCount == users.Count))
- {
- return ExecutionResult.Next();
- }
- //再次开启事件推送 等待下一次执行
- context.ExecutionPointer.EventPublished = false;
- return ExecutionResult.WaitForEvent(ActionName, Guid.NewGuid().ToString("N"), DateTime.MinValue);
- }
- }
- }
|