drools整合springboot整合drools测试例子--个税计算器规则(代码片段)

a393060727 a393060727     2022-12-26     195

关键词:

规则引擎,主要作用,就是将规则与java代码分离,可通过修改规则实时生效。让非java程序员,只要熟悉业务,也可以写规则。

规则引擎主要用在一些,打折、风控前置、后置、结算等模块地方。

新建一个droolsdemo的maven工程。

pom.xml

<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">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starters</artifactId>
        <version>2.2.0.RELEASE</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.drools</groupId>
    <artifactId>DroolsDemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
        <!--drools规则引擎-->
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-core</artifactId>
            <version>7.6.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-compiler</artifactId>
            <version>7.6.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-templates</artifactId>
            <version>7.6.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-api</artifactId>
            <version>7.6.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-spring</artifactId>
            <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>
            <version>7.6.0.Final</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>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
View Code

 

配置文件DroolsConfig.java

package com.drools.config;

import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieRepository;
import org.kie.api.runtime.KieContainer;
import org.kie.internal.io.ResourceFactory;
import org.kie.spring.KModuleBeanFactoryPostProcessor;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.core.io.Resource;
import java.io.IOException;
/**
 * 规则引擎配置类
 */
@Configuration
public class DroolsConfig 
    //指定规则文件存放的目录
    private static final String RULES_PATH = "rules/";
    private final KieServices kieServices = KieServices.Factory.get();
    @Bean
    @ConditionalOnMissingBean
    public KieFileSystem kieFileSystem() throws IOException 
        System.setProperty("drools.dateformat","yyyy-MM-dd");
        KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
        ResourcePatternResolver resourcePatternResolver = 
            new PathMatchingResourcePatternResolver();
        Resource[] files = 
            resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "*.*");
        String path = null;
        for (Resource file : files) 
            path = RULES_PATH + file.getFilename();
            kieFileSystem.write(ResourceFactory.newClassPathResource(path, "UTF-8"));
        
        return kieFileSystem;
    
    @Bean
    @ConditionalOnMissingBean
    public KieContainer kieContainer() throws IOException 
        KieRepository kieRepository = kieServices.getRepository();
        kieRepository.addKieModule(kieRepository::getDefaultReleaseId);
        KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem());
        kieBuilder.buildAll();
        return kieServices.newKieContainer(kieRepository.getDefaultReleaseId());
    
    
    @Bean
    @ConditionalOnMissingBean
    public KieBase kieBase() throws IOException 
        return kieContainer().getKieBase();
    
    
    @Bean
    @ConditionalOnMissingBean
    public KModuleBeanFactoryPostProcessor kiePostProcessor() 
        return new KModuleBeanFactoryPostProcessor();
    
View Code

 

入口控制类 RuleController.java

package com.drools.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.drools.entity.Calculation;
import com.drools.service.RuleService;

@RestController
public class RuleController 
    @Autowired
    private RuleService ruleService;
    
    @RequestMapping("/calculate")
    public Calculation calculate(HttpServletRequest request)
        String wage = request.getParameter("wage");
        Calculation calculation = new Calculation();
        calculation.setWage(Double.parseDouble(wage));
        calculation = ruleService.calculate(calculation);
        System.out.println(calculation);
        return calculation;
    
View Code

 

入参实体类 Calculation

package com.drools.entity;

