增加利润中心Cmp
This commit is contained in:
parent
a409f25604
commit
304f8281e1
24
pom.xml
24
pom.xml
|
@ -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>
|
|
@ -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();
|
||||||
|
|
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
|
@ -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");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
package com.example.liteflow.mysql.util;
|
||||||
|
|
||||||
|
public interface ConditionConstants {
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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[
|
||||||
|
|
Loading…
Reference in New Issue