xfe 10 месяцев назад
Родитель
Сommit
07147874fc

+ 11 - 10
src/Hotline.Api/Controllers/OrderController.cs

@@ -2255,16 +2255,17 @@ public class OrderController : BaseController
         if (order == null)
             return new();
 
-        string? countersignId = null;
-        var canPrevious = false;
+        var dto = _mapper.Map<OrderDto>(order);
+
         if (!string.IsNullOrEmpty(order.WorkflowId))
         {
             var result = await _workflowDomainService.GetWorkflowHandlePermissionAsync(
-                order.WorkflowId, _sessionContext.RequiredUserId, _sessionContext.RequiredOrgId,
+                order.WorkflowId, _sessionContext.RequiredUserId, _sessionContext.RequiredOrgId, _sessionContext.Roles,
                 cancellationToken: HttpContext.RequestAborted);
-            order.Workflow = result.workflow;
-            countersignId = result.countersignId;
-            canPrevious = result.canPrevious;
+            //order.Workflow = result.Workflow;
+            dto.CountersignId = result.CountersignId;
+            dto.CanHandle = result.CanHandle;
+            dto.CanPrevious = result.CanPrevious;
 
             await _mediator.Publish(new GetOrderDetailNotify(order.Workflow,
                 _sessionContext.RequiredUserId, _sessionContext.UserName,
@@ -2272,9 +2273,9 @@ public class OrderController : BaseController
                 _sessionContext.OrgAreaCode, _sessionContext.OrgAreaName));
         }
 
-        var dto = _mapper.Map<OrderDto>(order!);
-        dto.CountersignId = countersignId;
-        dto.CanHandle = order.CanHandle(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgId);
+        //var dto = _mapper.Map<OrderDto>(order!);
+        //dto.CountersignId = countersignId;
+        //dto.CanHandle = order.CanHandle(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgId);
         dto.IsCanDelay = !order.OrderDelays.Any(x => x.DelayState == EDelayState.Examining);
         if (order.OrderDelays.Any(x => x.DelayState == EDelayState.Examining && x.ApplyOrgCode == _sessionContext.RequiredOrgId))
         {
@@ -2310,7 +2311,7 @@ public class OrderController : BaseController
             dto.DelayString = "";
         }
 
-        dto.CanPrevious = canPrevious;
+        //dto.CanPrevious = canPrevious;
 
         if (dto.FileJson != null && dto.FileJson.Any())
         {

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

@@ -151,7 +151,15 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             current.RequiredOrgId, current.OrgName)};
 
         var startStep = _workflowDomainService.CreateStartStep(workflow, startStepDefine, dto,
-            new List<Kv> { new(current.RequiredUserId, current.UserName) },
+            new FlowStepHandler
+            {
+                Key = current.RequiredUserId,
+                Value = current.UserName,
+                UserId = current.UserId,
+                Username = current.UserName,
+                OrgId = current.RequiredOrgId,
+                OrgName = current.OrgName
+            },
             startStepHandles, expiredTime);
 
         var flowAssignInfo =
@@ -310,7 +318,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             throw UserFriendlyException.SameMessage("结束节点不支持撤回");
         //var isStartCountersign = targetStepDefine.CouldPrevStartCountersign(dto.NextHandlers.Count);
         var flowAssignInfo = await GetNextStepFlowAssignInfoByDefineAsync(targetStepDefine, dto.IsStartCountersign,
-            dto.NextHandlers, cancellationToken);
+            dto.NextHandlers.Select(d => new Kv(d.Key, d.Value)).ToList(), cancellationToken);
 
         var stepHandlers = await GetNextStepHandlersAsync(workflow, targetStepDefine, dto, cancellationToken);
 
@@ -714,7 +722,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                     Value = stepDefine.Name,
                     StepType = stepDefine.StepType,
                     BusinessType = stepDefine.BusinessType,
-                    HandlerType = stepDefine.HandlerType,
+                    //HandlerType = stepDefine.HandlerType,
+                    HandlerType = EHandlerType.AssignedUser,//指定办理人(业务需求)
                     Items = new List<FlowStepHandler> { handler }//handlers
                 };
             }
@@ -735,8 +744,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         return stepOptions;
     }
 
-    public async Task<NextStepOption> GetConfigStepAsync(EFlowType flowType, StepDefine stepDefine,
-        CancellationToken cancellationToken)
+    public async Task<NextStepOption> GetConfigStepAsync(EFlowType flowType, StepDefine stepDefine, CancellationToken cancellationToken)
     {
         var handlers = new List<FlowStepHandler>();
         if (stepDefine.StepType is EStepType.End)
@@ -911,7 +919,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             StepType = EStepType.Summary,
             BusinessType = prevStep.BusinessType,
             //HandlerType = prevStep.HandlerType,
-            HandlerType = EHandlerType.AssignedUser,
+            HandlerType = EHandlerType.AssignedUser,//指定办理人(业务需求)
             Items = new List<FlowStepHandler> { handler }//handlers //new List<Kv> { new(prevStep.HandlerId, prevStep.HandlerName) },
         };
     }
@@ -974,7 +982,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
 
                     items = await _organizeRepository.Queryable()
                         .Where(d => d.IsCenter)
