Explorar o código

移除WorkflowStepHandler

xf hai 10 meses
pai
achega
d60d41d112

+ 3 - 3
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -40,7 +40,7 @@ namespace Hotline.Api.Controllers.Bi
         private readonly IRepository<OrderDelay> _orderDelayRepository;
         private readonly IMapper _mapper;
         private readonly IRepository<WorkflowCountersign> _workflowCountersignRepository;
-        private readonly IRepository<WorkflowStepHandler> _workflowStepHandleRepository;
+        //private readonly IRepository<WorkflowStepHandler> _workflowStepHandleRepository;
         private readonly IRepository<OrderSpecial> _orderSpecialRepository;
         private readonly IRepository<OrderVisit> _orderVisitRepository;
         private readonly IRepository<TrCallRecord> _trCallRecordRepository;
@@ -75,7 +75,7 @@ namespace Hotline.Api.Controllers.Bi
             IRepository<OrderSpecialDetail> orderSpecialDetailRepository,
             IRepository<WorkflowTrace> workflowTraceRepository,
             IRepository<OrderScreen> orderScreenRepository,
-            IRepository<WorkflowStepHandler> workflowStepHandleRepository,
+            //IRepository<WorkflowStepHandler> workflowStepHandleRepository,
             IOrderSecondaryHandlingApplication orderSecondaryHandlingApplication,
             IOrderApplication orderApplication,
             ITimeLimitDomainService timeLimitDomainService
@@ -99,7 +99,7 @@ namespace Hotline.Api.Controllers.Bi
             _orderSpecialDetailRepository = orderSpecialDetailRepository;
             _workflowTraceRepository = workflowTraceRepository;
             _orderScreenRepository = orderScreenRepository;
-            _workflowStepHandleRepository = workflowStepHandleRepository;
+            //_workflowStepHandleRepository = workflowStepHandleRepository;
             _orderSecondaryHandlingApplication = orderSecondaryHandlingApplication;
             _orderApplication = orderApplication;
             _timeLimitDomainService = timeLimitDomainService;

+ 3 - 3
src/Hotline.Api/Controllers/OrderController.cs

@@ -2962,7 +2962,7 @@ public class OrderController : BaseController
             dto.StartTimeEnd = dto.StartTimeEnd.Value.AddDays(1).AddSeconds(-1);
 
         var (total, items) = await _orderRepository.Queryable(canView: false)
-            .Where(x => x.Workflow.Steps.Any(s => s.Status < EWorkflowStepStatus.Handled && s.StepHandlers.Any(d => d.OrgId == OrgSeedData.CenterId)))
+            .Where(x => x.Workflow.Steps.Any(s => s.Status < EWorkflowStepStatus.Handled && s.HandlerOrgId == OrgSeedData.CenterId))
             .Where(x => x.Source < ESource.MLSQ || x.Source > ESource.WZSC)
             .Where(x => x.Status != EOrderStatus.BackToProvince)
             .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.No!.Contains(dto.No!))
@@ -3106,7 +3106,7 @@ public class OrderController : BaseController
                     SendBackOrgName = prevStep.HandlerOrgName,//prevStep!.AcceptorOrgName,
                     WorkflowOrgId = _sessionContext.RequiredOrgId,
                     WorkflowUserId = _sessionContext.RequiredUserId,
-                    WorkflowRoleIds =  _sessionContext.Roles.ToList()
+                    WorkflowRoleIds = _sessionContext.Roles.ToList()
                 };
                 await _orderSendBackAuditRepository.AddAsync(audit, HttpContext.RequestAborted);
             }
@@ -3196,7 +3196,7 @@ public class OrderController : BaseController
             if (sendBack.State == ESendBackAuditState.End)
             {
                 var flowDirection = await _workflowApplication.PreviousAsync(sendBack.SendBackData,
-                    sendBack.WorkflowUserId, sendBack.WorkflowOrgId, sendBack.WorkflowRoleIds.ToArray(), 
+                    sendBack.WorkflowUserId, sendBack.WorkflowOrgId, sendBack.WorkflowRoleIds.ToArray(),
                     _sessionContext, HttpContext.RequestAborted);
                 //var flowDirection = await _workflowApplication.PreviousAsync(sendBack.SendBackData, sendBack.WorkflowUserId, HttpContext.RequestAborted);
                 var processType = flowDirection == EFlowDirection.OrgToCenter || flowDirection == EFlowDirection.CenterToCenter ? EProcessType.Zhiban : EProcessType.Jiaoban;

+ 59 - 58
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -146,9 +146,9 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             current.RequiredUserId, current.RequiredOrgId,
             externalId, cancellationToken);
 
-        var startStepHandles = new List<WorkflowStepHandler>{WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
-            EFlowAssignType.User, current.RequiredUserId, current.UserName,
-            current.RequiredOrgId, current.OrgName)};
+        //var startStepHandles = new List<WorkflowStepHandler>{WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
+        //    EFlowAssignType.User, current.RequiredUserId, current.UserName,
+        //    current.RequiredOrgId, current.OrgName)};
 
         var startStep = _workflowDomainService.CreateStartStep(workflow, startStepDefine, dto,
             new FlowStepHandler
@@ -159,13 +159,12 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                 Username = current.UserName,
                 OrgId = current.RequiredOrgId,
                 OrgName = current.OrgName
-            },
-            startStepHandles, expiredTime);
+            }, expiredTime);
 
         var flowAssignInfo =
             await GetNextStepFlowAssignInfoAsync(workflow, startStep, dto, firstStepDefine, isNextDynamic, cancellationToken);
 
-        var firstStepHandlers = await GetNextStepHandlersAsync(workflow, firstStepDefine, dto, cancellationToken);
+        //var firstStepHandlers = await GetNextStepHandlersAsync(workflow, firstStepDefine, dto, cancellationToken);
 
         var counterSignType = _workflowDomainService.GetCounterSignType(startStep.BusinessType);
 
@@ -181,10 +180,10 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             startStep.FileJson =
                 await _fileRepository.AddFileAsync(dto.Files, workflow.ExternalId, startStep.Id, cancellationToken);
 
-        //await _workflowStepRepository.AddAsync(startStep, cancellationToken);
-        await _workflowStepRepository.AddNav(startStep)
-            .Include(d => d.StepHandlers)
-            .ExecuteCommandAsync();
+        await _workflowStepRepository.AddAsync(startStep, cancellationToken);
+        //await _workflowStepRepository.AddNav(startStep)
+        //    .Include(d => d.StepHandlers)
+        //    .ExecuteCommandAsync();
         workflow.Steps.Add(startStep);
 
         //starttrace
@@ -204,7 +203,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             current.OrgName);
 
         await _workflowDomainService.StartAsync(workflow, startStep, dto, firstStepDefine, isNextDynamic,
-            flowAssignInfo, counterSignType, expiredTime, firstStepHandlers, current, cancellationToken);
+            flowAssignInfo, counterSignType, expiredTime, current, cancellationToken);
 
         return workflow.Id;
     }
@@ -264,10 +263,10 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         var flowAssignInfo =
             await GetNextStepFlowAssignInfoAsync(workflow, currentStep, dto, nextStepDefine, isNextDynamic, cancellationToken);
 
-        var nextStepHandlers = await GetNextStepHandlersAsync(workflow, nextStepDefine, dto, cancellationToken);
+        //var nextStepHandlers = await GetNextStepHandlersAsync(workflow, nextStepDefine, dto, cancellationToken);
 
         await _workflowDomainService.NextAsync(workflow, currentStep, dto, nextStepDefine, isNextDynamic,
-            flowAssignInfo, expiredTime, nextStepHandlers, current, cancellationToken);
+            flowAssignInfo, expiredTime, current, cancellationToken);
 
         return workflow;
     }
@@ -298,7 +297,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         return await _workflowDomainService.PreviousAsync(workflow, dto,
             applicantId, applicantOrgId, applicantRoleIds, _sessionContext, cancellationToken);
     }
-    
+
     /// <summary>
     /// 撤回至任意节点
     /// </summary>
