Selaa lähdekoodia

调整流程退回接口,action增加currentStep参数

xf 2 kuukautta sitten
vanhempi
commit
c8c154c3c5

+ 19 - 9
src/Hotline.Api/Controllers/OrderController.cs

@@ -5524,7 +5524,7 @@ public class OrderController : BaseController
 
                 var (workflow, currentStep1, prevDefine, prevStep1, newStep, flowDirection) =
                     await _workflowApplication.PreviousAsync(dto,
-                        async (workflow1, prevStepDefine, prevStep1, newStep) =>
+                        async (workflow1, currentStep1, prevStepDefine, prevStep1, newStep) =>
                         {
                             var stepAssignInfo =
                                 await _orderApplication.GetOrderPreviousAssignInfoAsync(workflow1, prevStepDefine, prevStep1,
@@ -5571,7 +5571,7 @@ public class OrderController : BaseController
 
             var (workflow, currentStep1, prevDefine, prevStep1, newStep, flowDirection) =
                 await _workflowApplication.PreviousAsync(dto,
-                    async (workflow1, prevStepDefine, prevStep1, newStep) =>
+                    async (workflow1, currentStep1, prevStepDefine, prevStep1, newStep) =>
                     {
                         var stepAssignInfo =
                             await _orderApplication.GetOrderPreviousAssignInfoAsync(workflow1, prevStepDefine, prevStep1, HttpContext.RequestAborted);
@@ -5668,7 +5668,7 @@ public class OrderController : BaseController
             var (workflow, currentStep1, prevDefine, prevStep1, newStep, flowDirection) =
                 await _workflowApplication.PreviousAsync(sendBack.SendBackData,
                     sendBack.WorkflowUserId, sendBack.WorkflowOrgId, sendBack.WorkflowRoleIds.ToArray(),
-                    async (workflow1, prevStepDefine, prevStep1, newStep) =>
+                    async (workflow1, currentStep1, prevStepDefine, prevStep1, newStep) =>
                     {
                         var stepAssignInfo =
                             await _orderApplication.GetOrderPreviousAssignInfoAsync(workflow1, prevStepDefine,
@@ -5764,7 +5764,7 @@ public class OrderController : BaseController
                 var (workflow, currentStep1, prevDefine, prevStep1, newStep, flowDirection) =
                     await _workflowApplication.PreviousAsync(sendBack.SendBackData,
                         sendBack.WorkflowUserId, sendBack.WorkflowOrgId, sendBack.WorkflowRoleIds.ToArray(),
-                        async (workflow1, prevStepDefine, prevStep1, newStep) =>
+                        async (workflow1, currentStep1, prevStepDefine, prevStep1, newStep) =>
                         {
                             var stepAssignInfo =
                                 await _orderApplication.GetOrderPreviousAssignInfoAsync(workflow1, prevStepDefine,
@@ -6186,8 +6186,13 @@ public class OrderController : BaseController
                 async (workflow, currentStep, targetStepDefine, targetStep, targetStepNew) =>
                 {
                     var basicWorkflowDto = _mapper.Map<BasicWorkflowDto>(dto);
-                    return await _orderApplication.GetOrderRecallAssignInfoAsync(workflow, targetStepDefine, targetStep,
+                    var stepAssignInfo = await _orderApplication.GetOrderRecallAssignInfoAsync(workflow, targetStepDefine, targetStep,
                         basicWorkflowDto, HttpContext.RequestAborted);
+                    if (stepAssignInfo is null) return;
+                    var validator = new StepAssignInfoValidator();
+                    await validator.ValidateAndThrowAsync(stepAssignInfo, HttpContext.RequestAborted);
+
+                    targetStepNew.Assign(stepAssignInfo);
                 },
                 HttpContext.RequestAborted);
 
@@ -6403,10 +6408,15 @@ public class OrderController : BaseController
                     recall, recall.NextHandlers.FirstOrDefault(), EWorkflowTraceType.Redo,
                     endTime, order.Status >= EOrderStatus.Filed, EHandleMode.Redo,
                     async (workflow, currentStep, targetStepDefine, targetStep, targetStepNew) =>
-                        recall.NextHandlers.FirstOrDefault()
-                        ?? await _orderApplication.GetOrderRecallAssignInfoAsync(workflow, targetStepDefine, targetStep,
-                            recall, HttpContext.RequestAborted), 
-                    HttpContext.RequestAborted);
+                    {
+                        var stepAssignInfo = recall.NextHandlers.FirstOrDefault()
+                                             ?? await _orderApplication.GetOrderRecallAssignInfoAsync(workflow, targetStepDefine, targetStep,
+                                                 recall, HttpContext.RequestAborted);
+                        if (stepAssignInfo is null) return;
+                        var validator = new StepAssignInfoValidator();
+                        await validator.ValidateAndThrowAsync(stepAssignInfo, HttpContext.RequestAborted);
+                        targetStepNew.Assign(stepAssignInfo);
+                    }, HttpContext.RequestAborted);
 
             //记录特提后最新的流程节点
             if (!string.IsNullOrEmpty(newStep.Id))

+ 6 - 6
src/Hotline.Application/FlowEngine/IWorkflowApplication.cs

@@ -47,19 +47,19 @@ namespace Hotline.Application.FlowEngine
         /// 退回(返回前一节点)
         /// </summary>
         Task<(Workflow workflow, WorkflowStep currentStep, StepDefine prevDefine,
-            WorkflowStep prevStep, WorkflowStep newStep, EFlowDirection flowDirection)> 
+                WorkflowStep prevStep, WorkflowStep newStep, EFlowDirection flowDirection)>
             PreviousAsync(PreviousWorkflowDto dto,
-            Action<Workflow, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
-            CancellationToken cancellationToken = default);
+                Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? newStepConfig = null,
+                CancellationToken cancellationToken = default);
 
         /// <summary>
         /// 工单退回(返回前一节点)
         /// </summary>
         Task<(Workflow workflow, WorkflowStep currentStep, StepDefine prevDefine,
-            WorkflowStep prevStep, WorkflowStep newStep, EFlowDirection flowDirection)> 
+                WorkflowStep prevStep, WorkflowStep newStep, EFlowDirection flowDirection)>
             PreviousAsync(PreviousWorkflowDto dto, string applicantId, string applicantOrgId, string[] applicantRoleIds,
-            Action<Workflow, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
-            CancellationToken cancellationToken = default);
+                Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? newStepConfig = null,
+                CancellationToken cancellationToken = default);
 
         ///// <summary>
         ///// 撤回至任意节点

+ 8 - 8
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -345,10 +345,10 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     /// 退回(返回前一节点)
     /// </summary>
     public async Task<(Workflow workflow, WorkflowStep currentStep, StepDefine prevDefine,
-        WorkflowStep prevStep, WorkflowStep newStep, EFlowDirection flowDirection)>
+            WorkflowStep prevStep, WorkflowStep newStep, EFlowDirection flowDirection)>
         PreviousAsync(PreviousWorkflowDto dto,
-        Action<Workflow, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
-        CancellationToken cancellationToken = default)
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? newStepConfig = null,
+            CancellationToken cancellationToken = default)
     {
         var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, withDefine: true, withSteps: true,
             withTraces: true, withCountersigns: true, cancellationToken: cancellationToken);
@@ -358,17 +358,17 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             _sessionContextProvider.SessionContext.RequiredOrgId, _sessionContextProvider.SessionContext.OrgName,
             _sessionContextProvider.SessionContext.OrgAreaCode, _sessionContextProvider.SessionContext.OrgAreaName,
             _sessionContextProvider.SessionContext.OrgIsCenter, _sessionContextProvider.SessionContext.Roles,
-            _sessionContextProvider.SessionContext.OrgLevel), stepConfig, cancellationToken);
+            _sessionContextProvider.SessionContext.OrgLevel), newStepConfig, cancellationToken);
     }
 
     /// <summary>
     /// 工单退回(返回前一节点)
     /// </summary>
     public async Task<(Workflow workflow, WorkflowStep currentStep, StepDefine prevDefine,
-        WorkflowStep prevStep, WorkflowStep newStep, EFlowDirection flowDirection)>
+            WorkflowStep prevStep, WorkflowStep newStep, EFlowDirection flowDirection)>
         PreviousAsync(PreviousWorkflowDto dto, string applicantId, string applicantOrgId, string[] applicantRoleIds,
-        Action<Workflow, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
-        CancellationToken cancellationToken = default)
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? newStepConfig = null,
+            CancellationToken cancellationToken = default)
     {
         var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, withDefine: true, withSteps: true,
             withTraces: true, withCountersigns: true, cancellationToken: cancellationToken);