-                        .Select(d=>new FlowStepHandler
+                        .Select(d => new FlowStepHandler
                         {
                             Key = d.Id,
                             Value = d.Name,
@@ -1095,7 +1103,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         if (nextStepDefine.StepType is EStepType.End) return new();
 
         var isStartCountersign = dto.IsStartCountersign;
-        var handlers = dto.NextHandlers.Select(d=>new Kv(d.Key,d.Value)).ToList();
+        var handlers = dto.NextHandlers.Select(d => new Kv(d.Key, d.Value)).ToList();
 
         if (isStartCountersign)
         {

+ 385 - 381
src/Hotline.Application/Orders/OrderSecondaryHandlingApplication.cs

@@ -26,406 +26,410 @@ using Hotline.Share.Enums.FlowEngine;
 
 namespace Hotline.Application.Orders
 {
-	public class OrderSecondaryHandlingApplication : IOrderSecondaryHandlingApplication, IScopeDependency
-	{
-		private readonly IMapper _mapper;
-		private readonly IRepository<OrderSecondaryHandling> _orderSecondaryHandlingRepository;
-		private readonly IFileRepository _fileRepository;
-		private readonly IRepository<OrderVisit> _orderVisitRepository;
-		private readonly ISessionContext _sessionContext;
-		private readonly IOrderRepository _orderRepository;
-		private readonly ITimeLimitDomainService _timeLimitDomainService;
-		private readonly ICapPublisher _capPublisher;
-		private readonly IWorkflowApplication _workflowApplication;
-		private readonly IRepository<OrderPublish> _orderPublishRepository;
-		private readonly IRepository<OrderPublishHistory> _orderPublishHistoryRepository;
-		private readonly IWorkflowDomainService _workflowDomainService;
-		private readonly IRepository<OrderVisitDetail> _orderVisitedDetailRepository;
+    public class OrderSecondaryHandlingApplication : IOrderSecondaryHandlingApplication, IScopeDependency
+    {
+        private readonly IMapper _mapper;
+        private readonly IRepository<OrderSecondaryHandling> _orderSecondaryHandlingRepository;
+        private readonly IFileRepository _fileRepository;
+        private readonly IRepository<OrderVisit> _orderVisitRepository;
+        private readonly ISessionContext _sessionContext;
+        private readonly IOrderRepository _orderRepository;
+        private readonly ITimeLimitDomainService _timeLimitDomainService;
+        private readonly ICapPublisher _capPublisher;
+        private readonly IWorkflowApplication _workflowApplication;
+        private readonly IRepository<OrderPublish> _orderPublishRepository;
+        private readonly IRepository<OrderPublishHistory> _orderPublishHistoryRepository;
+        private readonly IWorkflowDomainService _workflowDomainService;
+        private readonly IRepository<OrderVisitDetail> _orderVisitedDetailRepository;
 
-		public OrderSecondaryHandlingApplication(
-			IMapper mapper,
-			IRepository<OrderSecondaryHandling> orderSecondaryHandlingRepository,
-			IFileRepository fileRepository,
-			IRepository<OrderVisit> orderVisitRepository,
-			ISessionContext sessionContext,
-			IOrderRepository orderRepository,
-			ITimeLimitDomainService timeLimitDomainService,
-			ICapPublisher capPublisher,
-			IWorkflowApplication workflowApplication,
-			IRepository<OrderPublish> orderPublishRepository,
-			IRepository<OrderPublishHistory> orderPublishHistoryRepository,
-			IWorkflowDomainService workflowDomainService,
-			IRepository<OrderVisitDetail> orderVisitedDetailRepository
-			) {
-			_mapper = mapper;
-			_orderSecondaryHandlingRepository = orderSecondaryHandlingRepository;
-			_fileRepository = fileRepository;
-			_orderVisitRepository = orderVisitRepository;
-			_sessionContext = sessionContext;
-			_orderRepository = orderRepository;
-			_timeLimitDomainService = timeLimitDomainService;
-			_capPublisher = capPublisher;
-			_workflowApplication = workflowApplication;
-			_orderPublishRepository = orderPublishRepository;
-			_orderPublishHistoryRepository = orderPublishHistoryRepository;
-			_workflowDomainService = workflowDomainService;
-			_orderVisitedDetailRepository = orderVisitedDetailRepository;
-		}
+        public OrderSecondaryHandlingApplication(
+            IMapper mapper,
+            IRepository<OrderSecondaryHandling> orderSecondaryHandlingRepository,
+            IFileRepository fileRepository,
+            IRepository<OrderVisit> orderVisitRepository,
+            ISessionContext sessionContext,
+            IOrderRepository orderRepository,
+            ITimeLimitDomainService timeLimitDomainService,
+            ICapPublisher capPublisher,
+            IWorkflowApplication workflowApplication,
+            IRepository<OrderPublish> orderPublishRepository,
+            IRepository<OrderPublishHistory> orderPublishHistoryRepository,
+            IWorkflowDomainService workflowDomainService,
+            IRepository<OrderVisitDetail> orderVisitedDetailRepository
+            )
+        {
+            _mapper = mapper;
+            _orderSecondaryHandlingRepository = orderSecondaryHandlingRepository;
+            _fileRepository = fileRepository;
+            _orderVisitRepository = orderVisitRepository;
+            _sessionContext = sessionContext;
+            _orderRepository = orderRepository;
+            _timeLimitDomainService = timeLimitDomainService;
+            _capPublisher = capPublisher;
+            _workflowApplication = workflowApplication;
+            _orderPublishRepository = orderPublishRepository;
+            _orderPublishHistoryRepository = orderPublishHistoryRepository;
+            _workflowDomainService = workflowDomainService;
+            _orderVisitedDetailRepository = orderVisitedDetailRepository;
+        }
 
-		/// <summary>
-		///  二次办理新增
-		/// </summary>
-		/// <returns></returns>
-		public async Task AddAsync(AddOrderSecondaryHandlingDto dto, CancellationToken cancellationToken)
-		{
-			var model = _mapper.Map<OrderSecondaryHandling>(dto);
-			if (string.IsNullOrEmpty(dto.Id))
-			{
-				model.InitId();
-			}
-			else {
-				model = await _orderSecondaryHandlingRepository.GetAsync(dto.Id , cancellationToken);
-				model.Content = dto.Content;
-			}
-			model.State = ESecondaryHandlingState.Apply;
-			model.ApplyOrgId = _sessionContext.OrgId;
-			model.ApplyOrgName = _sessionContext.OrgName;
-		
-			if (dto.Files.Any())
-				model.FileJson = await _fileRepository.AddFileAsync(dto.Files, model.Id, "", cancellationToken);
+        /// <summary>
+        ///  二次办理新增
+        /// </summary>
+        /// <returns></returns>
+        public async Task AddAsync(AddOrderSecondaryHandlingDto dto, CancellationToken cancellationToken)
+        {
+            var model = _mapper.Map<OrderSecondaryHandling>(dto);
+            if (string.IsNullOrEmpty(dto.Id))
+            {
+                model.InitId();
+            }
+            else
+            {
+                model = await _orderSecondaryHandlingRepository.GetAsync(dto.Id, cancellationToken);
+                model.Content = dto.Content;
+            }
+            model.State = ESecondaryHandlingState.Apply;
+            model.ApplyOrgId = _sessionContext.OrgId;
+            model.ApplyOrgName = _sessionContext.OrgName;
 
-			var visit = await _orderVisitRepository.GetAsync(x => x.Id  == dto.VisitId && x.VisitState != EVisitState.None, cancellationToken);
-			if (visit != null)
-			{
-				model.VisitState = visit.VisitState;
-				visit.VisitState = EVisitState.None;
-				await _orderVisitRepository.UpdateAsync(visit, cancellationToken);
-			}
+            if (dto.Files.Any())
+                model.FileJson = await _fileRepository.AddFileAsync(dto.Files, model.Id, "", cancellationToken);
 
-			if (!string.IsNullOrEmpty(dto.Id))
-			{
-				await _orderSecondaryHandlingRepository.UpdateAsync(model, cancellationToken);
-			}
-			else {
-				await _orderSecondaryHandlingRepository.AddAsync(model, cancellationToken);
-			}
-		}
+            var visit = await _orderVisitRepository.GetAsync(x => x.Id == dto.VisitId && x.VisitState != EVisitState.None, cancellationToken);
+            if (visit != null)
+            {
+                model.VisitState = visit.VisitState;
+                visit.VisitState = EVisitState.None;
+                await _orderVisitRepository.UpdateAsync(visit, cancellationToken);
+            }
 
-		public async Task SendBackAsync(SendBackOrderSecondaryHandlingDto dto, CancellationToken cancellationToken) 
-		{
-			var model =await _orderSecondaryHandlingRepository.GetAsync(dto.Id, cancellationToken);
-			model.State = ESecondaryHandlingState.NotApply;
-			model.SendBackContent = dto.SendBackContent;
-			model.AuditUser = _sessionContext.UserName;
-			model.AuditTime = DateTime.Now;
-			model.SendBackNum = model.SendBackNum is null ? 1 : model.SendBackNum + 1;
-			await _orderSecondaryHandlingRepository.UpdateAsync(model, cancellationToken);
-			var visit = await _orderVisitRepository.GetAsync(x => x.Id == model.VisitId , cancellationToken);
-			if (visit != null)
-			{
-				visit.VisitState = model.VisitState;
-				await _orderVisitRepository.UpdateAsync(visit, cancellationToken);
-			}
-		}
+            if (!string.IsNullOrEmpty(dto.Id))
+            {
+                await _orderSecondaryHandlingRepository.UpdateAsync(model, cancellationToken);
+            }
+            else
+            {
+                await _orderSecondaryHandlingRepository.AddAsync(model, cancellationToken);
+            }
+        }
 
+        public async Task SendBackAsync(SendBackOrderSecondaryHandlingDto dto, CancellationToken cancellationToken)
+        {
+            var model = await _orderSecondaryHandlingRepository.GetAsync(dto.Id, cancellationToken);
+            model.State = ESecondaryHandlingState.NotApply;
+            model.SendBackContent = dto.SendBackContent;
+            model.AuditUser = _sessionContext.UserName;
+            model.AuditTime = DateTime.Now;
+            model.SendBackNum = model.SendBackNum is null ? 1 : model.SendBackNum + 1;
+            await _orderSecondaryHandlingRepository.UpdateAsync(model, cancellationToken);
+            var visit = await _orderVisitRepository.GetAsync(x => x.Id == model.VisitId, cancellationToken);
+            if (visit != null)
+            {
+                visit.VisitState = model.VisitState;
+                await _orderVisitRepository.UpdateAsync(visit, cancellationToken);
+            }
+        }
 
-		/// <summary>
-		/// 二次办理审批
-		/// </summary>
-		/// <returns></returns>
-		public async Task AuditAsync(AuditOrderSecondaryHandlingDto dto, OrderSecondaryHandling model, CancellationToken cancellationToken)
-		{
-			model.State = dto.State;
-			model.AuditContent = dto.AuditContent;
-			model.AuditId = _sessionContext.UserId;
-			model.AuditUser = _sessionContext.UserName;
-			model.AuditTime = DateTime.Now;
-			if (model.State == ESecondaryHandlingState.End)
-			{
-				var order = await _orderRepository.GetAsync(x => x.Id == model.OrderId, cancellationToken);
-				if (string.IsNullOrEmpty(order.WorkflowId))
-					throw UserFriendlyException.SameMessage("无效二次办理审批信息,没有找到对应流程信息!");
-				var step = await _workflowDomainService.FindLastHandleStepAsync(order.WorkflowId, model.ApplyOrgId, cancellationToken);
-				if (step == null)
-					throw UserFriendlyException.SameMessage("无效二次办理审批信息,没有找到对应流程节点!");
-				var recall = new RecallDto
-				{
-					WorkflowId = order.WorkflowId!,
-					NextStepCode = step.Code,
-					NextStepName = step.Name,
-					NextHandlers = step.Handlers,
-					Opinion = dto.AuditContent,
-					FlowDirection = Share.Enums.FlowEngine.EFlowDirection.CenterToOrg,
-					HandlerType = step.HandlerType,
-					BusinessType = step.BusinessType
-				};
-				var reTransactNum = order.ReTransactNum is null ? 1 : order.ReTransactNum + 1;
-				var expiredTime = _timeLimitDomainService.CalcEndTime(DateTime.Now, order.AcceptTypeCode);
-				var processType = step.FlowDirection == EFlowDirection.OrgToCenter || step.FlowDirection == EFlowDirection.CenterToCenter ? EProcessType.Zhiban : EProcessType.Jiaoban;
-				await _orderRepository.Updateable().SetColumns(o => new Order() { ExpiredTime = expiredTime.ExpiredTime, NearlyExpiredTime = expiredTime.NearlyExpiredTime, ReTransactNum = reTransactNum, ProcessType = processType })
-					.Where(o => o.Id == order.Id).ExecuteCommandAsync(cancellationToken);
-				var orderDto = _mapper.Map<OrderDto>(order);
-				await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto, cancellationToken: cancellationToken);
 
-				await _workflowApplication.RecallAsync(recall, expiredTime.ExpiredTime, cancellationToken);
-				var publish = await _orderPublishRepository.GetAsync(x => x.OrderId == model.OrderId);
-				if (publish != null)
-				{
-					var publishHistory = _mapper.Map<OrderPublishHistory>(publish);
-					publishHistory.OrderPublishId = publish.Id;
-					publishHistory.ArrangeTitleAfter = publish.ArrangeTitle;
-					publishHistory.ArrangeTitleBefor = publish.ArrangeTitle;
-					publishHistory.ArrangeContentAfter = publish.ArrangeContent;
-					publishHistory.ArrangeContentBefor = publish.ArrangeContent;
-					publishHistory.ArrangeOpinionAfter = publish.ArrangeOpinion;
-					publishHistory.ArrangeOpinionBefor = publish.ArrangeOpinion;
-					await _orderPublishHistoryRepository.AddAsync(publishHistory, cancellationToken);
-					await _orderPublishRepository.RemoveAsync(publish, false, cancellationToken);
-				}
-			}
-			else {
-				var visit = await _orderVisitRepository.GetAsync(x => x.OrderId == model.OrderId, cancellationToken);
-				visit.VisitState = model.VisitState;
-				await _orderVisitRepository.UpdateAsync(visit, cancellationToken);
-			}
-			await _orderSecondaryHandlingRepository.UpdateAsync(model, cancellationToken);
-		}
+        /// <summary>
+        /// 二次办理审批
+        /// </summary>
+        /// <returns></returns>
+        public async Task AuditAsync(AuditOrderSecondaryHandlingDto dto, OrderSecondaryHandling model, CancellationToken cancellationToken)
+        {
+            model.State = dto.State;
+            model.AuditContent = dto.AuditContent;
+            model.AuditId = _sessionContext.UserId;
+            model.AuditUser = _sessionContext.UserName;
+            model.AuditTime = DateTime.Now;
+            if (model.State == ESecondaryHandlingState.End)
+            {
+                var order = await _orderRepository.GetAsync(x => x.Id == model.OrderId, cancellationToken);
+                if (string.IsNullOrEmpty(order.WorkflowId))
+                    throw UserFriendlyException.SameMessage("无效二次办理审批信息,没有找到对应流程信息!");
+                var step = await _workflowDomainService.FindLastHandleStepAsync(order.WorkflowId, model.ApplyOrgId, cancellationToken);
+                if (step == null)
+                    throw UserFriendlyException.SameMessage("无效二次办理审批信息,没有找到对应流程节点!");
+                var recall = new RecallDto
+                {
+                    WorkflowId = order.WorkflowId!,
+                    NextStepCode = step.Code,
+                    NextStepName = step.Name,
+                    NextHandlers = new List<FlowStepHandler> { step.GetWorkflowStepHandler() },
+                    Opinion = dto.AuditContent,
+                    FlowDirection = Share.Enums.FlowEngine.EFlowDirection.CenterToOrg,
+                    HandlerType = step.HandlerType,
+                    BusinessType = step.BusinessType
+                };
+                var reTransactNum = order.ReTransactNum is null ? 1 : order.ReTransactNum + 1;
+                var expiredTime = _timeLimitDomainService.CalcEndTime(DateTime.Now, order.AcceptTypeCode);
+                var processType = step.FlowDirection == EFlowDirection.OrgToCenter || step.FlowDirection == EFlowDirection.CenterToCenter ? EProcessType.Zhiban : EProcessType.Jiaoban;
+                await _orderRepository.Updateable().SetColumns(o => new Order() { ExpiredTime = expiredTime.ExpiredTime, NearlyExpiredTime = expiredTime.NearlyExpiredTime, ReTransactNum = reTransactNum, ProcessType = processType })
+                    .Where(o => o.Id == order.Id).ExecuteCommandAsync(cancellationToken);
+                var orderDto = _mapper.Map<OrderDto>(order);
+                await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto, cancellationToken: cancellationToken);
 
+                await _workflowApplication.RecallAsync(recall, expiredTime.ExpiredTime, cancellationToken);
+                var publish = await _orderPublishRepository.GetAsync(x => x.OrderId == model.OrderId);
+                if (publish != null)
+                {
+                    var publishHistory = _mapper.Map<OrderPublishHistory>(publish);
+                    publishHistory.OrderPublishId = publish.Id;
+                    publishHistory.ArrangeTitleAfter = publish.ArrangeTitle;
+                    publishHistory.ArrangeTitleBefor = publish.ArrangeTitle;
+                    publishHistory.ArrangeContentAfter = publish.ArrangeContent;
+                    publishHistory.ArrangeContentBefor = publish.ArrangeContent;
+                    publishHistory.ArrangeOpinionAfter = publish.ArrangeOpinion;
+                    publishHistory.ArrangeOpinionBefor = publish.ArrangeOpinion;
+                    await _orderPublishHistoryRepository.AddAsync(publishHistory, cancellationToken);
+                    await _orderPublishRepository.RemoveAsync(publish, false, cancellationToken);
+                }
+            }
+            else
+            {
+                var visit = await _orderVisitRepository.GetAsync(x => x.OrderId == model.OrderId, cancellationToken);
+                visit.VisitState = model.VisitState;
+                await _orderVisitRepository.UpdateAsync(visit, cancellationToken);
+            }
+            await _orderSecondaryHandlingRepository.UpdateAsync(model, cancellationToken);
+        }
 
-		/// <summary>
-		/// 获取申请列表
-		/// </summary>
-		/// <returns></returns>
-		public ISugarQueryable<OrderVisitDetail> ApplyQuery(MayScreenListDto dto, CancellationToken cancellationToken)
-		{
-			dto.CreationTimeEnd = DateTime.Now;
-			//dto.CreationTimeStart = DateTime.Now;
-			dto.CreationTimeStart = _timeLimitDomainService.CalcWorkTimeReduce(DateTime.Now, 5);
 
-			var query = _orderVisitedDetailRepository.Queryable(false, true)
-				.Includes(x => x.OrderVisit)
-				.Includes(x => x.OrderVisit, y => y.Order)
-				.Includes(x => x.OrderVisit, y => y.Employee)
-				.Includes(x => x.SecondaryHandling)
-				.LeftJoin<OrderScreen>((x, s) => x.Id == s.VisitDetailId && s.Status < EScreenStatus.End && s.IsDeleted == false)
-				.Where((x, s) => s.Id == null && (x.SecondaryHandling.State == ESecondaryHandlingState.NotApply || x.SecondaryHandling.Id == null))
-				.Where(x => x.OrderVisit.VisitTime < dto.CreationTimeEnd && x.OrderVisit.VisitTime > dto.CreationTimeStart)
-				.WhereIF(!string.IsNullOrEmpty(dto.No), x => x.OrderVisit.Order!.No!.Contains(dto.No!))
-				.WhereIF(dto.IsProvince.HasValue, x => x.OrderVisit.Order!.IsProvince == dto.IsProvince)
-				.WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.OrderVisit.Order!.Title!.Contains(dto.Title!))
-				.WhereIF(!string.IsNullOrEmpty(dto.SourceChannel), x => x.OrderVisit.Order!.SourceChannelCode! == dto.SourceChannel!)
-				.WhereIF(!string.IsNullOrEmpty(dto.AcceptType), x => x.OrderVisit.Order!.AcceptTypeCode! == dto.AcceptType!)
-				.WhereIF(dto.CounterSignType.HasValue, x => x.OrderVisit.Order!.CounterSignType == dto.CounterSignType)
-				.WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), x => x.OrderVisit.Order!.OrgLevelOneName!.Contains(dto.OrgLevelOneName!))
-				.WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), x => x.OrderVisit.Order!.ActualHandleOrgName!.Contains(dto.ActualHandleOrgName!))
-				.WhereIF(dto.ActualHandleTime.HasValue && dto.EndActualHandleTime.HasValue, x => x.OrderVisit.Order!.ActualHandleTime >= dto.ActualHandleTime && x.OrderVisit.Order!.ActualHandleTime <= dto.EndActualHandleTime)
-				.WhereIF(dto.FiledTime.HasValue && dto.EndFiledTime.HasValue, x => x.OrderVisit.Order!.FiledTime == dto.FiledTime && x.OrderVisit.Order!.FiledTime <= dto.EndFiledTime)
-				.WhereIF(dto.CreationTime.HasValue && dto.EndCreationTime.HasValue, x => x.OrderVisit.Order!.CreationTime == dto.CreationTime && x.OrderVisit.Order!.CreationTime <= dto.EndCreationTime)
-				.WhereIF(dto.VisitTime.HasValue && dto.EndVisitTime.HasValue, x => x.OrderVisit.VisitTime == dto.VisitTime && x.OrderVisit.VisitTime <= dto.EndVisitTime)
-				.WhereIF(!string.IsNullOrEmpty(dto.VisitOrgName), x => x.VisitOrgName!.Contains(dto.VisitOrgName!))
-				.WhereIF(!string.IsNullOrEmpty(dto.OrgProcessingResults), x => SqlFunc.JsonField(x.OrgProcessingResults, "Key") == dto.OrgProcessingResults)
-				.WhereIF(!string.IsNullOrEmpty(dto.OrgHandledAttitude), x => SqlFunc.JsonListObjectAny(x.OrgHandledAttitude, "Key", dto.OrgHandledAttitude))
-				.WhereIF(!string.IsNullOrEmpty(dto.OrgNoSatisfiedReason), x => SqlFunc.JsonField(x.OrgNoSatisfiedReason, "Key") == dto.OrgNoSatisfiedReason)
-				.Where((x, s) => x.OrderVisit.VisitState != EVisitState.None && x.OrderVisit.IsCanHandle)
-				.Where((x, s) => x.OrderVisit.Order.CounterSignType == null && x.OrderVisit.Order.ActualHandleOrgCode == _sessionContext.OrgId)
-				;
-			if (_sessionContext.OrgId != null && !_sessionContext.OrgIsCenter)
-			{
-				query.WhereIF(!string.IsNullOrEmpty(dto.Keyword),
-						(x, s) => x.OrderVisit.Order.Title.Contains(dto.Keyword!) ||
-								  x.OrderVisit.Order.No.Contains(dto.Keyword!))
-					.Where((x, s) => x.VisitTarget == EVisitTarget.Org && x.VisitOrgCode.StartsWith(_sessionContext.OrgId) && (
-						SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "1" ||
-						SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2"
-						|| SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "1" ||
-						SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2"
-					));
-			}
-			else
-			{
-				query.WhereIF(!string.IsNullOrEmpty(dto.Keyword),
-						(x, s) => x.OrderVisit.Order.Title.Contains(dto.Keyword!) ||
-								  x.OrderVisit.Order.No.Contains(dto.Keyword!))
-					.Where((x, s) => x.VisitTarget == EVisitTarget.Org && (
-						SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "1" ||
-						SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2"
-						|| SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "1" ||
-						SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2"
-					));
-			}
+        /// <summary>
+        /// 获取申请列表
+        /// </summary>
+        /// <returns></returns>
+        public ISugarQueryable<OrderVisitDetail> ApplyQuery(MayScreenListDto dto, CancellationToken cancellationToken)
+        {
+            dto.CreationTimeEnd = DateTime.Now;
+            //dto.CreationTimeStart = DateTime.Now;
+            dto.CreationTimeStart = _timeLimitDomainService.CalcWorkTimeReduce(DateTime.Now, 5);
 
-			return query.OrderByDescending((x, s) => x.CreationTime);
-		}
+            var query = _orderVisitedDetailRepository.Queryable(false, true)
+                .Includes(x => x.OrderVisit)
+                .Includes(x => x.OrderVisit, y => y.Order)
+                .Includes(x => x.OrderVisit, y => y.Employee)
+                .Includes(x => x.SecondaryHandling)
+                .LeftJoin<OrderScreen>((x, s) => x.Id == s.VisitDetailId && s.Status < EScreenStatus.End && s.IsDeleted == false)
+                .Where((x, s) => s.Id == null && (x.SecondaryHandling.State == ESecondaryHandlingState.NotApply || x.SecondaryHandling.Id == null))
+                .Where(x => x.OrderVisit.VisitTime < dto.CreationTimeEnd && x.OrderVisit.VisitTime > dto.CreationTimeStart)
+                .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.OrderVisit.Order!.No!.Contains(dto.No!))
+                .WhereIF(dto.IsProvince.HasValue, x => x.OrderVisit.Order!.IsProvince == dto.IsProvince)
+                .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.OrderVisit.Order!.Title!.Contains(dto.Title!))
+                .WhereIF(!string.IsNullOrEmpty(dto.SourceChannel), x => x.OrderVisit.Order!.SourceChannelCode! == dto.SourceChannel!)
+                .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), x => x.OrderVisit.Order!.AcceptTypeCode! == dto.AcceptType!)
+                .WhereIF(dto.CounterSignType.HasValue, x => x.OrderVisit.Order!.CounterSignType == dto.CounterSignType)
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), x => x.OrderVisit.Order!.OrgLevelOneName!.Contains(dto.OrgLevelOneName!))
+                .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), x => x.OrderVisit.Order!.ActualHandleOrgName!.Contains(dto.ActualHandleOrgName!))
+                .WhereIF(dto.ActualHandleTime.HasValue && dto.EndActualHandleTime.HasValue, x => x.OrderVisit.Order!.ActualHandleTime >= dto.ActualHandleTime && x.OrderVisit.Order!.ActualHandleTime <= dto.EndActualHandleTime)
+                .WhereIF(dto.FiledTime.HasValue && dto.EndFiledTime.HasValue, x => x.OrderVisit.Order!.FiledTime == dto.FiledTime && x.OrderVisit.Order!.FiledTime <= dto.EndFiledTime)
+                .WhereIF(dto.CreationTime.HasValue && dto.EndCreationTime.HasValue, x => x.OrderVisit.Order!.CreationTime == dto.CreationTime && x.OrderVisit.Order!.CreationTime <= dto.EndCreationTime)
+                .WhereIF(dto.VisitTime.HasValue && dto.EndVisitTime.HasValue, x => x.OrderVisit.VisitTime == dto.VisitTime && x.OrderVisit.VisitTime <= dto.EndVisitTime)
+                .WhereIF(!string.IsNullOrEmpty(dto.VisitOrgName), x => x.VisitOrgName!.Contains(dto.VisitOrgName!))
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgProcessingResults), x => SqlFunc.JsonField(x.OrgProcessingResults, "Key") == dto.OrgProcessingResults)
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgHandledAttitude), x => SqlFunc.JsonListObjectAny(x.OrgHandledAttitude, "Key", dto.OrgHandledAttitude))
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgNoSatisfiedReason), x => SqlFunc.JsonField(x.OrgNoSatisfiedReason, "Key") == dto.OrgNoSatisfiedReason)
+                .Where((x, s) => x.OrderVisit.VisitState != EVisitState.None && x.OrderVisit.IsCanHandle)
+                .Where((x, s) => x.OrderVisit.Order.CounterSignType == null && x.OrderVisit.Order.ActualHandleOrgCode == _sessionContext.OrgId)
+                ;
+            if (_sessionContext.OrgId != null && !_sessionContext.OrgIsCenter)
+            {
+                query.WhereIF(!string.IsNullOrEmpty(dto.Keyword),
+                        (x, s) => x.OrderVisit.Order.Title.Contains(dto.Keyword!) ||
+                                  x.OrderVisit.Order.No.Contains(dto.Keyword!))
+                    .Where((x, s) => x.VisitTarget == EVisitTarget.Org && x.VisitOrgCode.StartsWith(_sessionContext.OrgId) && (
+                        SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "1" ||
+                        SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2"
+                        || SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "1" ||
+                        SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2"
+                    ));
+            }
+            else
+            {
+                query.WhereIF(!string.IsNullOrEmpty(dto.Keyword),
+                        (x, s) => x.OrderVisit.Order.Title.Contains(dto.Keyword!) ||
+                                  x.OrderVisit.Order.No.Contains(dto.Keyword!))
+                    .Where((x, s) => x.VisitTarget == EVisitTarget.Org && (
+                        SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "1" ||
+                        SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2"
+                        || SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "1" ||
+                        SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2"
+                    ));
+            }
 
