xf 2 lat temu
rodzic
commit
7cbbc6a3c9

+ 26 - 17
src/Hotline.Api/Controllers/WorkflowController.cs

@@ -69,25 +69,34 @@ public class WorkflowController : BaseController
     [HttpGet("definition")]
     public async Task<PagedDto<DefinitionDto>> QueryDefinitions([FromQuery] PagedRequest dto)
     {
-        //todo 数据量大需重构
-        var query1 = await _definitionRepository.Queryable()
-            .Where(d => d.Status == EDefinitionStatus.Temporary)
-            .ToListAsync();
-        var query2 = await _definitionRepository.Queryable()
-            .Where(d => d.Status != EDefinitionStatus.Temporary)
-            .Select(d => new { i = SqlFunc.RowNumber($"{d.Version} desc", d.Code), d })
-            .MergeTable()
-            .Where(d => d.i == 1)
-            .ToListAsync();
+        #region old version:只查询草稿、禁用以及已启用模板的最新版本
 
-        var query = query1.Union(query2.Select(d => d.d));
-        var total = query.Count();
-        var items = query
+        ////todo 数据量大需重构
+        //var query1 = await _definitionRepository.Queryable()
+        //    .Where(d => d.Status == EDefinitionStatus.Temporary)
+        //    .ToListAsync();
+        //var query2 = await _definitionRepository.Queryable()
+        //    .Where(d => d.Status != EDefinitionStatus.Temporary)
+        //    .Select(d => new { i = SqlFunc.RowNumber($"{d.Version} desc", d.Code), d })
+        //    .MergeTable()
+        //    .Where(d => d.i == 1)
+        //    .ToListAsync();
+
+        //var query = query1.Union(query2.Select(d => d.d));
+        //var total = query.Count();
+        //var items = query
+        //    .OrderBy(d => d.Status)
+        //    .ThenByDescending(d => d.CreationTime)
+        //    .Skip(dto.Skip())
+        //    .Take(dto.PageSize)
+        //    .ToList();
+
+        #endregion
+        var (total, items) = await _definitionRepository.Queryable()
             .OrderBy(d => d.Status)
-            .ThenByDescending(d => d.CreationTime)
-            .Skip(dto.Skip())
-            .Take(dto.PageSize)
-            .ToList();
+            .OrderBy(d => d.Code)
+            .OrderByDescending(d => d.Version)
+            .ToPagedListAsync(dto, HttpContext.RequestAborted);
 
         return new PagedDto<DefinitionDto>(total, _mapper.Map<IReadOnlyList<DefinitionDto>>(items));
     }

+ 7 - 4
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -59,11 +59,11 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             throw new UserFriendlyException("非法参数");
 
         var definition = string.IsNullOrEmpty(dto.DefinitionCode)
-            ? await _definitionDomainService.GetLastEnableByModuleCodeAsync(dto.DefinitionModuleCode, cancellationToken)
-            : await _definitionDomainService.GetLastEnableAsync(dto.DefinitionCode, cancellationToken);
+            ? await _definitionDomainService.GetLastVersionByModuleCodeAsync(dto.DefinitionModuleCode, cancellationToken)
+            : await _definitionDomainService.GetLastVersionAsync(dto.DefinitionCode, cancellationToken);
         if (definition == null)
             throw new UserFriendlyException("无效模板名称");
-        if (definition.Status != EDefinitionStatus.Enable)
+        if (definition.Status is EDefinitionStatus.Temporary or EDefinitionStatus.Disable)
             throw new UserFriendlyException("该模板不可用");
 
         var nextStepBoxDefine = _workflowDomainService.GetStepBoxDefine(definition, dto.NextStepCode);
@@ -122,9 +122,12 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     public async Task<IReadOnlyList<NextStepOptions>> GetStartOptionsAsync(string moduleCode, CancellationToken cancellationToken)
     {
         var definition =
-            await _definitionDomainService.GetLastEnableByModuleCodeAsync(moduleCode, cancellationToken);
+            await _definitionDomainService.GetLastVersionByModuleCodeAsync(moduleCode, cancellationToken);
         if (definition == null)
             throw new UserFriendlyException($"无效模块编码, modeuleCode: {moduleCode}", "无效模块编码");
+        if (definition.Status is EDefinitionStatus.Temporary or EDefinitionStatus.Disable)
+            throw new UserFriendlyException("该模板不可用");
+
         var startStep = definition.Steps.FirstOrDefault(d => d.StepType == EStepType.Start);
         var nextStepDefines = definition.FindSteps(startStep.NextSteps);
         return await GetNextStepOptionsAsync(nextStepDefines);

+ 5 - 5
src/Hotline.Share/Dtos/FlowEngine/DefinitionDto.cs

@@ -8,6 +8,11 @@ namespace Hotline.Share.Dtos.FlowEngine
         public EDefinitionStatus Status { get; set; }
         public string StatusText => Status.GetDescription();
 
+        /// <summary>
+        /// 版本号
+        /// </summary>
+        public int Version { get; set; }
+
         public DateTime CreationTime { get; set; }
     }
 
@@ -28,11 +33,6 @@ namespace Hotline.Share.Dtos.FlowEngine
         /// </summary>
         public string Code { get; set; }
 