@@ -381,7 +381,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             applicantOrgId, user.Organization.Name,
             user.Organization.AreaCode, user.Organization.AreaName,
             user.Organization.IsCenter, applicantRoleIds,
-            user.Organization.Level), stepConfig, cancellationToken);
+            user.Organization.Level), newStepConfig, cancellationToken);
     }
 
     ///// <summary>

+ 9 - 2
src/Hotline.Application/Orders/OrderApplication.cs

@@ -4075,8 +4075,15 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 recall, recall.NextHandlers.FirstOrDefault(), EWorkflowTraceType.Recall,
                 order.ExpiredTime, order.Status >= EOrderStatus.Filed, EHandleMode.Recall,
                 async (workflow, currentStep, targetStepDefine, targetStep, targetStepNew) =>
-                    recall.NextHandlers.FirstOrDefault()
-                    ?? await GetOrderRecallAssignInfoAsync(workflow, targetStepDefine, targetStep, recall, cancellation),
+                {
+                    var stepAssignInfo = recall.NextHandlers.FirstOrDefault()
+                                         ?? await GetOrderRecallAssignInfoAsync(workflow, targetStepDefine, targetStep,
+                                             recall, cancellation);
+                    if (stepAssignInfo is null) return;
+                    var validator = new StepAssignInfoValidator();
+                    await validator.ValidateAndThrowAsync(stepAssignInfo, cancellation);
+                    targetStepNew.Assign(stepAssignInfo);
+                },
                 cancellation);
 
         if (_appOptions.Value.IsZiGong && dto.BusinessType == EBusinessType.Send)

