فهرست منبع

fixed: 动态策略及会签策略创建下一节点时,handlerType依据策略判断

xf 1 سال پیش
والد
کامیت
c056416ee4
1فایلهای تغییر یافته به همراه53 افزوده شده و 16 حذف شده
  1. 53 16
      src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

+ 53 - 16
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -915,13 +915,13 @@ namespace Hotline.FlowEngine.Workflows
                     {
                         if (dto.IsStartCountersign)
                         {
-                            //todo 依据会签策略创建会签下一级节点
+                            //依据会签策略创建会签下一级节点
                             nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
                                 flowAssignInfo.FlowAssignType, cancellationToken);
                         }
                         else
                         {
-                            //todo 创建普通节点(根据配置)
+                            //创建普通节点(根据配置)
                             nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto,
                                 flowAssignInfo, EWorkflowTraceStatus.Normal, cancellationToken);
                         }
@@ -948,7 +948,7 @@ namespace Hotline.FlowEngine.Workflows
                     }
                     else
                     {
-                        //todo 依据会签策略创建会签下一级节点
+                        //依据会签策略创建会签下一级节点
                         nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
                             flowAssignInfo.FlowAssignType, cancellationToken);
                     }
@@ -956,20 +956,19 @@ namespace Hotline.FlowEngine.Workflows
             }
             else if (dto.IsStartCountersign) //top
             {
-                //todo 依据会签策略创建会签下一级节点
+                //依据会签策略创建会签下一级节点
                 nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
                     flowAssignInfo.FlowAssignType, cancellationToken);
             }
             else if (currentStep.InstanceMode is EInstanceMode.Dynamic && !currentStep.DynamicShouldTerminal())
             {
-                //todo 创建动态下一级节点
-                nextSteps = await CreateStepsAsync(workflow, nextStepDefine, currentStep, dto,
-                    flowAssignInfo.FlowAssignType, dto.NextHandlers, null, EWorkflowStepStatus.WaitForAccept,
-                    ECountersignPosition.None, false, EWorkflowTraceStatus.Normal, cancellationToken);
+                //创建动态下一级节点
+                nextSteps = await CreateDynamicStepsAsync(workflow, nextStepDefine, currentStep, dto, flowAssignInfo,
+                    cancellationToken);
             }
             else
             {
-                //todo 创建普通节点(根据配置)
+                //创建普通节点(根据配置)
                 nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto, flowAssignInfo,
                     EWorkflowTraceStatus.Normal, cancellationToken);
             }
@@ -977,6 +976,29 @@ namespace Hotline.FlowEngine.Workflows
             return nextSteps;
         }
 
+        private async Task<List<WorkflowStep>> CreateDynamicStepsAsync(
+            Workflow workflow,
+            StepDefine nextStepDefine,
+            WorkflowStep prevStep,
+            BasicWorkflowDto dto,
+            FlowAssignInfo flowAssignInfo,
+            CancellationToken cancellationToken)
+        {
+            var handlerType = nextStepDefine.InstancePolicy switch
+            {
+                EDynamicPolicy.OrgUpCenterTop => EHandlerType.OrgLevel,
+                EDynamicPolicy.OrgUp => EHandlerType.OrgLevel,
+                EDynamicPolicy.OrgDownCenterTop => EHandlerType.OrgLevel,
+                EDynamicPolicy.OrgDown => EHandlerType.OrgLevel,
+                null => throw new ArgumentOutOfRangeException(),
+                _ => throw new ArgumentOutOfRangeException()
+            };
+
+            return await CreateStepsAsync(workflow, nextStepDefine, prevStep, dto,
+                flowAssignInfo.FlowAssignType, dto.NextHandlers, null, EWorkflowStepStatus.WaitForAccept,
+                ECountersignPosition.None, false, EWorkflowTraceStatus.Normal, handlerType, cancellationToken);
+        }
+
         private Task<List<WorkflowStep>> CreateCountersignStepsAsync(
             Workflow workflow,
             StepDefine stepDefine,
@@ -989,10 +1011,20 @@ namespace Hotline.FlowEngine.Workflows
         {
             var countersignId = prevStep.IsStartCountersign ? prevStep.StartCountersignId : prevStep.CountersignId;
 
+            var handlerType = stepDefine.CountersignPolicy switch
+            {
+                EDynamicPolicy.OrgUpCenterTop => EHandlerType.OrgLevel,
+                EDynamicPolicy.OrgUp => EHandlerType.OrgLevel,
+                EDynamicPolicy.OrgDownCenterTop => EHandlerType.OrgLevel,
+                EDynamicPolicy.OrgDown => EHandlerType.OrgLevel,
+                null => throw new ArgumentOutOfRangeException(),
+                _ => throw new ArgumentOutOfRangeException()
+            };
+
             return CreateStepsAsync(workflow, stepDefine, prevStep, dto, flowAssignType, dto.NextHandlers,
                 countersignId,
                 EWorkflowStepStatus.WaitForAccept, prevStep.GetNextStepCountersignPosition(),
-                false, EWorkflowTraceStatus.Normal, cancellationToken);
+                false, EWorkflowTraceStatus.Normal, handlerType, cancellationToken);
         }
 
         /// <summary>
