Просмотр исходного кода

1.workflowApp.NextAsync -> domain.NextAsync
2.删除低效索引
3.中心待办查询取消orderby status

xf 5 месяцев назад
Родитель
Сommit
de4bbc3d64

+ 61 - 56
src/Hotline.Api/Controllers/KnowledgeController.cs

@@ -67,6 +67,7 @@ namespace Hotline.Api.Controllers
         private readonly IKnowApplication _knowApplication;
         private readonly IMediator _mediator;
         private readonly IWorkflowApplication _workflowApplication;
+        private readonly IWorkflowDomainService _workflowDomainService;
         private readonly IKnowledgeWorkFlowRepository _knowledgeWorkFlowRepository;
         private readonly IRepository<User> _userRepository;
         private readonly IRepository<KnowledgeType> _knowledgeTypeRepository;
@@ -88,7 +89,7 @@ namespace Hotline.Api.Controllers
         private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
 
 
-		public KnowledgeController(
+        public KnowledgeController(
            IKnowledgeRepository knowledgeRepository,
            ISessionContext sessionContext,
            IKnowledgeDomainService knowledgeDomainService,
@@ -96,6 +97,7 @@ namespace Hotline.Api.Controllers
            IKnowApplication knowApplication,
            IMediator mediator,
            IWorkflowApplication workflowApplication,
+           IWorkflowDomainService workflowDomainService,
            IKnowledgeWorkFlowRepository knowledgeWorkFlowRepository,
            IRepository<User> userRepository,
            IRepository<KnowledgeType> knowledgeTypeRepository,
@@ -120,7 +122,7 @@ namespace Hotline.Api.Controllers
             IRepository<KnowledgeWord> knowledgeWordRepository,
             IRepository<KnowledgeHotWord> knowledgeWordHotRepository,
            IOptionsSnapshot<AppConfiguration> appOptions,
-			IRepository<KnowledgeHotWord> knowledgeHotWordRepository)
+            IRepository<KnowledgeHotWord> knowledgeHotWordRepository)
         {
             _knowledgeRepository = knowledgeRepository;
             _sessionContext = sessionContext;
@@ -129,6 +131,7 @@ namespace Hotline.Api.Controllers
             _knowApplication = knowApplication;
             _mediator = mediator;
             _workflowApplication = workflowApplication;
+            _workflowDomainService = workflowDomainService;
             _knowledgeWorkFlowRepository = knowledgeWorkFlowRepository;
             _userRepository = userRepository;
             _knowledgeTypeRepository = knowledgeTypeRepository;
@@ -153,7 +156,7 @@ namespace Hotline.Api.Controllers
             _knowledgeWordRepository = knowledgeWordRepository;
             _knowledgeHotWordRepository = knowledgeHotWordRepository;
             _appOptions = appOptions;
-		}
+        }
 
         #endregion
 
@@ -219,7 +222,7 @@ namespace Hotline.Api.Controllers
             var know = await _knowledgeRepository.GetAsync(dto.Data.Id, HttpContext.RequestAborted);
             if (know != null && know.Status == EKnowledgeStatus.OnShelf)
             {
-                if (_sessionContext.OrgIsCenter ||  !_appOptions.Value.IsYiBin)
+                if (_sessionContext.OrgIsCenter || !_appOptions.Value.IsYiBin)
                 {
                     know.Status = EKnowledgeStatus.OffShelf;
                     know.OnShelfTime = null;
@@ -232,16 +235,17 @@ namespace Hotline.Api.Controllers
                     //推省上
                     await _capPublisher.PublishAsync(EventNames.HotlineKnowledgeRemove, pushKnowledge, cancellationToken: HttpContext.RequestAborted);
                 }
-                else {
-	                know.Status = EKnowledgeStatus.OffShelfAudit;
-	                await _knowledgeRepository.UpdateAsync(know, HttpContext.RequestAborted);
+                else
+                {
+                    know.Status = EKnowledgeStatus.OffShelfAudit;
+                    await _knowledgeRepository.UpdateAsync(know, HttpContext.RequestAborted);
 
-					var startDto = _mapper.Map<StartWorkflowDto>(dto.Workflow);
-					startDto.DefinitionModuleCode = WorkflowModuleConsts.KnowledgeOffshelf;
+                    var startDto = _mapper.Map<StartWorkflowDto>(dto.Workflow);
+                    startDto.DefinitionModuleCode = WorkflowModuleConsts.KnowledgeOffshelf;
                     startDto.Opinion = dto.Data.Opinion;
-					startDto.Title = "知识库下架";
-					await StartFlow(know.Id, WorkflowModuleConsts.KnowledgeOffshelf, EKnowledgeApplyType.Offshelf, startDto);
-				}
+                    startDto.Title = "知识库下架";
+                    await StartFlow(know.Id, WorkflowModuleConsts.KnowledgeOffshelf, EKnowledgeApplyType.Offshelf, startDto);
+                }
             }
             else
                 throw UserFriendlyException.SameMessage("知识下架失败");
@@ -308,24 +312,24 @@ namespace Hotline.Api.Controllers
             knowledge.HotspotId = dto.Data.HotspotId;
             knowledge.HotspotExternal = dto.Data.HotspotExternal;
 
-			if (dto.Data.Files.Any())
+            if (dto.Data.Files.Any())
                 knowledge.FileJson = await _fileRepository.AddFileAsync(dto.Data.Files, knowledge.Id, "", HttpContext.RequestAborted);
             else
                 knowledge.FileJson = new List<Share.Dtos.File.FileJson>();
             if (dto.Workflow != null) knowledge.Renewaln = knowledge.Status != EKnowledgeStatus.Drafts;
             if (_appOptions.Value.IsYiBin)
             {
-				//临时处理 修改后提交修改基本信息
-				if (!_sessionContext.OrgIsCenter)
-				{
-					knowledge.Attribution = "部门知识库";
-				}
-				knowledge.CreatorId = _sessionContext.UserId;
-				knowledge.CreatorName = _sessionContext.UserName;
-				knowledge.CreatorOrgId = _sessionContext.OrgId;
-				knowledge.CreatorOrgName = _sessionContext.OrgName;
-				knowledge.CreatorOrgLevel = _sessionContext.OrgLevel;
-			}
+                //临时处理 修改后提交修改基本信息
+                if (!_sessionContext.OrgIsCenter)
+                {
+                    knowledge.Attribution = "部门知识库";
+                }
+                knowledge.CreatorId = _sessionContext.UserId;
+                knowledge.CreatorName = _sessionContext.UserName;
+                knowledge.CreatorOrgId = _sessionContext.OrgId;
+                knowledge.CreatorOrgName = _sessionContext.OrgName;
+                knowledge.CreatorOrgLevel = _sessionContext.OrgLevel;
+            }
 
             await _knowledgeRepository.UpdateNullAsync(knowledge, HttpContext.RequestAborted);
             if (dto.Data.KnowledgeType.Any())
