|
@@ -519,19 +519,6 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
|
|
|
var updateSteps = new List<WorkflowStep> { currentStep };
|
|
|
|
|
|
- //操作为回到会签汇总时,更新开始会签节点的会签办理状态
|
|
|
- if (dto.BackToCountersignEnd)
|
|
|
- {
|
|
|
- var countersignStartStep = workflow.Steps.FirstOrDefault(d => d.Id == currentStep.PreviousId);
|
|
|
- if (countersignStartStep is null)
|
|
|
- throw new UserFriendlyException("未查询到会签开始节点");
|
|
|
- if (!countersignStartStep.HasStartedCountersign())
|
|
|
- throw new UserFriendlyException("查询到会签开始节点状态异常");
|
|
|
-
|
|
|
- countersignStartStep.CountersignSteps.First(d => d.StepId == currentStep.Id).Completed = true;
|
|
|
- updateSteps.Add(countersignStartStep);
|
|
|
- }
|
|
|
-
|
|
|
//结束当前会签流程
|
|
|
if (currentStep.IsCountersignEndStep)
|
|
|
{
|
|
@@ -574,6 +561,19 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ //操作为回到会签汇总时,更新开始会签节点的会签办理状态
|
|
|
+ if (currentStep.IsInCountersign() && dto.BackToCountersignEnd)
|
|
|
+ {
|
|
|
+ var countersignStartStep = workflow.Steps.FirstOrDefault(d => d.Id == currentStep.PreviousId);
|
|
|
+ if (countersignStartStep is null)
|
|
|
+ throw new UserFriendlyException("未查询到会签开始节点");
|
|
|
+ if (!countersignStartStep.HasStartedCountersign())
|
|
|
+ throw new UserFriendlyException("查询到会签开始节点状态异常");
|
|
|
+
|
|
|
+ countersignStartStep.CountersignSteps.First(d => d.StepId == currentStep.Id).Completed = true;
|
|
|
+ updateSteps.Add(countersignStartStep);
|
|
|
+ }
|
|
|
+
|
|
|
await _workflowStepRepository.UpdateRangeAsync(updateSteps, cancellationToken);
|
|
|
|
|
|
await NextTraceAsync(workflow, dto, currentStep, cancellationToken);
|
|
@@ -605,38 +605,59 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
workflow.CenterToOrg(CalculateExpiredTime(workflow.WorkflowDefinition.Code));//todo 过期时间
|
|
|
|
|
|
//创建下一/N个节点(会签汇总节点:会签未全部办理时不创建,最后一个会签办理节点创建会签汇总节点)
|
|
|
- if (dto.BackToCountersignEnd)
|
|
|
+ List<WorkflowStep> nextSteps;
|
|
|
+ if (currentStep.IsInCountersign())
|
|
|
{
|
|
|
- var countersignStartStep = workflow.Steps.FirstOrDefault(d => d.Id == currentStep.PreviousId);
|
|
|
- if (countersignStartStep is null)
|
|
|
- throw new UserFriendlyException("未查询到会签开始节点");
|
|
|
- if (!countersignStartStep.HasStartedCountersign())
|
|
|
- throw new UserFriendlyException("查询到会签开始节点状态异常");
|
|
|
- if (countersignStartStep.StartedCountersignHasAllHandled())
|
|
|
+ if (dto.BackToCountersignEnd)
|
|
|
{
|
|
|
- //todo 创建会签汇总节点
|
|
|
+ var countersignStartStep = workflow.Steps.FirstOrDefault(d => d.Id == currentStep.PreviousId);
|
|
|
+ if (countersignStartStep is null)
|
|
|
+ throw new UserFriendlyException("未查询到会签开始节点");
|
|
|
+ if (!countersignStartStep.HasStartedCountersign())
|
|
|
+ throw new UserFriendlyException("查询到会签开始节点状态异常");
|
|
|
+ if (countersignStartStep.StartedCountersignHasAllHandled())
|
|
|
+ {
|
|
|
+ //todo 创建会签汇总节点
|
|
|
|
|
|
|
|
|
- await _mediator.Publish(new CountersignEndAssigned(workflow), cancellationToken);
|
|
|
+ await _mediator.Publish(new CountersignEndAssigned(workflow), cancellationToken);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //todo 依据会签策略创建会签下一级节点
|
|
|
+ //考虑没有下级部门情况
|
|
|
}
|
|
|
}
|
|
|
else if (currentStep.InstanceMode is EInstanceMode.Dynamic && !currentStep.DynamicShouldTerminal())
|
|
|
{
|
|
|
- // 创建动态节点
|
|
|
+ //todo 创建动态下一级节点
|
|
|
|
|
|
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- //todo 创建普通节点
|
|
|
+
|
|
|
+ //todo 创建普通节点(根据配置)
|
|
|
+ if (dto.IsStartCountersign)
|
|
|
+ {
|
|
|
+ foreach (var nextHandler in dto.NextHandlers)
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ CreateStepByDefine(nextStepDefine, currentStep, workflow.Id, )
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
//更新办理人
|
|
|
workflow.UpdateHandlers(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgId,
|
|
|
flowAssignInfo.FlowAssignType, flowAssignInfo.HandlerObjects);
|
|
|
|
|
|
- //var nextStepBox = await CreateStepAsync(workflow, nextStepDefine, dto, EWorkflowStepStatus.Created,
|
|
|
- // currentStepBox, currentStep, EWorkflowTraceStatus.Normal, expiredTime, cancellationToken);
|
|
|
+ var nextStepBox = await CreateStepAsync(workflow, nextStepDefine, dto, EWorkflowStepStatus.Created,
|
|
|
+ currentStepBox, currentStep, EWorkflowTraceStatus.Normal, expiredTime, cancellationToken);
|
|
|
|
|
|
////下一节点为汇总节点时,检查下一节点是否可办理
|
|
|
//var nextStepCanHandle = true;
|
|
@@ -1143,7 +1164,9 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
currentStep.StartCountersign(countersign.Id);
|
|
|
}
|
|
|
|
|
|
- private async Task StartCountersignAsync(Workflow workflow, WorkflowStep startStep, BasicWorkflowDto dto, ECounterSignType counterSignType, CancellationToken cancellationToken)
|
|
|
+ //new
|
|
|
+ private async Task StartCountersignAsync(Workflow workflow, WorkflowStep startStep, BasicWorkflowDto dto,
|
|
|
+ ECounterSignType counterSignType, CancellationToken cancellationToken)
|
|
|
{
|
|
|
var countersign = await CreateCountersignAsync(
|
|
|
workflow.Id, startStep, dto.NextHandlers.Count,
|
|
@@ -1600,6 +1623,22 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
return stepBox;
|
|
|
}
|
|
|
|
|
|
+ //new
|
|
|
+ public async Task CreateStepsByDefineAsync(StepDefine stepDefine, WorkflowStep prevStep, BasicWorkflowDto dto)
|
|
|
+ {
|
|
|
+ if (dto.IsStartCountersign)
|
|
|
+ {
|
|
|
+ foreach (var nextHandler in dto.NextHandlers)
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ CreateStepByDefine(nextStepDefine, currentStep, workflow.Id, )
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private async Task<WorkflowStep> CreateStartSubStepAsync(
|
|
|
Kv handler,
|
|
|
string nextStepCode,
|
|
@@ -1658,7 +1697,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
CancellationToken cancellationToken = default)
|
|
|
{
|
|
|
var countersignStatus = stepBoxDefine.StepType is EStepType.Summary
|
|
|
- ? prevStep.IsInCountersign
|
|
|
+ ? prevStep.IsInCountersign()
|
|
|
? ECountersignPosition.InCountersign
|
|
|
: ECountersignPosition.None
|
|
|
: prevStep.GetNextStepCountersignStatus();
|
|
@@ -1689,6 +1728,41 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ //new
|
|
|
+ private async Task CreateStepsAsync(
|
|
|
+ Workflow workflow,
|
|
|
+ StepDefine stepDefine,
|
|
|
+ BasicWorkflowDto dto,
|
|
|
+ WorkflowStep prevStep,
|
|
|
+ EWorkflowStepStatus stepStatus,
|
|
|
+ EWorkflowTraceStatus traceStatus,
|
|
|
+ DateTime expiredTime,
|
|
|
+ CancellationToken cancellationToken = default)
|
|
|
+ {
|
|
|
+ List<WorkflowStep> steps;
|
|
|
+ if (stepDefine.HandlerType is EHandlerType.AssignedUser or EHandlerType.AssignedOrg)
|
|
|
+ {
|
|
|
+ steps = CreateSubSteps(dto.IsStartCountersign, stepBox, stepBox.HandlerClassifies, dto.NextStepCode, dto.NextMainHandler,
|
|
|
+ prevStep?.Id, countersignId, stepStatus, countersignStatus, expiredTime, stepExtension);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (stepDefine.HandlerType != EHandlerType.Role && !dto.NextHandlers.Any())
|
|
|
+ throw new UserFriendlyException("未指定节点处理者");
|
|
|
+ steps = CreateSubSteps(dto.IsStartCountersign, stepBox, dto.NextHandlers, dto.NextStepCode, dto.NextMainHandler,
|
|
|
+ prevStep?.Id, countersignId, stepStatus, countersignStatus, expiredTime, stepExtension);
|
|
|
+ }
|
|
|
+
|
|
|
+ await _workflowStepRepository.AddRangeAsync(steps, cancellationToken);
|
|
|
+
|
|
|
+ //create traces
|
|
|
+ foreach (var step in steps)
|
|
|
+ {
|
|
|
+ await CreateTraceAsync(workflow, step, traceStatus, cancellationToken);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 查询未完成节点
|
|
|
/// </summary>
|
|
@@ -1770,7 +1844,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
if (countersignPosition is not ECountersignPosition.None && string.IsNullOrEmpty(countersignId))
|
|
|
throw UserFriendlyException.SameMessage("非法参数");
|
|
|
|
|
|
- //依据是否发起会签创建step,发起会签表示一个handler创建一个step,未发起会签表示多人处理同一个节点,只创建一个step
|
|
|
+ //依据是否发起会签创建step,发起会签表示一个handler创建一个step,未发起会签默认作为或签处理,只创建一个step
|
|
|
var steps = new List<WorkflowStep>();
|
|
|
if (isPrevStartCountersign)
|
|
|
{
|
|
@@ -1793,8 +1867,9 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
return steps;
|
|
|
}
|
|
|
|
|
|
- private WorkflowStep CreateSubStep(
|
|
|
- WorkflowStep stepBox,
|
|
|
+ //new
|
|
|
+ private List<WorkflowStep> CreateSteps(
|
|
|
+ bool isPrevStartCountersign,
|
|
|
List<Kv> handlers,
|
|
|
string nextStepCode,
|
|
|
string? nextMainHandler,
|
|
@@ -1804,6 +1879,20 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
ECountersignPosition countersignPosition,
|
|
|
DateTime expiredTime,
|
|
|
StepExtension extension)
|
|
|
+ {
|
|
|
+ }
|
|
|
+
|
|
|
+ private WorkflowStep CreateSubStep(
|
|
|
+ WorkflowStep stepBox,
|
|
|
+ List<Kv> handlers,
|
|
|
+ string nextStepCode,
|
|
|
+ string? nextMainHandler,
|
|
|
+ string? prevStepId,
|
|
|
+ string? prevStepCode,
|
|
|
+ string? countersignId,
|
|
|
+ EWorkflowStepStatus stepStatus,
|
|
|
+ ECountersignPosition countersignPosition,
|
|
|
+ DateTime expiredTime)
|
|
|
{
|
|
|
if (!handlers.Any())
|
|
|
throw new UserFriendlyException("非法参数");
|
|
@@ -1815,13 +1904,48 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
step.Handlers = handlers;
|
|
|
step.NextStepCode = step.StepType is EStepType.End ? string.Empty : nextStepCode;
|
|
|
step.IsMain = isMain;
|
|
|
- step.PreviousStepId = prevStepId;
|
|
|
+ step.PreviousId = prevStepId;
|
|
|
+ step.PreviousCode = prevStepCode;
|
|
|
+ step.CountersignId = countersignId;
|
|
|
+ step.Status = stepStatus;
|
|
|
+ step.CountersignPosition = countersignPosition;
|
|
|
+ step.StepExpiredTime = expiredTime;
|
|
|
+ step.TimeLimit = GetTimeLimit("");//todo 过期时间
|
|
|
+
|
|
|
+ return step;
|
|
|
+ }
|
|
|
+
|
|
|
+ private WorkflowStep CreateStepByDefine(
|
|
|
+ StepDefine stepDefine,
|
|
|
+ WorkflowStep prevStep,
|
|
|
+ string workflowId,
|
|
|
+ List<Kv> handlers,
|
|
|
+ string nextStepCode,
|
|
|
+ string? nextMainHandler,
|
|
|
+ string? countersignId,
|
|
|
+ EWorkflowStepStatus stepStatus,
|
|
|
+ ECountersignPosition countersignPosition,
|
|
|
+ DateTime expiredTime
|
|
|
+ )
|
|
|
+ {
|
|
|
+ if (!handlers.Any())
|
|
|
+ throw new UserFriendlyException("非法参数");
|
|
|
+ var step = _mapper.Map<WorkflowStep>(stepDefine);
|
|
|
+ var handlerIds = handlers.Select(d => d.Key).ToList();
|
|
|
+ var isMain = handlers.Count == 1 || (handlers.Count > 1 || handlerIds.First() == nextMainHandler);
|
|
|
+
|
|
|
+ step.WorkflowId = workflowId;
|
|
|
+ step.Handlers = handlers;
|
|
|
+ step.NextStepCode = step.StepType is EStepType.End ? string.Empty : nextStepCode;
|
|
|
+ step.IsMain = isMain;
|
|
|
+ step.PreviousId = prevStep.Id;
|
|
|
+ step.PreviousCode = prevStep.Code;
|
|
|
+ step.PreviousCode = prevStep.NextStepCode;
|
|
|
step.CountersignId = countersignId;
|
|
|
step.Status = stepStatus;
|
|
|
step.CountersignPosition = countersignPosition;
|
|
|
- step.ExpiredTime = expiredTime;
|
|
|
+ step.StepExpiredTime = expiredTime;
|
|
|
step.TimeLimit = GetTimeLimit("");//todo 过期时间
|
|
|
- step.Extension = extension;
|
|
|
|
|
|
return step;
|
|
|
}
|