Browse Source

merge to dev

xf 6 tháng trước cách đây
mục cha
commit
c5b0a0334d

+ 15 - 1
src/Hotline.Api/Controllers/OrderController.cs

@@ -58,6 +58,7 @@ using MiniExcelLibs;
 using SqlSugar;
 using StackExchange.Redis;
 using System.Text;
+using Hotline.Share.Dtos.Order.Handle;
 using MongoDB.Driver.Linq;
 using XF.Domain.Authentications;
 using XF.Domain.Cache;
@@ -69,6 +70,7 @@ using Newtonsoft.Json;
 using XF.Domain.Extensions;
 using Order = Hotline.Orders.Order;
 using WorkflowStep = Hotline.FlowEngine.Workflows.WorkflowStep;
+using System.Threading;
 
 namespace Hotline.Api.Controllers;
 
@@ -3563,7 +3565,8 @@ public class OrderController : BaseController
             var sendOrderTraces = workflow.Traces.Where(x => x.BusinessType == EBusinessType.Send);
             if (sendOrderTraces.Any())
             {
-                var sendOrderTrace = workflow.Traces.Where(x => x.BusinessType == EBusinessType.Send).OrderByDescending(x => x.CreationTime)
+                var sendOrderTrace = workflow.Traces.Where(x => x.BusinessType == EBusinessType.Send)
+                    .OrderByDescending(x => x.CreationTime)
                     .FirstOrDefault();
                 dto.WorkflowDto.NextHandlers = new List<FlowStepHandler>
                 {
@@ -3694,6 +3697,15 @@ public class OrderController : BaseController
         return await _workflowDomainService.NextAsync(nextflowDto, expiredTime, cancellationToken);
     }
 
+    /// <summary>
+    /// 跨级指派查询下一步可选节点及办理对象参数
+    /// </summary>
+    /// <returns></returns>
+    public async Task<NextStepsDto<NextStepOption>> GetCrossLevelStepsOptions([FromQuery] GetCrossLevelStepsDto dto)
+    {
+        return await _workflowApplication.GetCrossLevelStepsAsync(dto, HttpContext.RequestAborted);
+    }
+
     /// <summary>
     /// 查询工单办理下一步可选节点(带推荐部门)
     /// </summary>
@@ -3728,6 +3740,8 @@ public class OrderController : BaseController
         return rsp;
     }
 
+
+
     /// <summary>
     /// 临时保存
     /// </summary>

+ 7 - 0
src/Hotline.Application/FlowEngine/IWorkflowApplication.cs

@@ -8,8 +8,10 @@ using Hotline.Share.Dtos.File;
 using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Dtos.FlowEngine.Definition;
 using Hotline.Share.Dtos.Order;
+using Hotline.Share.Dtos.Order.Handle;
 using Hotline.Share.Dtos.Settings;
 using Hotline.Share.Enums.FlowEngine;
+using Microsoft.AspNetCore.Mvc;
 using XF.Domain.Authentications;
 
 namespace Hotline.Application.FlowEngine
@@ -84,6 +86,11 @@ namespace Hotline.Application.FlowEngine
         /// </summary>
         Task<NextStepsWithOpinionDto<NextStepOption>> GetNextStepsAsync(string workflowId, string stepId, CancellationToken cancellationToken);
 
+        /// <summary>
+        /// 跨级指派查询下一步可选节点及办理对象参数
+        /// </summary>
+        Task<NextStepsDto<NextStepOption>> GetCrossLevelStepsAsync(GetCrossLevelStepsDto dto, CancellationToken cancellationToken);
+
         /// <summary>
         /// 查询撤回可选节点
         /// </summary>

+ 80 - 14
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -31,6 +31,8 @@ using Microsoft.Extensions.Logging;
 using System.Text;
 using System.Diagnostics;
 using Hotline.Configurations;
+using Hotline.Share.Dtos.Order.Handle;
+using Microsoft.AspNetCore.Http;
 using Microsoft.Extensions.Options;
 using Newtonsoft.Json;
 using NPOI.SS.Formula.Functions;
@@ -579,6 +581,72 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         return await GetNextStepsAsync(workflow, currentStep, cancellationToken);
     }
 