@@ -321,9 +320,9 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         var flowAssignInfo = await GetNextStepFlowAssignInfoByDefineAsync(targetStepDefine, dto.IsStartCountersign,
             dto.NextHandlers.Select(d => new Kv(d.Key, d.Value)).ToList(), cancellationToken);
 
-        var stepHandlers = await GetNextStepHandlersAsync(workflow, targetStepDefine, dto, cancellationToken);
+        //var stepHandlers = await GetNextStepHandlersAsync(workflow, targetStepDefine, dto, cancellationToken);
 
-        await _workflowDomainService.RecallAsync(workflow, dto, targetStepDefine, flowAssignInfo, stepHandlers, expiredTime, _sessionContext, cancellationToken);
+        await _workflowDomainService.RecallAsync(workflow, dto, targetStepDefine, flowAssignInfo, expiredTime, _sessionContext, cancellationToken);
     }
 
     /// <summary>
@@ -482,7 +481,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                 var sb = new StringBuilder();
                 foreach (var countersignHandleStep in countersignHandleSteps)
                 {
-                    sb.AppendLine($"{countersignHandleStep.GetActualHandler()?.GetHandler().Value} : {countersignHandleStep.Opinion}");
+                    //sb.AppendLine($"{countersignHandleStep.GetActualHandler()?.GetHandler().Value} : {countersignHandleStep.Opinion}");
+                    sb.AppendLine($"{countersignHandleStep.GetHandler().Value} : {countersignHandleStep.Opinion}");
                 }
                 dto.Opinion = sb.ToString();
 
@@ -533,7 +533,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             string.IsNullOrEmpty(dto.Opinion))
         {
             var prevStep = workflow.Steps.FirstOrDefault(d => d.Id == currentStep.PrevStepId);
-            dto.Opinion = $"{prevStep?.GetActualHandler()?.GetHandler().Value} : {prevStep?.Opinion}";
+            dto.Opinion = $"{prevStep?.GetHandler().Value} : {prevStep?.Opinion}";
         }
 
         return dto;
@@ -1160,45 +1160,45 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             cancellationToken);
     }
 
-    private async ValueTask<List<WorkflowStepHandler>> GetNextStepHandlersAsync(Workflow workflow,
-        StepDefine nextStepDefine, BasicWorkflowDto dto, CancellationToken cancellationToken)
-    {
-        var assignType = FlowAssignInfo.GetAssignType(dto.HandlerType);
-        //var assignType = AssignInfo.GetAssignType(nextStepDefine.HandlerType, dto.NextHandlers.Any());
-        switch (assignType)
-        {
-            case EFlowAssignType.Org:
-                return dto.NextHandlers.Select(d => WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
-                    assignType, orgId: d.Key, orgName: d.Value)).ToList();
-            case EFlowAssignType.User:
-                if (!dto.NextHandlers.Any() && dto.HandlerType is EHandlerType.Role)
-                {
-                    var stepOption = await GetConfigStepAsync(EFlowType.Handle, nextStepDefine, cancellationToken);
-                    var uIds = stepOption.Items.Select(d => d.Key).ToList();
-                    var users1 = await _userRepository.Queryable()
-                        .Includes(d => d.Organization)
-                        .Where(d => uIds.Contains(d.Id))
-                        .ToListAsync(cancellationToken);
-                    return users1.Select(d => WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
-                            assignType, d.Id, d.Name, d.OrgId, d.Organization.Name))
-                        .ToList();
-                }
-                var userIds = dto.NextHandlers.Select(d => d.Key).ToList();
-                var users = await _userRepository.Queryable()
-                    .Includes(d => d.Organization)
-                    .Where(d => userIds.Contains(d.Id))
-                    .ToListAsync(cancellationToken);
-                return users.Select(d => WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
-                        assignType, d.Id, d.Name, d.OrgId, d.Organization.Name))
-                    .ToList();
-            //case EFlowAssignType.Role:
-            //    handlers = dto.NextHandlers.Select(d => WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
-            //        assignType, roleId: d.Key, roleName: d.Value)).ToList();
-            //    break;
-            default:
-                throw new ArgumentOutOfRangeException();
-        }
-    }
+    //private async ValueTask<List<WorkflowStepHandler>> GetNextStepHandlersAsync(Workflow workflow,
+    //    StepDefine nextStepDefine, BasicWorkflowDto dto, CancellationToken cancellationToken)
+    //{
+    //    var assignType = FlowAssignInfo.GetAssignType(dto.HandlerType);
+    //    //var assignType = AssignInfo.GetAssignType(nextStepDefine.HandlerType, dto.NextHandlers.Any());
+    //    switch (assignType)
+    //    {
+    //        case EFlowAssignType.Org:
+    //            return dto.NextHandlers.Select(d => WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
+    //                assignType, orgId: d.Key, orgName: d.Value)).ToList();
+    //        case EFlowAssignType.User:
+    //            if (!dto.NextHandlers.Any() && dto.HandlerType is EHandlerType.Role)
+    //            {
+    //                var stepOption = await GetConfigStepAsync(EFlowType.Handle, nextStepDefine, cancellationToken);
+    //                var uIds = stepOption.Items.Select(d => d.Key).ToList();
+    //                var users1 = await _userRepository.Queryable()
+    //                    .Includes(d => d.Organization)
+    //                    .Where(d => uIds.Contains(d.Id))
+    //                    .ToListAsync(cancellationToken);
+    //                return users1.Select(d => WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
+    //                        assignType, d.Id, d.Name, d.OrgId, d.Organization.Name))
+    //                    .ToList();
+    //            }
+    //            var userIds = dto.NextHandlers.Select(d => d.Key).ToList();
+    //            var users = await _userRepository.Queryable()
+    //                .Includes(d => d.Organization)
+    //                .Where(d => userIds.Contains(d.Id))
+    //                .ToListAsync(cancellationToken);
+    //            return users.Select(d => WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
+    //                    assignType, d.Id, d.Name, d.OrgId, d.Organization.Name))
+    //                .ToList();
+    //        //case EFlowAssignType.Role:
+    //        //    handlers = dto.NextHandlers.Select(d => WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
+    //        //        assignType, roleId: d.Key, roleName: d.Value)).ToList();
+    //        //    break;
+    //        default:
+    //            throw new ArgumentOutOfRangeException();
+    //    }
+    //}
 
     /// <summary>
     /// 按流程模板配置创建下一步办理对象
@@ -1307,7 +1307,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         var workflow = await _workflowDomainService.GetWorkflowAsync(workflowId, withSteps: true, withTraces: true,
             cancellationToken: cancellationToken);
         var step = workflow.Steps.FirstOrDefault(d =>
-            d.StepHandlers.Any(d => d.OrgId == "001171" || d.OrgId == "001178"));
+            //d.StepHandlers.Any(d => d.OrgId == "001171" || d.OrgId == "001178"));
+            d.HandlerOrgId == "001171" || d.HandlerOrgId == "001178");
         if (step is not null)
         {
             step.FileJson = await _fileRepository.AddFileAsync(files, workflow.ExternalId, step.Id, cancellationToken);

+ 1 - 1
src/Hotline.Application/Mappers/WorkflowMapperConfigs.cs

@@ -37,7 +37,7 @@ public class WorkflowMapperConfigs : IRegister
             //.Ignore(d => d.StepExpiredTime)
             .Ignore(d => d.Workflow)
             .Ignore(d => d.WorkflowTrace)
-            .IgnoreIf((d, s) => s.StepHandlers == null || !s.StepHandlers.Any(), d => d.StepHandlers)
+            //.IgnoreIf((d, s) => s.StepHandlers == null || !s.StepHandlers.Any(), d => d.StepHandlers)
             ;
 
         config.ForType<WorkflowStep, WorkflowTrace>()

+ 7 - 7
src/Hotline/FlowEngine/Workflows/IWorkflowDomainService.cs

@@ -24,7 +24,7 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         Task StartAsync(Workflow workflow, WorkflowStep startStep, BasicWorkflowDto dto, StepDefine firstStepDefine,
             bool isNextDynamic, FlowAssignInfo flowAssignInfo, ECounterSignType? counterSignType, DateTime? expiredTime,
-            List<WorkflowStepHandler> stepHandlers, ISessionContext current, CancellationToken cancellationToken);
+            ISessionContext current, CancellationToken cancellationToken);
 
         /// <summary>
         /// 查询工作流