+ 11 - 17
src/Hotline/FlowEngine/Workflows/IWorkflowDomainService.cs

@@ -32,7 +32,7 @@ namespace Hotline.FlowEngine.Workflows
         /// new 
         /// </summary>
         Task<(Workflow, WorkflowStep)> StartAsync(StartWorkflowDto dto, string externalId, DateTime? expiredTime = null,
-            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? stepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? newStepConfig = null,
             CancellationToken cancellationToken = default);
 
         /// <summary>
@@ -40,14 +40,14 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         Task<(Workflow, WorkflowStep, StepDefine, List<WorkflowStep>)> NextAsync(ISessionContext current, NextWorkflowDto dto,
             DateTime? expiredTime = null, bool isAutoFillSummaryOpinion = false,
-            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? stepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? newStepConfig = null,
             CancellationToken cancellationToken = default);
 
         /// <summary>
         /// 开启流程并办理至第一个节点
         /// </summary>
         Task<List<WorkflowStep>> StartToFirstStepAsync(StartWorkflowDto dto, string externalId, DateTime? expiredTime = null,
-            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? stepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? newStepConfig = null,
             CancellationToken cancellationToken = default);
 
         /// <summary>
@@ -89,11 +89,11 @@ namespace Hotline.FlowEngine.Workflows
         /// <summary>
         /// 退回(new)
         /// </summary>
-        Task<(Workflow workflow, WorkflowStep currentStep, StepDefine prevDefine, 
-            WorkflowStep prevStep, WorkflowStep newStep, EFlowDirection flowDirection)> PreviousAsync
+        Task<(Workflow workflow, WorkflowStep currentStep, StepDefine prevDefine,
+                WorkflowStep prevStep, WorkflowStep newStep, EFlowDirection flowDirection)> PreviousAsync
             (Workflow workflow, PreviousWorkflowDto dto, OperatorInfo operatorInfo,
-            Action<Workflow, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
-            CancellationToken cancellationToken = default);
+                Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? newStepConfig = null,
+                CancellationToken cancellationToken = default);
 
         /// <summary>
         /// 撤回(返回到之前任意节点)
