|
@@ -542,10 +542,13 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
{
|
|
|
ValidatePermission(workflow, operater.OrgId, operater.Id);
|
|
|
//CheckWhetherRunnable(workflow.Status);
|
|
|
- if (workflow.IsInCountersign)
|
|
|
- throw UserFriendlyException.SameMessage("会签流程不支持退回");
|
|
|
+ //if (workflow.IsInCountersign)
|
|
|
+ // throw UserFriendlyException.SameMessage("会签流程不支持退回");
|
|
|
|
|
|
var currentStep = GetUnHandleStep(workflow.Steps, operater.OrgId, operater.Id);
|
|
|
+ if (currentStep.IsInCountersign())
|
|
|
+ throw UserFriendlyException.SameMessage("会签节点不支持退回");
|
|
|
+
|
|
|
//保存附件
|
|
|
if (dto.Files.Any())
|
|
|
currentStep.FileJson = await _fileRepository.AddFileAsync(dto.Files, workflow.ExternalId, currentStep.Id, cancellationToken);
|
|
@@ -558,6 +561,20 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
if (prevStep == null)
|
|
|
throw UserFriendlyException.SameMessage("未查询到前一节点");
|
|
|
|
|
|
+ var removeSteps = new List<WorkflowStep> { currentStep, prevStep };
|
|
|
+
|
|
|
+ //if prevStep is csEndStep t: 1. remove steps between cs end to start except startStep 2. prev == start
|
|
|
+ if (prevStep.IsCountersignEndStep)
|
|
|
+ {
|
|
|
+ var countersignStartStep = workflow.Steps.FirstOrDefault(d => d.Id == prevStep.CountersignStartStepId);
|
|
|
+ if (countersignStartStep is null)
|
|
|
+ throw new UserFriendlyException("未查询到对应会签开始节点");
|
|
|
+ SearchCsSteps(countersignStartStep, prevStep, workflow.Steps, ref removeSteps);
|
|
|
+ removeSteps.Add(prevStep);
|
|
|
+
|
|
|
+ prevStep = countersignStartStep;
|
|
|
+ }
|
|
|
+
|
|
|
//update trace
|
|
|
var trace = await PreviousTraceAsync(workflow.Id, dto, currentStep, cancellationToken);
|
|
|
|
|
@@ -565,8 +582,7 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
var newPrevStep = await DuplicateStepWithTraceAsync(workflow, prevStep, EWorkflowTraceStatus.Previous, cancellationToken);
|
|
|
|
|
|
//remove workflow.steps
|
|
|
- await _workflowStepRepository.RemoveRangeAsync(new List<WorkflowStep> { currentStep, prevStep },
|
|
|
- cancellationToken);
|
|
|
+ await _workflowStepRepository.RemoveRangeAsync(removeSteps, cancellationToken);
|
|
|
|
|
|
if (workflow.Status is EWorkflowStatus.Completed)
|
|
|
workflow.SetStatusRunnable();
|
|
@@ -592,6 +608,27 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
await _mediator.Publish(new PreviousNotify(workflow, newPrevStep, dto, isOrgToCenter), cancellationToken);
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 查找当前节点至结束节点之前的所有节点(不含头尾)
|
|
|
+ /// </summary>
|
|
|
+ private void SearchCsSteps(WorkflowStep step, WorkflowStep csEndStep,
|
|
|
+ List<WorkflowStep> steps, ref List<WorkflowStep> removeSteps)
|
|
|
+ {
|
|
|
+ if (step.Id == csEndStep.Id) return;
|
|
|
+ var nextSteps = steps.Where(d => d.PrevStepId == step.Id).ToList();
|
|
|
+ if (nextSteps.Any())
|
|
|
+ {
|
|
|
+ foreach (var nextStep in nextSteps)
|
|
|
+ {
|
|
|
+ SearchCsSteps(nextStep, csEndStep, steps, ref removeSteps);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ removeSteps.Add(step);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 撤回(返回到之前任意节点)
|
|
|
/// </summary>
|
|
@@ -1872,7 +1909,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
return workflow;
|
|
|
}
|
|
|
|
|
|
- private void HandleStepsByTerminalCs(WorkflowStep step, List<WorkflowStep> steps, List<WorkflowTrace> traces, ref List<WorkflowStep> updateSteps, ref List<WorkflowTrace> updateTraces)
|
|
|
+ private void HandleStepsByTerminalCs(WorkflowStep step, List<WorkflowStep> steps, List<WorkflowTrace> traces,
|
|
|
+ ref List<WorkflowStep> updateSteps, ref List<WorkflowTrace> updateTraces)
|
|
|
{
|
|
|
if (step == null) return;
|
|
|
var nextSteps = steps.Where(d => d.PrevStepId == step.Id).ToList();
|
|
@@ -1886,7 +1924,8 @@ namespace Hotline.FlowEngine.Workflows
|
|
|
EndStepByTerminalCs(step, traces, ref updateSteps, ref updateTraces);
|
|
|
}
|
|
|
|
|
|
- private void EndStepByTerminalCs(WorkflowStep step, List<WorkflowTrace> traces, ref List<WorkflowStep> updateSteps, ref List<WorkflowTrace> updateTraces)
|
|
|
+ private void EndStepByTerminalCs(WorkflowStep step, List<WorkflowTrace> traces,
|
|
|
+ ref List<WorkflowStep> updateSteps, ref List<WorkflowTrace> updateTraces)
|
|
|
{
|
|
|
var isHandled = step.Status is EWorkflowStepStatus.Handled;
|
|
|
var opinion = $"会签未办理完成,由 {_sessionContext.OrgName} 的 {_sessionContext.UserName} 终止办理";
|