|
@@ -1,6 +1,7 @@
|
|
|
using Hotline.FlowEngine.Definitions;
|
|
|
using Hotline.FlowEngine.Workflows;
|
|
|
using Hotline.Identity.Accounts;
|
|
|
+using Hotline.Identity.Roles;
|
|
|
using Hotline.SeedData;
|
|
|
using Hotline.Settings;
|
|
|
using Hotline.Share.Dtos.FlowEngine;
|
|
@@ -21,6 +22,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
private readonly IWorkflowAssignRepository _workflowAssignRepository;
|
|
|
private readonly IUserRepository _userRepository;
|
|
|
private readonly IAccountRepository _accountRepository;
|
|
|
+ private readonly ISystemOrganizeRepository _organizeRepository;
|
|
|
+ private readonly IRoleRepository _roleRepository;
|
|
|
private readonly IUserDomainService _userDomainService;
|
|
|
private readonly IAccountDomainService _accountDomainService;
|
|
|
private readonly ISessionContext _sessionContext;
|
|
@@ -32,6 +35,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
IWorkflowAssignRepository workflowAssignRepository,
|
|
|
IUserRepository userRepository,
|
|
|
IAccountRepository accountRepository,
|
|
|
+ ISystemOrganizeRepository organizeRepository,
|
|
|
+ IRoleRepository roleRepository,
|
|
|
ISessionContext sessionContext)
|
|
|
{
|
|
|
_definitionDomainService = definitionDomainService;
|
|
@@ -40,6 +45,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
_workflowAssignRepository = workflowAssignRepository;
|
|
|
_userRepository = userRepository;
|
|
|
_accountRepository = accountRepository;
|
|
|
+ _organizeRepository = organizeRepository;
|
|
|
+ _roleRepository = roleRepository;
|
|
|
_sessionContext = sessionContext;
|
|
|
}
|
|
|
|
|
@@ -84,6 +91,79 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
await AddOrUpdateAssignAsync(workflow, dto, nextStepBoxDefine, cancellationToken);
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 查询流程下一节点配置参数
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="moduleCode"></param>
|
|
|
+ /// <param name="externalId"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public async Task<IReadOnlyList<NextStepOptions>> GetNextStepOptionsAsync(string moduleCode, string externalId, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ var workflow = await _workflowDomainService.GetWorkflowAsync(moduleCode, externalId, true, true, cancellationToken: cancellationToken);
|
|
|
+ if (workflow == null)
|
|
|
+ throw new UserFriendlyException($"未查询到流程, moduleCode:{moduleCode}, externalId: {externalId}", "未查询到该流程");
|
|
|
+ return await GetNextStepOptionsAsync(workflow, cancellationToken);
|
|
|
+ }
|
|
|
+
|
|
|
+ public async Task<IReadOnlyList<NextStepOptions>> GetNextStepOptionsAsync(Workflow workflow, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ var nextStepDefines = _workflowDomainService.GetNextStepOptions(workflow, cancellationToken);
|
|
|
+
|
|
|
+ //todo 性能问题
|
|
|
+ var items = new List<NextStepOptions>();
|
|
|
+ foreach (var nextStepDefine in nextStepDefines)
|
|
|
+ {
|
|
|
+ var options = new NextStepOptions
|
|
|
+ {
|
|
|
+ Code = nextStepDefine.Code,
|
|
|
+ Name = nextStepDefine.Name,
|
|
|
+ };
|
|
|
+
|
|
|
+ switch (nextStepDefine.HandlerType)
|
|
|
+ {
|
|
|
+ case EHandlerType.AssignUser:
|
|
|
+ var users = await _userRepository.QueryAsync(d => nextStepDefine.HandlerClassifies.Select(d => d.Id).Contains(d.Id));
|
|
|
+ options.NextSteps = users.Select(d => new KeyValuePair<string, string>(d.Id, d.Name)).ToList();
|
|
|
+ break;
|
|
|
+ case EHandlerType.AssignOrg:
|
|
|
+ var orgs = await _organizeRepository.QueryAsync(d => nextStepDefine.HandlerClassifies.Select(d => d.Id).Contains(d.OrgCode));
|
|
|
+ options.NextSteps = orgs.Select(d => new KeyValuePair<string, string>(d.OrgCode, d.OrgName)).ToList();
|
|
|
+ break;
|
|
|
+ case EHandlerType.Role:
|
|
|
+ var roles = await _roleRepository.Queryable().Includes(d => d.Accounts, d => d.User)
|
|
|
+ .Where(d => nextStepDefine.HandlerClassifies.Select(d => d.Id).Contains(d.Name)).ToListAsync();
|
|
|
+ var users1 = roles.SelectMany(d => d.Accounts).Select(d => d.User);
|
|
|
+ if (nextStepDefine.OnlySelfOrg ?? false)
|
|
|
+ users1 = users1.Where(d => d.OrgCode == _sessionContext.RequiredOrgCode);
|
|
|
+ options.NextSteps = users1.Select(d => new KeyValuePair<string, string>(d.Id, d.Name)).ToList();
|
|
|
+ break;
|
|
|
+ case EHandlerType.OrgLevel:
|
|
|
+ //当前操作人所属部门的下级部门并且属于配置orgLevel的部门
|
|
|
+ var levels = nextStepDefine.HandlerClassifies.Select(d => d.Id).Select(d => int.Parse(d));
|
|
|
+ var orgs1 = await _organizeRepository.QueryAsync(d =>
|
|
|
+ d.IsEnable && d.OrgCode.StartsWith(_sessionContext.RequiredOrgCode) &&
|
|
|
+ levels.Contains(d.OrgLevel));
|
|
|
+ options.NextSteps = orgs1.Select(d => new KeyValuePair<string, string>(d.OrgCode, d.OrgName)).ToList();
|
|
|
+ break;
|
|
|
+ case EHandlerType.OrgType:
|
|
|
+ var types = nextStepDefine.HandlerClassifies.Select(d => d.Id).Select(d => Enum.Parse<EOrgType>(d));
|
|
|
+ var org2 = await _organizeRepository.QueryAsync(d =>
|
|
|
+ d.IsEnable && d.OrgCode.StartsWith(_sessionContext.RequiredOrgCode) &&
|
|
|
+ types.Contains(d.OrgType));
|
|
|
+ options.NextSteps = org2.Select(d => new KeyValuePair<string, string>(d.OrgCode, d.OrgName)).ToList();
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ throw new ArgumentOutOfRangeException();
|
|
|
+ }
|
|
|
+
|
|
|
+ items.Add(options);
|
|
|
+ }
|
|
|
+
|
|
|
+ return items;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
#region private
|
|
|
|
|
|
/// <summary>
|