@@ -101,28 +101,22 @@ namespace Hotline.FlowEngine.Workflows
         Task<(Workflow, StepDefine, WorkflowStep, WorkflowStep, WorkflowStep, bool)> RecallAsync(
             RecallDto dto, StepAssignInfo stepAssignInfo,
             EWorkflowTraceType traceType, DateTime? expiredTime, bool isOrderFiled, EHandleMode handleMode,
-            Func<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep, Task<StepAssignInfo?>>? newStepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? newStepConfig = null,
             CancellationToken cancellationToken = default);
 
         Task<(Workflow, StepDefine, WorkflowStep, WorkflowStep, WorkflowStep, bool)> RecallAsync(
             Workflow workflow, BasicWorkflowDto dto, StepAssignInfo stepAssignInfo,
             StepDefine targetStepDefine, EWorkflowTraceType traceType, DateTime? expiredTime, bool isOrderFiled, EHandleMode handleMode,
-            Func<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep, Task<StepAssignInfo?>>? newStepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? newStepConfig = null,
             CancellationToken cancellationToken = default);
 
         Task<(Workflow, StepDefine, WorkflowStep, WorkflowStep, WorkflowStep, bool)> RecallAsync(
             Workflow workflow, BasicWorkflowDto dto, StepAssignInfo stepAssignInfo,
             WorkflowStep targetStep, EWorkflowTraceType traceType,
             DateTime? expiredTime, bool isOrderFiled, EHandleMode handleMode,
-            Func<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep, Task<StepAssignInfo?>>? newStepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? newStepConfig = null,
             CancellationToken cancellationToken = default);
 
-        // Task<bool> RecallAsync(Workflow workflow, BasicWorkflowDto dto, StepAssignInfo stepAssignInfo,
-        //     StepDefine targetStepDefine, WorkflowStep targetStep, EWorkflowTraceType traceType,
-        //     DateTime? expiredTime, bool isOrderFiled, EHandleMode handleMode,
-        //     Action<Workflow, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
-        //     CancellationToken cancellationToken = default);
-
         /// <summary>
         /// 撤回至开始节点
         /// </summary>
@@ -205,7 +199,7 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         WorkflowStep CreateStartStep(Workflow workflow, StepDefine startStepDefine, BasicWorkflowDto dto, UserInfo assigner,
             StepAssignInfo handler, DateTime? expiredTime, //EFlowAssignType? flowAssignType = EFlowAssignType.User,
-            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? stepConfig = null);
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? newStepConfig = null);
 
         /// <summary>
         /// 查询未完成节点

+ 35 - 75
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -167,7 +167,7 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         public async Task<(Workflow, WorkflowStep)> StartAsync(StartWorkflowDto dto,
             string externalId, DateTime? expiredTime = null,
-            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? stepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? newStepConfig = null,
             CancellationToken cancellationToken = default)
         {
             //     var validator = new StartWorkflowDtoValidator();
@@ -236,7 +236,7 @@ namespace Hotline.FlowEngine.Workflows
                 RoleName = defineHandler.Value,
                 FlowAssignType = EFlowAssignType.User
             };
-            var startStep = CreateStartStep(workflow, startStepDefine, dto, assigner, handler, expiredTime, stepConfig);
+            var startStep = CreateStartStep(workflow, startStepDefine, dto, assigner, handler, expiredTime, newStepConfig);
 
             if (dto.Files.Any())
                 startStep.FileJson =
