瀏覽代碼

fixed: jump & recall reset handlers

xf 1 年之前
父節點
當前提交
de6d2ffaed
共有 2 個文件被更改,包括 28 次插入11 次删除
  1. 19 1
      src/Hotline/FlowEngine/Workflows/Workflow.cs
  2. 9 10
      src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

+ 19 - 1
src/Hotline/FlowEngine/Workflows/Workflow.cs

@@ -218,12 +218,30 @@ public class Workflow : CreationEntity
     public void ResetOption() => Opinion = "办理中...";
 
     /// <summary>
-    /// 更新当前办理人(代办人或部门)
+    /// 重新设置办理人(删除当前待办人/部门),撤回/跳转场景,因当前办理人不是流程指定办理人
+    /// </summary>
+    /// <param name="assignType"></param>
+    /// <param name="handlerObjects"></param>
+    public void ResetHandlers(EFlowAssignType assignType, List<HandlerGroupItem> handlerObjects)
+    {
+        HandlerOrgs = new List<HandlerGroupItem>();
+        HandlerUsers = new List<HandlerGroupItem>();
+
+        SetHandlers(assignType, handlerObjects);
+    }
+
+    /// <summary>
+    /// 更新当前办理人(待办人或部门),正常流转场景
     /// </summary>
     public void UpdateHandlers(string handlerId, string handlerOrg, EFlowAssignType assignType, List<HandlerGroupItem> handlerObjects)
     {
         RemoveCurrentHandleGroup(handlerId, handlerOrg);
 
+        SetHandlers(assignType, handlerObjects);
+    }
+
+    private void SetHandlers(EFlowAssignType assignType, List<HandlerGroupItem> handlerObjects)
+    {
         switch (assignType)
         {
             case EFlowAssignType.Org:

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

@@ -485,14 +485,16 @@ namespace Hotline.FlowEngine.Workflows
             //if (currentStepBox.StepType is EStepType.Start)
             //    throw UserFriendlyException.SameMessage("当前流程已退回到开始节点");
 
+            //update uncompleted traces
+            await RecallTraceAsync(workflow.Id, dto, cancellationToken);
+
             var targetStepBox = workflow.StepBoxes.FirstOrDefault(d => d.Code == dto.NextStepCode);
             if (targetStepBox is null)
                 throw UserFriendlyException.SameMessage("该流程尚未流转至该节点");
 
             await RecallAsync(workflow, dto, targetStepDefine, targetStepBox, isStartCountersign, cancellationToken);
 
-            workflow.UpdateHandlers(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgCode,
-                flowAssignMode.FlowAssignType, flowAssignMode.HandlerObjects);
+            workflow.ResetHandlers(flowAssignMode.FlowAssignType, flowAssignMode.HandlerObjects);
             await _workflowRepository.UpdateAsync(workflow, cancellationToken);
 
             await _mediator.Publish(new RecallNotify(workflow, dto), cancellationToken);
@@ -560,9 +562,8 @@ namespace Hotline.FlowEngine.Workflows
                 //返回之前节点
                 await RecallAsync(workflow, dto, targetStepDefine, targetStepBox, isStartCountersign, cancellationToken);
             }
-
-            workflow.UpdateHandlers(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgCode,
-                flowAssignMode.FlowAssignType, flowAssignMode.HandlerObjects);
+            
+            workflow.ResetHandlers(flowAssignMode.FlowAssignType, flowAssignMode.HandlerObjects);
             await _workflowRepository.UpdateAsync(workflow, cancellationToken);
 
             await _mediator.Publish(new JumpNotify(workflow, dto, flowAssignMode), cancellationToken);
@@ -847,6 +848,7 @@ namespace Hotline.FlowEngine.Workflows
             //查询所有目标节点之后的节点,然后删掉(包括目标节点)
             var removeSteps = GetStepsBehindTargetStepBox(workflow.StepBoxes, targetStepBox);
             await _workflowStepRepository.RemoveRangeAsync(removeSteps, cancellationToken);
+            workflow.StepBoxes.RemoveAll(d => removeSteps.Contains(d));
 
             //recreate targetStep
             await CreateStepAsync(isStartCountersign, workflow, targetStepDefine, dto, EWorkflowStepStatus.Assigned,
@@ -855,9 +857,6 @@ namespace Hotline.FlowEngine.Workflows
             //flow manage
             await ResetWorkflowCurrentStepInfo(workflow, dto, targetStepBox, isStartCountersign, cancellationToken);
 
-            //update uncompleted traces
-            await RecallTraceAsync(workflow.Id, dto, cancellationToken);
-
         }
 
         private IEnumerable<WorkflowStep> GetStepsBehindTargetStepBox(List<WorkflowStep> stepBoxes, WorkflowStep currentStepBox)
@@ -894,13 +893,13 @@ namespace Hotline.FlowEngine.Workflows
         private static void CheckWhetherRunnable(EWorkflowStatus status)
         {
             if (status != EWorkflowStatus.Runnable && status != EWorkflowStatus.Marked)
-                throw new UserFriendlyException("当前流程状态不可继续流转");
+                throw UserFriendlyException.SameMessage("当前流程状态不可继续流转");
         }
 
         private void ValidatePermission(Workflow workflow)
         {
             if (!workflow.CanHandle(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgCode))
-                throw new UserFriendlyException("无办理权限");
+                throw UserFriendlyException.SameMessage("无办理权限");
         }
 
         /// <summary>