-		/// <summary>
-		/// 二次办理列表查询
-		/// </summary>
-		/// <returns></returns>
-		public ISugarQueryable<OrderSecondaryHandling> Query(SecondaryHandlingListDto dto, CancellationToken cancellationToken)
-		{
-			if (dto.CreationTimeEnd.HasValue)
-				dto.CreationTimeEnd = dto.CreationTimeEnd.Value.AddDays(1).AddSeconds(-1);
-			return _orderSecondaryHandlingRepository.Queryable()
-				.Includes(x => x.Order)
-				.Includes(x => x.VisitDetail)
-				.Includes(x => x.Visit, d => d.Order)
-				.Where(x=>x.State> ESecondaryHandlingState.NotApply)
-				.WhereIF(!string.IsNullOrEmpty(dto.Keyword),
-					x => x.Visit.Order.Title.Contains(dto.Keyword!) || x.Visit.Order.No.Contains(dto.Keyword!))
-				.WhereIF(dto.Status is ESecondaryHandlingState.Apply, x => x.State == ESecondaryHandlingState.Apply)
-				.WhereIF(dto.Status is ESecondaryHandlingState.Handled, x => x.State != ESecondaryHandlingState.Apply)
-				.WhereIF(dto.Status is ESecondaryHandlingState.End, x => x.State == ESecondaryHandlingState.End)
-				.WhereIF(dto.Status is ESecondaryHandlingState.Refuse, x => x.State == ESecondaryHandlingState.Refuse)
-				.WhereIF(dto.CreationTimeStart.HasValue, x => x.CreationTime >= dto.CreationTimeStart)
-				.WhereIF(dto.CreationTimeEnd.HasValue, x => x.CreationTime <= dto.CreationTimeEnd)
-				.WhereIF(!string.IsNullOrEmpty(dto.OrderId), x => x.OrderId == dto.OrderId)
-				.OrderByDescending(x => x.CreationTime);
-		}
+            return query.OrderByDescending((x, s) => x.CreationTime);
+        }
 