@@ -286,7 +286,7 @@ namespace Hotline.FlowEngine.Workflows
         public async Task<(Workflow, WorkflowStep, StepDefine, List<WorkflowStep>)> NextAsync(
             ISessionContext current, NextWorkflowDto dto,
             DateTime? expiredTime = null, bool isAutoFillSummaryOpinion = false,
-            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? stepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? newStepConfig = null,
             CancellationToken cancellationToken = default)
         {
             var workflow = await GetWorkflowAsync(dto.WorkflowId, withDefine: true, withSteps: true,
@@ -559,7 +559,7 @@ namespace Hotline.FlowEngine.Workflows
             //创建下一/N个节点(会签汇总节点:会签未全部办理时不创建,最后一个会签办理节点创建会签汇总节点)
             var nextSteps = await CreateNextStepsAsync(workflow, currentStep, dto,
                 nextStepDefine, assigner, isNextDynamic, expiredTime, dto.IsStartCountersign,
-                isAutoFillSummaryOpinion, stepConfig, cancellationToken);
+                isAutoFillSummaryOpinion, newStepConfig, cancellationToken);
 
             // //更新办理对象(nextSteps无元素表示当前节点为会签办理节点且当前会签没有全部办理完成)
             // workflow.UpdateHandlers(current.RequiredUserId, current.RequiredOrgId,
@@ -598,15 +598,15 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         public async Task<List<WorkflowStep>> StartToFirstStepAsync(StartWorkflowDto dto,
             string externalId, DateTime? expiredTime = null,
-            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? stepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? newStepConfig = null,
             CancellationToken cancellationToken = default)
         {
-            var (workflow, startStep) = await StartAsync(dto, externalId, expiredTime, stepConfig, cancellationToken);
+            var (workflow, startStep) = await StartAsync(dto, externalId, expiredTime, newStepConfig, cancellationToken);
             var nextDto = _mapper.Map<NextWorkflowDto>(dto);
             nextDto.WorkflowId = workflow.Id;
             nextDto.StepId = startStep.Id;
             var (_, _, _, nextSteps) =
-                await NextAsync(_sessionContextProvider.SessionContext, nextDto, expiredTime, true, stepConfig, cancellationToken);
+                await NextAsync(_sessionContextProvider.SessionContext, nextDto, expiredTime, true, newStepConfig, cancellationToken);
             return nextSteps;
         }
 
@@ -886,7 +886,7 @@ namespace Hotline.FlowEngine.Workflows
         public async Task<(Workflow workflow, WorkflowStep currentStep, StepDefine prevDefine,
                 WorkflowStep prevStep, WorkflowStep newStep, EFlowDirection flowDirection)>
             PreviousAsync(Workflow workflow, PreviousWorkflowDto dto, OperatorInfo operatorInfo,
-                Action<Workflow, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
+                Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? newStepConfig = null,
                 CancellationToken cancellationToken = default)
         {
             //ValidatePermission(workflow, operater.OrgId, operater.Id);
@@ -971,7 +971,7 @@ namespace Hotline.FlowEngine.Workflows
 
             var prevStepDefine = workflow.WorkflowDefinition.FindStepDefine(prevStep.Code);
             //复制上一个节点为待接办
-            var newPrevStep = DuplicateStep(workflow, prevStepDefine, prevStep, EWorkflowTraceType.Previous, dto.ExpiredTime, stepConfig);
+            var newPrevStep = DuplicateStep(workflow, prevStepDefine, prevStep, EWorkflowTraceType.Previous, dto.ExpiredTime);
             //退给派单组节点,需按照平均分配原则派给一个派单员 禅道299 TODO
             if (dto.Handler != null) //todo 改为按策略判断
             {
@@ -979,6 +979,7 @@ namespace Hotline.FlowEngine.Workflows
                 newPrevStep.Assign(handle.UserId, handle.Username, handle.OrgId, handle.OrgName, handle.RoleId, handle.RoleName);
             }
 
+            await Task.Run(() => newStepConfig?.Invoke(workflow, currentStep, prevStepDefine, prevStep, newPrevStep), cancellationToken);
             await _workflowStepRepository.AddAsync(newPrevStep, cancellationToken);
             await CreateTraceAsync(workflow, newPrevStep, EWorkflowTraceType.Previous, cancellationToken);
 
@@ -1526,7 +1527,7 @@ namespace Hotline.FlowEngine.Workflows
         public async Task<(Workflow, StepDefine, WorkflowStep, WorkflowStep, WorkflowStep, bool)> RecallAsync(
             RecallDto dto, StepAssignInfo stepAssignInfo,
             EWorkflowTraceType traceType, DateTime? expiredTime, bool isOrderFiled, EHandleMode handleMode,
-            Func<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep, Task<StepAssignInfo?>>? newStepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? newStepConfig = null,
             CancellationToken cancellationToken = default)
         {
             var workflow = await GetWorkflowAsync(dto.WorkflowId, withDefine: true, withSteps: true,
@@ -1550,7 +1551,7 @@ namespace Hotline.FlowEngine.Workflows
         public Task<(Workflow, StepDefine, WorkflowStep, WorkflowStep, WorkflowStep, bool)> RecallAsync(
             Workflow workflow, BasicWorkflowDto dto, StepAssignInfo stepAssignInfo,
             StepDefine targetStepDefine, EWorkflowTraceType traceType, DateTime? expiredTime, bool isOrderFiled, EHandleMode handleMode,
-            Func<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep, Task<StepAssignInfo?>>? newStepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? newStepConfig = null,
             CancellationToken cancellationToken = default)
         {
             var targetStep = workflow.Steps.FirstOrDefault(d => d.Code == dto.NextStepCode && d.IsOrigin);
@@ -1565,7 +1566,7 @@ namespace Hotline.FlowEngine.Workflows
         public Task<(Workflow, StepDefine, WorkflowStep, WorkflowStep, WorkflowStep, bool)> RecallAsync(
             Workflow workflow, BasicWorkflowDto dto, StepAssignInfo stepAssignInfo,
             WorkflowStep targetStep, EWorkflowTraceType traceType, DateTime? expiredTime, bool isOrderFiled, EHandleMode handleMode,
-            Func<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep, Task<StepAssignInfo?>>? newStepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? newStepConfig = null,
             CancellationToken cancellationToken = default)
         {
             var targetStepDefine = GetStepDefine(workflow.WorkflowDefinition, dto.NextStepCode);
@@ -1588,7 +1589,7 @@ namespace Hotline.FlowEngine.Workflows
                 Workflow workflow, BasicWorkflowDto dto, StepAssignInfo stepAssignInfo,
                 StepDefine targetStepDefine, WorkflowStep targetStep, EWorkflowTraceType traceType,
                 DateTime? expiredTime, bool isOrderFiled, EHandleMode handleMode,
-                Func<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep, Task<StepAssignInfo?>>? newStepConfig = null,
+                Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? newStepConfig = null,
                 CancellationToken cancellationToken = default)
         {
             var targetIsStartStep = targetStepDefine.StepType is EStepType.Start;
@@ -1703,18 +1704,7 @@ namespace Hotline.FlowEngine.Workflows
                 //     stepAssignInfo, traceType, expiredTime, stepConfig, cancellationToken);
 
                 targetStepNew = CreateStartStep(workflow, targetStepDefine, dto, assigner, stepAssignInfo, expiredTime);
-                //stepConfig?.Invoke(workflow, currentStep, targetStepDefine, targetStep, targetStepNew);
-                if (newStepConfig is not null)
-                {
-                    var handler = await newStepConfig.Invoke(workflow, currentStep, targetStepDefine, targetStep, targetStepNew);
-                    if (handler is not null)
-                    {
-                        var validator = new StepAssignInfoValidator();
-                        await validator.ValidateAndThrowAsync(handler, cancellationToken);
-                        targetStepNew.Assign(handler);
-                    }
-                }
-
+                await Task.Run(() => newStepConfig?.Invoke(workflow, currentStep, targetStepDefine, targetStep, targetStepNew), cancellationToken);
                 await _workflowStepRepository.AddAsync(targetStepNew, cancellationToken);
                 workflow.Steps.Add(targetStepNew);
                 await CreateTraceAsync(workflow, targetStepNew, traceType, cancellationToken);
@@ -1728,18 +1718,7 @@ namespace Hotline.FlowEngine.Workflows
                 targetStepNew = CreateStep(workflow, targetStepDefine, targetPrevStep, stepAssignInfo, assigner,
                     dto.NextStepCode, null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, expiredTime,
                     dto.NextStepName, true, true, null, dto.BusinessType, dto.FlowDirection);
-                //stepConfig?.Invoke(workflow, currentStep, targetStepDefine, targetStep, targetStepNew);
-                if (newStepConfig is not null)
-                {
-                    var handler = await newStepConfig.Invoke(workflow, currentStep, targetStepDefine, targetStep, targetStepNew);
-                    if (handler is not null)
-                    {
-                        var validator = new StepAssignInfoValidator();
-                        await validator.ValidateAndThrowAsync(handler, cancellationToken);
-                        targetStepNew.Assign(handler);
-                    }
-                }
-
+                await Task.Run(() => newStepConfig?.Invoke(workflow, currentStep, targetStepDefine, targetStep, targetStepNew), cancellationToken);
                 await _workflowStepRepository.AddAsync(targetStepNew, cancellationToken);
                 workflow.Steps.Add(targetStepNew);
                 await CreateTraceAsync(workflow, targetStepNew, traceType, cancellationToken);
@@ -2026,7 +2005,7 @@ namespace Hotline.FlowEngine.Workflows
             Workflow workflow, StepDefine startStepDefine,
             BasicWorkflowDto dto, UserInfo assigner, StepAssignInfo handler, DateTime? expiredTime,
             //EFlowAssignType? flowAssignType = EFlowAssignType.User,
-            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? stepConfig = null)
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? newStepConfig = null)
         {
             //startstep
             var nextSteps = _mapper.Map<List<StepSimple>>(startStepDefine.NextSteps);
@@ -2060,14 +2039,7 @@ namespace Hotline.FlowEngine.Workflows
 
             startStep.InitId();
 
-            // if (stepConfig != null)
-            // {
-            //     var stepAssignInfo = stepConfig(workflow, startStepDefine, null);
-            //     var validator = new StepAssignInfoValidator();
-            //     validator.ValidateAndThrow(stepAssignInfo);
-            //     startStep.Assign(stepAssignInfo);
-            // }
-            stepConfig?.Invoke(workflow, null, startStepDefine, startStep);
+            newStepConfig?.Invoke(workflow, null, startStepDefine, startStep);
 
             return startStep;
         }
@@ -2448,7 +2420,7 @@ namespace Hotline.FlowEngine.Workflows
         private async Task<List<WorkflowStep>> CreateNextStepsAsync(Workflow workflow, WorkflowStep currentStep,
             BasicWorkflowDto dto, StepDefine nextStepDefine, UserInfo assigner, bool isNextDynamic,
             DateTime? expiredTime, bool isStartCountersign, bool isAutoFillSummaryOpinion = false,
-            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? stepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? newStepConfig = null,
             CancellationToken cancellationToken = default)
         {
             List<WorkflowStep> nextSteps = new();
@@ -2464,13 +2436,13 @@ namespace Hotline.FlowEngine.Workflows
                         {
                             //依据会签策略创建会签下一级节点
                             nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
-                                assigner, expiredTime, stepConfig, cancellationToken);
+                                assigner, expiredTime, newStepConfig, cancellationToken);
                         }
                         else
                         {
                             //创建普通节点(根据配置)
                             nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto, assigner,
-                                EWorkflowTraceType.Normal, expiredTime, isAutoFillSummaryOpinion, stepConfig, cancellationToken);
+                                EWorkflowTraceType.Normal, expiredTime, isAutoFillSummaryOpinion, newStepConfig, cancellationToken);
                         }
                     }
                     else
