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);
+
+