+    /// <summary>
+    /// 跨级指派查询下一步可选节点及办理对象参数
+    /// </summary>
+    public async Task<NextStepsDto<NextStepOption>> GetCrossLevelStepsAsync(GetCrossLevelStepsDto dto, CancellationToken cancellationToken)
+    {
+        WorkflowDefinition definition;
+        if (string.IsNullOrEmpty(dto.WorkflowId))
+        {
+            var wfModule = await GetWorkflowModuleAsync(WorkflowModuleConsts.OrderHandle, cancellationToken);
+            definition = wfModule.Definition;
+        }
+        else
+        {
+            var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, withDefine: true, cancellationToken: cancellationToken);
+            definition = workflow.WorkflowDefinition;
+        }
+        if (definition == null)
+            throw new UserFriendlyException("无效模板编码");
+        if (definition.Status is not EDefinitionStatus.Enable)
+            throw new UserFriendlyException("该模板不可用");
+
+        var currentStepDefine = definition.FindStepDefine(dto.StepCode);
+        var nextStepDefines = definition.FindStepDefines(currentStepDefine.NextSteps.Select(d => d.Code))
+            .Where(d => d.StepType == EStepType.Normal && d.BusinessType == EBusinessType.Department)
+            .ToList();
+
+        var stepOptions = new List<NextStepOption>();
+        foreach (var stepDefine in nextStepDefines)
+        {
+            var success = int.TryParse(stepDefine.HandlerTypeItems.First().Key, out var level);
+            int? orgLevel = success ? level : null;
+            var nextStepOption =   new NextStepOption
+            {
+                Key = stepDefine.Code,
+                Value = stepDefine.Name,
+                StepType = stepDefine.StepType,
+                BusinessType = stepDefine.BusinessType,
+                HandlerType = stepDefine.HandlerType,
+                OrgLevel = stepDefine.HandlerType is EHandlerType.OrgLevel ? orgLevel : null,
+            };
+            var orgs = await _organizeRepository.Queryable()
+                .Where(d => d.IsEnable &&
+                d.Level == orgLevel &&
+                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
+                })
+                .ToList();
+            nextStepOption.FlowDirection = _workflowDomainService.GetFlowDirection(dto.BusinessType, stepDefine.BusinessType);
+            stepOptions.Add(nextStepOption);
+        }
+
+        return new NextStepsDto<NextStepOption>
+        {
+            CanReject = false,
+            CanStartCountersign = true,
+            CurrentStepBusinessType = dto.BusinessType,
+            Steps = stepOptions
+        };
+    }
+
     private async Task<NextStepsWithOpinionDto<NextStepOption>> GetNextStepsAsync(Workflow workflow, WorkflowStep currentStep,
         CancellationToken cancellationToken)
     {
@@ -831,8 +899,6 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     private async Task<List<NextStepOption>> GetConfigStepsAsync(
         Workflow workflow,
         WorkflowStep currentStep,
-        //EStepType currentStepType,
-        //EBusinessType currentBusinessType,
         List<StepDefine> stepDefines,
         CancellationToken cancellationToken)
     {
@@ -1002,12 +1068,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:
@@ -1019,12 +1085,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:

+ 42 - 0
src/Hotline.Share/Dtos/Order/Handle/GetCrossLevelStepsDto.cs

@@ -0,0 +1,42 @@
+using Hotline.Share.Enums.FlowEngine;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Share.Dtos.Order.Handle
+{
+    public class GetCrossLevelStepsDto
+    {
+        /// <summary>
+        /// 已开启流程的必须传流程id
+        /// </summary>
+        public string? WorkflowId { get; set; }
+
+        /// <summary>
+        /// 流程模板节点编号
+        /// </summary>
+        public string StepCode { get; set; }
+
+        /// <summary>
+        /// 所选部门id
+        /// </summary>
+        public List<string> OrgIds { get; set; }
+
+        /// <summary>
+        /// 模板配置节点类型
+        /// </summary>
+        public EStepType StepType { get; set; }
+
+        /// <summary>
+        /// 模板配置节点业务类型
+        /// </summary>
+        public EBusinessType BusinessType { get; set; }
+
+        /// <summary>
+        /// 办理对象类型
+        /// </summary>
+        public EHandlerType HandlerType { get; set; }
+    }
+}