@@ -403,7 +407,8 @@ namespace Hotline.Api.Controllers
                     nextWorkflowDto.NextStepCode = next.Steps.First().Key;
                     nextWorkflowDto.NextStepName = next.Steps.First().Value;
                     if (dto.IsPass)
-                        await _workflowApplication.NextAsync(nextWorkflowDto, cancellationToken: HttpContext.RequestAborted);
+                        await _workflowDomainService.NextAsync(_sessionContext, nextWorkflowDto,
+                            cancellationToken: HttpContext.RequestAborted);
                     else
                     {
                         var reject = nextWorkflowDto.Adapt<RejectDto>();
@@ -455,7 +460,7 @@ namespace Hotline.Api.Controllers
                 var startDto = _mapper.Map<StartWorkflowDto>(dto.Workflow);
                 startDto.DefinitionModuleCode = WorkflowModuleConsts.KnowledgeDelete;
                 startDto.Title = "知识库删除";
-				//await _workflowApplication.StartWorkflowAsync(startDto, _sessionContext, knowledge.Id, cancellationToken: HttpContext.RequestAborted);
+                //await _workflowApplication.StartWorkflowAsync(startDto, _sessionContext, knowledge.Id, cancellationToken: HttpContext.RequestAborted);
                 await StartFlow(dto.Data.Id, WorkflowModuleConsts.KnowledgeDelete, EKnowledgeApplyType.Delete, startDto);
             }
         }
@@ -579,12 +584,12 @@ namespace Hotline.Api.Controllers
 
             if (knowledgeShowInfoDto.FileJson != null && knowledgeShowInfoDto.FileJson.Any())
             {
-	            var ids = knowledgeShowInfoDto.FileJson.Select(x => x.Id).ToList();
-	            knowledgeShowInfoDto.Files = await _fileRepository.GetFilesAsync(ids, HttpContext.RequestAborted);
+                var ids = knowledgeShowInfoDto.FileJson.Select(x => x.Id).ToList();
+                knowledgeShowInfoDto.Files = await _fileRepository.GetFilesAsync(ids, HttpContext.RequestAborted);
             }
 
-			//var files = await _fileRepository.Queryable().Where(x => x.Key == knowledge.Id).ToListAsync();
-   //         if (files.Any()) knowledgeShowInfoDto.Files = _mapper.Map<List<FileDto>>(files);
+            //var files = await _fileRepository.Queryable().Where(x => x.Key == knowledge.Id).ToListAsync();
+            //         if (files.Any()) knowledgeShowInfoDto.Files = _mapper.Map<List<FileDto>>(files);
 
             if (IsAddPv == true)
                 _mediator.Publish(new GetKnowledgeInfoNotify(knowledge));
@@ -681,30 +686,30 @@ namespace Hotline.Api.Controllers
                 new KeyValuePair<int, string>(1, "审核中"),
                 new KeyValuePair<int, string>(8, "草稿"),
                 new KeyValuePair<int, string>(-1, "全部")
-			};
+            };
 
             var tabNewDraftsNames = new List<KeyValuePair<int, string>>
             {
-	            new KeyValuePair<int, string>(-1, "全部"),
-				new KeyValuePair<int, string>(0, "待提交"),
-	            new KeyValuePair<int, string>(5, "审核不通过"),
+                new KeyValuePair<int, string>(-1, "全部"),
+                new KeyValuePair<int, string>(0, "待提交"),
+                new KeyValuePair<int, string>(5, "审核不通过"),
             };
 
             var tabAuditingNames = new List<KeyValuePair<string, string>>
             {
-	            new KeyValuePair<string, string>("", "全部"),
-				new KeyValuePair<string, string>("KnowledgeAdd", "新增审核"),
-	            new KeyValuePair<string, string>("KnowledgeUpdate", "修改审核"),
-	            new KeyValuePair<string, string>("KnowledgeDelete", "删除审核"),
-	            new KeyValuePair<string, string>("KnowledgeOffshelf", "下架审核"),
-			};
-
-			return _baseDataApplication
+                new KeyValuePair<string, string>("", "全部"),
+                new KeyValuePair<string, string>("KnowledgeAdd", "新增审核"),
+                new KeyValuePair<string, string>("KnowledgeUpdate", "修改审核"),
+                new KeyValuePair<string, string>("KnowledgeDelete", "删除审核"),
+                new KeyValuePair<string, string>("KnowledgeOffshelf", "下架审核"),
+            };
+
+            return _baseDataApplication
                 .FileType(EFileType.excel | EFileType.pdf)
                 .Add("tabNames", tabNames)
                 .Add("tabNewDraftsNames", tabNewDraftsNames)
                 .Add("tabAuditingNames", tabAuditingNames)
-				.Build();
+                .Build();
         }
 
         /// <summary>
@@ -761,7 +766,7 @@ namespace Hotline.Api.Controllers
         public Dictionary<string, dynamic> GetKnowretrievalBaseData()
         {
             return _baseDataApplication
-                .KnowledgeRetrievalType(new[]{3, 4})
+                .KnowledgeRetrievalType(new[] { 3, 4 })
                 .Build();
         }
 
@@ -994,19 +999,19 @@ namespace Hotline.Api.Controllers
         [HttpGet("offshelf-flow-start")]
         public async Task<NextStepsDto> GetOffshelfFlowStartOptionsAsync()
         {
-	        return await _workflowApplication.GetStartStepsAsync(WorkflowModuleConsts.KnowledgeOffshelf,
-		        HttpContext.RequestAborted);
+            return await _workflowApplication.GetStartStepsAsync(WorkflowModuleConsts.KnowledgeOffshelf,
+                HttpContext.RequestAborted);
         }
 
