Преглед на файлове

节点跳转条件表达式

caixiaofeng преди 6 месеца
родител
ревизия
9ff192682c

+ 13 - 0
flow-common/flow-common-flowable-starter/src/main/java/com/flow/flowable/behavior/JumpActivityBehavior.java

@@ -2,16 +2,29 @@ package com.flow.flowable.behavior;
 
 import com.flow.flowable.cmd.JumpActivityCmd;
 import com.flow.flowable.model.JumpServiceTask;
+import org.flowable.common.engine.api.delegate.Expression;
+import org.flowable.common.engine.impl.el.ExpressionManager;
 import org.flowable.engine.ManagementService;
 import org.flowable.engine.delegate.DelegateExecution;
 import org.flowable.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavior;
 import org.flowable.engine.impl.util.CommandContextUtil;
+import org.springframework.util.StringUtils;
 
 public class JumpActivityBehavior extends AbstractBpmnActivityBehavior {
 
     @Override
     public void execute(DelegateExecution execution) {
         JumpServiceTask jumpServiceTask = (JumpServiceTask) execution.getCurrentFlowElement();
+        String skipExpression = jumpServiceTask.getSkipExpression();
+        if (!StringUtils.isEmpty(skipExpression)) {
+            ExpressionManager expressionManager = CommandContextUtil.getProcessEngineConfiguration().getExpressionManager();
+            Expression expression = expressionManager.createExpression(skipExpression);
+            Object result = expression.getValue(execution);
+            if ((result instanceof Boolean && (Boolean) result)) {
+                leave(execution);
+                return;
+            }
+        }
         ManagementService managementService = CommandContextUtil.getProcessEngineConfiguration().getManagementService();
         managementService.executeCommand(new JumpActivityCmd(execution.getProcessInstanceId(), jumpServiceTask.getTargetNode()));
         leave(execution);

+ 7 - 7
flow-workflow/flow-workflow-entity/src/main/java/com/flow/entity/node/ConditionNode.java

@@ -20,9 +20,9 @@ public class ConditionNode extends Node {
     private Boolean def;
     private FilterGroup conditions;
     @JsonIgnore
-    private Map<String, String> operatorMap = new HashMap<>();
+    private static Map<String, String> operatorMap = new HashMap<>();
 
-    {
+    static {
         // 等于
         operatorMap.put("eq", "var:eq(%s, %s)");
         // 不等于
@@ -51,7 +51,7 @@ public class ConditionNode extends Node {
         operatorMap.put("bt", "var > %s && var < %s");
     }
 
-    protected String stringVal(Object val) {
+    protected static String stringVal(Object val) {
         if (val instanceof String) {
             return String.format("'%s'", val);
         } else {
@@ -59,7 +59,7 @@ public class ConditionNode extends Node {
         }
     }
 
-    public String toExpression(FilterGroup filterGroup) {
+    public static String toExpression(FilterGroup filterGroup) {
         List<FilterCondition> conditions = filterGroup.getConditions();
         String expression = conditions.stream().map(condition -> {
             String operator = condition.getOperator();
@@ -67,11 +67,11 @@ public class ConditionNode extends Node {
             if (StringUtils.isNotBlank(operator) && Objects.nonNull(value)) {
                 if (value instanceof Collection) {
                     value = ((Collection<?>) value).stream()
-                            .map(this::stringVal)
+                            .map(ConditionNode::stringVal)
                             .collect(Collectors.joining(","));
                 } else if (value instanceof Object[]) {
                     value = Arrays.stream((Object[]) value)
-                            .map(this::stringVal)
+                            .map(ConditionNode::stringVal)
                             .collect(Collectors.joining(","));
                 } else {
                     value = stringVal(value);
@@ -86,7 +86,7 @@ public class ConditionNode extends Node {
         } else {
             String collect = filterGroup.getGroups()
                     .stream()
-                    .map(this::toExpression)
+                    .map(ConditionNode::toExpression)
                     .collect(Collectors.joining("and".equals(filterGroup.getOperator()) ? " && " : " || "));
             if (StringUtils.isNotBlank(expression)) {
                 return String.format("(%s) %s (%s)", expression, "and".equals(filterGroup.getOperator()) ? " && " : " || ", collect);

+ 8 - 2
flow-workflow/flow-workflow-entity/src/main/java/com/flow/entity/node/HttpNode.java

@@ -3,9 +3,15 @@ package com.flow.entity.node;
 import com.google.common.collect.Lists;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import org.flowable.bpmn.model.*;
+import org.flowable.bpmn.model.FieldExtension;
+import org.flowable.bpmn.model.FlowElement;
+import org.flowable.bpmn.model.HttpServiceTask;
+import org.flowable.bpmn.model.SequenceFlow;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 
 @EqualsAndHashCode(callSuper = true)
 @Data

+ 9 - 0
flow-workflow/flow-workflow-entity/src/main/java/com/flow/entity/node/JumpNode.java

@@ -1,5 +1,7 @@
 package com.flow.entity.node;
 
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.flow.common.mybatis.entity.FilterGroup;
 import com.flow.flowable.model.JumpServiceTask;
 import com.google.common.collect.Lists;
 import lombok.Data;
@@ -16,6 +18,7 @@ import java.util.Objects;
 @Data
 public class JumpNode extends Node {
     private String targetNode;
+    private FilterGroup conditions;
 
     @Override
     public List<FlowElement> convert() {
@@ -33,6 +36,12 @@ public class JumpNode extends Node {
         fieldExtension.setFieldName("targetNode");
         fieldExtension.setStringValue(this.targetNode);
         jumpServiceTask.getFieldExtensions().add(fieldExtension);
+        if (Objects.nonNull(this.conditions)) {
+            String expression = ConditionNode.toExpression(this.conditions);
+            if (StringUtils.isNotBlank(expression)) {
+                jumpServiceTask.setSkipExpression(String.format("${!(%s)}", expression));
+            }
+        }
         elements.add(jumpServiceTask);
         // 下一个节点的连线
         Node child = this.getChild();