public class Calculation 
    private double wage;//税前工资
    private double wagemore;//应纳税所得额
    private double cess;//税率
    private double preminus;//速算扣除数
    private double wageminus;//扣税额
    private double actualwage;//税后工资
    
    @Override
    public String toString() 
        return "Calculation" +
                "wage=" + wage +
                ", actualwage=" + actualwage +
                ", wagemore=" + wagemore +
                ", cess=" + cess +
                ", preminus=" + preminus +
                ", wageminus=" + wageminus +
                \'\';
    

    public double getWage() 
        return wage;
    

    public void setWage(double wage) 
        this.wage = wage;
    

    public double getWagemore() 
        return wagemore;
    

    public void setWagemore(double wagemore) 
        this.wagemore = wagemore;
    

    public double getCess() 
        return cess;
    

    public void setCess(double cess) 
        this.cess = cess;
    

    public double getPreminus() 
        return preminus;
    

    public void setPreminus(double preminus) 
        this.preminus = preminus;
    

    public double getWageminus() 
        return wageminus;
    

    public void setWageminus(double wageminus) 
        this.wageminus = wageminus;
    

    public double getActualwage() 
        return actualwage;
    

    public void setActualwage(double actualwage) 
        this.actualwage = actualwage;
    
View Code

 

处理服务类RuleService

package com.drools.service;

import org.kie.api.KieBase;
import org.kie.api.runtime.KieSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.drools.entity.Calculation;

@Service
public class RuleService 
    @Autowired
    private KieBase kieBase;
    
    public void rule()
        KieSession kieSession = kieBase.newKieSession();
        kieSession.fireAllRules();
        kieSession.dispose();
    
    
    /**
     * @desc 个人所得税计算
     * @date 2020年6月18日 下午4:42:34
     * @param calculation
     * @return
     */
    public Calculation calculate(Calculation calculation)
        KieSession kieSession = kieBase.newKieSession();
        kieSession.insert(calculation);
        kieSession.fireAllRules();
        kieSession.dispose();
        return calculation;
    
View Code

 

程序启动入口类DsApp

package com.drools;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DsApp 
    public static void main(String[] args) 
        SpringApplication.run(DsApp.class,args);
    
View Code

 

drools 规则文件  calculation.drl

package calculation
import com.drools.entity.Calculation

/**
    当前规则文件中的规则主要分为三类
    1、计算应纳税所得额有1个规则
    2、设置税率、速算扣除数有7个规则
    3、计算税后工资有1个规则
**/

//计算应纳税所得额
rule "计算应纳税所得额"
    salience 100
    date-effective "2011-09-01"
    no-loop true
    when
        $cal:Calculation(wage > 0)
    then
        double wagemore = $cal.getWage() - 3500;
        $cal.setWagemore(wagemore);
        update($cal);
end

//设置税率、速算扣除数
rule "设置税率,应纳税所得额<=1500"
    salience 90
    no-loop true
    activation-group "SETCess_Group"
    when
        $cal:Calculation(wagemore <= 1500)
    then
        $cal.setCess(0.03);//税率
        $cal.setPreminus(0);//速算扣除数
        update($cal);
end

rule "设置税率,应纳税所得额在1500至4500之间"
    salience 90
    no-loop true
    activation-group "SETCess_Group"
    when
        $cal:Calculation(wagemore <= 4500 && wagemore > 1500)
    then
        $cal.setCess(0.1);//税率
        $cal.setPreminus(105);//速算扣除数
        update($cal);
end


rule "个人所得税:设置税率-->>应纳税所得额在4500志9000之间"
    salience 90
    no-loop true
    activation-group "SETCess_Group"
    when
        $cal : Calculation(wagemore > 4500 && wagemore <= 9000)
    then
        $cal.setCess(0.2);
        $cal.setPreminus(555);
        update($cal);
end

rule "个人所得税:设置税率-->>应纳税所得额在9000志35000之间"
    salience 90
    no-loop true
    activation-group "SETCess_Group"
    when
        $cal : Calculation(wagemore > 9000 && wagemore <= 35000)
    then
        $cal.setCess(0.25);
        $cal.setPreminus(1005);
        update($cal);
end

rule "个人所得税:设置税率-->>应纳税所得额在35000至55000之间"
    salience 90
    no-loop true
    activation-group "SETCess_Group"
    when
        $cal : Calculation(wagemore > 35000 && wagemore <= 55000)
    then
        $cal.setCess(0.3);
        $cal.setPreminus(2755);
        update($cal);