-		/// <summary>
-		/// 获取实体
-		/// </summary>
-		/// <returns></returns>
-		public async Task<OrderSecondaryHandling> Entity(string id, CancellationToken cancellationToken)
-		{
-			return await _orderSecondaryHandlingRepository.Queryable()
-				.FirstAsync(x => x.Id == id, cancellationToken);
-		}
+        /// <summary>
+        /// 二次办理列表查询
+        /// </summary>
+        /// <returns></returns>
+        public ISugarQueryable<OrderSecondaryHandling> Query(SecondaryHandlingListDto dto, CancellationToken cancellationToken)
+        {
+            if (dto.CreationTimeEnd.HasValue)
+                dto.CreationTimeEnd = dto.CreationTimeEnd.Value.AddDays(1).AddSeconds(-1);
+            return _orderSecondaryHandlingRepository.Queryable()
+                .Includes(x => x.Order)
+                .Includes(x => x.VisitDetail)
+                .Includes(x => x.Visit, d => d.Order)
+                .Where(x => x.State > ESecondaryHandlingState.NotApply)
+                .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
+                    x => x.Visit.Order.Title.Contains(dto.Keyword!) || x.Visit.Order.No.Contains(dto.Keyword!))
+                .WhereIF(dto.Status is ESecondaryHandlingState.Apply, x => x.State == ESecondaryHandlingState.Apply)
+                .WhereIF(dto.Status is ESecondaryHandlingState.Handled, x => x.State != ESecondaryHandlingState.Apply)
+                .WhereIF(dto.Status is ESecondaryHandlingState.End, x => x.State == ESecondaryHandlingState.End)
+                .WhereIF(dto.Status is ESecondaryHandlingState.Refuse, x => x.State == ESecondaryHandlingState.Refuse)
+                .WhereIF(dto.CreationTimeStart.HasValue, x => x.CreationTime >= dto.CreationTimeStart)
+                .WhereIF(dto.CreationTimeEnd.HasValue, x => x.CreationTime <= dto.CreationTimeEnd)
+                .WhereIF(!string.IsNullOrEmpty(dto.OrderId), x => x.OrderId == dto.OrderId)
+                .OrderByDescending(x => x.CreationTime);
+        }
 
