Ver Fonte

Merge branch 'master' of http://git.fwt.com/Hotline/hotline

TANG JIANG há 2 anos atrás
pai
commit
6d37d96789

+ 27 - 30
src/Hotline.Api/Controllers/WorkflowController.cs

@@ -287,6 +287,20 @@ public class WorkflowController : BaseController
         await _workflowDomainService.PreviousAsync(workflow, dto, HttpContext.RequestAborted);
     }
 
+    /// <summary>
+    /// 获取撤回参数
+    /// </summary>
+    /// <param name="workflowId"></param>
+    /// <returns></returns>
+    [Permission(EPermission.FlowJump)]
+    [HttpGet("{workflowId}/recall")]
+    public async Task<IReadOnlyList<StepDefineDto>> GetRecallOptions(string workflowId)
+    {
+        var workflow = await _workflowDomainService.GetWorkflowAsync(workflowId, true, true, cancellationToken: HttpContext.RequestAborted);
+        return _mapper.Map<IReadOnlyList<StepDefineDto>>(
+            workflow.StepBoxes.Where(d => d.StepType != EStepType.Start && d.StepType != EStepType.End));
+    }
+
     /// <summary>
     /// 撤回至任意节点
     /// </summary>
@@ -298,6 +312,19 @@ public class WorkflowController : BaseController
         await _workflowApplication.RecallAsync(dto, HttpContext.RequestAborted);
     }
 
+    /// <summary>
+    /// 获取跳转参数
+    /// </summary>
+    /// <param name="workflowId"></param>
+    /// <returns></returns>
+    [HttpGet("{workflowId}/jump")]
+    public async Task<IReadOnlyList<StepDefineDto>> GetJumpOptions(string workflowId)
+    {
+        var workflow = await _workflowDomainService.GetWorkflowAsync(workflowId, true, true, cancellationToken: HttpContext.RequestAborted);
+        var steps = workflow.Definition.Steps.Where(d => d.StepType != EStepType.Start && d.StepType != EStepType.End);
+        return _mapper.Map<IReadOnlyList<StepDefineDto>>(steps);
+    }
+
     /// <summary>
     /// 跳转至任意节点
     /// </summary>
@@ -337,33 +364,6 @@ public class WorkflowController : BaseController
         await _workflowDomainService.SupplementAsync(workflow, dto, HttpContext.RequestAborted);
     }
 
-    /// <summary>
-    /// 获取跳转参数
-    /// </summary>
-    /// <param name="workflowId"></param>
-    /// <returns></returns>
-    [HttpGet("{workflowId}/jump")]
-    public async Task<IReadOnlyList<StepDefineDto>> GetJumpOptions(string workflowId)
-    {
-        var workflow = await _workflowDomainService.GetWorkflowAsync(workflowId, true, true, cancellationToken: HttpContext.RequestAborted);
-        var steps = workflow.Definition.Steps.Where(d => d.StepType != EStepType.Start && d.StepType != EStepType.End);
-        return _mapper.Map<IReadOnlyList<StepDefineDto>>(steps);
-    }
-
-    /// <summary>
-    /// 获取撤回参数
-    /// </summary>
-    /// <param name="workflowId"></param>
-    /// <returns></returns>
-    [Permission(EPermission.FlowJump)]
-    [HttpGet("{workflowId}/recall")]
-    public async Task<IReadOnlyList<StepDefineDto>> GetRecallOptions(string workflowId)
-    {
-        var workflow = await _workflowDomainService.GetWorkflowAsync(workflowId, true, true, cancellationToken: HttpContext.RequestAborted);
-        return _mapper.Map<IReadOnlyList<StepDefineDto>>(
-            workflow.StepBoxes.Where(d => d.StepType != EStepType.Start && d.StepType != EStepType.End));
-    }
-
     /// <summary>
     /// 查询业务流程是否已经启用模板
     /// </summary>
@@ -380,9 +380,6 @@ public class WorkflowController : BaseController
     /// <summary>
     /// 查询办理类型参数
     /// </summary>
