|
@@ -324,7 +324,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
currentStep.FileJson = await _fileRepository.AddFileAsync(dto.Files, workflow.ExternalId,
|
|
|
currentStep.Id, cancellationToken);
|
|
|
|
|
|
- var isStartCountersign = currentStep.IsInCountersign() || dto.IsStartCountersign;
|
|
|
+ var isStartCountersign = (currentStep.IsInCountersign() && !dto.BackToCountersignEnd) || dto.IsStartCountersign;
|
|
|
|
|
|
var counterSignType = GetCounterSignType(currentStep.BusinessType);
|
|
|
|
|
@@ -365,6 +365,17 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
await HandleStepAsync(currentStep, workflow, dto, flowAssignInfo.FlowAssignType,
|
|
|
counterSignType, expiredTime, cancellationToken);
|
|
|
|
|
|
+ //创建会签数据
|
|
|
+ if (isStartCountersign)
|
|
|
+ {
|
|
|
+ var exists = workflow.Countersigns.Any(d =>
|
|
|
+ !d.IsCompleted() && d.StarterId == _sessionContext.RequiredUserId);
|
|
|
+ if (exists)
|
|
|
+ throw new UserFriendlyException("该用户在当前流程存在未结束会签");
|
|
|
+ await StartCountersignAsync(workflow, currentStep, dto, flowAssignInfo.FlowAssignType,
|
|
|
+ counterSignType, expiredTime, cancellationToken);
|
|
|
+ }
|
|
|
+
|
|
|
currentStep.IsActualHandled = CheckIsActualHandle(workflow, currentStep, nextStepDefine, dto);
|
|
|
|
|
|
_mapper.Map(dto, workflow);
|
|
@@ -445,17 +456,6 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- //创建会签数据
|
|
|
- if (isStartCountersign)
|
|
|
- {
|
|
|
- var exists = workflow.Countersigns.Any(d =>
|
|
|
- !d.IsCompleted() && d.StarterId == _sessionContext.RequiredUserId);
|
|
|
- if (exists)
|
|
|
- throw new UserFriendlyException("该用户在当前流程存在未结束会签");
|
|
|
- await StartCountersignAsync(workflow, currentStep, dto, flowAssignInfo.FlowAssignType,
|
|
|
- counterSignType, expiredTime, cancellationToken);
|
|
|
- }
|
|
|
-
|
|
|
//创建下一/N个节点(会签汇总节点:会签未全部办理时不创建,最后一个会签办理节点创建会签汇总节点)
|
|
|
var nextSteps = await CreateNextStepsAsync(workflow, currentStep, dto,
|
|
|
nextStepDefine, isNextDynamic, flowAssignInfo, expiredTime, stepHandlers, isStartCountersign,
|
|
@@ -560,8 +560,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
var trace = await PreviousTraceAsync(workflow.Id, dto, currentStep, cancellationToken);
|
|
|
|
|
|
//复制上一个节点为待接办
|
|
|
- var newPrevStep =
|
|
|
- await DuplicateStepWithTraceAsync(workflow, prevStep, EWorkflowTraceStatus.Previous, cancellationToken);
|
|
|
+ var newPrevStep = await DuplicateStepWithTraceAsync(workflow, prevStep, EWorkflowTraceType.Previous,
|
|
|
+ cancellationToken);
|
|
|
|
|
|
//remove workflow.steps
|
|
|
await _workflowStepRepository.RemoveRangeAsync(removeSteps, cancellationToken);
|
|
@@ -750,7 +750,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
await RecallTraceAsync(workflow.Id, dto.Opinion, cancellationToken);
|
|
|
|
|
|
var isOrgToCenter = await RecallAsync(workflow, dto, flowAssignInfo, targetStepDefine, targetStep,
|
|
|
- EWorkflowTraceStatus.Recall, stepHandlers, expiredTime, cancellationToken);
|
|
|
+ EWorkflowTraceType.Recall, stepHandlers, expiredTime, cancellationToken);
|
|
|
|
|
|
workflow.ResetHandlers(flowAssignInfo.FlowAssignType, flowAssignInfo.HandlerObjects);
|
|
|
|
|
@@ -780,7 +780,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
workflow.SetStatusRunnable();
|
|
|
|
|
|
var newStartStep =
|
|
|
- await DuplicateStepWithTraceAsync(workflow, startStep, EWorkflowTraceStatus.Recall, cancellationToken);
|
|
|
+ await DuplicateStepWithTraceAsync(workflow, startStep, EWorkflowTraceType.Recall, cancellationToken);
|
|
|
|
|
|
//更新当前办理节点信息
|
|
|
//workflow.UpdateWorkflowCurrentStepInfo(false,
|
|
@@ -1238,7 +1238,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
}
|
|
|
|
|
|
private async Task<WorkflowStep> CreateStartStepAsync(Workflow workflow, StepDefine startStepDefine,
|
|
|
- BasicWorkflowDto dto, List<Kv> handles, List<WorkflowStepHandler> stepHandlers, EWorkflowTraceStatus traceStatus,
|
|
|
+ BasicWorkflowDto dto, List<Kv> handles, List<WorkflowStepHandler> stepHandlers, EWorkflowTraceType traceType,
|
|
|
DateTime? expiredTime, CancellationToken cancellationToken)
|
|
|
{
|
|
|
var startStep = CreateStartStep(workflow, startStepDefine, dto, handles, stepHandlers, expiredTime);
|
|
@@ -1246,7 +1246,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
await _workflowStepRepository.AddNav(startStep)
|
|
|
.Include(d => d.StepHandlers)
|
|
|
.ExecuteCommandAsync();
|
|
|
- await CreateTraceAsync(workflow, startStep, traceStatus, cancellationToken);
|
|
|
+ await CreateTraceAsync(workflow, startStep, traceType, cancellationToken);
|
|
|
return startStep;
|
|
|
}
|
|
|
|
|
@@ -1291,18 +1291,27 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
{
|
|
|
//创建普通节点(根据配置)
|
|
|
nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto,
|
|
|
- flowAssignInfo, EWorkflowTraceStatus.Normal, expiredTime, stepHandlers, cancellationToken);
|
|
|
+ flowAssignInfo, EWorkflowTraceType.Normal, expiredTime, stepHandlers, cancellationToken);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- // csStartStep.prev
|
|
|
- var csStartStep = workflow.Steps.FirstOrDefault(d => d.Id == currentStep.CountersignStartStepId);
|
|
|
- if (csStartStep is null)
|
|
|
- throw new UserFriendlyException("未查询到会签节点");
|
|
|
+ if (dto.BackToCountersignEnd)
|
|
|
+ {
|
|
|
+ // csStartStep.prev
|
|
|
+ var csStartStep = workflow.Steps.FirstOrDefault(d => d.Id == currentStep.CountersignStartStepId);
|
|
|
+ if (csStartStep is null)
|
|
|
+ throw new UserFriendlyException("未查询到会签节点");
|
|
|
|
|
|
- nextSteps = await CreateCsEndStepsByTargetPrevAsync(workflow, csStartStep, dto, stepHandlers,
|
|
|
- expiredTime, cancellationToken);
|
|
|
+ nextSteps = await CreateCsEndStepsByTargetPrevAsync(workflow, csStartStep, dto, stepHandlers,
|
|
|
+ expiredTime, cancellationToken);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //依据会签策略创建会签下一级节点
|
|
|
+ nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
|
|
|
+ flowAssignInfo.FlowAssignType, expiredTime, stepHandlers, isStartCountersign, cancellationToken);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
else
|
|
@@ -1337,7 +1346,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
{
|
|
|
//创建普通节点(根据配置)
|
|
|
nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto, flowAssignInfo,
|
|
|
- EWorkflowTraceStatus.Normal, expiredTime, stepHandlers, cancellationToken);
|
|
|
+ EWorkflowTraceType.Normal, expiredTime, stepHandlers, cancellationToken);
|
|
|
}
|
|
|
|
|
|
return nextSteps;
|
|
@@ -1365,7 +1374,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
|
|
|
return await CreateStepsAsync(workflow, nextStepDefine, prevStep, dto, dto.IsStartCountersign,
|
|
|
flowAssignInfo.FlowAssignType, dto.NextHandlers, stepHandlers, null, EWorkflowStepStatus.WaitForAccept,
|
|
|
- ECountersignPosition.None, false, EWorkflowTraceStatus.Normal, handlerType, expiredTime,
|
|
|
+ ECountersignPosition.None, false, EWorkflowTraceType.Normal, handlerType, expiredTime,
|
|
|
cancellationToken: cancellationToken);
|
|
|
}
|
|
|
|
|
@@ -1400,7 +1409,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
|
|
|
return CreateStepsAsync(workflow, stepDefine, prevStep, dto, isStartCountersign, flowAssignType, dto.NextHandlers,
|
|
|
stepHandlers, countersignId, EWorkflowStepStatus.WaitForAccept, nextStepCountersignPosition,
|
|
|
- false, EWorkflowTraceStatus.Normal, handlerType, expiredTime, cancellationToken: cancellationToken);
|
|
|
+ false, EWorkflowTraceType.Normal, handlerType, expiredTime, cancellationToken: cancellationToken);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -1424,7 +1433,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
nextSteps = new List<WorkflowStep> { countersignEndStep };
|
|
|
|
|
|
//create trace
|
|
|
- await CreateTraceAsync(workflow, countersignEndStep, EWorkflowTraceStatus.Normal, cancellationToken);
|
|
|
+ await CreateTraceAsync(workflow, countersignEndStep, EWorkflowTraceType.Normal, cancellationToken);
|
|
|
|
|
|
await _mediator.Publish(new CountersignEndAssigned(workflow), cancellationToken);
|
|
|
}
|
|
@@ -1577,7 +1586,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
/// 复制一个节点为待接办
|
|
|
/// </summary>
|
|
|
private async Task<WorkflowStep> DuplicateStepWithTraceAsync(Workflow workflow, WorkflowStep step,
|
|
|
- EWorkflowTraceStatus traceStatus, CancellationToken cancellationToken)
|
|
|
+ EWorkflowTraceType traceType, CancellationToken cancellationToken)
|
|
|
{
|
|
|
var newStep = _mapper.Map<WorkflowStep>(step);
|
|
|
newStep.Reset();
|
|
@@ -1591,9 +1600,9 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
newStep.StartCountersignId = step.StartCountersignId;
|
|
|
newStep.CountersignId = step.CountersignId;
|
|
|
newStep.IsStartedCountersignEnd = step.IsStartedCountersignEnd;
|
|
|
- //await _workflowStepRepository.AddAsync(newStep, cancellationToken);
|
|
|
+ await _workflowStepRepository.AddAsync(newStep, cancellationToken);
|
|
|
|
|
|
- await CreateTraceAsync(workflow, newStep, traceStatus, cancellationToken);
|
|
|
+ await CreateTraceAsync(workflow, newStep, traceType, cancellationToken);
|
|
|
|
|
|
return newStep;
|
|
|
}
|
|
@@ -1720,11 +1729,11 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
}
|
|
|
|
|
|
private async Task CreateTraceAsync(Workflow workflow, WorkflowStep step,
|
|
|
- EWorkflowTraceStatus traceStatus = EWorkflowTraceStatus.Normal,
|
|
|
+ EWorkflowTraceType traceType = EWorkflowTraceType.Normal,
|
|
|
CancellationToken cancellationToken = default)
|
|
|
{
|
|
|
var trace = _mapper.Map<WorkflowTrace>(step);
|
|
|
- trace.Status = traceStatus;
|
|
|
+ trace.TraceType = traceType;
|
|
|
|
|
|
if (step.IsInCountersign())
|
|
|
{
|
|
@@ -1765,7 +1774,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
}
|
|
|
|
|
|
private async Task<bool> RecallAsync(Workflow workflow, BasicWorkflowDto dto, FlowAssignInfo flowAssignInfo,
|
|
|
- StepDefine targetStepDefine, WorkflowStep targetStep, EWorkflowTraceStatus traceStatus,
|
|
|
+ StepDefine targetStepDefine, WorkflowStep targetStep, EWorkflowTraceType traceType,
|
|
|
List<WorkflowStepHandler> stepHandlers, DateTime? expiredTime, CancellationToken cancellationToken)
|
|
|
{
|
|
|
var targetIsStartStep = targetStepDefine.StepType is EStepType.Start;
|
|
@@ -1796,11 +1805,11 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
workflow.SetStatusRunnable();
|
|
|
|
|
|
var targetStepNew = targetIsStartStep
|
|
|
- ? await CreateStartStepAsync(workflow, targetStepDefine, dto, dto.NextHandlers, stepHandlers, traceStatus, expiredTime,
|
|
|
+ ? await CreateStartStepAsync(workflow, targetStepDefine, dto, dto.NextHandlers, stepHandlers, traceType, expiredTime,
|
|
|
cancellationToken)
|
|
|
: (await CreateStepsAsync(workflow, targetStepDefine, targetPrevStep, dto, false,
|
|
|
flowAssignInfo.FlowAssignType, dto.NextHandlers, stepHandlers,
|
|
|
- null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, true, traceStatus,
|
|
|
+ null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, true, traceType,
|
|
|
null, expiredTime, cancellationToken: cancellationToken)).First();
|
|
|
|
|
|
|
|
@@ -1882,7 +1891,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
WorkflowStep prevStep,
|
|
|
BasicWorkflowDto dto,
|
|
|
FlowAssignInfo flowAssignInfo,
|
|
|
- EWorkflowTraceStatus traceStatus,
|
|
|
+ EWorkflowTraceType traceType,
|
|
|
DateTime? expiredTime,
|
|
|
List<WorkflowStepHandler> stepHandlers,
|
|
|
CancellationToken cancellationToken)
|
|
@@ -1909,7 +1918,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
return await CreateStepsAsync(workflow, stepDefine, prevStep, dto, dto.IsStartCountersign,
|
|
|
flowAssignInfo.FlowAssignType, handlers, stepHandlers, null,
|
|
|
EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None,
|
|
|
- true, traceStatus, null, expiredTime, cancellationToken);
|
|
|
+ true, traceType, null, expiredTime, cancellationToken);
|
|
|
}
|
|
|
|
|
|
private async Task<List<WorkflowStep>> CreateStepsAsync(
|
|
@@ -1925,7 +1934,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
EWorkflowStepStatus stepStatus,
|
|
|
ECountersignPosition csPosition,
|
|
|
bool isOrigin,
|
|
|
- EWorkflowTraceStatus traceStatus,
|
|
|
+ EWorkflowTraceType traceType,
|
|
|
EHandlerType? handlerType = null,
|
|
|
DateTime? expiredTime = null,
|
|
|
CancellationToken cancellationToken = default
|
|
@@ -1964,7 +1973,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
//create traces todo add range traces
|
|
|
foreach (var step in steps)
|
|
|
{
|
|
|
- await CreateTraceAsync(workflow, step, traceStatus, cancellationToken);
|
|
|
+ await CreateTraceAsync(workflow, step, traceType, cancellationToken);
|
|
|
}
|
|
|
|
|
|
return steps;
|
|
@@ -2076,7 +2085,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
|
|
|
//cp会签发起节点变为待办节点
|
|
|
//1. create terminal trace 2. 撤回至startStep
|
|
|
- var newStep = await DuplicateStepWithTraceAsync(workflow, startCountersignStep, EWorkflowTraceStatus.Normal,
|
|
|
+ var newStep = await DuplicateStepWithTraceAsync(workflow, startCountersignStep, EWorkflowTraceType.Normal,
|
|
|
cancellationToken);
|
|
|
|
|
|
//当topcsStep结束cs时,实际办理节点应该更新为newStep
|