浏览代码

自定义条件表达式

caixiaofeng 6 月之前
父节点
当前提交
ec615019e8

+ 5 - 0
flow-common/flow-common-flowable-starter/src/main/java/com/flow/flowable/configure/FlowableConfigure.java

@@ -4,11 +4,13 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.flow.flowable.converter.CopyServiceTaskXMLConverter;
 import com.flow.flowable.converter.CustomServiceTaskXMLConverter;
 import com.flow.flowable.converter.JumpServiceTaskXMLConverter;
+import com.flow.flowable.expression.VariableContainsAllExpressionFunction;
 import com.flow.flowable.parser.factory.CustomDefaultActivityBehaviorFactory;
 import com.flow.flowable.parser.handler.CopyServiceTaskParseHandler;
 import com.flow.flowable.parser.handler.JumpServiceTaskParseHandler;
 import com.flow.flowable.validator.CustomServiceTaskValidator;
 import org.flowable.bpmn.converter.BpmnXMLConverter;
+import org.flowable.common.engine.api.delegate.FlowableFunctionDelegate;
 import org.flowable.common.engine.impl.cfg.IdGenerator;
 import org.flowable.common.engine.impl.persistence.deploy.DeploymentCache;
 import org.flowable.engine.impl.persistence.deploy.ProcessDefinitionCacheEntry;
@@ -45,6 +47,9 @@ public class FlowableConfigure implements EngineConfigurationConfigurer<SpringPr
         engineConfiguration.setPostBpmnParseHandlers(bpmnParseHandlers);
         engineConfiguration.setCustomServiceTaskValidator(new CustomServiceTaskValidator());
         engineConfiguration.setActivityBehaviorFactory(new CustomDefaultActivityBehaviorFactory());
+        List<FlowableFunctionDelegate> customFlowableFunctionDelegates = new ArrayList<>();
+        customFlowableFunctionDelegates.add(new VariableContainsAllExpressionFunction());
+        engineConfiguration.setCustomFlowableFunctionDelegates(customFlowableFunctionDelegates);
         BpmnXMLConverter.addConverter(new JumpServiceTaskXMLConverter());
         BpmnXMLConverter.addConverter(new CopyServiceTaskXMLConverter());
         BpmnXMLConverter.addConverter(new CustomServiceTaskXMLConverter());

+ 33 - 0
flow-common/flow-common-flowable-starter/src/main/java/com/flow/flowable/expression/VariableContainsAllExpressionFunction.java

@@ -0,0 +1,33 @@
+package com.flow.flowable.expression;
+
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import org.flowable.common.engine.api.variable.VariableContainer;
+import org.flowable.common.engine.impl.el.function.AbstractFlowableVariableExpressionFunction;
+import org.flowable.common.engine.impl.el.function.VariableContainsExpressionFunction;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+public class VariableContainsAllExpressionFunction extends AbstractFlowableVariableExpressionFunction {
+
+    public VariableContainsAllExpressionFunction() {
+        super("containsAll");
+    }
+
+    public static boolean containsAll(VariableContainer variableContainer, String variableName, Object... values) {
+        Object variableValue = getVariableValue(variableContainer, variableName);
+        if (variableValue != null) {
+            if (variableValue instanceof String) {
+                return Arrays.stream(values).allMatch(value -> VariableContainsExpressionFunction.contains(variableContainer, variableValue.toString(), value));
+            } else if (variableValue instanceof Collection) {
+                Collection collectionVariableValue = (Collection) variableValue;
+                return Arrays.stream(values).allMatch(value -> VariableContainsExpressionFunction.collectionContains(collectionVariableValue, value));
+            } else if (variableValue instanceof ArrayNode) {
+                ArrayNode arrayNodeVariableValue = (ArrayNode) variableValue;
+                return Arrays.stream(values).allMatch(value -> VariableContainsExpressionFunction.arrayNodeContains(arrayNodeVariableValue, value));
+            }
+        }
+        return false;
+    }
+
+}

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

@@ -30,7 +30,7 @@ public class ConditionNode extends Node {
         // 包含
         operatorMap.put("in", "var:containsAny(%s, %s)");
         // 不包含
-        operatorMap.put("ni", "var:notContainsAny(%s, %s)");
+        operatorMap.put("ni", "!var:containsAny(%s, %s)");
         // 为空
         operatorMap.put("ul", "var:isNull(%s)");
         // 不为空
@@ -49,6 +49,10 @@ public class ConditionNode extends Node {
         operatorMap.put("ge", "var:gte(%s, %s)");
         // 介于
         operatorMap.put("bt", "var > %s && var < %s");
+        // 包含全部
+        operatorMap.put("ia", "var:containsAll(%s, %s)");
+        // 不包含全部
+        operatorMap.put("na", "!var:containsAll(%s, %s)");
     }
 
     protected static String stringVal(Object val) {
@@ -69,15 +73,25 @@ public class ConditionNode extends Node {
                     value = ((Collection<?>) value).stream()
                             .map(ConditionNode::stringVal)
                             .collect(Collectors.joining(","));
+                    if ("in".equals(operator)) {
+                        operator = "ia";
+                    } else if ("ni".equals(operator)) {
+                        operator = "na";
+                    }
                 } else if (value instanceof Object[]) {
                     value = Arrays.stream((Object[]) value)
                             .map(ConditionNode::stringVal)
                             .collect(Collectors.joining(","));
+                    if ("in".equals(operator)) {
+                        operator = "ia";
+                    } else if ("ni".equals(operator)) {
+                        operator = "na";
+                    }
                 } else {
                     value = stringVal(value);
                 }
                 String field = condition.getField();
-                return String.format(operatorMap.get(condition.getOperator()), field, value);
+                return String.format(operatorMap.get(operator), field, value);
             }
             return "";
         }).collect(Collectors.joining("and".equals(filterGroup.getOperator()) ? " && " : " ||"));