-		/// <summary>
-		/// 开始流程
-		/// </summary>
-		/// <param name="id">知识ID</param>
-		/// <param name="moduleCode">知识模板编号</param>
-		/// <param name="eKnowledgeApplyType">申请类型</param>
-		/// <param name="dto">流程开启参数</param>
-		/// <returns></returns>
-		private async Task<string> StartFlow(string id, string moduleCode, EKnowledgeApplyType eKnowledgeApplyType, StartWorkflowDto dto)
+        /// <summary>
+        /// 开始流程
+        /// </summary>
+        /// <param name="id">知识ID</param>
+        /// <param name="moduleCode">知识模板编号</param>
+        /// <param name="eKnowledgeApplyType">申请类型</param>
+        /// <param name="dto">流程开启参数</param>
+        /// <returns></returns>
+        private async Task<string> StartFlow(string id, string moduleCode, EKnowledgeApplyType eKnowledgeApplyType, StartWorkflowDto dto)
         {
             var knowledge = await _knowledgeRepository.GetAsync(id, HttpContext.RequestAborted);
             if (knowledge == null)
@@ -1022,7 +1027,7 @@ namespace Hotline.Api.Controllers
             await _knowledgeDomainService.AddWorkFlowAsync(id, eKnowledgeApplyType, HttpContext.RequestAborted);
 
             dto.DefinitionModuleCode = moduleCode;
-			//dto.Title = knowledge.Title;
+            //dto.Title = knowledge.Title;
             return await _workflowApplication.StartWorkflowAsync(dto, id, cancellationToken: HttpContext.RequestAborted);
         }
         #endregion

+ 4 - 72
src/Hotline.Api/Controllers/OrderController.cs