-		/// <summary>
-		/// 二次办理统计
-		/// </summary>
-		/// <param name="dto"></param>
-		/// <returns></returns>
-		public  ISugarQueryable<SecondaryHandlingVo> SecondaryHandlingReport(QuerySecondaryHandlingRequest dto, CancellationToken cancellationToken)
-		{
-			if (dto.EndTime.HasValue)
-				dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
-			return _orderSecondaryHandlingRepository.Queryable()
-				.WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
-				.WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
-				.WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.ApplyOrgName.Equals(dto.OrgName))
-				.Where(x => x.State == ESecondaryHandlingState.End)
-				.GroupBy(x => new { x.ApplyOrgId, x.ApplyOrgName })
-				.Select(x => new SecondaryHandlingVo
-				{
-					OrgId = x.ApplyOrgId,
-					OrgName = x.ApplyOrgName,
-					Num = SqlFunc.AggregateCount(x.Id)
-				})
-				.OrderByIF(dto.SortRule == 0, x => x.Num, OrderByType.Asc)
-				.OrderByIF(dto.SortRule == 1, x => x.Num, OrderByType.Desc);
-		}
+        /// <summary>
+        /// 获取实体
+        /// </summary>
+        /// <returns></returns>
+        public async Task<OrderSecondaryHandling> Entity(string id, CancellationToken cancellationToken)
+        {
+            return await _orderSecondaryHandlingRepository.Queryable()
+                .FirstAsync(x => x.Id == id, cancellationToken);
+        }
 