@@ -49,22 +49,22 @@ namespace Hotline.FlowEngine.Workflows
         /// 办理(流转至下一节点)
         /// </summary>
         Task NextAsync(Workflow workflow, WorkflowStep currentStep, NextWorkflowDto dto, StepDefine nextStepDefine,
-            bool isNextDynamic, FlowAssignInfo flowAssignInfo, DateTime? expiredTime, List<WorkflowStepHandler> stepHandlers,
+            bool isNextDynamic, FlowAssignInfo flowAssignInfo, DateTime? expiredTime,
             ISessionContext current, CancellationToken cancellationToken);
 
         /// <summary>
         /// 退回(返回前一节点)
         /// </summary>
         /// <returns></returns>
-        Task<EFlowDirection> PreviousAsync(Workflow workflow, PreviousWorkflowDto dto, 
-            string applicantId, string applicantOrgId, string[] applicantRoleIds, 
+        Task<EFlowDirection> PreviousAsync(Workflow workflow, PreviousWorkflowDto dto,
+            string applicantId, string applicantOrgId, string[] applicantRoleIds,
             ISessionContext current, CancellationToken cancellationToken);
-        
+
         /// <summary>
         /// 撤回(返回到之前任意节点)
         /// </summary>
         Task RecallAsync(Workflow workflow, RecallDto dto, StepDefine targetStepDefine, FlowAssignInfo flowAssignInfo,
-            List<WorkflowStepHandler> stepHandlers, DateTime? expiredTime, ISessionContext current, CancellationToken cancellationToken);
+            DateTime? expiredTime, ISessionContext current, CancellationToken cancellationToken);
 
         /// <summary>
         /// 撤回至开始节点
@@ -148,7 +148,7 @@ namespace Hotline.FlowEngine.Workflows
         /// 创建开始节点
         /// </summary>
         WorkflowStep CreateStartStep(Workflow workflow, StepDefine startStepDefine, BasicWorkflowDto dto,
-            FlowStepHandler handler, List<WorkflowStepHandler> stepHandlers, DateTime? expiredTime);
+            FlowStepHandler handler, DateTime? expiredTime);
 
         /// <summary>
         /// 查询未完成节点

+ 16 - 5
src/Hotline/FlowEngine/Workflows/StepBasicEntity.cs

@@ -30,10 +30,10 @@ public abstract class StepBasicEntity : CreationEntity
 
     #endregion
 
-	/// <summary>
-	/// 流程指派类型
-	/// </summary>
-	public EFlowAssignType? FlowAssignType { get; set; }
+    /// <summary>
+    /// 流程指派类型
+    /// </summary>
+    public EFlowAssignType? FlowAssignType { get; set; }
 
     /// <summary>
     /// 该节点指派办理对象(依据不同指派方式可能为:orgId或userId),该字段subStep才会存在,stepBox不存在
@@ -140,7 +140,7 @@ public abstract class StepBasicEntity : CreationEntity
     #endregion
 
     #endregion
-    
+
     #region 接办
 
     /// <summary>
@@ -435,6 +435,17 @@ public abstract class StepBasicEntity : CreationEntity
     /// </summary>
     public bool IsInCountersign() => CountersignPosition != ECountersignPosition.None;
 
+    public Kv GetHandler()
+    {
+        return FlowAssignType switch
+        {
+            EFlowAssignType.Org => new Kv(HandlerOrgId, HandlerOrgName),
+            EFlowAssignType.User => new Kv(HandlerId, HandlerName),
+            EFlowAssignType.Role => new Kv(RoleId, RoleName),
+            _ => throw new ArgumentOutOfRangeException()
+        };
+    }
+
     #endregion
 }
 

+ 2 - 2
src/Hotline/FlowEngine/Workflows/Workflow.cs

@@ -789,12 +789,12 @@ public partial class Workflow
     /// <summary>
     /// 更新受理人信息
     /// </summary>
-    public void UpdateAcceptor(string userId, string? userName, string? staffNo, string orgCode, string? orgName)
+    public void UpdateAcceptor(string userId, string? userName, string? staffNo, string orgId, string? orgName)
     {
         AcceptorId = userId;
         AcceptorName = userName;
         AcceptorStaffNo = staffNo;
-        AcceptorOrgId = orgCode;
+        AcceptorOrgId = orgId;
         AcceptorOrgName = orgName;
     }
 

+ 111 - 101
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -28,7 +28,7 @@ namespace Hotline.FlowEngine.Workflows
         private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
         private readonly IRepository<WorkflowSupplement> _workflowSupplementRepository;
         private readonly IRepository<WorkflowCountersign> _workflowCountersignRepository;
-        private readonly IRepository<WorkflowStepHandler> _workflowStepHandlerRepository;
+        //private readonly IRepository<WorkflowStepHandler> _workflowStepHandlerRepository;
         private readonly ISessionContext _sessionContext;
         private readonly IMapper _mapper;
         private readonly IMediator _mediator;
@@ -42,7 +42,7 @@ namespace Hotline.FlowEngine.Workflows
             IRepository<WorkflowTrace> workflowTraceRepository,
             IRepository<WorkflowSupplement> workflowSupplementRepository,
             IRepository<WorkflowCountersign> workflowCountersignRepository,
-            IRepository<WorkflowStepHandler> workflowStepHandlerRepository,
+            //IRepository<WorkflowStepHandler> workflowStepHandlerRepository,
             ISessionContext sessionContext,
             IMapper mapper,
             IMediator mediator,
@@ -54,7 +54,7 @@ namespace Hotline.FlowEngine.Workflows
             _workflowTraceRepository = workflowTraceRepository;
             _workflowSupplementRepository = workflowSupplementRepository;
             _workflowCountersignRepository = workflowCountersignRepository;
-            _workflowStepHandlerRepository = workflowStepHandlerRepository;
+            //_workflowStepHandlerRepository = workflowStepHandlerRepository;
             _sessionContext = sessionContext;
             _mapper = mapper;
             _mediator = mediator;
@@ -95,7 +95,7 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         public async Task StartAsync(Workflow workflow, WorkflowStep startStep, BasicWorkflowDto dto,
             StepDefine firstStepDefine, bool isNextDynamic, FlowAssignInfo flowAssignInfo,
-            ECounterSignType? counterSignType, DateTime? expiredTime, List<WorkflowStepHandler> stepHandlers,
+            ECounterSignType? counterSignType, DateTime? expiredTime,
             ISessionContext current, CancellationToken cancellationToken)
         {
             //1. 创建first节点 (和trace)2.办理开始节点 
@@ -115,7 +115,7 @@ namespace Hotline.FlowEngine.Workflows
 
             //firststeps
             var firstSteps = await CreateNextStepsAsync(workflow, startStep, dto, firstStepDefine,
-                isNextDynamic, flowAssignInfo, expiredTime, stepHandlers, dto.IsStartCountersign, cancellationToken);
+                isNextDynamic, flowAssignInfo, expiredTime, dto.IsStartCountersign, cancellationToken);
             if (firstSteps.Any())
                 workflow.Steps.AddRange(firstSteps);
 
@@ -187,7 +187,7 @@ namespace Hotline.FlowEngine.Workflows
             if (withCountersigns)
                 query = query.Includes(d => d.Countersigns, x => x.Members);
             if (withSteps)
-                query = query.Includes(d => d.Steps, x => x.StepHandlers);
+                query = query.Includes(d => d.Steps);
             //if (withTraces)
             //    query = query.Includes(d => d.Traces);
 
@@ -308,8 +308,7 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         public async Task NextAsync(Workflow workflow, WorkflowStep currentStep, NextWorkflowDto dto,
             StepDefine nextStepDefine, bool isNextDynamic, FlowAssignInfo flowAssignInfo,
-            DateTime? expiredTime, List<WorkflowStepHandler> stepHandlers, ISessionContext current,
-            CancellationToken cancellationToken)
+            DateTime? expiredTime, ISessionContext current, CancellationToken cancellationToken)
         {
             ValidatePermission(workflow, current.RequiredOrgId, current.RequiredUserId, current.Roles);
             //CheckWhetherRunnable(workflow.Status);
@@ -422,10 +421,10 @@ namespace Hotline.FlowEngine.Workflows
                     .ExecuteCommandAsync();
             }
 