-    /// <param name="handlerType"></param>
-    /// <returns></returns>
-    /// <exception cref="ArgumentOutOfRangeException"></exception>
     [HttpGet("handlerclassify/{handlerType}")]
     public async Task<List<KeyValuePair<string, string>>> GetHandlerClassifies(EHandlerType handlerType)
     {

+ 23 - 10
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -772,6 +772,15 @@ namespace Hotline.FlowEngine.Workflows
         private async Task RecallAsync(Workflow workflow, RecallDto dto, StepDefine targetStepDefine, WorkflowStep currentStepBox, WorkflowStep targetStepBox,
             bool isStartCountersign, CancellationToken cancellationToken)
         {
+            //get targetStep's previous
+            var targetPrevStepBox = workflow.StepBoxes.FirstOrDefault(d => d.Id == targetStepBox.PreviousId);
+            if (targetPrevStepBox == null)
+                throw new UserFriendlyException($"{nameof(RecallAsync)}, 未找到目标节点的前一节点, flowId: {workflow.Id}, targetStepBoxPrevId: {targetPrevStepBox.PreviousId}");
+            //真实的前一节点并不存在(非正常流转造成的),所以任意取一个替代
+            var targetPrevStep = targetPrevStepBox.Steps.FirstOrDefault();
+            if (targetPrevStep == null)
+                throw new UserFriendlyException($"{nameof(RecallAsync)}, 未找到目标节点的前一节点, flowId: {workflow.Id}");
+
             //remove completedSteps include target self
             var removeSteps = GetStepsIncludeSelf(targetStepBox);
             var tempStepBox = currentStepBox;
@@ -780,7 +789,7 @@ namespace Hotline.FlowEngine.Workflows
                 removeSteps.AddRange(GetStepsIncludeSelf(tempStepBox));
                 var prevStepBox = workflow.StepBoxes.FirstOrDefault(d => d.Id == tempStepBox.PreviousId);
                 if (prevStepBox is null)
-                    throw new UserFriendlyException($"{nameof(RecallAsync)}, 未查询到节点, tempStepBoxId: {tempStepBox.Id}, prevStepBoxId: {tempStepBox.PreviousId}");
+                    throw new UserFriendlyException($"{nameof(RecallAsync)}, 未查询到节点, workflowId: {workflow.Id}, prevStepBoxId: {tempStepBox.PreviousId}");
                 tempStepBox = prevStepBox;
             }
 
@@ -788,17 +797,21 @@ namespace Hotline.FlowEngine.Workflows
 
             //recreate targetStep
             await CreateStepAsync(isStartCountersign, workflow, targetStepDefine, dto, EWorkflowStepStatus.Assigned,
-                targetStepBox, targetStepBox.Steps.First(), cancellationToken);
+                targetPrevStepBox, targetPrevStep, cancellationToken);
 
             //flow manage
-            if (workflow.IsInCountersign())
-            {
-                var currentCountersignStepBox =
-                    workflow.StepBoxes.First(d => d.Code == workflow.TopCountersignStepCode);
-                //目标节点在初始会签节点之前或正好
-                if (targetStepBox.Code == workflow.TopCountersignStepCode || targetStepBox.CreationTime < currentCountersignStepBox.CreationTime)
-                    await ResetWorkflowCurrentStepInfo(workflow, dto, targetStepBox, isStartCountersign, cancellationToken);
-            }
+            await ResetWorkflowCurrentStepInfo(workflow, dto, targetStepBox, isStartCountersign, cancellationToken);
+
+            //if (workflow.IsInCountersign())
+            //{
+            //    var currentCountersignStepBox =
+            //        workflow.StepBoxes.First(d => d.Code == workflow.TopCountersignStepCode);
+            //    //目标节点在初始会签节点之前或正好
+
+            //    if (targetStepBox.Code == workflow.TopCountersignStepCode || targetStepBox.CreationTime < currentCountersignStepBox.CreationTime)
+            //        await ResetWorkflowCurrentStepInfo(workflow, dto, targetStepBox, isStartCountersign, cancellationToken);
+            //}
+
 
             //update uncompleted traces
             await RecallTraceAsync(workflow.Id, dto, cancellationToken);