Pārlūkot izejas kodu

http节点错误处理

caixiaofeng 6 mēneši atpakaļ
vecāks
revīzija
6e3280b1a8

+ 11 - 1
flow-workflow/flow-workflow-biz/src/main/java/com/flow/service/impl/FlowDefineServiceImpl.java

@@ -1,5 +1,6 @@
 package com.flow.service.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.flow.common.core.exception.BaseException;
 import com.flow.common.core.model.OauthUserDetails;
 import com.flow.common.core.util.SecurityContextUtil;
@@ -83,6 +84,13 @@ public class FlowDefineServiceImpl extends BaseServiceImpl<FlowDefineDao, FlowDe
         for (NotifyNode notifyNode : notifyNodes) {
             values.put(String.format("%sCollection", notifyNode.getId()), notifyNode.getAssignees(values));
         }
+        List<HttpNode> httpNodes = flowDefine.findFlowNodesOfType(HttpNode.class);
+        for (HttpNode httpNode : httpNodes) {
+            List<String> errorUsers = httpNode.getErrorUsers();
+            if (CollectionUtils.isNotEmpty(errorUsers)) {
+                values.put(String.format("%sCollection", httpNode.getId()), errorUsers);
+            }
+        }
         // 生成流程实例ID
         String serialKey = "flow:serial";
         Long increment = stringRedisTemplate.opsForValue().increment(serialKey, 1);
@@ -120,7 +128,9 @@ public class FlowDefineServiceImpl extends BaseServiceImpl<FlowDefineDao, FlowDe
                 .businessStatus(ProcessStatus.RUNNING.toString())
                 .variables(values)
                 .start();
-        runtimeService.setVariable(instanceId, "_SKIP_INITIATOR", false);
+        try {
+            runtimeService.setVariable(instanceId, "_SKIP_INITIATOR", false);
+        } catch (Exception ignored) {}
     }
 
     @Override

+ 1 - 1
flow-workflow/flow-workflow-biz/src/main/java/com/flow/service/impl/FlowTaskServiceImpl.java

@@ -97,7 +97,7 @@ public class FlowTaskServiceImpl extends BaseServiceImpl<FlowTaskDao, FlowTask>
         }
         Map<String, Object> variables = this.getVariables(task.getId());
         ApprovalNode approvalNode = flowDefine.getNode(task.getTaskDefinitionKey(), ApprovalNode.class);
-        StartNode startNode = flowDefine.getNode(task.getTaskDefinitionKey(), StartNode.class);
+        StartNode startNode = flowDefine.getNode(null, StartNode.class);
         List<FieldProperty> formProperties = Objects.nonNull(approvalNode) ? approvalNode.getFormProperties() : startNode.getFormProperties();
         HashMap<String, Boolean> startOpera = new HashMap<>();
         startOpera.put("complete", true);

+ 15 - 6
flow-workflow/flow-workflow-entity/src/main/java/com/flow/entity/FlowDefine.java