-            //await _workflowStepRepository.UpdateRangeAsync(updateSteps, cancellationToken);
-            await _workflowStepRepository.UpdateNav(updateSteps)
-                .Include(d => d.StepHandlers)
-                .ExecuteCommandAsync();
+            await _workflowStepRepository.UpdateRangeAsync(updateSteps, cancellationToken);
+            //await _workflowStepRepository.UpdateNav(updateSteps)
+            //    .Include(d => d.StepHandlers)
+            //    .ExecuteCommandAsync();
 
             await NextTraceAsync(workflow, dto, currentStep, cancellationToken);
 
@@ -461,7 +460,7 @@ namespace Hotline.FlowEngine.Workflows
 
             //创建下一/N个节点(会签汇总节点:会签未全部办理时不创建,最后一个会签办理节点创建会签汇总节点)
             var nextSteps = await CreateNextStepsAsync(workflow, currentStep, dto,
-                nextStepDefine, isNextDynamic, flowAssignInfo, expiredTime, stepHandlers, isStartCountersign,
+                nextStepDefine, isNextDynamic, flowAssignInfo, expiredTime, isStartCountersign,
                 cancellationToken);
 
             ////赋值当前节点的下级办理节点
@@ -659,7 +658,7 @@ namespace Hotline.FlowEngine.Workflows
             var steps = await _workflowStepRepository.Queryable()
                 .Includes(d => d.Workflow)
                 .Includes(d => d.WorkflowTrace)
-                .Includes(d => d.StepHandlers)
+                //.Includes(d => d.StepHandlers)
                 .Where(d => stepsIds.Contains(d.Id))
                 .ToListAsync(cancellationToken);
             foreach (var handler in handlers)
