From 304f8281e1da4374631f6ca6c2f72dc5eca006a5 Mon Sep 17 00:00:00 2001 From: 75349 <753495441@qq.com> Date: Mon, 5 Dec 2022 16:10:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=A9=E6=B6=A6=E4=B8=AD?= =?UTF-8?q?=E5=BF=83Cmp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 24 ++++++ .../liteflow/mysql/LiteFlowCommand.java | 4 +- .../liteflow/mysql/cmp/CostCenterCmp.java | 64 ++++++++++++++ .../mysql/enums/MathOperatorEnum.java | 83 +++++++++++++++++++ .../mysql/util/ConditionConstants.java | 6 ++ .../liteflow/mysql/util/ConditionParser.java | 82 ++++++++++++++++++ src/main/resources/liteflow/flow1.el.xml | 4 + 7 files changed, 266 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/example/liteflow/mysql/cmp/CostCenterCmp.java create mode 100644 src/main/java/com/example/liteflow/mysql/enums/MathOperatorEnum.java create mode 100644 src/main/java/com/example/liteflow/mysql/util/ConditionConstants.java create mode 100644 src/main/java/com/example/liteflow/mysql/util/ConditionParser.java diff --git a/pom.xml b/pom.xml index 6dd5461..12c8bf5 100644 --- a/pom.xml +++ b/pom.xml @@ -23,6 +23,24 @@ ${spring-boot.version} + + org.springframework.boot + spring-boot-starter-test + ${spring-boot.version} + + + + org.apache.commons + commons-lang3 + 3.3.2 + + + + org.projectlombok + lombok + provided + + mysql mysql-connector-java @@ -57,5 +75,11 @@ hutool-all ${hutool.version} + + + com.googlecode.aviator + aviator + 5.2.7 + \ No newline at end of file diff --git a/src/main/java/com/example/liteflow/mysql/LiteFlowCommand.java b/src/main/java/com/example/liteflow/mysql/LiteFlowCommand.java index a73c87a..51fcd04 100644 --- a/src/main/java/com/example/liteflow/mysql/LiteFlowCommand.java +++ b/src/main/java/com/example/liteflow/mysql/LiteFlowCommand.java @@ -32,7 +32,9 @@ public class LiteFlowCommand implements CommandLineRunner { // 数据库匹配 // LiteflowResponse response = flowExecutor.execute2Resp("costCenter", costCenter, CostCenterContext.class); // xml匹配 - LiteflowResponse response = flowExecutor.execute2Resp("mainChain", costCenter, CostCenterContext.class); +// LiteflowResponse response = flowExecutor.execute2Resp("mainChain", costCenter, CostCenterContext.class); + LiteflowResponse response = flowExecutor.execute2Resp("mainChain2", costCenter, CostCenterContext.class); + CostCenterContext costCenterContext = response.getFirstContextBean(); String code = costCenterContext.getCode(); diff --git a/src/main/java/com/example/liteflow/mysql/cmp/CostCenterCmp.java b/src/main/java/com/example/liteflow/mysql/cmp/CostCenterCmp.java new file mode 100644 index 0000000..28a84bf --- /dev/null +++ b/src/main/java/com/example/liteflow/mysql/cmp/CostCenterCmp.java @@ -0,0 +1,64 @@ +package com.example.liteflow.mysql.cmp; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Console; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONUtil; +import com.example.liteflow.mysql.model.CostCenter; +import com.example.liteflow.mysql.util.ConditionParser; +import com.googlecode.aviator.AviatorEvaluator; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeIfComponent; +import lombok.extern.slf4j.Slf4j; +import org.assertj.core.util.Lists; +import java.util.List; + +/** + * @author: 陈韦龙 + * @date: 2022年12月05日 10:15 + */ +@LiteflowComponent("costCenterCmp") +@Slf4j +public class CostCenterCmp extends NodeIfComponent { + + private static final String droolStr = "[{\"$or\": [{\"$and\": [{\"contains\": [sectionClassification, sectionClassificationList]}, {\"contains\": [businessType, businessTypeList]}, {\"contains\": [salesman, salesmanList]}, {\"contains\": [businessCategory, businessCategoryList]}]}]}, {\"$or\": [{\"$or\": [{\"$and\": [{\"contains\": [sectionClassification, sectionClassificationList]}, {\"contains\": [salesman, salesmanList]}]}]}, {\"$or\": [{\"contains\": [businessType, businessTypeList]}]}]}]"; + + private static final List sectionClassificationList = Lists.newArrayList("汇差", "手续费", "成本科目"); + private static final List businessTypeList = Lists.newArrayList("货代", "报关", "船代", "散杂货"); + private static final List salesmanList = Lists.newArrayList("仓干配物流部(物流)"); + private static final List businessCategoryList = Lists.newArrayList("全货船业务", "进出岛仓干配"); + @Override + public boolean processIf() throws Exception { + CostCenter requestData = this.getRequestData(); + String sectionClassification = requestData.getSectionClassification(); + String businessType = requestData.getBusinessType(); + String salesman = requestData.getSalesman(); + String businessCategory = requestData.getBusinessCategory(); + String replace = StrUtil.replace(droolStr, "sectionClassificationList", sectionClassificationList.toString(), false); + + String replace2 = StrUtil.replace(replace, "businessTypeList", businessTypeList.toString(), false); + + String replace3 = StrUtil.replace(replace2, "salesmanList", salesmanList.toString(), false); + String replace4 = StrUtil.replace(replace3, "businessCategoryList", businessCategoryList.toString(), false); + log.info("replace4 = {}", replace4); + + String replace5 = StrUtil.replace(replace4, "sectionClassification", "\"" + sectionClassification + "\"", false); + String replace6 = StrUtil.replace(replace5, "businessType", "\"" + businessType + "\"", false); + String replace7 = StrUtil.replace(replace6, "salesman", "\"" + salesman + "\"", false); + String replace8 = StrUtil.replace(replace7, "businessCategory", "\"" + businessCategory + "\"", false); + + log.info("replace8 = {}", replace8); + JSONArray jsonArray = JSONUtil.parseArray(replace8); + log.info("jsonArray = {}", jsonArray); + + String conditionResult = ConditionParser.parseCondition(jsonArray); + + Console.log("condition template = {}", conditionResult); + AviatorEvaluator.addStaticFunctions("CollUtil", CollUtil.class); + AviatorEvaluator.addStaticFunctions("StrUtil", StrUtil.class); + Object executeB = AviatorEvaluator.execute(conditionResult); + Console.log("{} = {}", conditionResult, executeB); + return Boolean.getBoolean(executeB.toString()); + } +} diff --git a/src/main/java/com/example/liteflow/mysql/enums/MathOperatorEnum.java b/src/main/java/com/example/liteflow/mysql/enums/MathOperatorEnum.java new file mode 100644 index 0000000..133152b --- /dev/null +++ b/src/main/java/com/example/liteflow/mysql/enums/MathOperatorEnum.java @@ -0,0 +1,83 @@ +package com.example.liteflow.mysql.enums; + + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.ToString; + +/** + * 数学-运算符枚举 + */ +@Getter +@AllArgsConstructor +@ToString +public enum MathOperatorEnum { + // 条件运算符 + eq("$eq", "==", "Arithmetic", "等于"), + eq2("==", "==", "Arithmetic", "等于"), + eqs("$eqs", "===", "Arithmetic", "相等(严格)"), + eqs2("===", "===", "Arithmetic", "相等(严格)"), + ne("$ne", "!=", "Arithmetic", "不等于"), + ne2("!=", "!=", "Arithmetic", "不等于"), + nes("$nes", "!=", "Arithmetic", "不等于"), + nes2("!==", "!==", "Arithmetic", "不等于(严格)"), + lt("$lt", "<", "Arithmetic", "小于"), + lt2("<", "<", "Arithmetic", "小于"), + lte("$lte", "<=", "Arithmetic", "小于等于"), + lte2("<=", "<=", "Arithmetic", "小于等于"), + gt("$gt", ">", "Arithmetic", "大于"), + gt2(">", ">", "Arithmetic", "大于"), + gte("$gte", ">=", "Arithmetic", "大于等于"), + gte2(">=", ">=", "Arithmetic", "大于等于"), + + // 逻辑运算符 + and("$and", "&&", "Logical", "且"), + or("$or", "||", "Logical", "或"), + not("$not", "!", "Logical", "非"), + $match("$match", "match", "Logical", "匹配"), + + // 特殊运算符 + contains("contains", "CollUtil.contains(StrUtil.split(\"{}\", \",\"), '{}')", "Special", "包含"), + + ; + + private final String operator; + + private final String actual; + + private final String type; + + private final String desc; + + public static MathOperatorEnum fromOperator(String operator) { + for (MathOperatorEnum operatorEnum : MathOperatorEnum.values()) { + if (ObjectUtil.equals(operatorEnum.getOperator(), operator)) { + return operatorEnum; + } + } + throw new IllegalArgumentException("数据运算符不匹配"); + } + + public static boolean isLogical(String operator) { + boolean isLogical = false; + for (MathOperatorEnum operatorEnum : MathOperatorEnum.values()) { + if (ObjectUtil.equals(operatorEnum.getOperator(), operator)) { + if(StrUtil.equals(operatorEnum.getType(), "Logical")) { + isLogical = true; + break; + } + } + } + return isLogical; + } + + public boolean isLogical() { + return StrUtil.equals(this.getType(), "Logical"); + } + + public boolean isSpecial() { + return StrUtil.equals(this.getType(), "Special"); + } +} diff --git a/src/main/java/com/example/liteflow/mysql/util/ConditionConstants.java b/src/main/java/com/example/liteflow/mysql/util/ConditionConstants.java new file mode 100644 index 0000000..1b21b6e --- /dev/null +++ b/src/main/java/com/example/liteflow/mysql/util/ConditionConstants.java @@ -0,0 +1,6 @@ +package com.example.liteflow.mysql.util; + +public interface ConditionConstants { + + +} diff --git a/src/main/java/com/example/liteflow/mysql/util/ConditionParser.java b/src/main/java/com/example/liteflow/mysql/util/ConditionParser.java new file mode 100644 index 0000000..92b2327 --- /dev/null +++ b/src/main/java/com/example/liteflow/mysql/util/ConditionParser.java @@ -0,0 +1,82 @@ +package com.example.liteflow.mysql.util; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Console; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.example.liteflow.mysql.enums.MathOperatorEnum; + +import java.util.Map; +import java.util.Set; +import java.util.StringJoiner; + +/** + * 条件格式化 + */ +public class ConditionParser { + + public static String parseCondition(JSONArray jsonArray) { + StringBuilder stringBuffer = new StringBuilder(); + for (int i = 0; i < jsonArray.size(); i++) { + Console.log("object = ", JSONUtil.toJsonStr(jsonArray.get(i))); + JSONObject o = jsonArray.getJSONObject(i); + + for (Map.Entry kv : o.entrySet()) { + String key = kv.getKey(); + JSONArray values = (JSONArray) kv.getValue(); + + boolean notEmpty = CollUtil.isNotEmpty(values); + + if (notEmpty) { + MathOperatorEnum operatorEnum = MathOperatorEnum.fromOperator(key); + if (i != 0) { +// Console.log("math Operator = {}", operatorEnum.toString()); + stringBuffer.append(" ").append(operatorEnum.getActual()).append(" "); + } + + stringBuffer.append(parseArithmetic(operatorEnum, values)); + } + } + } + return stringBuffer.toString(); + } + + private static String parseArithmetic(MathOperatorEnum parentOperatorEnum, JSONArray jsonArray) { + StringJoiner stringJoiner = new StringJoiner(" "); + int i = 0; + for (Object value : jsonArray) { + JSONObject vJson = (JSONObject) value; + + Set keySet = vJson.keySet(); + for (String skey : keySet) { + JSONArray sValues = vJson.getJSONArray(skey); + MathOperatorEnum operatorEnum = MathOperatorEnum.fromOperator(skey); +// Console.log("math Operator = {}, isLogical = {}", operatorEnum.toString(), operatorEnum.isLogical()); + if (i != 0) { + stringJoiner.add(parentOperatorEnum.getActual()); + } + + + if (operatorEnum.isLogical()) { + stringJoiner.add("(").add(parseCondition(jsonArray)).add(") "); + } else if (operatorEnum.isSpecial()) { + String leftValue = sValues.getStr(0); + String rightValue = sValues.getStr(1); + JSONArray objects = JSONUtil.parseArray(rightValue); + String join = CollUtil.join(objects, ","); + String format = StrUtil.format(MathOperatorEnum.contains.getActual(), join, leftValue); + stringJoiner.add("(").add(format).add(") "); + } else { + String leftValue = sValues.getStr(0); + String rightValue = sValues.getStr(1); + stringJoiner.add("(").add(leftValue).add(operatorEnum.getActual()).add(rightValue).add(") "); + } + } + i++; + } + return stringJoiner.toString(); + } + +} diff --git a/src/main/resources/liteflow/flow1.el.xml b/src/main/resources/liteflow/flow1.el.xml index 8e9e444..5fb705e 100644 --- a/src/main/resources/liteflow/flow1.el.xml +++ b/src/main/resources/liteflow/flow1.el.xml @@ -28,6 +28,10 @@ ); + + THEN(costCenterCmp); + +