@@ -1768,7 +1768,7 @@ public class OrderController : BaseController
         try
         {
             dto.NextWorkflow.WorkflowId = delay.WorkflowId;
-            await _workflowApplication.NextAsync(dto.NextWorkflow, cancellationToken: HttpContext.RequestAborted);
+            await _workflowDomainService.NextAsync(_sessionContext, dto.NextWorkflow, cancellationToken: HttpContext.RequestAborted);
         }
         catch (Exception e)
         {
@@ -4128,37 +4128,6 @@ public class OrderController : BaseController
     [HttpGet("waited")]
     public async Task<PagedDto<OrderDto>> QueryWaited([FromQuery] QueryOrderWaitedDto dto)
     {
-        var a = await _orderRepository.Queryable()
-            .LeftJoin<WorkflowStep>((o, s) => o.Id == s.ExternalId)
-            .Select((o, s) => new
-            {
-                no = o.No,
-                time = o.CreationTime,
-                sId = s.Id,
-                name = s.Name,
-                //sStatus = s.Status,
-                rn = SqlFunc.RowNumber(SqlFunc.Desc(s.CreationTime), o.Id)
-            })
-            .MergeTable()
-            .Where(d => d.rn == 1)
-            .OrderByDescending(d => d.time)
-            .Take(100)
-            .ToListAsync(HttpContext.RequestAborted);
-
-       var b = await _orderRepository.Queryable()
-            .Includes(d => d.WorkflowSteps.Where(s=>s.HandlerOrgId == _sessionContext.OrgId
-                                                    && s.Status != EWorkflowStepStatus.Handled)
-                .OrderByDescending(s=>s.CreationTime)
-                .Take(1)
-                .ToList())
-            .Where(d => d.WorkflowSteps.Any(s => s.HandlerOrgId == _sessionContext.OrgId
-                                                 && s.Status != EWorkflowStepStatus.Handled
-                                                 && s.StepType != EStepType.End))
-            .OrderByDescending(d => d.CreationTime)
-            .Take(100)
-            .ToListAsync(HttpContext.RequestAborted);
-
-
         var isHandledStep = dto.IsHandled.HasValue && dto.IsHandled.Value;
         if (isHandledStep)
             dto.QueryType = null;
@@ -4242,50 +4211,14 @@ public class OrderController : BaseController
     [HttpGet("waited/center")]
     public async Task<PagedDto<OrderDto>> QueryWaitedForCenter([FromQuery] QueryOrderWaitedCenterDto dto)
     {
-        //if (dto.EndCreationTime.HasValue)
-        //    dto.EndCreationTime = dto.EndCreationTime.Value.AddDays(1).AddSeconds(-1);
-        //if (dto.StartTimeEnd.HasValue)
-        //    dto.StartTimeEnd = dto.StartTimeEnd.Value.AddDays(1).AddSeconds(-1);
-
-        //var (total, items) = await _orderRepository.Queryable()
-        //    //.LeftJoin<WorkflowStep>((d, step) => d.Id == step.ExternalId)
-        //    //.Where((d, step) =>
-        //    // ((string.IsNullOrEmpty(d.WorkflowId) && (string.IsNullOrEmpty(d.SignerId) || d.SignerId == _sessionContext.RequiredUserId)) ||
-        //    //  (!string.IsNullOrEmpty(d.WorkflowId) &&
-        //    //   ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
-        //    //    (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
-        //    //    (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId))) &&
-        //    //   ( step.Status != EWorkflowStepStatus.Handled )
-        //    //  )))
-        //    //.Where(d => d.Workflow.Steps.Any(s => s.Status < EWorkflowStepStatus.Handled && s.HandlerOrgId == OrgSeedData.CenterId))
-        //    .LeftJoin<WorkflowStep>((d, step) => d.Id == step.ExternalId)
-        //    .Where((d, step) => (step.Id == null || (step.HandlerOrgId == OrgSeedData.CenterId && step.Status < EWorkflowStepStatus.Handled)))
-        //    .Where(d => d.Source < ESource.MLSQ || d.Source > ESource.WZSC)
-        //    .Where(d => d.Status != EOrderStatus.BackToProvince && d.Status < EOrderStatus.Filed)
-        //    .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No!.Contains(dto.No!))
-        //    .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Title!.Contains(dto.Title!))
-        //    .WhereIF(dto is { StCreationTime: not null, EndCreationTime: not null }, d => d.CreationTime >= dto.StCreationTime && d.CreationTime <= dto.EndCreationTime)
-        //    .WhereIF(dto is { StartTimeSt: not null, StartTimeEnd: not null }, d => d.StartTime >= dto.StartTimeSt && d.StartTime <= dto.StartTimeEnd)
-        //    .WhereIF(!string.IsNullOrEmpty(dto.StepName), d => d.ActualHandleStepName == dto.StepName)
-        //    .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.ActualHandleOrgName!.Contains(dto.ActualHandleOrgName!))
-        //    .WhereIF(dto.Status.HasValue, d => d.Status == dto.Status)
-        //    .WhereIF(!string.IsNullOrEmpty(dto.AcceptorName), d => d.AcceptorName!.Contains(dto.AcceptorName!))
-        //    .WhereIF(dto.ExpiredStatus is EExpiredStatus.Normal, d => DateTime.Now < d.NearlyExpiredTime)
-        //    .WhereIF(dto.ExpiredStatus is EExpiredStatus.GoingToExpired, d => DateTime.Now > d.NearlyExpiredTime && DateTime.Now < d.ExpiredTime)
-        //    .WhereIF(dto.ExpiredStatus is EExpiredStatus.Expired, d => DateTime.Now >= d.ExpiredTime)
-        //    .WhereIF(dto.IsUrgent.HasValue, d => d.IsUrgent == dto.IsUrgent.Value)
-        //    .OrderBy(d => d.Status)
-        //    .OrderBy(d => d.CreationTime, OrderByType.Desc)
-        //    .ToPagedListAsync(dto, HttpContext.RequestAborted);
-
         var (total, items) = await _orderRepository.Queryable()
             .Includes(d => d.Workflow.Steps)
             .Where(d => SqlFunc.Subqueryable<WorkflowTrace>()
+                            .WhereIF(!string.IsNullOrEmpty(dto.CenterToOrgHandlerName), step => step.BusinessType == EBusinessType.Send && step.HandlerName.Contains(dto.CenterToOrgHandlerName))
                             .Where(step => step.ExternalId == d.Id &&
                                            step.HandlerOrgId == OrgSeedData.CenterId &&
-                                           step.Status < EWorkflowStepStatus.Handled)
-                            .WhereIF(!string.IsNullOrEmpty(dto.CenterToOrgHandlerName), step => step.BusinessType == EBusinessType.Send && step.HandlerName.Contains(dto.CenterToOrgHandlerName)).Any() ||
-                        (string.IsNullOrEmpty(d.WorkflowId) && string.IsNullOrEmpty(dto.CenterToOrgHandlerName))
+                                           step.Status < EWorkflowStepStatus.Handled).Any()
+                        || (string.IsNullOrEmpty(d.WorkflowId) && string.IsNullOrEmpty(dto.CenterToOrgHandlerName))
             )
             .Where(d => d.Source < ESource.MLSQ || d.Source > ESource.WZSC)
             .Where(d => d.Status != EOrderStatus.BackToProvince && d.Status < EOrderStatus.Filed)
@@ -4303,7 +4236,6 @@ public class OrderController : BaseController
             .WhereIF(dto.ExpiredStatus is EExpiredStatus.Expired, d => DateTime.Now >= d.ExpiredTime)
             //.WhereIF(!string.IsNullOrEmpty(dto.CenterToOrgHandlerName), d => d.CenterToOrgHandlerName.Contains(dto.CenterToOrgHandlerName))
             .WhereIF(dto.IsUrgent.HasValue, d => d.IsUrgent == dto.IsUrgent!.Value)
-            .OrderBy(d => d.Status)
             .OrderByIF(string.IsNullOrEmpty(dto.SortField), d => d.CreationTime, OrderByType.Desc)
             .OrderByIF(dto is { SortField: "startTime", SortRule: 0 }, d => d.StartTime, OrderByType.Asc) //受理时间升序
             .OrderByIF(dto is { SortField: "startTime", SortRule: 1 }, d => d.StartTime, OrderByType.Desc) //受理时间降序

+ 1 - 1
src/Hotline.Api/Controllers/OrderTerminateController.cs

@@ -206,7 +206,7 @@ namespace Hotline.Api.Controllers
 			try
 			{
 				dto.NextWorkflow.WorkflowId = model.WorkflowId;
-				await _workflowApplication.NextAsync(dto.NextWorkflow, cancellationToken: HttpContext.RequestAborted);
+				await _workflowDomainService.NextAsync(_sessionContext, dto.NextWorkflow, cancellationToken: HttpContext.RequestAborted);
 			}
 			catch (Exception e)
 			{

+ 2 - 1
src/Hotline.Api/Controllers/WorkflowController.cs

@@ -347,9 +347,10 @@ public class WorkflowController : BaseController
     /// 办理节点
     /// </summary>
     [HttpPost("next")]
+    [Obsolete("即将弃用")]
     public async Task Next([FromBody] NextWorkflowDto dto)
     {
-        await _workflowApplication.NextAsync(dto, cancellationToken: HttpContext.RequestAborted);
+        await _workflowDomainService.NextAsync(_sessionContext, dto, cancellationToken: HttpContext.RequestAborted);
     }
 
     /// <summary>

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

@@ -38,10 +38,10 @@ namespace Hotline.Application.FlowEngine
         Task<FlowAssignInfo> GetNextStepFlowAssignInfoAsync(Workflow workflow, WorkflowStep currentStep,
             BasicWorkflowDto dto, StepDefine nextStepDefine, bool isNextDynamic, CancellationToken cancellationToken);
 
-        /// <summary>
-        /// 流转至下一节点(节点办理)
-        /// </summary>
-        Task<Workflow> NextAsync(NextWorkflowDto dto, DateTime? expiredTime = null, CancellationToken cancellationToken = default);
+        ///// <summary>
+        ///// 流转至下一节点(节点办理)
+        ///// </summary>
+        //Task<Workflow> NextAsync(NextWorkflowDto dto, DateTime? expiredTime = null, CancellationToken cancellationToken = default);
 
         /// <summary>
         /// 退回(返回前一节点)

+ 170 - 167
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -254,76 +254,76 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         return workflow.Id;
     }
 
-    /// <summary>
-    /// 流转至下一节点(节点办理)
-    /// </summary>
-    public async Task<Workflow> NextAsync(NextWorkflowDto dto, DateTime? expiredTime = null, CancellationToken cancellationToken = default)
-    {
-        var validator = new NextWorkflowDtoValidator();
-        var validResult = await validator.ValidateAsync(dto, cancellationToken);
-        if (!validResult.IsValid)
-            throw new UserFriendlyException(
-                $"非法参数, {string.Join(',', validResult.Errors.Select(d => d.ErrorMessage))}");
-        var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, withDefine: true, withSteps: true,
-            withTraces: true, withCountersigns: true, cancellationToken: cancellationToken);
-
-        //var currentStep = _workflowDomainService.FindCurrentStepWaitForHandle(workflow,
-        //    current.RequiredUserId, current.RequiredOrgId, current.Roles);
-        var currentStep = workflow.Steps.FirstOrDefault(d => d.Id == dto.StepId);
-        if (currentStep == null)
-            throw new UserFriendlyException(
-                $"未找到对应节点, workflowId: {dto.WorkflowId}, stepId: {dto.StepId}", "未找到对应节点");
-        if (currentStep.Status is EWorkflowStepStatus.Handled)
-            throw new UserFriendlyException("该状态不支持继续办理");
-
-        var currentStepDefine = _workflowDomainService.GetStepDefine(workflow.WorkflowDefinition, currentStep.Code);
-
-        //下一节点是否为动态节点
-        var isNextDynamic = currentStepDefine.InstanceMode is EInstanceMode.Dynamic &&
-                            !_workflowDomainService.DynamicShouldTerminal(currentStepDefine, _sessionContextProvider.SessionContext.OrgLevel);
-
-        StepDefine nextStepDefine;
-        if (isNextDynamic
-            || (currentStep.IsInCountersign() && !currentStep.IsTopCountersignEndStep(workflow.TopCountersignStepId))
-            || dto.IsStartCountersign)
-        {
-            //下一步配置为当前节点配置
-            nextStepDefine = currentStepDefine;
-        }
-        else
-        {
-            //下一步配置为下一步节点配置
-            nextStepDefine = _workflowDomainService.GetStepDefine(workflow.WorkflowDefinition, dto.NextStepCode);
-        }
-
-        //需求:按角色选择办理人可以不选,表示该角色下所有人都可以办理,同时依据配置:是否本部门人办理显示待选办理人。角色下只要一人办理即可(即:角色下不发起会签)
-        if (nextStepDefine.HandlerType != EHandlerType.Role && !dto.NextHandlers.Any())
-            throw new UserFriendlyException("未指定节点处理者");
-
-        if (dto.IsStartCountersign)
-        {
-            if (!currentStepDefine.CanStartCountersign)
-                throw new UserFriendlyException("当前节点不支持发起会签");
-            //if (currentStepDefine.HandlerType is EHandlerType.Role)
-            //    throw new UserFriendlyException("当前节点不支持发起会签");
-            //即使当前节点支持发起会签,但下一节点为信息汇总节点、结束节点时也不可发起会签
-            if (nextStepDefine.StepType is EStepType.Summary or EStepType.End)
-                throw new UserFriendlyException("下一节点不允许发起会签");
-            //下一节点是会签汇总节点也不允许发起会签
-            if (dto.BackToCountersignEnd)
-                throw new UserFriendlyException("下一节点不允许发起会签");
-        }
-
-        var flowAssignInfo =
-            await GetNextStepFlowAssignInfoAsync(workflow, currentStep, dto, nextStepDefine, isNextDynamic, cancellationToken);
-
-        //var nextStepHandlers = await GetNextStepHandlersAsync(workflow, nextStepDefine, dto, cancellationToken);
-
-        await _workflowDomainService.NextAsync(workflow, currentStep, dto, nextStepDefine, isNextDynamic,
-            flowAssignInfo, expiredTime, cancellationToken);
-
-        return workflow;
-    }
+    ///// <summary>
+    ///// 流转至下一节点(节点办理)
+    ///// </summary>
+    //public async Task<Workflow> NextAsync(NextWorkflowDto dto, DateTime? expiredTime = null, CancellationToken cancellationToken = default)
+    //{
+    //    var validator = new NextWorkflowDtoValidator();
+    //    var validResult = await validator.ValidateAsync(dto, cancellationToken);
+    //    if (!validResult.IsValid)
+    //        throw new UserFriendlyException(
+    //            $"非法参数, {string.Join(',', validResult.Errors.Select(d => d.ErrorMessage))}");
+    //    var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, withDefine: true, withSteps: true,
+    //        withTraces: true, withCountersigns: true, cancellationToken: cancellationToken);
+
+    //    //var currentStep = _workflowDomainService.FindCurrentStepWaitForHandle(workflow,
+    //    //    current.RequiredUserId, current.RequiredOrgId, current.Roles);
+    //    var currentStep = workflow.Steps.FirstOrDefault(d => d.Id == dto.StepId);
+    //    if (currentStep == null)
+    //        throw new UserFriendlyException(
+    //            $"未找到对应节点, workflowId: {dto.WorkflowId}, stepId: {dto.StepId}", "未找到对应节点");
+    //    if (currentStep.Status is EWorkflowStepStatus.Handled)
+    //        throw new UserFriendlyException("该状态不支持继续办理");
+
+    //    var currentStepDefine = _workflowDomainService.GetStepDefine(workflow.WorkflowDefinition, currentStep.Code);
+
+    //    //下一节点是否为动态节点
+    //    var isNextDynamic = currentStepDefine.InstanceMode is EInstanceMode.Dynamic &&
+    //                        !_workflowDomainService.DynamicShouldTerminal(currentStepDefine, _sessionContextProvider.SessionContext.OrgLevel);
+
+    //    StepDefine nextStepDefine;
+    //    if (isNextDynamic
+    //        || (currentStep.IsInCountersign() && !currentStep.IsTopCountersignEndStep(workflow.TopCountersignStepId))
+    //        || dto.IsStartCountersign)
+    //    {
+    //        //下一步配置为当前节点配置
+    //        nextStepDefine = currentStepDefine;
+    //    }
+    //    else
+    //    {
+    //        //下一步配置为下一步节点配置
+    //        nextStepDefine = _workflowDomainService.GetStepDefine(workflow.WorkflowDefinition, dto.NextStepCode);
+    //    }
+
+    //    //需求:按角色选择办理人可以不选,表示该角色下所有人都可以办理,同时依据配置:是否本部门人办理显示待选办理人。角色下只要一人办理即可(即:角色下不发起会签)
+    //    if (nextStepDefine.HandlerType != EHandlerType.Role && !dto.NextHandlers.Any())
+    //        throw new UserFriendlyException("未指定节点处理者");
+
+    //    if (dto.IsStartCountersign)
+    //    {
+    //        if (!currentStepDefine.CanStartCountersign)
+    //            throw new UserFriendlyException("当前节点不支持发起会签");
+    //        //if (currentStepDefine.HandlerType is EHandlerType.Role)
+    //        //    throw new UserFriendlyException("当前节点不支持发起会签");
+    //        //即使当前节点支持发起会签,但下一节点为信息汇总节点、结束节点时也不可发起会签
+    //        if (nextStepDefine.StepType is EStepType.Summary or EStepType.End)
+    //            throw new UserFriendlyException("下一节点不允许发起会签");
+    //        //下一节点是会签汇总节点也不允许发起会签
+    //        if (dto.BackToCountersignEnd)
+    //            throw new UserFriendlyException("下一节点不允许发起会签");
+    //    }
+
+    //    var flowAssignInfo =
+    //        await GetNextStepFlowAssignInfoAsync(workflow, currentStep, dto, nextStepDefine, isNextDynamic, cancellationToken);
+
+    //    //var nextStepHandlers = await GetNextStepHandlersAsync(workflow, nextStepDefine, dto, cancellationToken);
+
+    //    await _workflowDomainService.NextAsync(workflow, currentStep, dto, nextStepDefine, isNextDynamic,
+    //        flowAssignInfo, expiredTime, cancellationToken);
+
+    //    return workflow;
+    //}
 
     /// <summary>
     /// 退回(返回前一节点)
@@ -433,7 +433,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             Files = files,
             StepId = unHandleStep.Id
         };