@@ -674,10 +673,10 @@ namespace Hotline.FlowEngine.Workflows
                 var thisSteps = steps.Where(d => handler.stepIds.Contains(d.Id)).ToList();
                 foreach (var thisStep in thisSteps)
                 {
-                    var stepHandler = WorkflowStepHandler.Create(thisStep.Workflow.Id, thisStep.Workflow.ExternalId,
-                        thisStep.FlowAssignType ?? EFlowAssignType.User, handler.userId, handler.username, handler.orgId, handler.orgName);
-                    thisStep.StepHandlers.Clear();
-                    thisStep.StepHandlers.Add(stepHandler);
+                    //var stepHandler = WorkflowStepHandler.Create(thisStep.Workflow.Id, thisStep.Workflow.ExternalId,
+                    //    thisStep.FlowAssignType ?? EFlowAssignType.User, handler.userId, handler.username, handler.orgId, handler.orgName);
+                    //thisStep.StepHandlers.Clear();
+                    //thisStep.StepHandlers.Add(stepHandler);
 
                     thisStep.Handlers = thisHandlers;
 
@@ -700,7 +699,7 @@ namespace Hotline.FlowEngine.Workflows
             await _workflowStepRepository.UpdateNav(steps)
                 .Include(d => d.WorkflowTrace)
                 .Include(d => d.Workflow)
-                .Include(d => d.StepHandlers)
+                //.Include(d => d.StepHandlers)
                 .ExecuteCommandAsync();
 
             return steps.Select(d => d.WorkflowId).ToList();
@@ -711,20 +710,33 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         public async Task<ICollection<Kv>> GetLevelOneOrgsAsync(string workflowId, CancellationToken cancellation)
         {
-            var handlers = await _workflowStepHandlerRepository.Queryable()
-                .InnerJoin<WorkflowTrace>((wsh, wt) => wsh.WorkflowStepId == wt.StepId)
-                .LeftJoin<SystemOrganize>((wsh, wt, o) => wsh.OrgId == o.Id)
-                .Where((wsh, wt, o) => wsh.WorkflowId == workflowId &&
-                                    //wt.BusinessType == EBusinessType.Department &&
-                                    //wt.HandlerType == EHandlerType.OrgLevel &&
-                                    !string.IsNullOrEmpty(wsh.OrgId) &&
-                                    o.Level == 1)
-                .ToListAsync(cancellation);
+            var traces = await _workflowTraceRepository.Queryable()
+                 .LeftJoin<SystemOrganize>((t, o) => t.HandlerOrgId == o.Id)
+                 .Where((t, o) => t.WorkflowId == workflowId &&
+                                  !string.IsNullOrEmpty(t.HandlerOrgId) &&
+                                  o.Level == 1)
+                 .ToListAsync(cancellation);
+
+            //var handlers = await _workflowStepHandlerRepository.Queryable()
+            //    .InnerJoin<WorkflowTrace>((wsh, wt) => wsh.WorkflowStepId == wt.StepId)
+            //    .LeftJoin<SystemOrganize>((wsh, wt, o) => wsh.OrgId == o.Id)
+            //    .Where((wsh, wt, o) => wsh.WorkflowId == workflowId &&
+            //                        //wt.BusinessType == EBusinessType.Department &&
+            //                        //wt.HandlerType == EHandlerType.OrgLevel &&
+            //                        !string.IsNullOrEmpty(wsh.OrgId) &&
+            //                        o.Level == 1)
+            //    .ToListAsync(cancellation);
+
+            //var orgs = handlers.Select(d => new Kv(d.OrgId, d.OrgName))
+            //    .DistinctBy(d => d.Key)
+            //    .ToList();
 
-            var orgs = handlers.Select(d => new Kv(d.OrgId, d.OrgName))
-                .DistinctBy(d => d.Key)
+            var orgs = traces
+                .DistinctBy(d => d.HandlerOrgId)
+                .Select(d => new Kv(d.HandlerOrgId, d.HandlerOrgName))
                 .ToList();
 
+
             return orgs;
             //var workflow = await GetWorkflowAsync(workflowId, withSteps: true, cancellationToken: cancellation);
             //var list = workflow.Steps.Distinct().Where(d => d.BusinessType == EBusinessType.Department &&
@@ -764,7 +776,8 @@ namespace Hotline.FlowEngine.Workflows
         public async Task<WorkflowStep> FindLastHandleStepAsync(string workflowId, string orgId, CancellationToken cancellation)
         {
             return await _workflowStepRepository.Queryable()
-                .Where(d => d.StepHandlers.Any(sh => sh.OrgId == orgId) && d.WorkflowId == workflowId)
+                .Where(d => d.WorkflowId == workflowId && d.HandlerOrgId == orgId)
+                //.Where(d => d.StepHandlers.Any(sh => sh.OrgId == orgId) && d.WorkflowId == workflowId)
                 .OrderByDescending(d => d.HandleTime)
                 .FirstAsync(cancellation);
         }
@@ -808,7 +821,7 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         public async Task<Workflow> SignToSomebodyAsync(string workflowId, string userId, string username, string orgId, string orgName, CancellationToken cancellationToken)
         {
-            var workflow = await GetWorkflowAsync(workflowId, withSteps: true, cancellationToken: cancellationToken);
+            var workflow = await GetWorkflowAsync(workflowId, withSteps: true, withTraces: true, cancellationToken: cancellationToken);
             workflow.Assign(EFlowAssignType.User, _sessionContext.RequiredUserId);
 
             workflow.HandlerOrgs = new();
@@ -830,15 +843,19 @@ namespace Hotline.FlowEngine.Workflows
             startStep.AcceptorOrgId = orgId;
             startStep.AcceptorOrgName = orgName;
 
-            var stepHandler = startStep.StepHandlers.First();
-            startStep.StepHandlers.RemoveAll(d => d.Id != stepHandler.Id);
-            stepHandler.UserId = userId;
-            stepHandler.Username = username;
-            stepHandler.OrgId = orgId;
-            stepHandler.OrgName = orgName;
+            //var stepHandler = startStep.StepHandlers.First();
+            //startStep.StepHandlers.RemoveAll(d => d.Id != stepHandler.Id);
+            //stepHandler.UserId = userId;
+            //stepHandler.Username = username;
+            //stepHandler.OrgId = orgId;
+            //stepHandler.OrgName = orgName;
+
+            startStep.WorkflowTrace = workflow.Traces.First(d => d.Id == startStep.Id);
+            _mapper.Map(startStep, startStep.WorkflowTrace);
 
             await _workflowStepRepository.UpdateNav(startStep)
-                .Include(d => d.StepHandlers)
+                //.Include(d => d.StepHandlers)
+                .Include(d => d.WorkflowTrace)
                 .ExecuteCommandAsync();
 
             await _workflowRepository.UpdateAsync(workflow, cancellationToken);
@@ -870,7 +887,7 @@ namespace Hotline.FlowEngine.Workflows
         /// 撤回(返回到之前任意节点)
         /// </summary>
         public async Task RecallAsync(Workflow workflow, RecallDto dto, StepDefine targetStepDefine,
-            FlowAssignInfo flowAssignInfo, List<WorkflowStepHandler> stepHandlers, DateTime? expiredTime,
+            FlowAssignInfo flowAssignInfo, DateTime? expiredTime,
             ISessionContext current, CancellationToken cancellationToken)
         {
             var targetStep = workflow.Steps.FirstOrDefault(d => d.Code == dto.NextStepCode && d.IsOrigin);
@@ -881,7 +898,7 @@ namespace Hotline.FlowEngine.Workflows
             await RecallTraceAsync(workflow.Id, dto.Opinion, current, cancellationToken);
 
             var isOrgToCenter = await RecallAsync(workflow, dto, flowAssignInfo, targetStepDefine, targetStep,
-                EWorkflowTraceType.Recall, stepHandlers, expiredTime, cancellationToken);
+                EWorkflowTraceType.Recall, expiredTime, cancellationToken);
 
             await _workflowRepository.UpdateAsync(workflow, cancellationToken);
 
@@ -1211,7 +1228,7 @@ namespace Hotline.FlowEngine.Workflows
         /// 创建开始节点
         /// </summary>
         public WorkflowStep CreateStartStep(Workflow workflow, StepDefine startStepDefine,
-            BasicWorkflowDto dto, FlowStepHandler handler, List<WorkflowStepHandler> stepHandlers, DateTime? expiredTime)
+            BasicWorkflowDto dto, FlowStepHandler handler, DateTime? expiredTime)
         {
             //startstep
             var nextSteps = _mapper.Map<List<StepSimple>>(startStepDefine.NextSteps);
@@ -1226,7 +1243,7 @@ namespace Hotline.FlowEngine.Workflows
             _mapper.Map(workflow, startStep);
             startStep.FlowAssignType = EFlowAssignType.User;
             startStep.Handlers = new List<Kv> { new(handler.Key, handler.Value) };
-            startStep.StepHandlers = stepHandlers;
+            //startStep.StepHandlers = stepHandlers;
             startStep.NextSteps = nextSteps;
             startStep.IsMain = true;
             startStep.IsOrigin = true;
@@ -1255,14 +1272,14 @@ namespace Hotline.FlowEngine.Workflows
             StepDefine endStepDefine, WorkflowStep currentStep, ISessionContext current,
             CancellationToken cancellationToken)
         {
-            var endStepHandles = new List<WorkflowStepHandler>
-            {
-                WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId, EFlowAssignType.User,
-                    current.RequiredUserId, current.UserName, current.RequiredOrgId, current.OrgName)
-            };
+            //var endStepHandles = new List<WorkflowStepHandler>
+            //{
+            //    WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId, EFlowAssignType.User,
+            //        current.RequiredUserId, current.UserName, current.RequiredOrgId, current.OrgName)
+            //};
 
             //create endStep
-            var endStep = await CreateEndStepAsync(current, workflow, endStepDefine, currentStep, endStepHandles, cancellationToken);
+            var endStep = await CreateEndStepAsync(current, workflow, endStepDefine, currentStep, cancellationToken);
             workflow.Steps.Add(endStep);
 
             //update endTrace
@@ -1363,14 +1380,14 @@ namespace Hotline.FlowEngine.Workflows
         }
 
         private async Task<WorkflowStep> CreateStartStepAsync(Workflow workflow, StepDefine startStepDefine,
-            BasicWorkflowDto dto, FlowStepHandler handler, List<WorkflowStepHandler> stepHandlers, EWorkflowTraceType traceType,
+            BasicWorkflowDto dto, FlowStepHandler handler, EWorkflowTraceType traceType,
             DateTime? expiredTime, CancellationToken cancellationToken)
         {
-            var startStep = CreateStartStep(workflow, startStepDefine, dto, handler, stepHandlers, expiredTime);
-            //await _workflowStepRepository.AddAsync(startStep, cancellationToken);
-            await _workflowStepRepository.AddNav(startStep)
-                .Include(d => d.StepHandlers)
-                .ExecuteCommandAsync();
+            var startStep = CreateStartStep(workflow, startStepDefine, dto, handler, expiredTime);
+            await _workflowStepRepository.AddAsync(startStep, cancellationToken);
+            //await _workflowStepRepository.AddNav(startStep)
+            //    .Include(d => d.StepHandlers)
+            //    .ExecuteCommandAsync();
             await CreateTraceAsync(workflow, startStep, traceType, cancellationToken);
             return startStep;
         }
@@ -1394,7 +1411,7 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         private async Task<List<WorkflowStep>> CreateNextStepsAsync(Workflow workflow, WorkflowStep currentStep,
             BasicWorkflowDto dto, StepDefine nextStepDefine, bool isNextDynamic, FlowAssignInfo flowAssignInfo,
-            DateTime? expiredTime, List<WorkflowStepHandler> stepHandlers, bool isStartCountersign,
+            DateTime? expiredTime, bool isStartCountersign,
             CancellationToken cancellationToken)
         {
             List<WorkflowStep> nextSteps = new();
@@ -1410,13 +1427,13 @@ namespace Hotline.FlowEngine.Workflows
                         {
                             //依据会签策略创建会签下一级节点
                             nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
-                                flowAssignInfo.FlowAssignType, expiredTime, stepHandlers, isStartCountersign, cancellationToken);
+                                flowAssignInfo.FlowAssignType, expiredTime, isStartCountersign, cancellationToken);
                         }
                         else
                         {
                             //创建普通节点(根据配置)
                             nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto,
-                                flowAssignInfo, EWorkflowTraceType.Normal, expiredTime, stepHandlers, cancellationToken);
+                                flowAssignInfo, EWorkflowTraceType.Normal, expiredTime, cancellationToken);
                         }
                     }
                     else
@@ -1428,14 +1445,13 @@ namespace Hotline.FlowEngine.Workflows
                             if (csStartStep is null)
                                 throw new UserFriendlyException("未查询到会签节点");
 
-                            nextSteps = await CreateCsEndStepsByTargetPrevAsync(workflow, csStartStep, dto, stepHandlers,
-                                expiredTime, cancellationToken);
+                            nextSteps = await CreateCsEndStepsByTargetPrevAsync(workflow, csStartStep, dto, expiredTime, cancellationToken);
                         }
                         else
                         {
                             //依据会签策略创建会签下一级节点
                             nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
-                                flowAssignInfo.FlowAssignType, expiredTime, stepHandlers, isStartCountersign, cancellationToken);
+                                flowAssignInfo.FlowAssignType, expiredTime, isStartCountersign, cancellationToken);
                         }
                     }
                 }
@@ -1444,14 +1460,14 @@ namespace Hotline.FlowEngine.Workflows
                     if (dto.BackToCountersignEnd)
                     {
                         // check if cs all complete, create next
-                        nextSteps = await CreateCsEndStepsByTargetPrevAsync(workflow, currentStep, dto, stepHandlers,
+                        nextSteps = await CreateCsEndStepsByTargetPrevAsync(workflow, currentStep, dto,
                             expiredTime, cancellationToken);
                     }
                     else
                     {
                         //依据会签策略创建会签下一级节点
                         nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
-                            flowAssignInfo.FlowAssignType, expiredTime, stepHandlers, isStartCountersign, cancellationToken);
+                            flowAssignInfo.FlowAssignType, expiredTime, isStartCountersign, cancellationToken);
                     }
                 }
             }
