规则样例

This commit is contained in:
sanmao 2022-06-30 14:50:49 +08:00
commit 654d08e951
8 changed files with 355 additions and 0 deletions

38
.gitignore vendored Normal file
View File

@ -0,0 +1,38 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

137
pom.xml Normal file
View File

@ -0,0 +1,137 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.we-zone.drools</groupId>
<artifactId>drools-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<springboot.version>2.7.1</springboot.version>
<drools.version>7.10.0.Final</drools.version>
<hutool.version>5.8.4</hutool.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<type>pom</type>
<version>${springboot.version}</version>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</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>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>5.2.7</version>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-spring</artifactId>
<version>${drools.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--drools规则引擎-->
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-templates</artifactId>
<version>${drools.version}</version>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,14 @@
package com.wezone.drools;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DroolsDemoApplication {
public static void main(String[] args) {
SpringApplication.run(DroolsDemoApplication.class, args);
}
}

View File

@ -0,0 +1,72 @@
package com.wezone.drools.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", "==", "Conditional", "等于"),
eq2("==", "==", "Conditional", "等于"),
eqs("$eqs", "===", "Conditional", "相等(严格)"),
eqs2("===", "===", "Conditional", "相等(严格)"),
ne("$ne", "!=", "Conditional", "不等于"),
ne2("!=", "!=", "Conditional", "不等于"),
nes("$nes", "!=", "Conditional", "不等于"),
nes2("!==", "!==", "Conditional", "不等于(严格)"),
lt("$lt", "<", "Conditional", "小于"),
lt2("<", "<", "Conditional", "小于"),
lte("$lte", "<=", "Conditional", "小于等于"),
lte2("<=", "<=", "Conditional", "小于等于"),
gt("$gt", ">", "Conditional", "大于"),
gt2(">", ">", "Conditional", "大于"),
gte("$gte", ">=", "Conditional", "大于等于"),
gte2(">=", ">=", "Conditional", "大于等于"),
// 逻辑运算符
and("$and", "&&", "Logical", "且"),
or("$or", "||", "Logical", "或"),
not("$not", "!", "Logical", "非"),
$match("$match", "match", "Logical", "匹配"),
;
private String operator;
private String actual;
private String type;
private 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;
}
}

View File

@ -0,0 +1,6 @@
package com.wezone.drools.utils;
public interface ConditionConstants {
}

View File

@ -0,0 +1,11 @@
package com.wezone.drools.utils;
/**
* 条件格式化
*/
public class ConditionParser {
}

View File

@ -0,0 +1,5 @@
server:
port: 8080
spring:
application:
name: drools-springboot

View File

@ -0,0 +1,72 @@
package com.wezone.drools.test;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.googlecode.aviator.AviatorEvaluator;
import com.wezone.drools.enums.MathOperatorEnum;
import org.junit.jupiter.api.Test;
import java.util.Set;
import java.util.StringJoiner;
public class ConditionTest {
@Test
public void test1() {
String condition = "[{\"$or\":[{\"$eq\":[\"1\",\"2\"]}]},{\"$or\":[{\"$eq\":[\"2\",\"2\"]}]}]";
JSONArray jsonArray = JSONUtil.parseArray(condition);
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < jsonArray.size(); i++) {
StringJoiner stringJoiner = new StringJoiner(" ");
JSONObject o = jsonArray.getJSONObject(i);
int finalI = i;
o.forEach(kv -> {
String key = kv.getKey();
JSONArray values = (JSONArray) kv.getValue();
boolean notEmpty = CollUtil.isNotEmpty(values);
if (notEmpty) {
if (finalI != 0) {
MathOperatorEnum operatorEnum = MathOperatorEnum.fromOperator(key);
Console.log("math Operator = {}", operatorEnum.toString());
stringJoiner.add(operatorEnum.getActual());
}
stringJoiner.add("(");
int ki = 0;
for (Object value : values) {
JSONObject vJson = (JSONObject) value;
Set<String> keySet = vJson.keySet();
for (String skey : keySet) {
// if(ki != 0) {
MathOperatorEnum operatorEnum = MathOperatorEnum.fromOperator(skey);
Console.log("math Operator = {}", operatorEnum.toString());
// }
JSONArray sValues = vJson.getJSONArray(skey);
String leftValue = sValues.getStr(0);
String rightValue = sValues.getStr(1);
stringJoiner.add(leftValue).add(operatorEnum.getActual()).add(rightValue);
}
ki++;
}
stringJoiner.add(") ");
}
stringBuffer.append(stringJoiner.toString());
});
}
Console.log("condition template = {}", stringBuffer.toString());
Object executeB = AviatorEvaluator.execute(stringBuffer.toString());
Console.log("{} = {}", stringBuffer.toString(), executeB);
}
}