|
@@ -96,8 +96,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
|
|
|
//如果发起会签需检查是否支持发起会签
|
|
|
var startStepDefine = definition.FindStartStepDefine();
|
|
|
- if(dto.IsStartCountersign && !startStepDefine.CanStartCountersign)
|
|
|
- throw UserFriendlyException.SameMessage("发起人节点不支持发起会签");
|
|
|
+ //if (dto.IsStartCountersign && !startStepDefine.CanStartCountersign)
|
|
|
+ // throw UserFriendlyException.SameMessage("发起人节点不支持发起会签");
|
|
|
|
|
|
|
|
|
//var nextStepBoxDefine = _workflowDomainService.GetStepBoxDefine(definition, dto.NextStepCode);
|
|
@@ -106,18 +106,36 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
// nextStepBoxDefine.CountersignMode is not ECountersignMode.Support))
|
|
|
// throw UserFriendlyException.SameMessage("下一节点不支持办理会签");
|
|
|
|
|
|
+
|
|
|
+ var firstStepDefine = startStepDefine.InstanceMode is EInstanceMode.Dynamic
|
|
|
+ ? startStepDefine
|
|
|
+ : definition.FindStepDefine(dto.NextStepCode);
|
|
|
+ if (firstStepDefine is null)
|
|
|
+ throw new UserFriendlyException("未查询到下一步节点配置");
|
|
|
+
|
|
|
//1. 如果不是按角色指派,handlers必填 2. 如果按角色指派,handlers可以不选
|
|
|
- if (startStepDefine.HandlerType is not EHandlerType.Role && !dto.NextHandlers.Any())
|
|
|
+ if (firstStepDefine.HandlerType is not EHandlerType.Role && !dto.NextHandlers.Any())
|
|
|
throw UserFriendlyException.SameMessage("未指派办理人");
|
|
|
|
|
|
- //todo
|
|
|
+ if (dto.IsStartCountersign)
|
|
|
+ {
|
|
|
+ if (!startStepDefine.CanStartCountersign)
|
|
|
+ throw new UserFriendlyException("当前节点不支持发起会签");
|
|
|
+ //即使当前节点支持发起会签,但下一节点为信息汇总节点、结束节点时也不可发起会签
|
|
|
+ if (firstStepDefine.StepType is EStepType.Summary or EStepType.End)
|
|
|
+ throw new UserFriendlyException("下一节点不允许发起会签");
|
|
|
+ //下一节点是会签汇总节点也不允许发起会签
|
|
|
+ if (dto.BackToCountersignSummary)
|
|
|
+ throw new UserFriendlyException("下一节点不允许发起会签");
|
|
|
+ }
|
|
|
+
|
|
|
var workflow = await _workflowDomainService.CreateWorkflowAsync(wfModule, dto.Title,
|
|
|
_sessionContext.RequiredUserId, _sessionContext.RequiredOrgId, externalId, cancellationToken);
|
|
|
|
|
|
- var flowAssignMode = await GetFlowAssignModeAsync(nextStepBoxDefine, dto.IsStartCountersign, dto.NextHandlers,
|
|
|
+ var flowAssignInfo = await GetFlowAssignInfoAsync(firstStepDefine, dto.IsStartCountersign, dto.NextHandlers,
|
|
|
cancellationToken);
|
|
|
|
|
|
- await _workflowDomainService.StartAsync(workflow, dto, nextStepBoxDefine, flowAssignMode, cancellationToken);
|
|
|
+ await _workflowDomainService.StartAsync(workflow, dto, startStepDefine, firstStepDefine, flowAssignInfo, cancellationToken);
|
|
|
|
|
|
////更新接办部门(详情页面展示)
|
|
|
//await AddOrUpdateAssignAsync(workflow, dto, nextStepBoxDefine, cancellationToken);
|
|
@@ -148,7 +166,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
nextStepBoxDefine.CountersignMode is not ECountersignMode.Support))
|
|
|
throw UserFriendlyException.SameMessage("下一节点不支持办理会签");
|
|
|
|
|
|
- var flowAssignMode = await GetFlowAssignModeAsync(nextStepBoxDefine, dto.IsStartCountersign, dto.NextHandlers,
|
|
|
+ var flowAssignMode = await GetFlowAssignInfoAsync(nextStepBoxDefine, dto.IsStartCountersign, dto.NextHandlers,
|
|
|
cancellationToken);
|
|
|
|
|
|
await _workflowDomainService.NextAsync(workflow, dto, nextStepBoxDefine, flowAssignMode, dto.ExpiredTime,
|
|
@@ -158,10 +176,53 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
//await AddOrUpdateAssignAsync(workflow, dto, nextStepBoxDefine, cancellationToken);
|
|
|
}
|
|
|
|
|
|
+ //new
|
|
|
+ public async Task NextAsync(NextWorkflowDto dto, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, true, true, withCountersigns: true,
|
|
|
+ cancellationToken: cancellationToken);
|
|
|
+ //await NextAsync(workflow, dto, dto.ExpiredTime, dto.IsStartCountersign, cancellationToken);
|
|
|
+
|
|
|
+ //未超期工单,节点超期时间不能小于当前时间,不能大于流程整体超期时间
|
|
|
+ if (workflow.ExpiredTime > DateTime.Now &&
|
|
|
+ (dto.ExpiredTime <= DateTime.Now || dto.ExpiredTime > workflow.ExpiredTime))
|
|
|
+ throw UserFriendlyException.SameMessage("节点期满时间无效");
|
|
|
+
|
|
|
+ var currentStep = _workflowDomainService.FindCurrentStepWaitForHandle(workflow);
|
|
|
+ if(currentStep.InstanceMode is EInstanceMode.Dynamic)
|
|
|
+ {
|
|
|
+ if (!DynamicShouldTerminal(currentStep))
|
|
|
+ {
|
|
|
+ //下一步配置为当前节点配置
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //下一步配置为下一步节点配置
|
|
|
+ }
|
|
|
+
|
|
|
+ var nextStepDefine = _workflowDomainService.GetStepBoxDefine(workflow.WorkflowDefinition, dto.NextStepCode);
|
|
|
+
|
|
|
+ //需求:按角色选择办理人可以不选,表示该角色下所有人都可以办理,同时依据配置:是否本部门人办理显示待选办理人。角色下只要一人办理即可(即:角色下不发起会签)
|
|
|
+ if (nextStepDefine.HandlerType != EHandlerType.Role && !dto.NextHandlers.Any())
|
|
|
+ throw new UserFriendlyException("未指定节点处理者");
|
|
|
+
|
|
|
+ if (dto.IsStartCountersign &&
|
|
|
+ (nextStepDefine.StepType is EStepType.Summary ||
|
|
|
+ nextStepDefine.CountersignMode is not ECountersignMode.Support))
|
|
|
+ throw UserFriendlyException.SameMessage("下一节点不支持办理会签");
|
|
|
+
|
|
|
+ var flowAssignMode = await GetFlowAssignInfoAsync(nextStepDefine, dto.IsStartCountersign, dto.NextHandlers,
|
|
|
+ cancellationToken);
|
|
|
+
|
|
|
+ await _workflowDomainService.NextAsync(workflow, dto, nextStepDefine, flowAssignMode, dto.ExpiredTime,
|
|
|
+ cancellationToken);
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
- /// 撤回至任意节点
|
|
|
- /// </summary>
|
|
|
- public async Task RecallAsync(RecallDto dto, CancellationToken cancellationToken)
|
|
|
+ /// 撤回至任意节点
|
|
|
+ /// </summary>
|
|
|
+ public async Task RecallAsync(RecallDto dto, CancellationToken cancellationToken)
|
|
|
{
|
|
|
var workflow =
|
|
|
await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, true, true,
|
|
@@ -171,7 +232,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
|
|
|
var targetStepDefine = _workflowDomainService.GetStepBoxDefine(workflow.WorkflowDefinition, dto.NextStepCode);
|
|
|
//var isStartCountersign = targetStepDefine.CouldPrevStartCountersign(dto.NextHandlers.Count);
|
|
|
- var flowAssignMode = await GetFlowAssignModeAsync(targetStepDefine, dto.IsStartCountersign, dto.NextHandlers,
|
|
|
+ var flowAssignMode = await GetFlowAssignInfoAsync(targetStepDefine, dto.IsStartCountersign, dto.NextHandlers,
|
|
|
cancellationToken);
|
|
|
await _workflowDomainService.RecallAsync(workflow, dto, targetStepDefine, flowAssignMode, cancellationToken);
|
|
|
}
|
|
@@ -189,7 +250,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
|
|
|
var targetStepDefine = _workflowDomainService.GetStepBoxDefine(workflow.WorkflowDefinition, dto.NextStepCode);
|
|
|
//var isStartCountersign = targetStepDefine.CouldPrevStartCountersign(dto.NextHandlers.Count);
|
|
|
- var flowAssignMode = await GetFlowAssignModeAsync(targetStepDefine, dto.IsStartCountersign, dto.NextHandlers,
|
|
|
+ var flowAssignMode = await GetFlowAssignInfoAsync(targetStepDefine, dto.IsStartCountersign, dto.NextHandlers,
|
|
|
cancellationToken);
|
|
|
await _workflowDomainService.JumpAsync(workflow, dto, targetStepDefine, dto.IsStartCountersign, flowAssignMode,
|
|
|
cancellationToken);
|
|
@@ -204,7 +265,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, true, true,
|
|
|
cancellationToken: cancellationToken);
|
|
|
var targetStepDefine = _workflowDomainService.GetStepBoxDefine(workflow.WorkflowDefinition, dto.NextStepCode);
|
|
|
- var flowAssignInfo = await GetFlowAssignModeAsync(targetStepDefine, dto.IsStartCountersign, dto.NextHandlers,
|
|
|
+ var flowAssignInfo = await GetFlowAssignInfoAsync(targetStepDefine, dto.IsStartCountersign, dto.NextHandlers,
|
|
|
cancellationToken);
|
|
|
await _workflowDomainService.RedoAsync(workflow, dto, targetStepDefine, flowAssignInfo, cancellationToken);
|
|
|
}
|
|
@@ -247,26 +308,26 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
/// <param name="cancellationToken"></param>
|
|
|
/// <returns></returns>
|
|
|
/// <exception cref="ArgumentOutOfRangeException"></exception>
|
|
|
- public async Task<IReadOnlyList<Kv>> GetNextStepOptionsAsync(StepDefineBasic stepDefine,
|
|
|
+ public async Task<IReadOnlyList<IdName>> GetNextStepOptionsAsync(StepDefineBasic stepDefine,
|
|
|
CancellationToken cancellationToken)
|
|
|
{
|
|
|
if (stepDefine.StepType == EStepType.End)
|
|
|
throw new UserFriendlyException("结束节点无待选项");
|
|
|
|
|
|
- var handlers = new List<Kv>();
|
|
|
+ var handlers = new List<IdName>();
|
|
|
switch (stepDefine.HandlerType)
|
|
|
{
|
|
|
// case EHandlerType.AssignedUser:
|
|
|
// var users = await _userRepository.Queryable()
|
|
|
- // .Where(d => stepDefine.HandlerTypeItems.Select(x => x.Key).Contains(d.Id))
|
|
|
+ // .Where(d => stepDefine.HandlerTypeItems.Select(x => x.Id).Contains(d.Id))
|
|
|
// .ToListAsync(cancellationToken);
|
|
|
- // handlers = users.Select(d => new Kv(d.Id, d.Name)).ToList();
|
|
|
+ // handlers = users.Select(d => new IdName(d.Id, d.Name)).ToList();
|
|
|
// break;
|
|
|
// case EHandlerType.AssignedOrg:
|
|
|
// var orgs = await _organizeRepository.QueryAsync(d =>
|
|
|
// d.IsEnable &&
|
|
|
- // stepDefine.HandlerTypeItems.Select(d => d.Key).Contains(d.Id));
|
|
|
- // handlers = orgs.Select(d => new Kv(d.Id, d.OrgName))
|
|
|
+ // stepDefine.HandlerTypeItems.Select(d => d.Id).Contains(d.Id));
|
|
|
+ // handlers = orgs.Select(d => new IdName(d.Id, d.OrgName))
|
|
|
// .ToList();
|
|
|
// break;
|
|
|
case EHandlerType.AssignedUser:
|
|
@@ -278,14 +339,14 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
var roles = await _roleRepository.Queryable()
|
|
|
.Includes(d => d.Accounts.Where(x => !x.IsDeleted && x.Status == EAccountStatus.Normal).ToList(),
|
|
|
x => x.User)
|
|
|
- .Where(d => stepDefine.HandlerTypeItems.Select(x => x.Key).Contains(d.Name))
|
|
|
+ .Where(d => stepDefine.HandlerTypeItems.Select(x => x.Id).Contains(d.Name))
|
|
|
.ToListAsync(cancellationToken);
|
|
|
var users1 = roles.SelectMany(d => d.Accounts).Select(d => d.User);
|
|
|
- handlers = users1.Select(d => new Kv(d.Id, d.Name)).ToList();
|
|
|
+ handlers = users1.Select(d => new IdName(d.Id, d.Name)).ToList();
|
|
|
break;
|
|
|
case EHandlerType.OrgLevel:
|
|
|
//当前操作人所属部门的下级部门并且属于配置orgLevel的部门
|
|
|
- var levels = stepDefine.HandlerTypeItems.Select(d => d.Key).Select(d => int.Parse(d));
|
|
|
+ var levels = stepDefine.HandlerTypeItems.Select(d => d.Id).Select(d => int.Parse(d));
|
|
|
var levelOneOrg = _sessionContext.RequiredOrgId.GetHigherOrgCode();
|
|
|
//var orgs1 = await _organizeRepository.QueryAsync(d =>
|
|
|
// d.IsEnable && d.OrgCode.StartsWith(levelOneOrg) &&
|
|
@@ -296,10 +357,10 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
.WhereIF(!levelOneOrg.IsCenter(), d => d.Id.StartsWith(levelOneOrg))
|
|
|
.ToListAsync(cancellationToken);
|
|
|
|
|
|
- handlers = orgs1.Select(d => new Kv(d.Id, d.Name)).ToList();
|
|
|
+ handlers = orgs1.Select(d => new IdName(d.Id, d.Name)).ToList();
|
|
|
break;
|
|
|
case EHandlerType.OrgType:
|
|
|
- var types = stepDefine.HandlerTypeItems.Select(d => d.Key)
|
|
|
+ var types = stepDefine.HandlerTypeItems.Select(d => d.Id)
|
|
|
.Select(d => Enum.Parse<EOrgType>(d));
|
|
|
var levelOneOrg1 = _sessionContext.RequiredOrgId.GetHigherOrgCode();
|
|
|
//var org2 = await _organizeRepository.QueryAsync(d =>
|
|
@@ -311,7 +372,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
.WhereIF(!levelOneOrg1.IsCenter(), d => d.Id.StartsWith(levelOneOrg1))
|
|
|
.ToListAsync(cancellationToken);
|
|
|
|
|
|
- handlers = orgs2.Select(d => new Kv(d.Id, d.Name)).ToList();
|
|
|
+ handlers = orgs2.Select(d => new IdName(d.Id, d.Name)).ToList();
|
|
|
break;
|
|
|
default:
|
|
|
throw new ArgumentOutOfRangeException();
|
|
@@ -324,12 +385,12 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
var orderRedoReasons =
|
|
|
await _systemDomainService.GetSysDicDataByCodeAsync(SysDicTypeConsts.OrderRedoReason,
|
|
|
cancellationToken);
|
|
|
- dto.OrderRedoReasonOptions = orderRedoReasons.Select(d => new Kv(d.DicDataValue, d.DicDataName)).ToList();
|
|
|
+ dto.OrderRedoReasonOptions = orderRedoReasons.Select(d => new IdName(d.DicDataValue, d.DicDataName)).ToList();
|
|
|
}
|
|
|
|
|
|
return dto;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 查询开始流程的下一步待选节点
|
|
|
/// </summary>
|
|
@@ -422,9 +483,9 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
/// <summary>
|
|
|
/// 查询下一步所选节点对应待选项
|
|
|
/// </summary>
|
|
|
- public async Task<IReadOnlyList<Kv>> GetNextStepOptionsAsync(GetNextStepItemsDto dto, CancellationToken cancellationToken)
|
|
|
+ public async Task<IReadOnlyList<IdName>> GetNextStepOptionsAsync(GetNextStepItemsDto dto, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- List<Kv> nextStepOptions;
|
|
|
+ List<IdName> nextStepOptions;
|
|
|
if (dto.InstanceMode is EInstanceMode.Config)
|
|
|
{
|
|
|
nextStepOptions = await NextStepOptionsByConfigAsync(dto, cancellationToken);
|
|
@@ -437,11 +498,11 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
return nextStepOptions;
|
|
|
}
|
|
|
|
|
|
- private async Task<List<Kv>> CreateNextStepOptionsDynamicAsync(GetNextStepItemsDto dto, CancellationToken cancellationToken)
|
|
|
+ private async Task<List<IdName>> CreateNextStepOptionsDynamicAsync(GetNextStepItemsDto dto, CancellationToken cancellationToken)
|
|
|
{
|
|
|
if (!int.TryParse(dto.Key, out int orgLevel))
|
|
|
throw new UserFriendlyException("无效参数");
|
|
|
- List<Kv> items;
|
|
|
+ List<IdName> items;
|
|
|
var firstLevelOrgCode = _sessionContext.RequiredOrgId.GetHigherOrgCode();
|
|
|
switch (dto.DynamicPolicy)
|
|
|
{
|
|
@@ -450,21 +511,21 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
{
|
|
|
items = await _organizeRepository.Queryable()
|
|
|
.Where(d => d.IsCenter)
|
|
|
- .Select(d => new Kv(d.Id, d.Name))
|
|
|
+ .Select(d => new IdName(d.Id, d.Name))
|
|
|
.ToListAsync(cancellationToken);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
items = await _organizeRepository.Queryable()
|
|
|
.Where(d => !d.IsCenter && d.Level == orgLevel && d.Id.StartsWith(firstLevelOrgCode))
|
|
|
- .Select(d => new Kv(d.Id, d.Name))
|
|
|
+ .Select(d => new IdName(d.Id, d.Name))
|
|
|
.ToListAsync(cancellationToken);
|
|
|
}
|
|
|
break;
|
|
|
case EDynamicPolicy.OrgUp:
|
|
|
items = await _organizeRepository.Queryable()
|
|
|
.Where(d => d.Level == orgLevel && d.Id.StartsWith(firstLevelOrgCode))
|
|
|
- .Select(d => new Kv(d.Id, d.Name))
|
|
|
+ .Select(d => new IdName(d.Id, d.Name))
|
|
|
.ToListAsync(cancellationToken);
|
|
|
break;
|
|
|
case EDynamicPolicy.OrgDownCenterTop:
|
|
@@ -472,21 +533,21 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
{
|
|
|
items = await _organizeRepository.Queryable()
|
|
|
.Where(d => !d.IsCenter && d.Level == orgLevel)
|
|
|
- .Select(d => new Kv(d.Id, d.Name))
|
|
|
+ .Select(d => new IdName(d.Id, d.Name))
|
|
|
.ToListAsync(cancellationToken);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
items = await _organizeRepository.Queryable()
|
|
|
.Where(d => !d.IsCenter && d.Level == orgLevel && d.Id.StartsWith(firstLevelOrgCode))
|
|
|
- .Select(d => new Kv(d.Id, d.Name))
|
|
|
+ .Select(d => new IdName(d.Id, d.Name))
|
|
|
.ToListAsync(cancellationToken);
|
|
|
}
|
|
|
break;
|
|
|
case EDynamicPolicy.OrgDown:
|
|
|
items = await _organizeRepository.Queryable()
|
|
|
.Where(d => d.Level == orgLevel && d.Id.StartsWith(firstLevelOrgCode))
|
|
|
- .Select(d => new Kv(d.Id, d.Name))
|
|
|
+ .Select(d => new IdName(d.Id, d.Name))
|
|
|
.ToListAsync(cancellationToken);
|
|
|
break;
|
|
|
|
|
@@ -497,7 +558,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
return items;
|
|
|
}
|
|
|
|
|
|
- private async Task<List<Kv>> NextStepOptionsByConfigAsync(GetNextStepItemsDto dto, CancellationToken cancellationToken)
|
|
|
+ private async Task<List<IdName>> NextStepOptionsByConfigAsync(GetNextStepItemsDto dto, CancellationToken cancellationToken)
|
|
|
{
|
|
|
var definition = await _definitionRepository.GetAsync(dto.DefinitionId, cancellationToken);
|
|
|
if (definition == null)
|
|
@@ -510,7 +571,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
if (stepDefine.StepType == EStepType.End)
|
|
|
throw new UserFriendlyException("结束节点无待选项");
|
|
|
|
|
|
- var handlers = new List<Kv>();
|
|
|
+ var handlers = new List<IdName>();
|
|
|
var firstLevelOrgCode = _sessionContext.RequiredOrgId.GetHigherOrgCode();
|
|
|
switch (stepDefine.HandlerType)
|
|
|
{
|
|
@@ -529,7 +590,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
.Where(d => stepDefine.HandlerTypeItems.Select(x => x.Key).Contains(d.Name))
|
|
|
.ToListAsync(cancellationToken);
|
|
|
var users1 = roles.SelectMany(d => d.Accounts).Select(d => d.User);
|
|
|
- handlers = users1.Select(d => new Kv(d.Id, d.Name)).ToList();
|
|
|
+ handlers = users1.Select(d => new IdName(d.Id, d.Name)).ToList();
|
|
|
break;
|
|
|
case EHandlerType.OrgLevel:
|
|
|
//当前操作人所属部门的垂直部门并且属于配置orgLevel的部门
|
|
@@ -539,7 +600,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
.WhereIF(!firstLevelOrgCode.IsCenter(), d => d.Id.StartsWith(firstLevelOrgCode))
|
|
|
.ToListAsync(cancellationToken);
|
|
|
|
|
|
- handlers = orgs1.Select(d => new Kv(d.Id, d.Name)).ToList();
|
|
|
+ handlers = orgs1.Select(d => new IdName(d.Id, d.Name)).ToList();
|
|
|
break;
|
|
|
case EHandlerType.OrgType:
|
|
|
var types = stepDefine.HandlerTypeItems.Select(d => d.Key)
|
|
@@ -549,7 +610,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
.WhereIF(!firstLevelOrgCode.IsCenter(), d => d.Id.StartsWith(firstLevelOrgCode))
|
|
|
.ToListAsync(cancellationToken);
|
|
|
|
|
|
- handlers = orgs2.Select(d => new Kv(d.Id, d.Name)).ToList();
|
|
|
+ handlers = orgs2.Select(d => new IdName(d.Id, d.Name)).ToList();
|
|
|
break;
|
|
|
default:
|
|
|
throw new ArgumentOutOfRangeException();
|
|
@@ -607,184 +668,50 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
|
|
|
};
|
|
|
}
|
|
|
|
|
|
- private async Task<NextStepOption> CreateDynamicStepAsync1(EDynamicPolicy policy, CancellationToken cancellationToken)
|
|
|
- {
|
|
|
- int orgLevel;
|
|
|
- List<Kv> items = new();
|
|
|
- var firstLevelOrgCode = _sessionContext.RequiredOrgId.GetHigherOrgCode();
|
|
|
- switch (policy)
|
|
|
- {
|
|
|
- case EDynamicPolicy.OrgUpCenterTop:
|
|
|
- orgLevel = _sessionContext.OrgLevel - 1;
|
|
|
- if (orgLevel < 0) orgLevel = 0;
|
|
|
-
|
|
|
- if (orgLevel == 0)
|
|
|
- {
|
|
|
- items = await _organizeRepository.Queryable()
|
|
|
- .Where(d => d.IsCenter)
|
|
|
- .Select(d => new Kv(d.Id, d.Name))
|
|
|
- .ToListAsync(cancellationToken);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- items = await _organizeRepository.Queryable()
|
|
|
- .Where(d => !d.IsCenter && d.Level == orgLevel && d.Id.StartsWith(firstLevelOrgCode))
|
|
|
- .Select(d => new Kv(d.Id, d.Name))
|
|
|
- .ToListAsync(cancellationToken);
|
|
|
- }
|
|
|
- break;
|
|
|
- case EDynamicPolicy.OrgUp:
|
|
|
- orgLevel = _sessionContext.OrgLevel - 1;
|
|
|
- if (orgLevel <= 0) orgLevel = 1;
|
|
|
- items = await _organizeRepository.Queryable()
|
|
|
- .Where(d => d.Level == orgLevel && d.Id.StartsWith(firstLevelOrgCode))
|
|
|
- .Select(d => new Kv(d.Id, d.Name))
|
|
|
- .ToListAsync(cancellationToken);
|
|
|
- break;
|
|
|
- case EDynamicPolicy.OrgDownCenterTop:
|
|
|
- if (_sessionContext.RequiredOrgId.IsBelongCenter())
|
|
|
- {
|
|
|
- orgLevel = 1;
|
|
|
- items = await _organizeRepository.Queryable()
|
|
|
- .Where(d => !d.IsCenter && d.Level == orgLevel)
|
|
|
- .Select(d => new Kv(d.Id, d.Name))
|
|
|
- .ToListAsync(cancellationToken);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- orgLevel = _sessionContext.OrgLevel + 1;
|
|
|
- items = await _organizeRepository.Queryable()
|
|
|
- .Where(d => !d.IsCenter && d.Level == orgLevel && d.Id.StartsWith(firstLevelOrgCode))
|
|
|
- .Select(d => new Kv(d.Id, d.Name))
|
|
|
- .ToListAsync(cancellationToken);
|
|
|
- }
|
|
|
- break;
|
|
|
- case EDynamicPolicy.OrgDown:
|
|
|
- orgLevel = _sessionContext.OrgLevel + 1;
|
|
|
- items = await _organizeRepository.Queryable()
|
|
|
- .Where(d => d.Level == orgLevel && d.Id.StartsWith(firstLevelOrgCode))
|
|
|
- .Select(d => new Kv(d.Id, d.Name))
|
|
|
- .ToListAsync(cancellationToken);
|
|
|
- break;
|
|
|
- default:
|
|
|
- throw new ArgumentOutOfRangeException(nameof(policy), policy, null);
|
|
|
- }
|
|
|
-
|
|
|
- return new NextStepOption
|
|
|
- {
|
|
|
- Key = orgLevel.ToString(),
|
|
|
- Value = orgLevel == 0 ? "中心办理" : $"{orgLevel.ToChinese()}级部门办理",
|
|
|
- Items = items
|
|
|
- };
|
|
|
- }
|
|
|
-
|
|
|
- private async Task<IReadOnlyList<NextStepOption>> CreateConfigStepsAsync(List<StepDefine> stepDefines,
|
|
|
- CancellationToken cancellationToken)
|
|
|
- {
|
|
|
- foreach (var stepDefine in stepDefines)
|
|
|
- {
|
|
|
- if (stepDefine.StepType == EStepType.End)
|
|
|
- throw new UserFriendlyException("结束节点无待选项");
|
|
|
-
|
|
|
- var handlers = new List<Kv>();
|
|
|
- switch (stepDefine.HandlerType)
|
|
|
- {
|
|
|
- case EHandlerType.AssignedUser:
|
|
|
- case EHandlerType.AssignedOrg:
|
|
|
- handlers = stepDefine.HandlerTypeItems;
|
|
|
- break;
|
|
|
- case EHandlerType.Role:
|
|
|
- //当前操作人所属部门的下级部门并且属于配置包含角色
|
|
|
- var roles = await _roleRepository.Queryable()
|
|
|
- .Includes(d => d.Accounts.Where(x => !x.IsDeleted && x.Status == EAccountStatus.Normal).ToList(),
|
|
|
- x => x.User)
|
|
|
- .Where(d => stepDefine.HandlerTypeItems.Select(x => x.Key).Contains(d.Name))
|
|
|
- .ToListAsync(cancellationToken);
|
|
|
- var users1 = roles.SelectMany(d => d.Accounts).Select(d => d.User);
|
|
|
- handlers = users1.Select(d => new Kv(d.Id, d.Name)).ToList();
|
|
|
- break;
|
|
|
- case EHandlerType.OrgLevel:
|
|
|
- //当前操作人所属部门的下级部门并且属于配置orgLevel的部门
|
|
|
- var levels = stepDefine.HandlerTypeItems.Select(d => d.Key).Select(d => int.Parse(d));
|
|
|
- var levelOneOrg = _sessionContext.RequiredOrgId.GetHigherOrgCode();
|
|
|
- //var orgs1 = await _organizeRepository.QueryAsync(d =>
|
|
|
- // d.IsEnable && d.OrgCode.StartsWith(levelOneOrg) &&
|
|
|
- // levels.Contains(d.OrgLevel));
|
|
|
-
|
|
|
- var orgs1 = await _organizeRepository.Queryable()
|
|
|
- .Where(d => d.IsEnable && levels.Contains(d.Level))
|
|
|
- .WhereIF(!levelOneOrg.IsCenter(), d => d.Id.StartsWith(levelOneOrg))
|
|
|
- .ToListAsync(cancellationToken);
|
|
|
-
|
|
|
- handlers = orgs1.Select(d => new Kv(d.Id, d.Name)).ToList();
|
|
|
- break;
|
|
|
- case EHandlerType.OrgType:
|
|
|
- var types = stepDefine.HandlerTypeItems.Select(d => d.Key)
|
|
|
- .Select(d => Enum.Parse<EOrgType>(d));
|
|
|
- var levelOneOrg1 = _sessionContext.RequiredOrgId.GetHigherOrgCode();
|
|
|
- //var org2 = await _organizeRepository.QueryAsync(d =>
|
|
|
- // d.IsEnable && d.OrgCode.StartsWith(levelOneOrg1) &&
|
|
|
- // types.Contains(d.OrgType));
|
|
|
-
|
|
|
- var orgs2 = await _organizeRepository.Queryable()
|
|
|
- .Where(d => d.IsEnable && types.Contains(d.OrgType))
|
|
|
- .WhereIF(!levelOneOrg1.IsCenter(), d => d.Id.StartsWith(levelOneOrg1))
|
|
|
- .ToListAsync(cancellationToken);
|
|
|
-
|
|
|
- handlers = orgs2.Select(d => new Kv(d.Id, d.Name)).ToList();
|
|
|
- break;
|
|
|
- default:
|
|
|
- throw new ArgumentOutOfRangeException();
|
|
|
- }
|
|
|
-
|
|
|
- var dto = new NextStepOptionDto { Handlers = handlers };
|
|
|
-
|
|
|
- if (stepDefine.Components.Contains(SysDicTypeConsts.OrderRedoReason))
|
|
|
- {
|
|
|
- var orderRedoReasons =
|
|
|
- await _systemDomainService.GetSysDicDataByCodeAsync(SysDicTypeConsts.OrderRedoReason,
|
|
|
- cancellationToken);
|
|
|
- dto.OrderRedoReasonOptions = orderRedoReasons.Select(d => new Kv(d.DicDataValue, d.DicDataName)).ToList();
|
|
|
- }
|
|
|
-
|
|
|
- return dto;
|
|
|
- }
|
|
|
- throw new NotImplementedException();
|
|
|
- }
|
|
|
-
|
|
|
/// <summary>
|
|
|
/// 查询指派办理人的处理方式及实际办理人
|
|
|
/// </summary>
|
|
|
- public async Task<FlowAssignInfo> GetFlowAssignModeAsync(StepDefine stepDefine, bool isStartCountersign,
|
|
|
- List<Kv> handlers, CancellationToken cancellationToken)
|
|
|
+ public async Task<FlowAssignInfo> GetFlowAssignInfoAsync(StepDefine stepDefine, bool isStartCountersign,
|
|
|
+ List<IdName> handlers, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- if (stepDefine.StepType is EStepType.Start or EStepType.End) return new();
|
|
|
- switch (stepDefine.HandlerType)
|
|
|
+ if (stepDefine.StepType is EStepType.End) return new();
|
|
|
+
|
|
|
+ switch (stepDefine.InstanceMode)
|
|
|
{
|
|
|
- case EHandlerType.Role:
|
|
|
- if (!handlers.Any())
|
|
|
+ case EInstanceMode.Config:
|
|
|
+ switch (stepDefine.HandlerType)
|
|
|
{
|
|
|
- var roles = await _roleRepository.Queryable()
|
|
|
- .Includes(d => d.Accounts, x => x.User)
|
|
|
- .Where(d => stepDefine.HandlerTypeItems.Select(d => d.Key).Contains(d.Name))
|
|
|
- .ToListAsync(cancellationToken);
|
|
|
- handlers = roles.SelectMany(d => d.Accounts).Distinct().Select(d => new Kv(d.Id, d.User.Name))
|
|
|
- .ToList();
|
|
|
+ case EHandlerType.Role:
|
|
|
+ if (!handlers.Any())
|
|
|
+ {
|
|
|
+ var roles = await _roleRepository.Queryable()
|
|
|
+ .Includes(d => d.Accounts, x => x.User)
|
|
|
+ .Where(d => stepDefine.HandlerTypeItems.Select(d => d.Id).Contains(d.Name))
|
|
|
+ .ToListAsync(cancellationToken);
|
|
|
+ handlers = roles.SelectMany(d => d.Accounts).Distinct().Select(d => new IdName(d.Id, d.User.Name))
|
|
|
+ .ToList();
|
|
|
+ }
|
|
|
+
|
|
|
+ return FlowAssignInfo.Create(EFlowAssignType.User, handlers, isStartCountersign);
|
|
|
+
|
|
|
+ case EHandlerType.OrgLevel:
|
|
|
+ case EHandlerType.OrgType:
|
|
|
+ case EHandlerType.AssignedOrg:
|
|
|
+ return FlowAssignInfo.Create(EFlowAssignType.Org, handlers, isStartCountersign);
|
|
|
+
|
|
|
+ case EHandlerType.AssignedUser:
|
|
|
+ return FlowAssignInfo.Create(EFlowAssignType.User, handlers, isStartCountersign);
|
|
|
+
|
|
|
+ default:
|
|
|
+ throw new ArgumentOutOfRangeException();
|
|
|
}
|
|
|
-
|
|
|
- return FlowAssignInfo.Create(EFlowAssignType.User, handlers, isStartCountersign);
|
|
|
-
|
|
|
- case EHandlerType.OrgLevel:
|
|
|
- case EHandlerType.OrgType:
|
|
|
- case EHandlerType.AssignedOrg:
|
|
|
+ case EInstanceMode.Dynamic:
|
|
|
return FlowAssignInfo.Create(EFlowAssignType.Org, handlers, isStartCountersign);
|
|
|
-
|
|
|
- case EHandlerType.AssignedUser:
|
|
|
- return FlowAssignInfo.Create(EFlowAssignType.User, handlers, isStartCountersign);
|
|
|
-
|
|
|
default:
|
|
|
throw new ArgumentOutOfRangeException();
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
|
|
|
|