@@ -1459,19 +1475,19 @@ namespace Hotline.FlowEngine.Workflows
             {
                 //依据会签策略创建会签下一级节点
                 nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
-                    flowAssignInfo.FlowAssignType, expiredTime, stepHandlers, isStartCountersign, cancellationToken);
+                    flowAssignInfo.FlowAssignType, expiredTime, isStartCountersign, cancellationToken);
             }
             else if (isNextDynamic)
             {
                 //创建动态下一级节点
                 nextSteps = await CreateDynamicStepsAsync(workflow, nextStepDefine, currentStep, dto, flowAssignInfo,
-                    expiredTime, stepHandlers, cancellationToken);
+                    expiredTime, cancellationToken);
             }
             else
             {
                 //创建普通节点(根据配置)
                 nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto, flowAssignInfo,
-                    EWorkflowTraceType.Normal, expiredTime, stepHandlers, cancellationToken);
+                    EWorkflowTraceType.Normal, expiredTime, cancellationToken);
             }
 
             return nextSteps;
@@ -1484,7 +1500,6 @@ namespace Hotline.FlowEngine.Workflows
             BasicWorkflowDto dto,
             FlowAssignInfo flowAssignInfo,
             DateTime? expiredTime,
-            List<WorkflowStepHandler> stepHandlers,
             CancellationToken cancellationToken)
         {
             var handlerType = nextStepDefine.InstancePolicy switch
@@ -1498,7 +1513,7 @@ namespace Hotline.FlowEngine.Workflows
             };
 
             return await CreateStepsAsync(workflow, nextStepDefine, prevStep, dto,
-                flowAssignInfo.FlowAssignType, dto.NextHandlers, stepHandlers, null, EWorkflowStepStatus.WaitForAccept,
+                flowAssignInfo.FlowAssignType, dto.NextHandlers, null, EWorkflowStepStatus.WaitForAccept,
                 ECountersignPosition.None, false, EWorkflowTraceType.Normal, handlerType, expiredTime,
                 cancellationToken: cancellationToken);
         }
@@ -1510,7 +1525,6 @@ namespace Hotline.FlowEngine.Workflows
             BasicWorkflowDto dto,
             EFlowAssignType flowAssignType,
             DateTime? expiredTime,
-            List<WorkflowStepHandler> stepHandlers,
             bool isStartCountersign,
             CancellationToken cancellationToken = default
         )
@@ -1533,7 +1547,7 @@ namespace Hotline.FlowEngine.Workflows
                 : ECountersignPosition.Single;
 
             return CreateStepsAsync(workflow, stepDefine, prevStep, dto, flowAssignType, dto.NextHandlers,
-                stepHandlers, countersignId, EWorkflowStepStatus.WaitForAccept, nextStepCountersignPosition,
+                countersignId, EWorkflowStepStatus.WaitForAccept, nextStepCountersignPosition,
                 false, EWorkflowTraceType.Normal, handlerType, expiredTime, cancellationToken: cancellationToken);
         }
 
@@ -1541,7 +1555,7 @@ namespace Hotline.FlowEngine.Workflows
         /// 根据传入节点的上一节点创建会签汇总节点(汇总传入节点的前一节点)
         /// </summary>
         private async Task<List<WorkflowStep>> CreateCsEndStepsByTargetPrevAsync(Workflow workflow, WorkflowStep step,
-            BasicWorkflowDto dto, List<WorkflowStepHandler> stepHandlers, DateTime? expiredTime, CancellationToken cancellationToken)
+            BasicWorkflowDto dto, DateTime? expiredTime, CancellationToken cancellationToken)
         {
             var countersignStartStep = workflow.Steps.FirstOrDefault(d => d.Id == step.PrevStepId);
             if (countersignStartStep is null)
@@ -1554,7 +1568,7 @@ namespace Hotline.FlowEngine.Workflows
             {
                 // 创建会签汇总节点
                 var countersignEndStep =
-                    await CreateCountersignEndStepAsync(countersignStartStep, dto, stepHandlers, expiredTime, cancellationToken);
+                    await CreateCountersignEndStepAsync(countersignStartStep, dto, expiredTime, cancellationToken);
                 nextSteps = new List<WorkflowStep> { countersignEndStep };
 
                 //create trace
@@ -1567,7 +1581,7 @@ namespace Hotline.FlowEngine.Workflows
         }
 
         private async Task<WorkflowStep> CreateCountersignEndStepAsync(WorkflowStep countersignStartStep,
-            BasicWorkflowDto dto, List<WorkflowStepHandler> stepHandlers, DateTime? expiredTime,
+            BasicWorkflowDto dto, DateTime? expiredTime,
             CancellationToken cancellationToken = default)
         {
             var csEndStep = _mapper.Map<WorkflowStep>(countersignStartStep);
@@ -1587,15 +1601,15 @@ namespace Hotline.FlowEngine.Workflows
             csEndStep.Handlers = countersignStartStep.Handlers
                 .Where(d => d.Key == countersignStartStep.HandlerId || d.Key == countersignStartStep.HandlerOrgId)
                 .ToList();
-            csEndStep.StepHandlers = stepHandlers;
+            //csEndStep.StepHandlers = stepHandlers;
 
             csEndStep.Reset();
             csEndStep.ResetParameters();
 
-            //await _workflowStepRepository.AddAsync(csEndStep, cancellationToken);
-            await _workflowStepRepository.AddNav(csEndStep)
-                .Include(d => d.StepHandlers)
-                .ExecuteCommandAsync();
+            await _workflowStepRepository.AddAsync(csEndStep, cancellationToken);
+            //await _workflowStepRepository.AddNav(csEndStep)
+            //    .Include(d => d.StepHandlers)
+            //    .ExecuteCommandAsync();
             return csEndStep;
         }
 
@@ -1627,9 +1641,9 @@ namespace Hotline.FlowEngine.Workflows
                  current.OrgAreaCode, current.OrgAreaName,
                  current.OrgIsCenter, opinion, nextStepCode);
 
-            var handler = step.FindActualHandler(current.Roles, current.RequiredUserId, current.RequiredOrgId);
-            if (handler is not null)
-                handler.IsActualHandler = true;
+            //var handler = step.FindActualHandler(current.Roles, current.RequiredUserId, current.RequiredOrgId);
+            //if (handler is not null)
+            //    handler.IsActualHandler = true;
         }
 
 
@@ -1720,14 +1734,14 @@ namespace Hotline.FlowEngine.Workflows
             newStep.IsOrigin = step.IsOrigin;
             //newStep.ParentId = step.ParentId;
             newStep.Handlers = step.Handlers;
-            newStep.StepHandlers = _mapper.Map<List<WorkflowStepHandler>>(step.StepHandlers);
+            //newStep.StepHandlers = _mapper.Map<List<WorkflowStepHandler>>(step.StepHandlers);
             newStep.StartCountersignId = step.StartCountersignId;
             newStep.CountersignId = step.CountersignId;
             newStep.IsStartedCountersignEnd = step.IsStartedCountersignEnd;
-            //await _workflowStepRepository.AddAsync(newStep, cancellationToken);
-            await _workflowStepRepository.AddNav(newStep)
-                .Include(d => d.StepHandlers)
-                .ExecuteCommandAsync();
+            await _workflowStepRepository.AddAsync(newStep, cancellationToken);
+            //await _workflowStepRepository.AddNav(newStep)
+            //    .Include(d => d.StepHandlers)
+            //    .ExecuteCommandAsync();
 
             await CreateTraceAsync(workflow, newStep, traceType, cancellationToken);
 
