增加利润中心Cmp

This commit is contained in:
chenweilong 2022-12-05 16:10:22 +08:00
parent a409f25604
commit 304f8281e1
7 changed files with 266 additions and 1 deletions

24
pom.xml
View File

@ -23,6 +23,24 @@
<version>${spring-boot.version}</version> <version>${spring-boot.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency> <dependency>
<groupId>mysql</groupId> <groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId> <artifactId>mysql-connector-java</artifactId>
@ -57,5 +75,11 @@
<artifactId>hutool-all</artifactId> <artifactId>hutool-all</artifactId>
<version>${hutool.version}</version> <version>${hutool.version}</version>
</dependency> </dependency>
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>5.2.7</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -32,7 +32,9 @@ public class LiteFlowCommand implements CommandLineRunner {
// 数据库匹配 // 数据库匹配
// LiteflowResponse response = flowExecutor.execute2Resp("costCenter", costCenter, CostCenterContext.class); // LiteflowResponse response = flowExecutor.execute2Resp("costCenter", costCenter, CostCenterContext.class);
// xml匹配 // 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(); CostCenterContext costCenterContext = response.getFirstContextBean();
String code = costCenterContext.getCode(); String code = costCenterContext.getCode();

View File

@ -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<String> sectionClassificationList = Lists.newArrayList("汇差", "手续费", "成本科目");
private static final List<String> businessTypeList = Lists.newArrayList("货代", "报关", "船代", "散杂货");
private static final List<String> salesmanList = Lists.newArrayList("仓干配物流部(物流)");
private static final List<String> 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());
}
}

View File

@ -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");
}
}

View File

@ -0,0 +1,6 @@
package com.example.liteflow.mysql.util;
public interface ConditionConstants {
}

View File

@ -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<String, Object> 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<String> 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();
}
}

View File

@ -28,6 +28,10 @@
); );
</chain> </chain>
<chain name="mainChain2">
THEN(costCenterCmp);
</chain>
<nodes> <nodes>
<node id="s3" name="sectionClassification" type="script"> <node id="s3" name="sectionClassification" type="script">
<![CDATA[ <![CDATA[