end

rule "个人所得税:设置税率-->>应纳税所得额在55000至80000之间"
    salience 90
    no-loop true
    activation-group "SETCess_Group"
    when
        $cal : Calculation(wagemore > 55000 && wagemore <= 80000)
    then
        $cal.setCess(0.35);
        $cal.setPreminus(5505);
        update($cal);
end

rule "个人所得税:设置税率-->>应纳税所得额在80000以上"
    salience 90
    no-loop true
    activation-group "SETCess_Group"
    when
        $cal : Calculation(wagemore > 80000)
    then
        $cal.setCess(0.45);
        $cal.setPreminus(13505);
        update($cal);
end

rule "个人所得税:计算税后工资"
    salience 80
    when
        $cal : Calculation(wage > 0 && wagemore > 0 && cess > 0)
    then
        //扣税额
        double wageminus = $cal.getWagemore() * $cal.getCess() - $cal.getPreminus();
        double actualwage = $cal.getWage() - wageminus;
        $cal.setWageminus(wageminus);
        $cal.setActualwage(actualwage);
        System.out.println("-----税前工资:"+$cal.getWage());
        System.out.println("-----应纳税所得额:"+$cal.getWagemore());
        System.out.println("-----税率:" + $cal.getCess());
        System.out.println("-----速算扣除数:" + $cal.getPreminus());
        System.out.println("-----扣税额:" + $cal.getWageminus());
        System.out.println("-----税后工资:" + $cal.getActualwage());
end
View Code

 

总的目录结果如下:

 

 

启动运行。通过postmain访问。

加入参数wage

http://localhost:8080/calculate

 

 后台打印:

 

 

 

测试成功。

 

 

rule "计算应纳税所得额"
salience ----100 优先级
date-effective "2011-09-01" ----规则生效时间
no-loop true ----放死循环
when
----一定的规则条件
then
----这块纯粹的java代码。。。
end

drools整合springboot整合drools测试例子--个税计算器规则(代码片段)

规则引擎,主要作用,就是将规则与java代码分离,可通过修改规则实时生效。让非java程序员,只要熟悉业务,也可以写规则。规则引擎主要用在一些,打折、风控前置、后置、结算等模块地方。新建一个droolsdemo的maven工程。pom.... 查看详情

springboot2整合drools规则引擎,实现高效的业务规则

本文源码:GitHub·点这里||GitEE·点这里一、Drools引擎简介1、基础简介Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启... 查看详情

java规则引擎drools急速入门

...1.Drools规则引擎简介​​​​2.DroolsAPI开发步骤​​​​3.SpringBoot整合Drools案例​​​​4.Drools基础语法​​​​5.Drools条件语法部分​​​​6.Drools结果操作部分​​​​7.Drools内置属性部分​​​​8.Drools高级语法部分​​1.Drool... 查看详情

35activiti整合规则引擎drools(代码片段)

喜欢关注公众号:java乐园日常生活是由规则驱动的。红灯停绿灯行,这是我们的交通规则;我们站着往上跳,最终还是要落下来,这是地球的引力规则。规则在生活中无处不在。软件开发中我们也需要规则,满足什么规则应该... 查看详情

疯狂讲义activiti6.x工作流进阶与项目实战,activiti整合drools

01Activiti介绍与搭建开发环境 02运行官方例子03编写第一个Activiti程序 04流程引擎配置与服务组件05Activiti数据库介绍06API(1)Activiti数据查询07API(2)流程文件部署08API(3)流程定义09API(4)任务操作10API(5)任务参数与附... 查看详情

drools集成springboot

...考技术A为了更好的在项目中使用Drools,需要把Drools集成到SpringBoot,下面介绍集成的方法,并且开发简单的Demo和测试用例。pom.xml工程信息:引入spring-boot-starter-web作为Web工程,对外提供Rest服务,引入spring-boot-starter-log4j2日志框架,... 查看详情