-        /// <summary>
-        /// 草稿版本号 == 0
-        /// </summary>
-        public int Version { get; set; }
-
         public string? Description { get; set; }
 
         public List<StepDefineDto> Steps { get; set; }

+ 5 - 0
src/Hotline.Share/Enums/FlowEngine/EDefinitionStatus.cs

@@ -21,4 +21,9 @@ public enum EDefinitionStatus
     /// </summary>
     [Description("禁用")]
     Disable = 2,
+
+    /// <summary>
+    /// 过期(被新版本替代,依据该模板发起的流程依旧采用该模板走完流程)
+    /// </summary>
+    Expired = 3,
 }

+ 9 - 9
src/Hotline/FlowEngine/Definitions/DefinitionDomainService.cs

@@ -39,7 +39,7 @@ public class DefinitionDomainService : IDefinitionDomainService, IScopeDependenc
 
         ValidateDefinition(definitionTemp);
 
-        var lastVersion = await GetLastVersionAsync(definitionTemp!.Code, cancellationToken);
+        var lastVersion = await GetLastVersionNoAsync(definitionTemp!.Code, cancellationToken);
         definitionTemp.Version = lastVersion + 1;
         definitionTemp.Status = EDefinitionStatus.Enable;
 
@@ -79,7 +79,7 @@ public class DefinitionDomainService : IDefinitionDomainService, IScopeDependenc
     /// <param name="code"></param>
     /// <param name="cancellationToken"></param>
     /// <returns></returns>
-    public async Task<int> GetLastVersionAsync(string code, CancellationToken cancellationToken)
+    public async Task<int> GetLastVersionNoAsync(string code, CancellationToken cancellationToken)
     {
         return await _definitionRepository.Queryable()
             .Where(d => d.Code == code)
@@ -90,30 +90,30 @@ public class DefinitionDomainService : IDefinitionDomainService, IScopeDependenc
     }
 
     /// <summary>
-    /// 查询已启用的最后版本
+    /// 查询最新版本
     /// </summary>
     /// <param name="moduleCode"></param>
     /// <param name="cancellationToken"></param>
     /// <returns></returns>
-    public async Task<Definition?> GetLastEnableByModuleCodeAsync(string moduleCode, CancellationToken cancellationToken)
+    public async Task<Definition?> GetLastVersionByModuleCodeAsync(string moduleCode, CancellationToken cancellationToken)
     {
         return await _definitionRepository.Queryable()
-            .Where(d => d.ModuleCode == moduleCode && d.Status == EDefinitionStatus.Enable)
+            .Where(d => d.ModuleCode == moduleCode)
             .OrderByDescending(d => d.Version)
             .Take(1)
             .FirstAsync();
     }
 
     /// <summary>
-    /// 查询已启用的最后版本
+    /// 查询最新版本
     /// </summary>
     /// <param name="code"></param>
     /// <param name="cancellationToken"></param>
     /// <returns></returns>
-    public async Task<Definition?> GetLastEnableAsync(string code, CancellationToken cancellationToken)
+    public async Task<Definition?> GetLastVersionAsync(string code, CancellationToken cancellationToken)
     {
         return await _definitionRepository.Queryable()
-            .Where(d => d.Code == code && d.Status == EDefinitionStatus.Enable)
+            .Where(d => d.Code == code)
             .OrderByDescending(d => d.Version)
             .Take(1)
             .FirstAsync();
@@ -127,7 +127,7 @@ public class DefinitionDomainService : IDefinitionDomainService, IScopeDependenc
     /// <returns></returns>
     public async Task<IReadOnlyList<StepDefine>> GetSecondStepsAsync(string definitionCode, CancellationToken cancellationToken)
     {
-        var definition = await GetLastEnableAsync(definitionCode, cancellationToken);
+        var definition = await GetLastVersionAsync(definitionCode, cancellationToken);
         if (definition == null)
             throw new UserFriendlyException($"无效模板编码, code:{definitionCode}", "无效模板编码");
         return definition.FindSteps(definition.FindStartStep().NextSteps);

+ 3 - 3
src/Hotline/FlowEngine/Definitions/IDefinitionDomainService.cs

@@ -22,7 +22,7 @@ namespace Hotline.FlowEngine.Definitions
         /// <param name="code"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        Task<int> GetLastVersionAsync(string code, CancellationToken cancellationToken);
+        Task<int> GetLastVersionNoAsync(string code, CancellationToken cancellationToken);
 
         /// <summary>
         /// 查询已启用的最后版本
@@ -30,7 +30,7 @@ namespace Hotline.FlowEngine.Definitions
         /// <param name="code"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        Task<Definition?> GetLastEnableAsync(string code, CancellationToken cancellationToken);
+        Task<Definition?> GetLastVersionAsync(string code, CancellationToken cancellationToken);
 
         /// <summary>
         /// 查询已启用的最后版本
@@ -38,7 +38,7 @@ namespace Hotline.FlowEngine.Definitions
         /// <param name="moduleCode"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        Task<Definition?> GetLastEnableByModuleCodeAsync(string moduleCode, CancellationToken cancellationToken);
+        Task<Definition?> GetLastVersionByModuleCodeAsync(string moduleCode, CancellationToken cancellationToken);
 
         /// <summary>
         /// 禁用指定业务模块下所有模板