-        await NextAsync(dto, cancellationToken: cancellationToken);
+        //await NextAsync(dto, cancellationToken: cancellationToken);
+        await _workflowDomainService.NextAsync(_sessionContextProvider.SessionContext, dto, cancellationToken: cancellationToken);
     }
 
     /// <summary>
@@ -552,12 +553,12 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                             dto.OrgIds.Contains(d.ParentId))
                 .ToListAsync(cancellationToken);
             nextStepOption.Items = orgs.Select(d => new FlowStepHandler
-                {
-                    Key = d.Id,
-                    Value = d.Name,
-                    OrgId = d.Id,
-                    OrgName = d.Name
-                })
+            {
+                Key = d.Id,
+                Value = d.Name,
+                OrgId = d.Id,
+                OrgName = d.Name
+            })
                 .ToList();
             nextStepOption.FlowDirection = _workflowDomainService.GetFlowDirection(dto.BusinessType, stepDefine.BusinessType);
             stepOptions.Add(nextStepOption);
@@ -643,7 +644,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                         EStepType.Normal, currentStep.BusinessType, cancellationToken);
 
                     dto.Steps = new List<NextStepOption> { nextStepOption };
-                    if(countersignEndOption!= null)
+                    if (countersignEndOption != null)
                         dto.Steps.Add(countersignEndOption);
                     return dto;
                 }
