Browse Source

需求变更:会签结束后依然可以退回,退回操作遇到会签节点自动跳过会签流程回到发起会签节点

xfe 1 year ago
parent
commit
efff369c42
1 changed files with 45 additions and 6 deletions
  1. 45 6
      src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

+ 45 - 6
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -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} 终止办理";