springboot+drools使用数据库(代码片段)

说明此配置方式为打成jar包,不直接连接数据库,请根据不同项目区别自行修改,POM依赖<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schema 查看详情

drools只执行一个规则或者执行完当前规则之后不再执行其他规则(转)(代码片段)

...提高系统的可维护性和维护成本    3、方便系统的整合    4 查看详情

无法在 Spring Boot 中实现 Drools KieSession Persistence

】无法在SpringBoot中实现DroolsKieSessionPersistence【英文标题】:CannotimplementDroolsKieSessionPersistenceinSpringBoot【发布时间】:2021-01-2102:17:00【问题描述】:我试图在SpringBootMaven项目中使用KieSession的持久性功能实现Drools。关注thisdocumentatio... 查看详情

drools规则引擎一文读懂(代码片段)

目录一、Drools简介电商平台的促销活动规则引擎Drools简介二、Drools快速入门 电商平台促销积分规则开发实现三、Drools规则引擎构成及其核心类Drools规则引擎构成Drools规则引擎概念四、Drools基础语法规则文件构成 规则体语法结... 查看详情

Drool 无法正确排序数字

】Drool无法正确排序数字【英文标题】:Drooldoesnotsortnumberscorrectly【发布时间】:2012-12-3114:43:09【问题描述】:我是Drools的新手,正在尝试让示例程序正常工作。这个示例在drools文档http://docs.jboss.org/drools/release/5.5.0.Final/drools-expert... 查看详情

drools应用实例

Drools 实例介绍Drools编译与运行:在Drools当中,规则的编译与运行要通过Drools提供的各种API来实现,这些API总体来讲可以分为三类:规则编译、规则收集和规则的执行。Kmodule.xml的编写kmodule.xml文件放到  src/main/resources/M... 查看详情

drools规则引擎环境搭建(代码片段)

一、关于drools规则引擎前面写过一篇Drools规则引擎相关的文章,这篇文章主要记录一下规则引擎的环境搭建和简单示例。不熟悉drools的朋友可以看看这篇文章:自己写个Drools文件语法检查工具——栈的应用之编译器检测语法错误... 查看详情

在 Drools 6 中以编程方式创建新的 drools 规则的新接受方式是啥?

】在Drools6中以编程方式创建新的drools规则的新接受方式是啥?【英文标题】:WhatisthenewacceptedwayofprogrammaticallycreatingnewdroolsrulesinDrools6?在Drools6中以编程方式创建新的drools规则的新接受方式是什么?【发布时间】:2015-02-1815:33:26【... 查看详情

java使用规则引擎drools出现异常

...lang.RuntimeException:Classnotconvertibletoprimitive:java.lang.Objectatorg.drools.core.util.ClassUtils.convertToPrimitiveType(ClassUtils.java:378)atorg.drools.rule.constraint.ConditionAnalyzer$AritmeticExpression.inferType(ConditionAnalyzer.java:723)atorg.drools.rule.constraint.ConditionAnalyzer$Ari... 查看详情

[springboot系列]springboot如何整合ssmp

文章目录基于SpringBoot实现SSMP整合基于SpringBoot实现SSMP整合SpringBoot之所以好用,就是它能方便快捷的整合其他技术,这里我们先介绍四种技术的整合:整合JUnit整合MyBatis整合MyBatis-Plus整合Druid整合JUnitSpringBoot技术的定位用于简化... 查看详情

drools笔记:初识与入门

Drools是什么?Drools是一个用Java编写的开源规则引擎,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。通俗地说,Drools是一种工... 查看详情

Drools 布尔比较

】Drools布尔比较【英文标题】:Droolsbooleancomparison【发布时间】:2019-05-2802:35:29【问题描述】:为什么false==(cancelationCode==\'C\')bahave不同来自(cancelationCode==\'C\')==false?是drools6.5.0中的错误还是我遗漏了什么?这里是完整的故事:我... 查看详情