Эх сурвалжийг харах

drools配置文件drl代码

小车车 2 долоо хоног өмнө
parent
commit
25e3dd47de

+ 23 - 1
yudao-module-iscs/pom.xml

@@ -16,7 +16,6 @@
        新业务模块iscs
     </description>
 
-
     <dependencies>
         <dependency>
             <groupId>cn.iocoder.boot</groupId>
@@ -66,6 +65,29 @@
             <artifactId>yudao-spring-boot-starter-excel</artifactId>
         </dependency>
 
+        <!-- Drools 核心依赖 -->
+        <dependency>
+            <groupId>org.drools</groupId>
+            <artifactId>drools-core</artifactId>
+            <version>8.44.0.Final</version>
+        </dependency>
+        <dependency>
+            <groupId>org.drools</groupId>
+            <artifactId>drools-compiler</artifactId>
+            <version>8.44.0.Final</version>
+        </dependency>
+        <dependency>
+            <groupId>org.drools</groupId>
+            <artifactId>drools-decisiontables</artifactId>
+            <version>8.44.0.Final</version>
+        </dependency>
+        <dependency>
+            <groupId>org.drools</groupId>
+            <artifactId>drools-mvel</artifactId>
+            <version>8.44.0.Final</version>
+        </dependency>
+
+
     </dependencies>
 
 </project>

+ 31 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/config/DroolsConfig.java

@@ -0,0 +1,31 @@
+package cn.iocoder.yudao.module.iscs.config;
+
+import org.kie.api.KieServices;
+import org.kie.api.builder.*;
+import org.kie.api.runtime.KieContainer;
+import org.kie.internal.io.ResourceFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class DroolsConfig {
+
+    @Bean
+    public KieContainer kieContainer() {
+        KieServices kieServices = KieServices.Factory.get();
+        KieFileSystem kfs = kieServices.newKieFileSystem();
+        // 加载 resources/rules/ 目录下的所有 .drl 文件
+        kfs.write(ResourceFactory.newClassPathResource("rules/sample.drl", getClass().getClassLoader()));
+
+        KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll();
+        Results results = kieBuilder.getResults();
+        if (results.hasMessages()) {
+            results.getMessages().forEach(msg -> System.err.println("&#9888;️ Rules compilation error: " + msg));
+        }
+
+        // &#9989; 正确方式:通过 ReleaseId 创建容器
+        KieModule kieModule = kieBuilder.getKieModule();
+        ReleaseId releaseId = kieModule.getReleaseId(); // 获取模块的唯一标识符
+        return kieServices.newKieContainer(releaseId);   // 根据 ReleaseId 创建容器
+    }
+}

+ 36 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/controller/admin/RulesController.java

@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.iscs.controller.admin;
+
+import cn.iocoder.yudao.module.iscs.dal.dataobject.Person;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.kie.api.runtime.KieContainer;
+import org.kie.api.runtime.KieSession;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@Tag(name = "管理后台 - uize------------")
+@RequestMapping("/rules")
+public class RulesController {
+
+    @Autowired
+    private KieContainer kieContainer;
+
+    @Operation(summary = "规则--------")
+    @PostMapping("/execute")
+    public Person executeRule(@RequestBody Person person) {
+        KieSession session = null; // 声明在外部以便在 finally 块中访问
+        try {
+            session = kieContainer.newKieSession();
+            session.insert(person);      // 插入事实对象到工作内存
+            session.fireAllRules();      // 触发所有匹配的规则
+            return person;               // 返回可能已被修改的对象
+        } catch (Exception e) {
+            throw new RuntimeException("Failed to execute rules", e);
+        } finally {
+            if (session != null) {
+                session.dispose(); // &#9989; 显式释放资源
+            }
+        }
+    }
+}

+ 10 - 0
yudao-module-iscs/src/main/java/cn/iocoder/yudao/module/iscs/dal/dataobject/Person.java

@@ -0,0 +1,10 @@
+package cn.iocoder.yudao.module.iscs.dal.dataobject;
+
+import lombok.Data;
+
+@Data
+public class Person {
+    private String name;
+    private int age;
+    private double salary;
+}

+ 18 - 0
yudao-module-iscs/src/main/resources/rules/sample.drl

@@ -0,0 +1,18 @@
+package rules;
+import cn.iocoder.yudao.module.iscs.dal.dataobject.Person;
+
+dialect "mvel" // 默认就是MVEL表达式语言
+
+rule "checkHighSalary"
+when
+    $p : Person(age > 30 && salary >= 10000)
+then
+    System.out.println("警告:[" + $p.getName() + "]薪资过高!");
+end
+
+rule "checkHighSalary2"
+when
+    $p : Person(age > 20 && salary >= 12000)
+then
+    System.out.println("警告:[" + $p.getName() + "]薪资过高2!");
+end