xf 1 년 전
부모
커밋
367ac817e0

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

@@ -325,7 +325,7 @@ public class WorkflowController : BaseController
     /// <returns></returns>
     [Permission(EPermission.FlowRecall)]
     [HttpGet("{workflowId}/recall")]
-    public async Task<NextStepsDto> GetRecallSteps(string workflowId)
+    public async Task<RecallStepsDto> GetRecallSteps(string workflowId)
     {
         return await _workflowApplication.GetRecallStepsAsync(workflowId, HttpContext.RequestAborted);
     }

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

@@ -65,7 +65,7 @@ namespace Hotline.Application.FlowEngine
         /// <summary>
         /// 查询撤回可选节点
         /// </summary>
-        Task<NextStepsDto> GetRecallStepsAsync(string workflowId, CancellationToken cancellationToken);
+        Task<RecallStepsDto> GetRecallStepsAsync(string workflowId, CancellationToken cancellationToken);
 
         /// <summary>
         /// 查询跳转可选节点

+ 32 - 20
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -546,52 +546,64 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     /// <summary>
     /// 查询撤回可选节点
     /// </summary>
-    public async Task<NextStepsDto> GetRecallStepsAsync(string workflowId, CancellationToken cancellationToken)
+    public async Task<RecallStepsDto> GetRecallStepsAsync(string workflowId, CancellationToken cancellationToken)
     {
         var workflow = await _workflowDomainService.GetWorkflowAsync(workflowId, true, true, cancellationToken: cancellationToken);
-        var stepCodes = workflow.Steps.Where(d => d.StepType != EStepType.End && d.IsOrigin)
-            .Select(d => d.Code).ToList();
+        var originSteps = workflow.Steps.Where(d => d.StepType != EStepType.End && d.IsOrigin).ToList();
+        var stepCodes = originSteps.Select(d => d.Code).ToList();
         var stepDefines = workflow.WorkflowDefinition.FindStepDefines(stepCodes);
         var currentStep = workflow.Steps.FirstOrDefault(d => d.Id == workflow.CurrentStepId);
         if (currentStep is null)
             throw new UserFriendlyException("无效当前节点编号");
-        return new NextStepsDto
+
+        var dto = new RecallStepsDto
         {
-            Steps = await GetRecallConfigStepsAsync(workflow.Status is EWorkflowStatus.Completed,
-                workflow.FlowType, currentStep.BusinessType, stepDefines, cancellationToken)
+            TimeTypeOptions = EnumExts.GetDescriptions<ETimeType>().ToList()
         };
+
+        var steps = await GetRecallConfigStepsAsync(originSteps, stepDefines, currentStep,
+            workflow.FlowType,
+            workflow.Status is EWorkflowStatus.Completed, 
+            cancellationToken);
+        dto.Steps = steps;
+
+        return dto;
     }
 
-    private async Task<IReadOnlyList<NextStepOption>> GetRecallConfigStepsAsync(
-        bool isWorkflowFiled,
-        EFlowType flowType,
-        EBusinessType currentBusinessType,
-        List<StepDefine> stepDefines,
-        CancellationToken cancellationToken)
+    private async Task<List<RecallStepOption>> GetRecallConfigStepsAsync(
+        List<WorkflowStep> originSteps, List<StepDefine> stepDefines,
+        WorkflowStep currentStep, EFlowType flowType, bool isWorkflowFiled, CancellationToken cancellationToken)
     {
-        var stepOptions = new List<NextStepOption>();
-        foreach (var stepDefine in stepDefines)
+        var steps = new List<RecallStepOption>();
+        foreach (var originStep in originSteps)
         {
+            var stepDefine = stepDefines.First(d => d.Code == originStep.Code);
             var nextStepOption = await GetConfigStepAsync(flowType, stepDefine, cancellationToken);
+            var stepOption = _mapper.Map<RecallStepOption>(nextStepOption);
             if (stepDefine.StepType is EStepType.End)
             {
-                stepOptions.Add(nextStepOption);
+                steps.Add(stepOption);
                 continue;
             }
 
-            nextStepOption.InputRealHandler = false;
+            stepOption.InputRealHandler = false;
+
             //已归档工单,撤回至中心看作otc,撤回至部门看作cto
-            nextStepOption.FlowDirection = isWorkflowFiled
+            stepOption.FlowDirection = isWorkflowFiled
                 ? stepDefine.BusinessType is EBusinessType.Center or EBusinessType.Send
                     ? EFlowDirection.OrgToCenter
                     : stepDefine.BusinessType is EBusinessType.Department
                         ? EFlowDirection.CenterToOrg
                         : null
-                : CheckFlowDirection(currentBusinessType, stepDefine.BusinessType);
-            stepOptions.Add(nextStepOption);
+                : CheckFlowDirection(currentStep.BusinessType, stepDefine.BusinessType);
+
+            stepOption.Handler =
+                originStep.NextHandlers.First(d => d.Key == originStep.HandlerId || d.Key == originStep.HandlerOrgId);
+
+            steps.Add(stepOption);
         }
 
-        return stepOptions;
+        return steps;
     }
 
     /// <summary>