@@ -797,7 +798,9 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             ? EFlowDirection.CenterToFile
             : EFlowDirection.OrgToFile;
 
-        await NextAsync(nextDto, cancellationToken: cancellationToken);
+        //await NextAsync(nextDto, cancellationToken: cancellationToken);
+        await _workflowDomainService.NextAsync(_sessionContextProvider.SessionContext, nextDto,
+            cancellationToken: cancellationToken);
     }
 
     //供开启流程调用
@@ -990,12 +993,12 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                 }
 
                 handlers = orgs1.Select(d => new FlowStepHandler
-                    {
-                        Key = d.Id,
-                        Value = d.Name,
-                        OrgId = d.Id,
-                        OrgName = d.Name
-                    })
+                {
+                    Key = d.Id,
+                    Value = d.Name,
+                    OrgId = d.Id,
+                    OrgName = d.Name
+                })
                     .ToList();
                 break;
             case EHandlerType.OrgType:
@@ -1007,12 +1010,12 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                     .ToListAsync(cancellationToken);
 
                 handlers = orgs2.Select(d => new FlowStepHandler
-                    {
-                        Key = d.Id,
-                        Value = d.Name,
-                        OrgId = d.Id,
-                        OrgName = d.Name
-                    })
+                {
+                    Key = d.Id,
+                    Value = d.Name,
+                    OrgId = d.Id,
+                    OrgName = d.Name
+                })
                     .ToList();
                 break;
             default:
@@ -1038,7 +1041,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         var prevStep = steps.FirstOrDefault(d => d.Id == step.PrevStepId);
         //归档以后特提发起会签场景
         if (prevStep is null || !prevStep.IsStartCountersign) return null;
-            
+
         var text = prevStep.HandlerOrgIsCenter.Value
             ? "热线中心会签汇总"
             : $"{prevStep.HandlerOrgId.CalcOrgLevel().ToChinese()}级部门会签汇总";
@@ -1727,87 +1730,87 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         }
     }
 
