|
@@ -54,7 +54,12 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
|
|
|
public async Task<string> StartWorkflowAsync(StartWorkflowDto dto, CancellationToken cancellationToken = default)
|
|
|
{
|
|
|
- var definition = await _definitionDomainService.GetLastVersionDefinitionAsync(dto.DefinitionCode, cancellationToken);
|
|
|
+ if (string.IsNullOrEmpty(dto.DefinitionCode) && string.IsNullOrEmpty(dto.DefinitionModuleCode))
|
|
|
+ throw new UserFriendlyException("非法参数");
|
|
|
+
|
|
|
+ var definition = string.IsNullOrEmpty(dto.DefinitionCode)
|
|
|
+ ? await _definitionDomainService.GetLastVersionDefinitionByModuleCodeAsync(dto.DefinitionModuleCode, cancellationToken)
|
|
|
+ : await _definitionDomainService.GetLastVersionDefinitionAsync(dto.DefinitionCode, cancellationToken);
|
|
|
if (definition == null)
|
|
|
throw new UserFriendlyException("无效模板名称");
|
|
|
if (definition.Status != EDefinitionStatus.Enable)
|
|
@@ -83,7 +88,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
var nextStepBoxDefine = _workflowDomainService.GetStepBoxDefine(workflow.Definition, dto.NextStepCode);
|
|
|
var isOutOfCallCenter =
|
|
|
await CheckIfFlowOutOfCallCenterAsync(nextStepBoxDefine, dto.NextMainHandler, cancellationToken);
|
|
|
- var isStartCountersign = nextStepBoxDefine.IsStartCountersign(dto.Handlers.Count);
|
|
|
+ var isStartCountersign = nextStepBoxDefine.IsStartCountersign(dto.NextHandlers.Count);
|
|
|
await _workflowDomainService.NextAsync(workflow, dto, nextStepBoxDefine, isOutOfCallCenter, isStartCountersign, cancellationToken);
|
|
|
|
|
|
//更新接办部门(详情页面展示)
|
|
@@ -96,7 +101,54 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
public async Task<IReadOnlyList<NextStepOptions>> GetNextStepOptionsAsync(Workflow workflow, CancellationToken cancellationToken)
|
|
|
{
|
|
|
var nextStepDefines = _workflowDomainService.GetNextStepOptions(workflow, cancellationToken);
|
|
|
+ return await GetNextStepOptionsAsync(nextStepDefines);
|
|
|
+ }
|
|
|
+
|
|
|
+ public async Task<IReadOnlyList<NextStepOptions>> GetStartOptionsAsync(string moduleCode, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ var definition =
|
|
|
+ await _definitionDomainService.GetLastVersionDefinitionByModuleCodeAsync(moduleCode, cancellationToken);
|
|
|
+ if (definition == null)
|
|
|
+ throw new UserFriendlyException($"无效模块编码, modeuleCode: {moduleCode}", "无效模块编码");
|
|
|
+ var startStep = definition.Steps.FirstOrDefault(d => d.StepType == EStepType.Start);
|
|
|
+ var nextStepDefines = definition.FindSteps(startStep.NextSteps);
|
|
|
+ return await GetNextStepOptionsAsync(nextStepDefines);
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 查询指派办理人的处理方式及实际办理人
|
|
|
+ /// </summary>
|
|
|
+ public async Task<FlowAssignMode> GetFlowAssignModeAsync(StepDefine stepDefine, List<string> handlers, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ switch (stepDefine.HandlerType)
|
|
|
+ {
|
|
|
+ case EHandlerType.Role:
|
|
|
+ if (!handlers.Any())
|
|
|
+ {
|
|
|
+ var roles = await _roleRepository.Queryable()
|
|
|
+ .Includes(d => d.Accounts)
|
|
|
+ .Where(d => stepDefine.HandlerClassifies.Select(d => d.Id).Contains(d.Name))
|
|
|
+ .ToListAsync();
|
|
|
+ handlers = roles.SelectMany(d => d.Accounts).Select(d => d.Id).ToList();
|
|
|
+ }
|
|
|
+
|
|
|
+ return new FlowAssignMode(EFlowAssignType.User, handlers);
|
|
|
+ case EHandlerType.OrgLevel:
|
|
|
+ case EHandlerType.OrgType:
|
|
|
+ case EHandlerType.AssignOrg:
|
|
|
+ return new FlowAssignMode(EFlowAssignType.Org, handlers);
|
|
|
+ case EHandlerType.AssignUser:
|
|
|
+ return new FlowAssignMode(EFlowAssignType.User, handlers);
|
|
|
+ default:
|
|
|
+ throw new ArgumentOutOfRangeException();
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
+
|
|
|
+ #region private
|
|
|
+
|
|
|
+ private async Task<IReadOnlyList<NextStepOptions>> GetNextStepOptionsAsync(IReadOnlyList<StepDefine> nextStepDefines)
|
|
|
+ {
|
|
|
//todo 性能问题
|
|
|
var items = new List<NextStepOptions>();
|
|
|
foreach (var nextStepDefine in nextStepDefines)
|
|
@@ -110,11 +162,13 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
switch (nextStepDefine.HandlerType)
|
|
|
{
|
|
|
case EHandlerType.AssignUser:
|
|
|
- var users = await _userRepository.QueryAsync(d => nextStepDefine.HandlerClassifies.Select(d => d.Id).Contains(d.Id));
|
|
|
+ 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));
|
|
|
+ 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:
|
|
@@ -151,37 +205,6 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
return items;
|
|
|
}
|
|
|
|
|
|
- /// <summary>
|
|
|
- /// 查询指派办理人的处理方式及实际办理人
|
|
|
- /// </summary>
|
|
|
- public async Task<FlowAssignMode> GetFlowAssignModeAsync(StepDefine stepDefine, List<string> handlers, CancellationToken cancellationToken)
|
|
|
- {
|
|
|
- switch (stepDefine.HandlerType)
|
|
|
- {
|
|
|
- case EHandlerType.Role:
|
|
|
- if (!handlers.Any())
|
|
|
- {
|
|
|
- var roles = await _roleRepository.Queryable()
|
|
|
- .Includes(d => d.Accounts)
|
|
|
- .Where(d => stepDefine.HandlerClassifies.Select(d => d.Id).Contains(d.Name))
|
|
|
- .ToListAsync();
|
|
|
- handlers = roles.SelectMany(d => d.Accounts).Select(d => d.Id).ToList();
|
|
|
- }
|
|
|
-
|
|
|
- return new FlowAssignMode(EFlowAssignType.User, handlers);
|
|
|
- case EHandlerType.OrgLevel:
|
|
|
- case EHandlerType.OrgType:
|
|
|
- case EHandlerType.AssignOrg:
|
|
|
- return new FlowAssignMode(EFlowAssignType.Org, handlers);
|
|
|
- case EHandlerType.AssignUser:
|
|
|
- return new FlowAssignMode(EFlowAssignType.User, handlers);
|
|
|
- default:
|
|
|
- throw new ArgumentOutOfRangeException();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- #region private
|
|
|
|
|
|
/// <summary>
|
|
|
/// 更新接办部门
|
|
@@ -198,12 +221,12 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
switch (nextStepBoxDefine.HandlerType)
|
|
|
{
|
|
|
case EHandlerType.Role:
|
|
|
- if (dto.Handlers.Any())
|
|
|
+ if (dto.NextHandlers.Any())
|
|
|
{
|
|
|
//选了handler,handler为userId
|
|
|
var users1 = await _userRepository.Queryable()
|
|
|
.Includes(d => d.Organization)
|
|
|
- .Where(d => dto.Handlers.Select(d => d.Id).Contains(d.Id))
|
|
|
+ .Where(d => dto.NextHandlers.Select(d => d.Id).Contains(d.Id))
|
|
|
.ToListAsync();
|
|
|
assigns = users1.Select(d => WorkflowAssign.Create(workflow.Id, d.OrgCode, d.Organization.OrgName))
|
|
|
.ToList();
|
|
@@ -222,7 +245,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
{
|
|
|
var accounts = await _accountRepository.Queryable()
|
|
|
.Includes(d => d.User, d => d.Organization)
|
|
|
- .Where(d => dto.Handlers.Select(d => d.Id).Contains(d.Name))
|
|
|
+ .Where(d => dto.NextHandlers.Select(d => d.Id).Contains(d.Name))
|
|
|
.ToListAsync();
|
|
|
assigns = accounts.Select(d => d.User.Organization).Select(d =>
|
|
|
WorkflowAssign.Create(workflow.Id, d.OrgCode, d.OrgName)).ToList();
|
|
@@ -234,14 +257,14 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
case EHandlerType.OrgLevel:
|
|
|
case EHandlerType.OrgType:
|
|
|
case EHandlerType.AssignOrg:
|
|
|
- assigns = dto.Handlers.Select(d => WorkflowAssign.Create(workflow.Id, d.Id, d.Name)).ToList();
|
|
|
+ assigns = dto.NextHandlers.Select(d => WorkflowAssign.Create(workflow.Id, d.Id, d.Name)).ToList();
|
|
|
break;
|
|
|
|
|
|
case EHandlerType.AssignUser:
|
|
|
//指定人所属部门
|
|
|
var users = await _userRepository.Queryable()
|
|
|
.Includes(d => d.Organization)
|
|
|
- .Where(d => dto.Handlers.Select(d => d.Id).Contains(d.Id))
|
|
|
+ .Where(d => dto.NextHandlers.Select(d => d.Id).Contains(d.Id))
|
|
|
.ToListAsync();
|
|
|
assigns = users.Select(d => WorkflowAssign.Create(workflow.Id, d.OrgCode, d.Organization.OrgName))
|
|
|
.ToList();
|