using Abp.Application.Services.Dto; using Abp.Authorization; using Abp.Domain.Repositories; using Abp.UI; using Microsoft.EntityFrameworkCore; using VberZero.AppService.Base; using VberZero.AppService.Base.Dto; using VberZero.AppService.Workflows.Dto; using VberZero.Authorization.Users; using VberZero.BaseSystem; using VberZero.Workflow; using VberZero.Workflow.Persistence; namespace VberZero.AppService.Workflows; [AbpAuthorize] public class WorkflowAuditAppServiceBase : VzAppServiceBase, IWorkflowAuditAppServiceBase { private readonly IVberWorkflowManager _workflowManager; private readonly IRepository _auditorRepository; private readonly IRepository _workflowRepository; private readonly VzUserManager _userManager; public WorkflowAuditAppServiceBase(IVberWorkflowManager workflowManager, IRepository auditorRepository, IRepository workflowRepository, VzUserManager userManager) { _workflowManager = workflowManager; _auditorRepository = auditorRepository; _workflowRepository = workflowRepository; _userManager = userManager; } /// /// 获取我的审批流程 /// /// /// public async Task> GetAllAsync(VzPagedRequestDto input) { var query = _auditorRepository.GetAll().Where(u => u.UserId == AbpSession.UserId); query = ApplyFilter(query, input); var totalCount = await query.CountAsync(); query = query.OrderByDescending(u => u.CreationTime); var entities = query.Skip(input.SkipCount).Take(input.MaxResultCount); return new PagedResultDto(totalCount, entities.Select(a => new MyAuditWorkflowListOutput() { Id = a.Id, ExecutionPointerId = a.ExecutionPointerId, CreationTime = a.Workflow.CreationTime, Title = a.Workflow.WorkflowDefinitionInfo.Title, UserName = a.Workflow.CreateUserIdentityName, WorkflowDefinitionId = a.Workflow.WorkflowDefinitionId, Version = a.Workflow.WorkflowDefinitionInfo.Version, WorkflowId = a.WorkflowId, Status = a.Status, AuditTime = a.AuditTime }).ToList()); } /// /// 获取详情 /// /// 流程ID /// public async Task GetAuditRecordsAsync(EntityDto input) { var query = _auditorRepository.GetAll().Where(u => u.WorkflowId == input.Id).Select(a => new { a.ExecutionPointerId, a.AuditTime, a.Status, a.Remark, a.UserIdentityName, a.UserHeadPhoto, a.UserId, }); var data = await query.ToListAsync(); //审核记录 var records = data.GroupBy(i => i.ExecutionPointerId).Select(u => new { ExecutionPointerId = u.Key, AuditRecords = u.Select(a => new WorkflowAuditRecord() { UserId = a.UserId, AuditTime = a.AuditTime, Status = a.Status, Remark = a.Remark, UserIdentityName = a.UserIdentityName, UserHeadPhoto = a.UserHeadPhoto, }) }) .ToDictionary(a => a.ExecutionPointerId, a => a.AuditRecords); return new WorkflowAuditDto() { NeedAudit = data.Any(i => i.UserId == AbpSession.UserId && i.Status == VzDefinition.WorkflowAuditStatus.UnAudited), AuditRecords = records }; } /// /// 审核 /// /// /// public async Task AuditAsync(WorkflowAuditInput input) { var entity = await _auditorRepository.FirstOrDefaultAsync(u => u.ExecutionPointerId == input.ExecutionPointerId && u.UserId == AbpSession.UserId); if (entity == null) { throw new UserFriendlyException("不需要您审核"); } var user = await _userManager.GetUserByIdAsync(AbpSession.UserId ?? 0); entity.Status = input.Pass ? VzDefinition.WorkflowAuditStatus.Pass : VzDefinition.WorkflowAuditStatus.UnApprove; entity.Remark = input.Remark; entity.AuditTime = DateTime.Now; entity.UserIdentityName = user.FullName; entity.UserHeadPhoto = user.AvatarPath; entity.TenantId = AbpSession.TenantId; await CurrentUnitOfWork.SaveChangesAsync(); //终止流程 if (!input.Pass) { await _workflowManager.TerminateWorkflow(entity.WorkflowId); return; } //if (!_auditorRepository.GetAll().Any(u => u.ExecutionPointerId == input.ExecutionPointerId && u.Status == VzDefinition.WorkflowAuditStatus.UnAudited)) //{ // var pointer = await _workflowManager.PersistenceProvider.GetPersistedExecutionPointer(input.ExecutionPointerId); // await _workflowManager.PublishEventAsync(pointer.EventName, pointer.EventKey, null); //} var pointer = await _workflowManager.PersistenceProvider.GetPersistedExecutionPointer(input.ExecutionPointerId); await _workflowManager.PublishEventAsync(pointer.EventName, pointer.EventKey, null); } }