-    public ISugarQueryable<WorkflowCountersign,Workflow,Order> QueryOrderCountersigns(QueryOrderCountersignDto dto, ISessionContext _sessionContext)
+    public ISugarQueryable<WorkflowCountersign, Workflow, Order> QueryOrderCountersigns(QueryOrderCountersignDto dto, ISessionContext _sessionContext)
     {
-		var Role = _sessionContext.Roles;
-
-		var query = _workflowCountersignRepository.Queryable()
-			.Includes(x => x.Members)
-			.LeftJoin<Workflow>((c, w) => c.WorkflowId == w.Id)
-			.InnerJoin<Order>((c, w, o) => w.ExternalId == o.Id)
-			.WhereIF(!string.IsNullOrEmpty(dto.Title), (c, w, o) => o.Title.Contains(dto.Title))
-			.WhereIF(!string.IsNullOrEmpty(dto.OrderNo), (c, w, o) => o.No == dto.OrderNo)
-			.WhereIF(!string.IsNullOrEmpty(dto.AcceptType), (c, w, o) => o.AcceptTypeCode == dto.AcceptType)//受理类型
-			.WhereIF(!string.IsNullOrEmpty(dto.Channel), (c, w, o) => o.SourceChannelCode == dto.Channel)//受理类型
-			.WhereIF(!string.IsNullOrEmpty(dto.Hotspot), (c, w, o) => o.HotspotSpliceName != null && o.HotspotSpliceName.Contains(dto.Hotspot))//热点类型
-			.WhereIF(!string.IsNullOrEmpty(dto.OrgId), (c, w, o) => c.FinisherOrgId == dto.OrgId) //接办部门
-			.WhereIF(dto.CounterSignType != null, (c, w, o) => c.CounterSignType == dto.CounterSignType) //会签类型
-		;
-
-		var rolePaiDan = _systemSettingCacheManager.GetSetting(SettingConstants.RolePaiDan)?.SettingValue[0];//派单员角色
-		var seatsMonitor = _systemSettingCacheManager.GetSetting(SettingConstants.SeatsMonitor)?.SettingValue[0];//班长角色
-		var isAdmin = false;
-		var systemAdministrator = _systemSettingCacheManager.GetSetting(SettingConstants.SystemAdministrator)?.SettingValue[0];//管理员角色
-		if (!string.IsNullOrEmpty(systemAdministrator) && (_sessionContext.Roles.Contains(systemAdministrator) || _sessionContext.Roles.Contains(RoleSeedData.AdminRole)))
-			isAdmin = true;
-
-		//发起会签:班长角色能看所有会签信件;新增管理员能看到所有会签
-		//派单员角色只能看到自己发起的会签信件;
-		//承办部门用户能看到自己发起的和同级部门用户发起的会签件
-		if (dto.InitiatedCountersignature.HasValue && dto.InitiatedCountersignature == true)
-		{
-			if (_sessionContext.Roles.Any(p => p == seatsMonitor) || isAdmin)
-			{
-
-			}
-			else
-			if (_sessionContext.Roles.Any(p => p == rolePaiDan))
-			{
-				query = query.Where((c, w, o) => c.StarterId == _sessionContext.UserId);
-			}
-			else
-			{
-				query = query.Where((c, w, o) => c.StarterOrgId == _sessionContext.RequiredOrgId);
-			}
-		}
-
-		//会签已办(会签状态为已结束):
-		//班长角色能看所有已结束的会签信件;新增管理员能看到所有会签
-		//派单员不会办理会签件只会发起会签件所以这一点派单员角色可以忽略;
-		//承办部门用户能看到和同级部门用户已办理过的会签件
-		if (dto.HandleCountersignature.HasValue && dto.HandleCountersignature == true)
-		{
-			if (_sessionContext.Roles.Any(p => p == seatsMonitor) || isAdmin)
-			{
-				query = query.Where((c, w, o) => c.EndTime.HasValue);
-			}
-			else
-		   if (_sessionContext.Roles.Any(p => p == rolePaiDan))
-			{
-				query = query.Where((c, w, o) => c.Members.Any(m => m.Key == _sessionContext.RequiredOrgId) && c.EndTime.HasValue);
-			}
-			else
-			{
-				query = query.Where((c, w, o) => c.Members.Any(m => m.Key == _sessionContext.OrgId || m.Key == _sessionContext.RequiredOrgId) && c.EndTime.HasValue);
-			}
-		}
-
-		var items =  query
-			.OrderByDescending((c, w, o) => o.ExpiredTime);
-		return items;
+        var Role = _sessionContext.Roles;
+
+        var query = _workflowCountersignRepository.Queryable()
+            .Includes(x => x.Members)
+            .LeftJoin<Workflow>((c, w) => c.WorkflowId == w.Id)
+            .InnerJoin<Order>((c, w, o) => w.ExternalId == o.Id)
+            .WhereIF(!string.IsNullOrEmpty(dto.Title), (c, w, o) => o.Title.Contains(dto.Title))
+            .WhereIF(!string.IsNullOrEmpty(dto.OrderNo), (c, w, o) => o.No == dto.OrderNo)
+            .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), (c, w, o) => o.AcceptTypeCode == dto.AcceptType)//受理类型
+            .WhereIF(!string.IsNullOrEmpty(dto.Channel), (c, w, o) => o.SourceChannelCode == dto.Channel)//受理类型
+            .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), (c, w, o) => o.HotspotSpliceName != null && o.HotspotSpliceName.Contains(dto.Hotspot))//热点类型
+            .WhereIF(!string.IsNullOrEmpty(dto.OrgId), (c, w, o) => c.FinisherOrgId == dto.OrgId) //接办部门
+            .WhereIF(dto.CounterSignType != null, (c, w, o) => c.CounterSignType == dto.CounterSignType) //会签类型
+        ;
+
+        var rolePaiDan = _systemSettingCacheManager.GetSetting(SettingConstants.RolePaiDan)?.SettingValue[0];//派单员角色
+        var seatsMonitor = _systemSettingCacheManager.GetSetting(SettingConstants.SeatsMonitor)?.SettingValue[0];//班长角色
+        var isAdmin = false;
+        var systemAdministrator = _systemSettingCacheManager.GetSetting(SettingConstants.SystemAdministrator)?.SettingValue[0];//管理员角色
+        if (!string.IsNullOrEmpty(systemAdministrator) && (_sessionContext.Roles.Contains(systemAdministrator) || _sessionContext.Roles.Contains(RoleSeedData.AdminRole)))
+            isAdmin = true;
+
+        //发起会签:班长角色能看所有会签信件;新增管理员能看到所有会签
+        //派单员角色只能看到自己发起的会签信件;
+        //承办部门用户能看到自己发起的和同级部门用户发起的会签件
+        if (dto.InitiatedCountersignature.HasValue && dto.InitiatedCountersignature == true)
+        {
+            if (_sessionContext.Roles.Any(p => p == seatsMonitor) || isAdmin)
+            {
+
+            }
+            else
+            if (_sessionContext.Roles.Any(p => p == rolePaiDan))
+            {
+                query = query.Where((c, w, o) => c.StarterId == _sessionContext.UserId);
+            }
+            else
+            {
+                query = query.Where((c, w, o) => c.StarterOrgId == _sessionContext.RequiredOrgId);
+            }
+        }
+
+        //会签已办(会签状态为已结束):
+        //班长角色能看所有已结束的会签信件;新增管理员能看到所有会签
+        //派单员不会办理会签件只会发起会签件所以这一点派单员角色可以忽略;
+        //承办部门用户能看到和同级部门用户已办理过的会签件
+        if (dto.HandleCountersignature.HasValue && dto.HandleCountersignature == true)
+        {
+            if (_sessionContext.Roles.Any(p => p == seatsMonitor) || isAdmin)
+            {
+                query = query.Where((c, w, o) => c.EndTime.HasValue);
+            }
+            else
+           if (_sessionContext.Roles.Any(p => p == rolePaiDan))
+            {
+                query = query.Where((c, w, o) => c.Members.Any(m => m.Key == _sessionContext.RequiredOrgId) && c.EndTime.HasValue);
+            }
+            else
+            {
+                query = query.Where((c, w, o) => c.Members.Any(m => m.Key == _sessionContext.OrgId || m.Key == _sessionContext.RequiredOrgId) && c.EndTime.HasValue);
+            }
+        }
+
+        var items = query
+            .OrderByDescending((c, w, o) => o.ExpiredTime);
+        return items;
     }
 
 
     #region private
 