@@ -1910,7 +1924,7 @@ namespace Hotline.FlowEngine.Workflows
 
         private async Task<bool> RecallAsync(Workflow workflow, BasicWorkflowDto dto, FlowAssignInfo flowAssignInfo,
             StepDefine targetStepDefine, WorkflowStep targetStep, EWorkflowTraceType traceType,
-            List<WorkflowStepHandler> stepHandlers, DateTime? expiredTime, CancellationToken cancellationToken)
+            DateTime? expiredTime, CancellationToken cancellationToken)
         {
             var targetIsStartStep = targetStepDefine.StepType is EStepType.Start;
 
@@ -1941,9 +1955,9 @@ namespace Hotline.FlowEngine.Workflows
 
             var targetStepNew = targetIsStartStep
                 ? await CreateStartStepAsync(workflow, targetStepDefine, dto,
-                    dto.NextHandlers.First(), stepHandlers, traceType, expiredTime, cancellationToken)
+                    dto.NextHandlers.First(), traceType, expiredTime, cancellationToken)
                 : (await CreateStepsAsync(workflow, targetStepDefine, targetPrevStep, dto,
-                    flowAssignInfo.FlowAssignType, dto.NextHandlers, stepHandlers,
+                    flowAssignInfo.FlowAssignType, dto.NextHandlers,
                     null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, true, traceType,
                     null, expiredTime, cancellationToken: cancellationToken)).First();
 
@@ -1997,7 +2011,6 @@ namespace Hotline.FlowEngine.Workflows
             Workflow workflow,
             StepDefine endStepDefine,
             WorkflowStep prevStep,
-            List<WorkflowStepHandler> stepHandlers,
             CancellationToken cancellationToken)
         {
             if (workflow.Steps.Any(d => d.StepType == EStepType.End))
@@ -2014,7 +2027,7 @@ namespace Hotline.FlowEngine.Workflows
             };
 
             var step = CreateStep(workflow, endStepDefine, prevStep, null, handler,
-                stepHandlers, null, null, EWorkflowStepStatus.WaitForAccept,
+                 null, null, EWorkflowStepStatus.WaitForAccept,
                 ECountersignPosition.None, DateTime.Now, endStepDefine.Name, true);
 
             //step.Accept(_sessionContext.RequiredUserId, _sessionContext.UserName,
@@ -2039,7 +2052,6 @@ namespace Hotline.FlowEngine.Workflows
             FlowAssignInfo flowAssignInfo,
             EWorkflowTraceType traceType,
             DateTime? expiredTime,
-            List<WorkflowStepHandler> stepHandlers,
             CancellationToken cancellationToken)
         {
             //List<Kv> handlers;
@@ -2067,7 +2079,7 @@ namespace Hotline.FlowEngine.Workflows
             //}
 
             return await CreateStepsAsync(workflow, stepDefine, prevStep, dto, /*dto.IsStartCountersign,*/
-                flowAssignInfo.FlowAssignType, handlers, stepHandlers, null,
+                flowAssignInfo.FlowAssignType, handlers, null,
                 EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None,
                 true, traceType, null, expiredTime, cancellationToken);
         }
@@ -2080,7 +2092,6 @@ namespace Hotline.FlowEngine.Workflows
             //bool isStartCountersign,
             EFlowAssignType? flowAssignType,
             List<FlowStepHandler> handlers,
-            List<WorkflowStepHandler> stepHandlers,
             string? countersignId,
             EWorkflowStepStatus stepStatus,
             ECountersignPosition csPosition,
@@ -2099,7 +2110,7 @@ namespace Hotline.FlowEngine.Workflows
             {
                 var isMain = handlers.Count == 1 || (handlers.Count > 1 && handler.Key == dto.NextMainHandler);
                 var step = CreateStep(workflow, stepDefine, prevStep, flowAssignType,
-                    handler, stepHandlers, dto.NextStepCode, countersignId, stepStatus, csPosition, expiredTime,
+                    handler, dto.NextStepCode, countersignId, stepStatus, csPosition, expiredTime,
                     dto.NextStepName, isOrigin, isMain, handlerType, dto.BusinessType);
 
                 //var stepHandler = stepHandlers.First(d => d.GetHandler().Key == handler.Key);
@@ -2117,10 +2128,10 @@ namespace Hotline.FlowEngine.Workflows
             //    steps.Add(step);
             //}
 
-            //await _workflowStepRepository.AddRangeAsync(steps, cancellationToken);
-            await _workflowStepRepository.AddNav(steps)
-                .Include(d => d.StepHandlers)
-                .ExecuteCommandAsync();
+            await _workflowStepRepository.AddRangeAsync(steps, cancellationToken);
+            //await _workflowStepRepository.AddNav(steps)
+            //    .Include(d => d.StepHandlers)
+            //    .ExecuteCommandAsync();
 
             //create traces todo add range traces
             foreach (var step in steps)
@@ -2374,7 +2385,6 @@ namespace Hotline.FlowEngine.Workflows
             WorkflowStep prevStep,
             EFlowAssignType? flowAssignType,
             FlowStepHandler handler,
-            List<WorkflowStepHandler> stepHandlers,
             string nextStepCode,
             string? countersignId,
             EWorkflowStepStatus stepStatus,
@@ -2397,7 +2407,7 @@ namespace Hotline.FlowEngine.Workflows
 
             step.FlowAssignType = flowAssignType;
             step.Handlers = new List<Kv> { new(handler.Key, handler.Value) };
-            step.StepHandlers = stepHandlers;
+            //step.StepHandlers = stepHandlers;
             step.NextStepCode = step.StepType is EStepType.End ? string.Empty : nextStepCode;
             step.IsMain = isMainHandler;
             step.PrevStepId = prevStep.Id;

+ 7 - 7
src/Hotline/FlowEngine/Workflows/WorkflowStep.cs

@@ -19,8 +19,8 @@ public class WorkflowStep : StepBasicEntity
         nameof(Workflows.WorkflowTrace.StepId))]
     public WorkflowTrace WorkflowTrace { get; set; }
 
-    [Navigate(NavigateType.OneToMany, nameof(WorkflowStepHandler.WorkflowStepId))]
-    public List<WorkflowStepHandler> StepHandlers { get; set; }
+    //[Navigate(NavigateType.OneToMany, nameof(WorkflowStepHandler.WorkflowStepId))]
+    //public List<WorkflowStepHandler> StepHandlers { get; set; }
 
     #region Method
 
@@ -181,12 +181,12 @@ public class WorkflowStep : StepBasicEntity
         return IsCountersignEndStep && CountersignStartStepId == topCountersignStepId;
     }
 
-    public WorkflowStepHandler?
-        FindActualHandler(ICollection<string> roles, string? userId = null, string? orgId = null) =>
-        StepHandlers.FirstOrDefault(d => d.IsHandler(roles, userId, orgId));
+    //public WorkflowStepHandler?
+    //    FindActualHandler(ICollection<string> roles, string? userId = null, string? orgId = null) =>
+    //    StepHandlers.FirstOrDefault(d => d.IsHandler(roles, userId, orgId));
 