+ 16 - 4
src/Hotline.Share/Dtos/FlowEngine/NextStepsDto.cs

@@ -41,10 +41,19 @@ public class NextStepOption : Kv
     /// </summary>
     public EFlowDirection? FlowDirection { get; set; }
 
+    /// <summary>
+    /// 模板配置节点类型
+    /// </summary>
     public EStepType StepType { get; set; }
 
+    /// <summary>
+    /// 模板配置节点业务类型
+    /// </summary>
     public EBusinessType BusinessType { get; set; }
 
+    /// <summary>
+    /// 节点下可选办理对象
+    /// </summary>
     public IReadOnlyList<Kv> Items { get; set; }
 }
 
@@ -59,11 +68,11 @@ public class GetNextStepItemsDto
 /// <summary>
 /// 撤回可选节点参数
 /// </summary>
-public class RecallNextStepsDto
+public class RecallStepsDto
 {
-    public IReadOnlyList<RecallNextStepOption> Steps { get; set; }
+    public IReadOnlyList<RecallStepOption> Steps { get; set; }
 
-    public DateTime? ExpiredTime { get; set; }
+    //public DateTime? ExpiredTime { get; set; }
 
     /// <summary>
     /// 是否有否决按钮
@@ -75,10 +84,13 @@ public class RecallNextStepsDto
     /// </summary>
     public bool CanStartCountersign { get; set; }
 
+    /// <summary>
+    /// 办理时限时间类型待选参数
+    /// </summary>
     public IReadOnlyList<KeyValuePair<int, string>> TimeTypeOptions { get; set; }
 }
 
-public class RecallNextStepOption : NextStepOption
+public class RecallStepOption : NextStepOption
 {
     /// <summary>
     /// 该节点原办理对象

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

@@ -159,12 +159,12 @@ public class DefinitionDomainService : IDefinitionDomainService, IScopeDependenc
         if (definition.Steps.GroupBy(d => d.Code).Count() < definition.Steps.Count)
             throw UserFriendlyException.SameMessage("一个模板内不允许出现code相同的节点");
 
-        if (definition.Steps.Count(d => d.NextSteps.Any(x => x.Code == "End")) > 1)
-            throw UserFriendlyException.SameMessage("结束节点只能有一个上级节点");
+        //if (definition.Steps.Count(d => d.NextSteps.Any(x => x.Code == "End")) > 1)
+        //    throw UserFriendlyException.SameMessage("结束节点只能有一个上级节点");
 
-        var startStep = startSteps.First();
-        if (startStep.NextSteps.Count > 1)
-            throw UserFriendlyException.SameMessage("开始节点有且只能有一个下级节点");
+        //var startStep = startSteps.First();
+        //if (startStep.NextSteps.Count > 1)
+        //    throw UserFriendlyException.SameMessage("开始节点有且只能有一个下级节点");
     }
 
     #endregion