@@ -160,12 +160,21 @@ public class FlowDefine extends BaseEntity {
     }
 
     public <T extends Node> T getNode(String nodeId, Class<T> type) {
-        Node node = allNodesAsMap().get(nodeId);
-        if (Objects.nonNull(node)) {
-            if (type.isInstance(node)) {
-                return type.cast(node);
-            } else {
-                return null;
+        Map<String, Node> nodeMap = allNodesAsMap();
+        if (StringUtils.isNotBlank(nodeId)) {
+            Node node = nodeMap.get(nodeId);
+            if (Objects.nonNull(node)) {
+                if (type.isInstance(node)) {
+                    return type.cast(node);
+                } else {
+                    return null;
+                }
+            }
+        } else {
+            for (Node value : nodeMap.values()) {
+                if (type.isInstance(value)) {
+                    return type.cast(value);
+                }
             }
         }
         return null;

+ 47 - 3
flow-workflow/flow-workflow-entity/src/main/java/com/flow/entity/node/HttpNode.java

@@ -23,7 +23,7 @@ public class HttpNode extends Node {
     private Integer retryCount;
     private TimeUnitEnum unit = TimeUnitEnum.MINUTE;
     private Integer duration;
-
+    private List<String> errorUsers;
 
     @Override
     public List<FlowElement> convert() {
@@ -103,10 +103,10 @@ public class HttpNode extends Node {
         FieldExtension failCodesExtension = new FieldExtension();
         failCodesExtension.setFieldName("failStatusCodes");
         failCodesExtension.setStringValue("400,401,403,404,500,503");
-        fieldExtensions.add(failCodesExtension);
+        // fieldExtensions.add(failCodesExtension);
         FieldExtension handleCodesExtension = new FieldExtension();
         handleCodesExtension.setFieldName("handleStatusCodes");
-        handleCodesExtension.setStringValue("200");
+        handleCodesExtension.setStringValue("400,401,403,404,500,503");
         fieldExtensions.add(handleCodesExtension);
         FieldExtension saveResponseBodyExtension = new FieldExtension();
         saveResponseBodyExtension.setFieldName("saveResponseVariableAsJson");
@@ -122,6 +122,9 @@ public class HttpNode extends Node {
         ignoreExtension.setStringValue(Boolean.toString(isRetry));
         fieldExtensions.add(ignoreExtension);
         elements.add(httpServiceTask);
+        if (CollectionUtils.isNotEmpty(this.errorUsers)) {
+            elements.addAll(this.errorHandler(httpServiceTask));
+        }
         // 下一个节点的连线
         Node child = this.getChild();
         SequenceFlow sequenceFlow = this.buildSequence(child);
@@ -134,4 +137,45 @@ public class HttpNode extends Node {
         }
         return elements;
     }
+
+    private List<FlowElement> errorHandler(Activity activity) {
+        ArrayList<FlowElement> elements = Lists.newArrayList();
+        // 错误边界事件
+        BoundaryEvent boundaryEvent = new BoundaryEvent();
+        String boundaryId = String.format("%s_boundary", activity.getId());
+        boundaryEvent.setId(boundaryId);
+        boundaryEvent.setName("错误处理");
+        boundaryEvent.setCancelActivity(false);
+        boundaryEvent.setAttachedToRef(activity);
+        ErrorEventDefinition errorEventDefinition = new ErrorEventDefinition();
+        // errorEventDefinition.setErrorCode("HTTP400");
+        boundaryEvent.setEventDefinitions(Lists.newArrayList(errorEventDefinition));
+        elements.add(boundaryEvent);
+        // 连接线
+        String targetRef = String.format("%s_error", activity.getId());
+        SequenceFlow sequenceFlow = new SequenceFlow();
+        sequenceFlow.setId(String.format("%s-%s", boundaryId, targetRef));
+        sequenceFlow.setSourceRef(boundaryId);
+        sequenceFlow.setTargetRef(targetRef);
+        elements.add(sequenceFlow);
+        // 人工处理
+        UserTask userTask = new UserTask();
+        userTask.setId(targetRef);
+        userTask.setName(String.format("%s(%s)", activity.getName(), "错误处理"));
+        MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics();
+        multiInstanceLoopCharacteristics.setSequential(false);
+        String variable = String.format("%sItem", targetRef);
+        multiInstanceLoopCharacteristics.setElementVariable(variable);
+        multiInstanceLoopCharacteristics.setInputDataItem(String.format("${%sCollection}", activity.getId()));
+        userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics);
+        userTask.setAssignee(String.format("${%s}", variable));
+        elements.add(userTask);
+        // 连接线
+        SequenceFlow sequenceNext = new SequenceFlow();
+        sequenceNext.setId(String.format("%s-%s", targetRef, activity.getId()));
+        sequenceNext.setSourceRef(targetRef);
+        sequenceNext.setTargetRef(activity.getId());
+        elements.add(sequenceNext);
+        return elements;
+    }
 }

+ 3 - 6
flow-workflow/flow-workflow-entity/src/main/java/com/flow/entity/node/TimerStartNode.java

@@ -8,9 +8,7 @@ import org.flowable.bpmn.model.SequenceFlow;
 import org.flowable.bpmn.model.StartEvent;
 import org.flowable.bpmn.model.TimerEventDefinition;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 
 @EqualsAndHashCode(callSuper = true)
 @Data
@@ -21,9 +19,8 @@ public class TimerStartNode extends Node {
         ArrayList<FlowElement> elements = Lists.newArrayList();
         // 开始节点
         StartEvent startEvent = new StartEvent();
-        String startId = "node_start";
-        startEvent.setId(startId);
-        startEvent.setName("开始");
+        startEvent.setId(this.getId());
+        startEvent.setName(this.getName());
         startEvent.setExecutionListeners(this.buidEventListener());
         TimerEventDefinition timerEventDefinition = new TimerEventDefinition();
         startEvent.setEventDefinitions(Lists.newArrayList(timerEventDefinition));