@@ -2489,7 +2461,7 @@ namespace Hotline.FlowEngine.Workflows
                         {
                             //依据会签策略创建会签下一级节点
                             nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
-                                assigner, expiredTime, stepConfig, cancellationToken);
+                                assigner, expiredTime, newStepConfig, cancellationToken);
                         }
                     }
                 }
@@ -2505,7 +2477,7 @@ namespace Hotline.FlowEngine.Workflows
                     {
                         //依据会签策略创建会签下一级节点
                         nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
-                            assigner, expiredTime, stepConfig, cancellationToken);
+                            assigner, expiredTime, newStepConfig, cancellationToken);
                     }
                 }
             }
@@ -2513,19 +2485,19 @@ namespace Hotline.FlowEngine.Workflows
             {
                 //依据会签策略创建会签下一级节点
                 nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
-                    assigner, expiredTime, stepConfig, cancellationToken);
+                    assigner, expiredTime, newStepConfig, cancellationToken);
             }
             else if (isNextDynamic)
             {
                 //创建动态下一级节点
                 nextSteps = await CreateDynamicStepsAsync(workflow, nextStepDefine, currentStep, dto, assigner,
-                    expiredTime, stepConfig, cancellationToken);
+                    expiredTime, newStepConfig, cancellationToken);
             }
             else
             {
                 //创建普通节点(根据配置)
                 nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto, assigner,
-                    EWorkflowTraceType.Normal, expiredTime, isAutoFillSummaryOpinion, stepConfig, cancellationToken);
+                    EWorkflowTraceType.Normal, expiredTime, isAutoFillSummaryOpinion, newStepConfig, cancellationToken);
             }
 
             return nextSteps;
