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;
///
/// 指定角色审批
///
public class RoleAuditingStepBody : StepBodyAsync, ITransientDependency
{
private const string ActionName = "RoleAuditEvent";
private readonly IAppNotifier _appNotifier;
private readonly VzUserManager _userManager;
private readonly IRepository _auditorRepository;
private readonly IRepository _WorkflowDefinitionRepository;
private readonly IRepository _workflowInfoRepository;
private readonly IUnitOfWorkManager _unitOfWorkManager;
///
/// 审核角色
///
public string RoleName { get; set; }
public int CheckCount { get; set; }
public RoleAuditingStepBody(IAppNotifier appNotifier, VzUserManager userManager, IRepository auditorRepository, IRepository workflowInfoRepository, IRepository workflowDefinitionRepository, IUnitOfWorkManager unitOfWorkManager)
{
_appNotifier = appNotifier;
_userManager = userManager;
_auditorRepository = auditorRepository;
_workflowInfoRepository = workflowInfoRepository;
_WorkflowDefinitionRepository = workflowDefinitionRepository;
_unitOfWorkManager = unitOfWorkManager;
}
[UnitOfWork]
public override async Task 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);
}
}
}