Эх сурвалжийг харах

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

TANG JIANG 2 жил өмнө
parent
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);
         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>
     /// 撤回至任意节点
     /// 撤回至任意节点
     /// </summary>
     /// </summary>
@@ -298,6 +312,19 @@ public class WorkflowController : BaseController
         await _workflowApplication.RecallAsync(dto, HttpContext.RequestAborted);
         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>
     /// 跳转至任意节点
     /// 跳转至任意节点
     /// </summary>
     /// </summary>
@@ -337,33 +364,6 @@ public class WorkflowController : BaseController
         await _workflowDomainService.SupplementAsync(workflow, dto, HttpContext.RequestAborted);
         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>
     /// 查询业务流程是否已经启用模板
     /// 查询业务流程是否已经启用模板
     /// </summary>
     /// </summary>
@@ -380,9 +380,6 @@ public class WorkflowController : BaseController
     /// <summary>
     /// <summary>
     /// 查询办理类型参数
     /// 查询办理类型参数
     /// </summary>
     /// </summary>
-    /// <param name="handlerType"></param>
-    /// <returns></returns>
-    /// <exception cref="ArgumentOutOfRangeException"></exception>
     [HttpGet("handlerclassify/{handlerType}")]
     [HttpGet("handlerclassify/{handlerType}")]
     public async Task<List<KeyValuePair<string, string>>> GetHandlerClassifies(EHandlerType 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,
         private async Task RecallAsync(Workflow workflow, RecallDto dto, StepDefine targetStepDefine, WorkflowStep currentStepBox, WorkflowStep targetStepBox,
             bool isStartCountersign, CancellationToken cancellationToken)
             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
             //remove completedSteps include target self
             var removeSteps = GetStepsIncludeSelf(targetStepBox);
             var removeSteps = GetStepsIncludeSelf(targetStepBox);
             var tempStepBox = currentStepBox;
             var tempStepBox = currentStepBox;
@@ -780,7 +789,7 @@ namespace Hotline.FlowEngine.Workflows
                 removeSteps.AddRange(GetStepsIncludeSelf(tempStepBox));
                 removeSteps.AddRange(GetStepsIncludeSelf(tempStepBox));
                 var prevStepBox = workflow.StepBoxes.FirstOrDefault(d => d.Id == tempStepBox.PreviousId);
                 var prevStepBox = workflow.StepBoxes.FirstOrDefault(d => d.Id == tempStepBox.PreviousId);
                 if (prevStepBox is null)
                 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;
                 tempStepBox = prevStepBox;
             }
             }
 
 
@@ -788,17 +797,21 @@ namespace Hotline.FlowEngine.Workflows
 
 
             //recreate targetStep
             //recreate targetStep
             await CreateStepAsync(isStartCountersign, workflow, targetStepDefine, dto, EWorkflowStepStatus.Assigned,
             await CreateStepAsync(isStartCountersign, workflow, targetStepDefine, dto, EWorkflowStepStatus.Assigned,
-                targetStepBox, targetStepBox.Steps.First(), cancellationToken);
+                targetPrevStepBox, targetPrevStep, cancellationToken);
 
 
             //flow manage
             //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
             //update uncompleted traces
             await RecallTraceAsync(workflow.Id, dto, cancellationToken);
             await RecallTraceAsync(workflow.Id, dto, cancellationToken);