-    public WorkflowStepHandler? GetActualHandler() =>
-        StepHandlers.FirstOrDefault(d => d.IsActualHandler);
+    //public WorkflowStepHandler? GetActualHandler() =>
+    //    StepHandlers.FirstOrDefault(d => d.IsActualHandler);
 
     public FlowStepHandler GetWorkflowStepHandler()
     {

+ 102 - 102
src/Hotline/FlowEngine/Workflows/WorkflowStepHandler.cs

@@ -1,114 +1,114 @@
-using Hotline.Share.Dtos;
-using SqlSugar;
-using XF.Domain.Entities;
-using XF.Domain.Exceptions;
-using XF.Domain.Repository;
+//using Hotline.Share.Dtos;
+//using SqlSugar;
+//using XF.Domain.Entities;
+//using XF.Domain.Exceptions;
+//using XF.Domain.Repository;
 
-namespace Hotline.FlowEngine.Workflows;
+//namespace Hotline.FlowEngine.Workflows;
 
-public class WorkflowStepHandler : CreationEntity
-{
-    public string WorkflowId { get; set; }
-    public string ExternalId { get; set; }
-    public string WorkflowStepId { get; set; }
+//public class WorkflowStepHandler : CreationEntity
+//{
+//    public string WorkflowId { get; set; }
+//    public string ExternalId { get; set; }
+//    public string WorkflowStepId { get; set; }
 
-    /// <summary>
-    /// 流程指派类型
-    /// </summary>
-    public EFlowAssignType FlowAssignType { get; set; }
+//    /// <summary>
+//    /// 流程指派类型
+//    /// </summary>
+//    public EFlowAssignType FlowAssignType { get; set; }
 
-    public string? UserId { get; set; }
-    public string? Username { get; set; }
-    public string? OrgId { get; set; }
-    public string? OrgName { get; set; }
-    public string? RoleId { get; set; }
-    public string? RoleName { get; set; }
+//    public string? UserId { get; set; }
+//    public string? Username { get; set; }
+//    public string? OrgId { get; set; }
+//    public string? OrgName { get; set; }
+//    public string? RoleId { get; set; }
+//    public string? RoleName { get; set; }
 
-    /// <summary>
-    /// 是否为实际办理者
-    /// </summary>
-    public bool IsActualHandler { get; set; }
+//    /// <summary>
+//    /// 是否为实际办理者
+//    /// </summary>
+//    public bool IsActualHandler { get; set; }
 
-    [Navigate(NavigateType.ManyToOne, nameof(WorkflowStepId))]
-    public WorkflowStep WorkflowStep { get; set; }
+//    [Navigate(NavigateType.ManyToOne, nameof(WorkflowStepId))]
+//    public WorkflowStep WorkflowStep { get; set; }
 
-    #region method
+//    #region method
 
-    public static WorkflowStepHandler Create(string workflowId, string externalId, EFlowAssignType flowAssignType, string? userId = null, string? username = null,
-        string? orgId = null, string? orgName = null, string? roleId = null, string? roleName = null)
-    {
-        var handler = new WorkflowStepHandler
-        {
-            WorkflowId = workflowId,
-            ExternalId = externalId,
-        };
-        handler.Assign(flowAssignType, userId, username, orgId, orgName, roleId, roleName);
-        return handler;
-    }
+//    public static WorkflowStepHandler Create(string workflowId, string externalId, EFlowAssignType flowAssignType, string? userId = null, string? username = null,
+//        string? orgId = null, string? orgName = null, string? roleId = null, string? roleName = null)
+//    {
+//        var handler = new WorkflowStepHandler
+//        {
+//            WorkflowId = workflowId,
+//            ExternalId = externalId,
+//        };
+//        handler.Assign(flowAssignType, userId, username, orgId, orgName, roleId, roleName);
+//        return handler;
+//    }
 
-    public void Assign(EFlowAssignType assignType, string? userId, string? username,
-    string? orgId, string? orgName, string? roleId, string? roleName)
-    {
-        FlowAssignType = assignType;
-        switch (assignType)
-        {
-            case EFlowAssignType.Org:
-                if (string.IsNullOrEmpty(orgId) || string.IsNullOrEmpty(orgName))
-                    throw new ArgumentNullException(nameof(orgId));
-                OrgId = orgId;
-                OrgName = orgName;
-                break;
-            case EFlowAssignType.User:
-                if (string.IsNullOrEmpty(userId) || string.IsNullOrEmpty(username) ||
-                   string.IsNullOrEmpty(orgId) || string.IsNullOrEmpty(orgName))
-                    throw new ArgumentNullException(nameof(userId));
-                UserId = userId;
-                Username = username;
-                OrgId = orgId;
-                OrgName = orgName;
-                break;
-            //case EFlowAssignType.Role:
-            //    if (string.IsNullOrEmpty(roleId) || string.IsNullOrEmpty(roleName))
-            //        throw new ArgumentNullException(nameof(roleId));
-            //    RoleId = roleId;
-            //    RoleName = roleName;
-            //    break;
-            default:
-                throw new ArgumentOutOfRangeException(nameof(assignType), assignType, null);
-        }
-    }
+//    public void Assign(EFlowAssignType assignType, string? userId, string? username,
+//    string? orgId, string? orgName, string? roleId, string? roleName)
+//    {
+//        FlowAssignType = assignType;
+//        switch (assignType)
+//        {
+//            case EFlowAssignType.Org:
+//                if (string.IsNullOrEmpty(orgId) || string.IsNullOrEmpty(orgName))
+//                    throw new ArgumentNullException(nameof(orgId));
+//                OrgId = orgId;
+//                OrgName = orgName;
+//                break;
+//            case EFlowAssignType.User:
+//                if (string.IsNullOrEmpty(userId) || string.IsNullOrEmpty(username) ||
+//                   string.IsNullOrEmpty(orgId) || string.IsNullOrEmpty(orgName))
+//                    throw new ArgumentNullException(nameof(userId));
+//                UserId = userId;
+//                Username = username;
+//                OrgId = orgId;
+//                OrgName = orgName;
+//                break;
+//            //case EFlowAssignType.Role:
+//            //    if (string.IsNullOrEmpty(roleId) || string.IsNullOrEmpty(roleName))
+//            //        throw new ArgumentNullException(nameof(roleId));
+//            //    RoleId = roleId;
+//            //    RoleName = roleName;
+//            //    break;
+//            default:
+//                throw new ArgumentOutOfRangeException(nameof(assignType), assignType, null);
+//        }
+//    }
 
-    public bool IsHandler(ICollection<string> roleIds, string? userId = null, string? orgId = null)
-    {
-        switch (FlowAssignType)
-        {
-            case EFlowAssignType.Org:
-                if (string.IsNullOrEmpty(OrgId))
-                    throw new UserFriendlyException($"数据异常, {nameof(OrgId)}");
-                return OrgId.Equals(orgId, StringComparison.OrdinalIgnoreCase);
-            case EFlowAssignType.User:
-                if (string.IsNullOrEmpty(UserId))
-                    throw new UserFriendlyException($"数据异常, {nameof(UserId)}");
-                return UserId.Equals(userId, StringComparison.OrdinalIgnoreCase);
-            //case EFlowAssignType.Role:
-            //    if (string.IsNullOrEmpty(RoleId))
-            //        throw new UserFriendlyException($"数据异常, {nameof(RoleId)}");
-            //    return roleIds.Any() && roleIds.Contains(RoleId, StringComparer.OrdinalIgnoreCase);
-            default:
-                throw new ArgumentOutOfRangeException();
-        }
-    }
+//    public bool IsHandler(ICollection<string> roleIds, string? userId = null, string? orgId = null)
+//    {
+//        switch (FlowAssignType)
+//        {
+//            case EFlowAssignType.Org:
+//                if (string.IsNullOrEmpty(OrgId))
+//                    throw new UserFriendlyException($"数据异常, {nameof(OrgId)}");
+//                return OrgId.Equals(orgId, StringComparison.OrdinalIgnoreCase);
+//            case EFlowAssignType.User:
+//                if (string.IsNullOrEmpty(UserId))
+//                    throw new UserFriendlyException($"数据异常, {nameof(UserId)}");
+//                return UserId.Equals(userId, StringComparison.OrdinalIgnoreCase);
+//            //case EFlowAssignType.Role:
+//            //    if (string.IsNullOrEmpty(RoleId))
+//            //        throw new UserFriendlyException($"数据异常, {nameof(RoleId)}");
+//            //    return roleIds.Any() && roleIds.Contains(RoleId, StringComparer.OrdinalIgnoreCase);
+//            default:
+//                throw new ArgumentOutOfRangeException();
+//        }
+//    }
 
-    public Kv GetHandler()
-    {
-        return FlowAssignType switch
-        {
-            EFlowAssignType.Org => new Kv(OrgId, OrgName),
-            EFlowAssignType.User => new Kv(UserId, Username),
-            //EFlowAssignType.Role => new Kv(RoleId, RoleName),
-            _ => throw new ArgumentOutOfRangeException()
-        };
-    }
+//    public Kv GetHandler()
+//    {
+//        return FlowAssignType switch
+//        {
+//            EFlowAssignType.Org => new Kv(OrgId, OrgName),
+//            EFlowAssignType.User => new Kv(UserId, Username),
+//            //EFlowAssignType.Role => new Kv(RoleId, RoleName),
+//            _ => throw new ArgumentOutOfRangeException()
+//        };
+//    }
 
-    #endregion
-}
+//    #endregion
+//}