-		/// <summary>
-		/// 二次办理统计明细
-		/// </summary>
-		/// <param name="dto"></param>
-		/// <returns></returns>
-		public ISugarQueryable<OrderSecondaryHandling> SecondaryHandlingDetailReport(QuerySecondaryHandlingRequest dto, CancellationToken cancellationToken)
-		{
-			if (dto.EndTime.HasValue)
-				dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
-			return _orderSecondaryHandlingRepository.Queryable()
-				.Includes(x=>x.Order)
-				.Includes(x=>x.Visit)
-				.Includes(x=>x.VisitDetail)
-				.WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
-				.WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
-				.WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.ApplyOrgName.Equals(dto.OrgName))
-				.Where(x=>x.ApplyOrgId == dto.OrgId)
-				.Where(x => x.State == ESecondaryHandlingState.End);
-		}
+        /// <summary>
+        /// 二次办理统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public ISugarQueryable<SecondaryHandlingVo> SecondaryHandlingReport(QuerySecondaryHandlingRequest dto, CancellationToken cancellationToken)
+        {
+            if (dto.EndTime.HasValue)
+                dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+            return _orderSecondaryHandlingRepository.Queryable()
+                .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
+                .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.ApplyOrgName.Equals(dto.OrgName))
+                .Where(x => x.State == ESecondaryHandlingState.End)
+                .GroupBy(x => new { x.ApplyOrgId, x.ApplyOrgName })
+                .Select(x => new SecondaryHandlingVo
+                {
+                    OrgId = x.ApplyOrgId,
+                    OrgName = x.ApplyOrgName,
+                    Num = SqlFunc.AggregateCount(x.Id)
+                })
+                .OrderByIF(dto.SortRule == 0, x => x.Num, OrderByType.Asc)
+                .OrderByIF(dto.SortRule == 1, x => x.Num, OrderByType.Desc);
+        }
 
+        /// <summary>
+        /// 二次办理统计明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public ISugarQueryable<OrderSecondaryHandling> SecondaryHandlingDetailReport(QuerySecondaryHandlingRequest dto, CancellationToken cancellationToken)
+        {
+            if (dto.EndTime.HasValue)
+                dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+            return _orderSecondaryHandlingRepository.Queryable()
+                .Includes(x => x.Order)
+                .Includes(x => x.Visit)
+                .Includes(x => x.VisitDetail)
+                .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
+                .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.ApplyOrgName.Equals(dto.OrgName))
+                .Where(x => x.ApplyOrgId == dto.OrgId)
+                .Where(x => x.State == ESecondaryHandlingState.End);
+        }
 
-		/// <summary>
-		/// 二次办理满意度统计
-		/// </summary>
-		/// <param name="dto"></param>
-		/// <returns></returns>
-		public ISugarQueryable<SecondaryHandlingSatisfactionVo> SecondaryHandlingSatisfactionReport(QuerySecondaryHandlingRequest dto, CancellationToken cancellationToken) 
-		{
-			if (dto.EndTime.HasValue)
-				dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
-			return _orderSecondaryHandlingRepository.Queryable()
-				.Includes(x => x.Order)
-				.Includes(x => x.Visit)
-				.Includes(x => x.VisitDetail)
-				.Includes(x => x.Order, o => o.CallRecord)
-				.LeftJoin<SystemOrganize>((x, o) => x.ApplyOrgId == o.Id)
-				.WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
-				.WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
-				.WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.ApplyOrgName.Equals(dto.OrgName))
-				.WhereIF(!string.IsNullOrEmpty(dto.CDPN), x => x.Order.CallRecord.CDPN.Contains(dto.CDPN))
-				.GroupBy((x,o) => new { x.ApplyOrgId, x.ApplyOrgName,o.OrgType })
-				.Select((x, o) => new SecondaryHandlingSatisfactionVo()
-				{
-					OrgId = x.ApplyOrgId,
-					OrgName = x.ApplyOrgName,
-					OrgType = o.OrgType,
-					TotalSumCount = SqlFunc.AggregateCount(x.Id),
-					VerySatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "5", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "5", 1, 0))),//非常满意数
-					SatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "4", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
-					RegardedAsSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "-1", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "-1", 1, 0))),//视为满意
-					DefaultSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "0", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "0", 1, 0))),//默认满意
-					NoSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "2", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "2", 1, 0))),//不满意
-					NoEvaluateCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "7", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "7", 1, 0))),//未做评价
-					NoPutThroughCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "6", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "6", 1, 0))),//未接通
-				});
-		}
 
-		/// <summary>
-		///  二次办理满意度统计明细
-		/// </summary>
-		/// <param name="dto"></param>
-		/// <returns></returns>
-		public ISugarQueryable<OrderSecondaryHandling> SecondaryHandlingSatisfactionDetailReport(QuerySecondaryHandlingRequest dto, CancellationToken cancellationToken)
-		{
-			var key = string.Empty;
-			if (dto.EndTime.HasValue)
-				dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
-			if (!string.IsNullOrEmpty(dto.Header))
-			{
-				switch (dto.Header)
-				{
-					case "verySatisfiedCount":
-						key = "5";
-						break;
-					case "satisfiedCount":
-						key = "4";
-						break;
-					case "regardedAsSatisfiedCount":
-						key = "-1";
-						break;
-					case "defaultSatisfiedCount":
-						key = "0";
-						break;
-					case "noSatisfiedCount":
-						key = "2";
-						break;
-					case "noEvaluateCount":
-						key = "7";
-						break;
-					case "noPutThroughCount":
-						key = "6";
-						break;
-				}
-			}
+        /// <summary>
+        /// 二次办理满意度统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public ISugarQueryable<SecondaryHandlingSatisfactionVo> SecondaryHandlingSatisfactionReport(QuerySecondaryHandlingRequest dto, CancellationToken cancellationToken)
+        {
+            if (dto.EndTime.HasValue)
+                dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+            return _orderSecondaryHandlingRepository.Queryable()
+                .Includes(x => x.Order)
+                .Includes(x => x.Visit)
+                .Includes(x => x.VisitDetail)
+                .Includes(x => x.Order, o => o.CallRecord)
+                .LeftJoin<SystemOrganize>((x, o) => x.ApplyOrgId == o.Id)
+                .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
+                .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.ApplyOrgName.Equals(dto.OrgName))
+                .WhereIF(!string.IsNullOrEmpty(dto.CDPN), x => x.Order.CallRecord.CDPN.Contains(dto.CDPN))
+                .GroupBy((x, o) => new { x.ApplyOrgId, x.ApplyOrgName, o.OrgType })
+                .Select((x, o) => new SecondaryHandlingSatisfactionVo()
+                {
+                    OrgId = x.ApplyOrgId,
+                    OrgName = x.ApplyOrgName,
+                    OrgType = o.OrgType,
+                    TotalSumCount = SqlFunc.AggregateCount(x.Id),
+                    VerySatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "5", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "5", 1, 0))),//非常满意数
+                    SatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "4", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
+                    RegardedAsSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "-1", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "-1", 1, 0))),//视为满意
+                    DefaultSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "0", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "0", 1, 0))),//默认满意
+                    NoSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "2", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "2", 1, 0))),//不满意
+                    NoEvaluateCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "7", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "7", 1, 0))),//未做评价
+                    NoPutThroughCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "6", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "6", 1, 0))),//未接通
+                });
+        }
 
