|
@@ -772,6 +772,15 @@ namespace Hotline.FlowEngine.Workflows
|
|
private async Task RecallAsync(Workflow workflow, RecallDto dto, StepDefine targetStepDefine, WorkflowStep currentStepBox, WorkflowStep targetStepBox,
|
|
private async Task RecallAsync(Workflow workflow, RecallDto dto, StepDefine targetStepDefine, WorkflowStep currentStepBox, WorkflowStep targetStepBox,
|
|
bool isStartCountersign, CancellationToken cancellationToken)
|
|
bool isStartCountersign, CancellationToken cancellationToken)
|
|
{
|
|
{
|
|
|
|
+ //get targetStep's previous
|
|
|
|
+ var targetPrevStepBox = workflow.StepBoxes.FirstOrDefault(d => d.Id == targetStepBox.PreviousId);
|
|
|
|
+ if (targetPrevStepBox == null)
|
|
|
|
+ throw new UserFriendlyException($"{nameof(RecallAsync)}, 未找到目标节点的前一节点, flowId: {workflow.Id}, targetStepBoxPrevId: {targetPrevStepBox.PreviousId}");
|
|
|
|
+ //真实的前一节点并不存在(非正常流转造成的),所以任意取一个替代
|
|
|
|
+ var targetPrevStep = targetPrevStepBox.Steps.FirstOrDefault();
|
|
|
|
+ if (targetPrevStep == null)
|
|
|
|
+ throw new UserFriendlyException($"{nameof(RecallAsync)}, 未找到目标节点的前一节点, flowId: {workflow.Id}");
|
|
|
|
+
|
|
//remove completedSteps include target self
|
|
//remove completedSteps include target self
|
|
var removeSteps = GetStepsIncludeSelf(targetStepBox);
|
|
var removeSteps = GetStepsIncludeSelf(targetStepBox);
|
|
var tempStepBox = currentStepBox;
|
|
var tempStepBox = currentStepBox;
|
|
@@ -780,7 +789,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
removeSteps.AddRange(GetStepsIncludeSelf(tempStepBox));
|
|
removeSteps.AddRange(GetStepsIncludeSelf(tempStepBox));
|
|
var prevStepBox = workflow.StepBoxes.FirstOrDefault(d => d.Id == tempStepBox.PreviousId);
|
|
var prevStepBox = workflow.StepBoxes.FirstOrDefault(d => d.Id == tempStepBox.PreviousId);
|
|
if (prevStepBox is null)
|
|
if (prevStepBox is null)
|
|
- throw new UserFriendlyException($"{nameof(RecallAsync)}, 未查询到节点, tempStepBoxId: {tempStepBox.Id}, prevStepBoxId: {tempStepBox.PreviousId}");
|
|
|
|
|
|
+ throw new UserFriendlyException($"{nameof(RecallAsync)}, 未查询到节点, workflowId: {workflow.Id}, prevStepBoxId: {tempStepBox.PreviousId}");
|
|
tempStepBox = prevStepBox;
|
|
tempStepBox = prevStepBox;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -788,17 +797,21 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
|
|
|
//recreate targetStep
|
|
//recreate targetStep
|
|
await CreateStepAsync(isStartCountersign, workflow, targetStepDefine, dto, EWorkflowStepStatus.Assigned,
|
|
await CreateStepAsync(isStartCountersign, workflow, targetStepDefine, dto, EWorkflowStepStatus.Assigned,
|
|
- targetStepBox, targetStepBox.Steps.First(), cancellationToken);
|
|
|
|
|
|
+ targetPrevStepBox, targetPrevStep, cancellationToken);
|
|
|
|
|
|
//flow manage
|
|
//flow manage
|
|
- if (workflow.IsInCountersign())
|
|
|
|
- {
|
|
|
|
- var currentCountersignStepBox =
|
|
|
|
- workflow.StepBoxes.First(d => d.Code == workflow.TopCountersignStepCode);
|
|
|
|
- //目标节点在初始会签节点之前或正好
|
|
|
|
- if (targetStepBox.Code == workflow.TopCountersignStepCode || targetStepBox.CreationTime < currentCountersignStepBox.CreationTime)
|
|
|
|
- await ResetWorkflowCurrentStepInfo(workflow, dto, targetStepBox, isStartCountersign, cancellationToken);
|
|
|
|
- }
|
|
|
|
|
|
+ await ResetWorkflowCurrentStepInfo(workflow, dto, targetStepBox, isStartCountersign, cancellationToken);
|
|
|
|
+
|
|
|
|
+ //if (workflow.IsInCountersign())
|
|
|
|
+ //{
|
|
|
|
+ // var currentCountersignStepBox =
|
|
|
|
+ // workflow.StepBoxes.First(d => d.Code == workflow.TopCountersignStepCode);
|
|
|
|
+ // //目标节点在初始会签节点之前或正好
|
|
|
|
+
|
|
|
|
+ // if (targetStepBox.Code == workflow.TopCountersignStepCode || targetStepBox.CreationTime < currentCountersignStepBox.CreationTime)
|
|
|
|
+ // await ResetWorkflowCurrentStepInfo(workflow, dto, targetStepBox, isStartCountersign, cancellationToken);
|
|
|
|
+ //}
|
|
|
|
+
|
|
|
|
|
|
//update uncompleted traces
|
|
//update uncompleted traces
|
|
await RecallTraceAsync(workflow.Id, dto, cancellationToken);
|
|
await RecallTraceAsync(workflow.Id, dto, cancellationToken);
|