-	/// <summary>
-	/// 查询流程业务模块
-	/// </summary>
-	/// <param name="code"></param>
-	/// <param name="cancellationToken"></param>
-	/// <returns></returns>
-	/// <exception cref="UserFriendlyException"></exception>
-	public async Task<WorkflowModule> GetWorkflowModuleAsync(string code, CancellationToken cancellationToken)
+    /// <summary>
+    /// 查询流程业务模块
+    /// </summary>
+    /// <param name="code"></param>
+    /// <param name="cancellationToken"></param>
+    /// <returns></returns>
+    /// <exception cref="UserFriendlyException"></exception>
+    public async Task<WorkflowModule> GetWorkflowModuleAsync(string code, CancellationToken cancellationToken)
     {
         var wfModule = await _wfModuleCacheManager.GetWorkflowModuleAsync(code, cancellationToken);
         if (wfModule == null)

+ 1 - 0
src/Hotline/FlowEngine/Workflows/WorkflowCountersign.cs

@@ -7,6 +7,7 @@ using XF.Domain.Repository;
 
 namespace Hotline.FlowEngine.Workflows
 {
+    [SugarIndex("index_wfcs_workflowId", nameof(WorkflowStep.WorkflowId), OrderByType.Desc)]
     public class WorkflowCountersign : CreationEntity
     {
         public string WorkflowId { get; set; }

+ 3 - 1
src/Hotline/FlowEngine/Workflows/WorkflowCountersignMember.cs

@@ -1,4 +1,5 @@
-using XF.Domain.Entities;
+using SqlSugar;
+using XF.Domain.Entities;
 using XF.Domain.Repository;
 
 namespace Hotline.FlowEngine.Workflows;
@@ -6,6 +7,7 @@ namespace Hotline.FlowEngine.Workflows;
 /// <summary>
 /// 会签办理对象
 /// </summary>
+[SugarIndex("index_wfcsMember_workflowCountersignId", nameof(WorkflowStep.WorkflowId), OrderByType.Desc)]
 public class WorkflowCountersignMember : CreationEntity
 {
     public string WorkflowCountersignId { get; set; }

+ 3 - 8
src/Hotline/FlowEngine/Workflows/WorkflowStep.cs

@@ -1,16 +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 Hotline.Share.Enums.FlowEngine;
 using SqlSugar;
 using XF.Domain.Entities;
-using XF.Domain.Exceptions;
 
 namespace Hotline.FlowEngine.Workflows;
 
-[SugarIndex("index_step_externalId", nameof(WorkflowStep.ExternalId), OrderByType.Asc)]
+[SugarIndex("index_step_workflowId", nameof(WorkflowStep.WorkflowId), OrderByType.Desc)]
+[SugarIndex("index_step_externalId", nameof(WorkflowStep.ExternalId), OrderByType.Desc)]
 public class WorkflowStep : StepBasicEntity
 {
    [Navigate(NavigateType.OneToOne, nameof(Id),

+ 2 - 5
src/Hotline/FlowEngine/Workflows/WorkflowTrace.cs

@@ -7,11 +7,8 @@ namespace Hotline.FlowEngine.Workflows;
 /// <summary>
 /// 流转记录
 /// </summary>
-[SugarIndex("index_trace_externalId", nameof(WorkflowTrace.ExternalId), OrderByType.Asc)]
-[SugarIndex("index_trace_flowAssignType", nameof(WorkflowTrace.FlowAssignType), OrderByType.Asc)]
-[SugarIndex("index_trace_handlerId", nameof(WorkflowTrace.HandlerId), OrderByType.Asc)]
-[SugarIndex("index_trace_handlerOrgId", nameof(WorkflowTrace.HandlerOrgId), OrderByType.Asc)]
-[SugarIndex("index_trace_roleId", nameof(WorkflowTrace.RoleId), OrderByType.Asc)]
+[SugarIndex("index_trace_workflowId", nameof(WorkflowTrace.WorkflowId), OrderByType.Desc)]
+[SugarIndex("index_trace_externalId", nameof(WorkflowTrace.ExternalId), OrderByType.Desc)]
 public class WorkflowTrace : StepBasicEntity
 {
     /// <summary>

+ 3 - 7
src/Hotline/Orders/Order.cs

@@ -22,10 +22,9 @@ namespace Hotline.Orders
     /// </summary>
     [Description("工单")]
     [SugarIndex("unique_order_no", nameof(Order.No), OrderByType.Desc, true)]
-    [SugarIndex("index_order_creationtime", nameof(Order.CreationTime), OrderByType.Asc)]
-    [SugarIndex("index_order_startTime", nameof(Order.StartTime), OrderByType.Asc)]
-    [SugarIndex("index_order_status", nameof(Status), OrderByType.Asc)]
-    [SugarIndex("index_order_expiredTime", nameof(Order.ExpiredTime), OrderByType.Asc)]
+    [SugarIndex("index_order_creationtime", nameof(Order.CreationTime), OrderByType.Desc)]
+    [SugarIndex("index_order_startTime", nameof(Order.StartTime), OrderByType.Desc)]
+    [SugarIndex("index_order_expiredTime", nameof(Order.ExpiredTime), OrderByType.Desc)]
 	public partial class Order : PositionWorkflowEntity
     {
         public Order()
@@ -1158,9 +1157,6 @@ namespace Hotline.Orders
         [Navigate(NavigateType.OneToOne, nameof(CallId), nameof(TrCallRecord.OtherAccept))]
         public TrCallRecord CallRecord { get; set; }
 
-        [Navigate(NavigateType.OneToMany, nameof(WorkflowStep.ExternalId))]
-        public List<WorkflowStep> WorkflowSteps { get; set; }
-
         #region Method
 
         public void Cancel()