-			return _orderSecondaryHandlingRepository.Queryable()
-				.Includes(x => x.Order)
-				.Includes(x => x.Visit)
-				.Includes(x => x.VisitDetail)
-				.Includes(x => x.Order, o => o.CallRecord)
-				.WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
-				.WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
-				.WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.ApplyOrgName.Equals(dto.OrgName))
-				.WhereIF(!string.IsNullOrEmpty(dto.CDPN), x => x.Order.CallRecord.CDPN.Contains(dto.CDPN))
-				.WhereIF(dto.TypeId is 1 && !string.IsNullOrEmpty(key), x=> SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == key)
-				.WhereIF(dto.TypeId is 2 && !string.IsNullOrEmpty(key), x => SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == key)
-				.Where(x => x.ApplyOrgId == dto.OrgId)
-				.Where(x => x.State == ESecondaryHandlingState.End);
-		}
+        /// <summary>
+        ///  二次办理满意度统计明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public ISugarQueryable<OrderSecondaryHandling> SecondaryHandlingSatisfactionDetailReport(QuerySecondaryHandlingRequest dto, CancellationToken cancellationToken)
+        {
+            var key = string.Empty;
+            if (dto.EndTime.HasValue)
+                dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+            if (!string.IsNullOrEmpty(dto.Header))
+            {
+                switch (dto.Header)
+                {
+                    case "verySatisfiedCount":
+                        key = "5";
+                        break;
+                    case "satisfiedCount":
+                        key = "4";
+                        break;
+                    case "regardedAsSatisfiedCount":
+                        key = "-1";
+                        break;
+                    case "defaultSatisfiedCount":
+                        key = "0";
+                        break;
+                    case "noSatisfiedCount":
+                        key = "2";
+                        break;
+                    case "noEvaluateCount":
+                        key = "7";
+                        break;
+                    case "noPutThroughCount":
+                        key = "6";
+                        break;
+                }
+            }
 
-	}
+            return _orderSecondaryHandlingRepository.Queryable()
+                .Includes(x => x.Order)
+                .Includes(x => x.Visit)
+                .Includes(x => x.VisitDetail)
+                .Includes(x => x.Order, o => o.CallRecord)
+                .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
+                .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.ApplyOrgName.Equals(dto.OrgName))
+                .WhereIF(!string.IsNullOrEmpty(dto.CDPN), x => x.Order.CallRecord.CDPN.Contains(dto.CDPN))
+                .WhereIF(dto.TypeId is 1 && !string.IsNullOrEmpty(key), x => SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == key)
+                .WhereIF(dto.TypeId is 2 && !string.IsNullOrEmpty(key), x => SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == key)
+                .Where(x => x.ApplyOrgId == dto.OrgId)
+                .Where(x => x.State == ESecondaryHandlingState.End);
+        }
+
+    }
 }

+ 3 - 2
src/Hotline.Share/Dtos/Order/OrderSpecialDto.cs

@@ -7,6 +7,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Dtos.FlowEngine.Workflow;
 using XF.Utility.EnumExtensions;
 using Hotline.Share.Enums.FlowEngine;
@@ -37,7 +38,7 @@ namespace Hotline.Share.Dtos.Order
 		/// 部门等级/分类为:depCodes, 角色为:userIds
 		/// </example>
 		/// </summary>
-		public List<Kv> NextHandlers { get; set; } = new();
+		public List<FlowStepHandler> NextHandlers { get; set; } = new();
 
 		/// <summary>
 		/// 特提原因
@@ -102,7 +103,7 @@ namespace Hotline.Share.Dtos.Order
 		/// 部门等级/分类为:depCodes, 角色为:userIds
 		/// </example>
 		/// </summary>
-		public List<Kv> NextHandlers { get; set; } = new();
+		public List<FlowStepHandler> NextHandlers { get; set; } = new();
 
 		//public string? OrgId { get; set; }
 

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

@@ -36,8 +36,8 @@ namespace Hotline.FlowEngine.Workflows
         /// <summary>
         /// 查询工作流包含当前用户办理权限(是否可办理)
         /// </summary>
-        Task<(Workflow workflow, string? countersignId, bool canPrevious)> GetWorkflowHandlePermissionAsync(
-            string workflowId, string userId, string orgId, CancellationToken cancellationToken = default);
+        Task<(Workflow Workflow, string? CountersignId, bool CanHandle, bool CanPrevious)> GetWorkflowHandlePermissionAsync(
+            string workflowId, string userId, string orgId, string[] roleIds, CancellationToken cancellationToken = default);
 
         /// <summary>
         /// 受理,接办
@@ -147,7 +147,7 @@ namespace Hotline.FlowEngine.Workflows
         /// 创建开始节点
         /// </summary>
         WorkflowStep CreateStartStep(Workflow workflow, StepDefine startStepDefine, BasicWorkflowDto dto,
-            List<Kv> handlers, List<WorkflowStepHandler> stepHandlers, DateTime? expiredTime);
+            FlowStepHandler handler, List<WorkflowStepHandler> stepHandlers, DateTime? expiredTime);
 
         /// <summary>
         /// 查询未完成节点

+ 9 - 4
src/Hotline/FlowEngine/Workflows/Workflow.cs

@@ -719,9 +719,14 @@ public partial class Workflow
     /// 当前用户是否可以办理该流程
     /// </summary>
     /// <returns></returns>
-    public bool CanHandle(string userId, string orgCode) =>
-        Status is EWorkflowStatus.Runnable &&
-        (HandlerUsers.Any(d => d.Key == userId) || HandlerOrgs.Any(d => d.Key == orgCode));
+    public bool CanHandle(string userId, string orgId, string[] roleIds)
+    {
+        if (!Steps.Any())
+            throw new UserFriendlyException("未查询节点信息");
+        return Status is EWorkflowStatus.Runnable &&
+               //(HandlerUsers.Any(d => d.Key == userId) || HandlerOrgs.Any(d => d.Key == orgCode));
+               Steps.Any(d => d.HandlerId == userId || d.HandlerOrgId == orgId || roleIds.Contains(d.RoleId));
+    }
 
     private void RemoveCurrentHandleGroup(string handlerId, string handlerOrg)
     {
@@ -818,7 +823,7 @@ public partial class Workflow
         ResetOption();
         Status = EWorkflowStatus.Runnable;
     }