@@ -2551,7 +2523,7 @@ namespace Hotline.FlowEngine.Workflows
             BasicWorkflowDto dto,
             UserInfo assigner,
             DateTime? expiredTime,
-            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? stepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? newStepConfig = null,
             CancellationToken cancellationToken = default)
         {
             var handlerType = nextStepDefine.InstancePolicy switch
@@ -2573,7 +2545,7 @@ namespace Hotline.FlowEngine.Workflows
             return await CreateStepsAsync(workflow, nextStepDefine, currentStep, dto, assigner,
                 dto.NextHandlers, null, EWorkflowStepStatus.WaitForAccept,
                 ECountersignPosition.None, false, EWorkflowTraceType.Normal, handlerType, expiredTime,
-                stepConfig: stepConfig, cancellationToken: cancellationToken);
+                newStepConfig: newStepConfig, cancellationToken: cancellationToken);
         }
 
         private Task<List<WorkflowStep>> CreateCountersignStepsAsync(
@@ -2583,7 +2555,7 @@ namespace Hotline.FlowEngine.Workflows
             BasicWorkflowDto dto,
             UserInfo assigner,
             DateTime? expiredTime,
-            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? stepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? newStepConfig = null,
             CancellationToken cancellationToken = default
         )
         {
@@ -2599,7 +2571,7 @@ namespace Hotline.FlowEngine.Workflows
 
             return CreateStepsAsync(workflow, stepDefine, currentStep, dto, assigner, dto.NextHandlers,
                 countersignId, EWorkflowStepStatus.WaitForAccept, nextStepCountersignPosition,
-                false, EWorkflowTraceType.Normal, handlerType, expiredTime, stepConfig: stepConfig, cancellationToken: cancellationToken);
+                false, EWorkflowTraceType.Normal, handlerType, expiredTime, newStepConfig: newStepConfig, cancellationToken: cancellationToken);
         }
 
         /// <summary>
