xf 2 years ago
parent
commit
6f3721f008
1 changed files with 21 additions and 14 deletions
  1. 21 14
      src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

+ 21 - 14
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -490,20 +490,25 @@ namespace Hotline.FlowEngine.Workflows
         {
             CheckWhetherRunnable(workflow.Status);
 
-            var (currentStepBox, currentStep) = GetUnCompleteStep(workflow.StepBoxes, _sessionContext.RequiredOrgCode, _sessionContext.RequiredUserId);
-            if (currentStepBox.StepType is EStepType.Start)
-                throw UserFriendlyException.SameMessage("当前流程已退回到开始节点");
-            if (currentStepBox.StepType is EStepType.End)
-                throw UserFriendlyException.SameMessage("当前流程已流转到结束节点");
+            //var (currentStepBox, currentStep) = GetUnCompleteStep(workflow.StepBoxes, _sessionContext.RequiredOrgCode, _sessionContext.RequiredUserId);
+            //if (currentStepBox.StepType is EStepType.Start)
+            //    throw UserFriendlyException.SameMessage("当前流程已退回到开始节点");
+            //if (currentStepBox.StepType is EStepType.End)
+            //    throw UserFriendlyException.SameMessage("当前流程已流转到结束节点");
+
 
             var targetStepBox = workflow.StepBoxes.FirstOrDefault(d => d.Code == dto.NextStepCode);
             if (targetStepBox == null)
             {
                 //向后跳转
-                //var nextStepBoxDefine = GetStepBoxDefine(workflow.Definition, dto.NextStepCode);
-                //var isStartCountersign = nextStepBoxDefine.IsStartCountersign(dto.NextHandlers.Count);
+
+                //此场景并非按配置征程流转,取最靠后的节点做为targetStep的prevStep
+                var lastStepBox = workflow.StepBoxes.MaxBy(d => d.CreationTime);
+                if (lastStepBox is null || lastStepBox.StepType is EStepType.End)
+                    throw new UserFriendlyException($"流程流转数据异常,未结束流程出现endStep, flowId: {workflow.Id}", "流程流转数据异常");
+
                 targetStepBox = await CreateStepAsync(isStartCountersign, workflow, targetStepDefine, dto,
-                    EWorkflowStepStatus.Assigned, currentStepBox, currentStep, cancellationToken);
+                    EWorkflowStepStatus.Assigned, lastStepBox, lastStepBox.Steps.First(), cancellationToken);
 
                 await ResetWorkflowCurrentStepInfo(workflow, dto, targetStepBox, isStartCountersign, cancellationToken);
 
@@ -928,12 +933,14 @@ namespace Hotline.FlowEngine.Workflows
         /// 创建节点(不含开始、结束节点)
         /// </summary>
         private async Task<WorkflowStep> CreateStepAsync(
-            bool isPrevStartCountersign,
-            Workflow workflow, StepDefine stepBoxDefine,
-            BasicWorkflowDto dto, EWorkflowStepStatus status,
-            WorkflowStep prevStepBox,
-            WorkflowStep prevStep,
-            CancellationToken cancellationToken = default)
+        bool isPrevStartCountersign,
+        Workflow workflow,
+        StepDefine stepBoxDefine,
+        BasicWorkflowDto dto,
+        EWorkflowStepStatus status,
+        WorkflowStep prevStepBox,
+        WorkflowStep prevStep,
+        CancellationToken cancellationToken = default)
         {
             if (stepBoxDefine.StepType is EStepType.Start or EStepType.End)
                 throw new UserFriendlyException("该方法不支持创建开始或结束节点");