-    
+
     public void SetAllDuration()
     {
         if (!EndTime.HasValue)

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

@@ -226,14 +226,15 @@ namespace Hotline.FlowEngine.Workflows
         /// <summary>
         /// 查询工作流包含当前用户结束会签权限(是否可结束)
         /// </summary>
-        public async Task<(Workflow, string?, bool)> GetWorkflowHandlePermissionAsync(
-            string workflowId, string userId, string orgId, CancellationToken cancellationToken = default)
+        public async Task<(Workflow Workflow, string? CountersignId, bool CanHandle, bool CanPrevious)> GetWorkflowHandlePermissionAsync(
+            string workflowId, string userId, string orgId, string[] roleIds, CancellationToken cancellationToken = default)
         {
             var workflow = await GetWorkflowAsync(workflowId, withSteps: true, withCountersigns: true,
                 cancellationToken: cancellationToken);
 
+            var canHandle = workflow.CanHandle(userId, orgId, roleIds);
             var canPrevious = false;
-            if (workflow.CanHandle(userId, orgId))
+            if (canHandle)
             {
                 var currentStep = FindCurrentStepWaitForHandle(workflow, userId, orgId);
                 if (currentStep.Status is not EWorkflowStepStatus.Handled)
@@ -245,12 +246,12 @@ namespace Hotline.FlowEngine.Workflows
 
             var unCompletedCountersign = workflow.Countersigns
                 .FirstOrDefault(d => !d.IsCompleted() && d.StarterId == userId);
-            if (unCompletedCountersign is null) return (workflow, null, canPrevious);
+            if (unCompletedCountersign is null) return (workflow, null, canHandle, canPrevious);
 
             //var existCountersignEndStep = workflow.Steps.Exists(d =>
             //    d.IsCountersignEndStep && d.CountersignStartStepId == unCompletedCountersign.StartStepId);
             //return (workflow, existCountersignEndStep ? null : unCompletedCountersign.Id, canPrevious);
-            return (workflow, unCompletedCountersign.Id, canPrevious);
+            return (workflow, unCompletedCountersign.Id, canHandle, canPrevious);
         }
 
         /// <summary>
@@ -262,7 +263,7 @@ namespace Hotline.FlowEngine.Workflows
             string? orgAreaCode, string? orgAreaName,
             CancellationToken cancellationToken)
         {
-            if (!workflow.CanHandle(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgId)) return;
+            if (!workflow.CanHandle(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgId, _sessionContext.Roles)) return;
             //工单完成以后查看的场景
             if (workflow.Status != EWorkflowStatus.Runnable) return;
 
@@ -310,7 +311,7 @@ namespace Hotline.FlowEngine.Workflows
             DateTime? expiredTime, List<WorkflowStepHandler> stepHandlers, ISessionContext current,
             CancellationToken cancellationToken)
         {
-            ValidatePermission(workflow, current.RequiredOrgId, current.RequiredUserId);
+            ValidatePermission(workflow, current.RequiredOrgId, current.RequiredUserId, current.Roles);
             //CheckWhetherRunnable(workflow.Status);
 
             #region 办理当前节点
@@ -516,7 +517,7 @@ namespace Hotline.FlowEngine.Workflows
         public async Task<EFlowDirection> PreviousAsync(Workflow workflow, PreviousWorkflowDto dto, User operater,
            ISessionContext current, CancellationToken cancellationToken)
         {
-            ValidatePermission(workflow, operater.OrgId, operater.Id);
+            //ValidatePermission(workflow, operater.OrgId, operater.Id);
 
             var (currentStep, prevStep, countersignStartStep) = GetPreviousStep(workflow, operater.Id, operater.OrgId);
 
@@ -1211,7 +1212,7 @@ namespace Hotline.FlowEngine.Workflows
         /// 创建开始节点
         /// </summary>
         public WorkflowStep CreateStartStep(Workflow workflow, StepDefine startStepDefine,
-            BasicWorkflowDto dto, List<Kv> handles, List<WorkflowStepHandler> stepHandlers, DateTime? expiredTime)
+            BasicWorkflowDto dto, FlowStepHandler handler, List<WorkflowStepHandler> stepHandlers, DateTime? expiredTime)
         {
             //startstep
             var nextSteps = _mapper.Map<List<StepSimple>>(startStepDefine.NextSteps);
@@ -1225,7 +1226,7 @@ namespace Hotline.FlowEngine.Workflows
             var startStep = _mapper.Map<WorkflowStep>(startStepDefine);
             _mapper.Map(workflow, startStep);
             startStep.FlowAssignType = EFlowAssignType.User;
-            startStep.Handlers = handles;
+            startStep.Handlers = new List<Kv> { new(handler.Key, handler.Value) };
             startStep.StepHandlers = stepHandlers;
             startStep.NextSteps = nextSteps;
             startStep.IsMain = true;
@@ -1234,6 +1235,10 @@ namespace Hotline.FlowEngine.Workflows
             startStep.PrevChosenStepCode = null;
             startStep.StepExpiredTime = expiredTime;
 
+            startStep.Assign(handler.UserId, handler.Username,
+                handler.OrgId, handler.OrgName,
+                handler.RoleId, handler.RoleName);
+
             startStep.InitId();
             return startStep;
         }
@@ -1359,10 +1364,10 @@ namespace Hotline.FlowEngine.Workflows
         }
 
         private async Task<WorkflowStep> CreateStartStepAsync(Workflow workflow, StepDefine startStepDefine,
-            BasicWorkflowDto dto, List<Kv> handles, List<WorkflowStepHandler> stepHandlers, EWorkflowTraceType traceType,
+            BasicWorkflowDto dto, FlowStepHandler handler, List<WorkflowStepHandler> stepHandlers, EWorkflowTraceType traceType,
             DateTime? expiredTime, CancellationToken cancellationToken)
         {
-            var startStep = CreateStartStep(workflow, startStepDefine, dto, handles, stepHandlers, expiredTime);
+            var startStep = CreateStartStep(workflow, startStepDefine, dto, handler, stepHandlers, expiredTime);
             //await _workflowStepRepository.AddAsync(startStep, cancellationToken);
             await _workflowStepRepository.AddNav(startStep)
                 .Include(d => d.StepHandlers)
@@ -1937,8 +1942,7 @@ namespace Hotline.FlowEngine.Workflows
 
             var targetStepNew = targetIsStartStep
                 ? await CreateStartStepAsync(workflow, targetStepDefine, dto,
-                    dto.NextHandlers.Select(d => new Kv(d.Key, d.Value)).ToList(),
-                    stepHandlers, traceType, expiredTime, cancellationToken)
+                    dto.NextHandlers.First(), stepHandlers, traceType, expiredTime, cancellationToken)
                 : (await CreateStepsAsync(workflow, targetStepDefine, targetPrevStep, dto,
                     flowAssignInfo.FlowAssignType, dto.NextHandlers, stepHandlers,
                     null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, true, traceType,
@@ -1980,9 +1984,9 @@ namespace Hotline.FlowEngine.Workflows
                 throw UserFriendlyException.SameMessage("当前流程状态不可继续流转");
         }
 
-        private void ValidatePermission(Workflow workflow, string OrgId, string UserId)
+        private void ValidatePermission(Workflow workflow, string OrgId, string UserId, string[] roleIds)
         {
-            if (!workflow.CanHandle(UserId, OrgId))
+            if (!workflow.CanHandle(UserId, OrgId, roleIds))
                 throw UserFriendlyException.SameMessage("无办理权限");
         }
 

+ 37 - 0
src/Hotline/FlowEngine/Workflows/WorkflowStep.cs

@@ -1,9 +1,11 @@
 using Hotline.File;
 using Hotline.Share.Dtos;
+using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Dtos.FlowEngine.Definition;
 using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Enums.FlowEngine;
 using SqlSugar;
+using XF.Domain.Entities;
 using XF.Domain.Exceptions;
 
 namespace Hotline.FlowEngine.Workflows;
@@ -186,6 +188,41 @@ public class WorkflowStep : StepBasicEntity
     public WorkflowStepHandler? GetActualHandler() =>
         StepHandlers.FirstOrDefault(d => d.IsActualHandler);
 
+    public FlowStepHandler GetWorkflowStepHandler()
+    {
+        switch (FlowAssignType)
+        {
+            case EFlowAssignType.Org:
+                return new FlowStepHandler
+                {
+                    Key = HandlerOrgId,
+                    Value = HandlerOrgName,
+                    OrgId = HandlerOrgId,
+                    OrgName = HandlerOrgName
+                };
+            case EFlowAssignType.User:
+                return new FlowStepHandler
+                {
+                    Key = HandlerId,
+                    Value = HandlerName,
+                    UserId = HandlerId,
+                    Username = HandlerName,
+                    OrgId = HandlerOrgId,
+                    OrgName = HandlerOrgName
+                };
+            case EFlowAssignType.Role:
+                return new FlowStepHandler
+                {
+                    Key = RoleId,
+                    Value = RoleName,
+                    RoleId = RoleId,
+                    RoleName = RoleName,
+                };
+            default:
+                throw new ArgumentOutOfRangeException();
+        }
+    }
+
     #endregion
 }
 

+ 2 - 1
src/Hotline/Orders/OrderSpecial.cs

@@ -7,6 +7,7 @@ using System.Threading.Tasks;
 using Hotline.FlowEngine.Workflows;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.File;
+using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.Order;
@@ -46,7 +47,7 @@ namespace Hotline.Orders
         public string? StepName { get; set; } = string.Empty;
 
 		[SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
-		public List<Kv> NextHandlers { get; set; }
+		public List<FlowStepHandler> NextHandlers { get; set; }
 
 		/// <summary>
 		/// 特提原因