@@ -2922,8 +2894,7 @@ namespace Hotline.FlowEngine.Workflows
         //new
         private WorkflowStep DuplicateStep(
             Workflow workflow, StepDefine stepDefine, WorkflowStep step,
-            EWorkflowTraceType traceType, DateTime? expiredTime,
-            Action<Workflow, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null)
+            EWorkflowTraceType traceType, DateTime? expiredTime)
         {
             var newStep = _mapper.Map<WorkflowStep>(step);
             newStep.Reset();
@@ -2941,17 +2912,6 @@ namespace Hotline.FlowEngine.Workflows
 
             newStep.Assign(step, EFlowAssignType.User);
 
-            stepConfig?.Invoke(workflow, stepDefine, step, newStep);
-
-            // if (stepConfig != null)
-            // {
-            //     //workflow, targetStepDefine, targetStep 
-            //     var stepAssignInfo = stepConfig(workflow, stepDefine, step);
-            //     var validator = new StepAssignInfoValidator();
-            //     validator.ValidateAndThrow(stepAssignInfo);
-            //     step.Assign(stepAssignInfo);
-            // }
-
             // //退回场景:指派给原办理人,其余场景:按照原节点原始指派方式复制 //todo 重构为参数传入办理对象
             // if (traceType is EWorkflowTraceType.Previous)
             // {
@@ -3381,7 +3341,7 @@ namespace Hotline.FlowEngine.Workflows
             EWorkflowTraceType traceType,
             DateTime? expiredTime,
             bool isAutoFillSummaryOpinion = false,
-            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? stepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? newStepConfig = null,
             CancellationToken cancellationToken = default)
         {
             string? opinion = null;
@@ -3391,7 +3351,7 @@ namespace Hotline.FlowEngine.Workflows
             return await CreateStepsAsync(workflow, stepDefine, currentStep, dto,
                 assigner, dto.NextHandlers, null,
                 EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None,
-                true, traceType, null, expiredTime, opinion, stepConfig, cancellationToken);
+                true, traceType, null, expiredTime, opinion, newStepConfig, cancellationToken);
         }
 
         private async Task<List<WorkflowStep>> CreateStepsAsync(
@@ -3410,7 +3370,7 @@ namespace Hotline.FlowEngine.Workflows
             EHandlerType? handlerType = null,
             DateTime? expiredTime = null,
             string? opinion = null,
-            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? stepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? newStepConfig = null,
             CancellationToken cancellationToken = default
         )
         {
@@ -3423,7 +3383,7 @@ namespace Hotline.FlowEngine.Workflows
                     dto.NextStepName, isOrigin, isMain, handlerType, dto.BusinessType, dto.FlowDirection, opinion);
 
                 //workflow, currentStep, nextStepDefine, nextStep
-                stepConfig?.Invoke(workflow, currentStep, stepDefine, step);
+                await Task.Run(() => newStepConfig?.Invoke(workflow, currentStep, stepDefine, step), cancellationToken);
                 // if (stepConfig != null)
                 // {
                 //     var stepAssignInfo = stepConfig(workflow, stepDefine, prevStep);