@@ -1441,7 +1473,7 @@ namespace Hotline.FlowEngine.Workflows
                 : (await CreateStepsAsync(workflow, targetStepDefine, targetPrevStep, dto,
                     flowAssignInfo.FlowAssignType, dto.NextHandlers,
                     null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, true, traceStatus,
-                    cancellationToken)).First();
+                    null, cancellationToken)).First();
 
 
             //更新当前办理节点信息
@@ -1538,7 +1570,7 @@ namespace Hotline.FlowEngine.Workflows
 
             return await CreateStepsAsync(workflow, stepDefine, prevStep, dto, flowAssignInfo.FlowAssignType, handlers,
                 null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, true, traceStatus,
-                cancellationToken);
+                null, cancellationToken);
         }
 
         private async Task<List<WorkflowStep>> CreateStepsAsync(
@@ -1554,7 +1586,8 @@ namespace Hotline.FlowEngine.Workflows
             //DateTime expiredTime,
             bool isOrigin,
             EWorkflowTraceStatus traceStatus,
-            CancellationToken cancellationToken
+            EHandlerType? handlerType = null,
+            CancellationToken cancellationToken = default
         )
         {
             //var countersignId = prevStep.IsStartCountersign
@@ -1568,7 +1601,7 @@ namespace Hotline.FlowEngine.Workflows
                 {
                     var step = CreateStep(stepDefine, prevStep, workflow.Id, flowAssignType, new List<Kv> { handler },
                         dto.NextStepCode, dto.NextMainHandler, countersignId,
-                        stepStatus, csPosition, workflow.ExpiredTime, dto.NextStepName, isOrigin);
+                        stepStatus, csPosition, workflow.ExpiredTime, dto.NextStepName, isOrigin, handlerType);
 
                     steps.Add(step);
                 }
@@ -1577,7 +1610,7 @@ namespace Hotline.FlowEngine.Workflows
             {
                 var step = CreateStep(stepDefine, prevStep, workflow.Id, flowAssignType, handlers,
                     dto.NextStepCode, dto.NextMainHandler, countersignId,
-                    stepStatus, csPosition, workflow.ExpiredTime, dto.NextStepName, isOrigin);
+                    stepStatus, csPosition, workflow.ExpiredTime, dto.NextStepName, isOrigin, handlerType);
 
                 steps.Add(step);
             }
@@ -1641,7 +1674,8 @@ namespace Hotline.FlowEngine.Workflows
             ECountersignPosition countersignPosition,
             DateTime expiredTime,
             string stepName,
-            bool isOrigin
+            bool isOrigin,
+            EHandlerType? handlerType = null//动态节点依据动态策略判断
         )
         {
             if (!handlers.Any())
@@ -1665,6 +1699,9 @@ namespace Hotline.FlowEngine.Workflows
             step.IsOrigin = isOrigin;
             step.Name = stepName;
 
+            if (handlerType.HasValue)
+                step.HandlerType = handlerType.Value;
+
             return step;
         }