Drools入门案例:图书商城优惠规则系统(超详细附代码)

1 业务场景说明

业务场景:消费者在图书商城购买图书,下单后需要在支付页面显示订单优惠后的价格。具体优惠规则如下:
在这里插入图片描述

2 开发实现

  1. 使用IDEA新建maven工程
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  2. 导入drools相关maven坐标
<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-compiler</artifactId>
    <version>7.10.0.Final</version>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>

在这里插入图片描述

  1. 创建resources/META-INF/kmodule.xml配置文件
    配置文件的名称和位置都是固定写法,不能更改
<?xml version="1.0" encoding="UTF-8" ?>
<kmodule xmlns="http://www.drools.org/xsd/kmodule">
    <!--
        name:指定kbase的名称,可以任意,但是需要唯一
        packages:指定规则文件的目录,需要根据实际情况填写,否则无法加载到规则文件,名字任意
        default:指定当前kbase是否为默认
    -->
    <kbase name="myKbase1" packages="rules" default="true">
        <!--
            ksession:会话对象
            name:指定ksession名称,可以任意,但是需要唯一
            default:指定当前session是否为默认
        -->
        <ksession name="ksession-rule" default="true"/>
    </kbase>
</kmodule>

在这里插入图片描述

  1. 创建实体类:订单对象Order
    承担规则引擎输入输出数据的载体
package com.avengers.drools.entity;/**
 * 订单
 */
public class Order {
    private Double originalPrice;//订单原始价格,即优惠前价格
    private Double realPrice;//订单真实价格,即优惠后价格public String toString() {
        return "Order{" +
                "originalPrice=" + originalPrice +
                ", realPrice=" + realPrice +
                '}';
    }public Double getOriginalPrice() {
        return originalPrice;
    }public void setOriginalPrice(Double originalPrice) {
        this.originalPrice = originalPrice;
    }public Double getRealPrice() {
        return realPrice;
    }public void setRealPrice(Double realPrice) {
        this.realPrice = realPrice;
    }
}

在这里插入图片描述

  1. 创建规则文件resources/rules/bookDiscount.drl
    1. drl是规则文件的后缀,文件位置要对应第二步xml中packages规定的位置
      在这里插入图片描述

    2. 规则文件中,第一行的package不代表真实的包结构,是一个逻辑的概念,同一个包中的规则文件可以相互访问

    3. 规则结构:

rule "规则名称"
    when
    then
end
//图书优惠规则
package book.discount
import com.avengers.drools.entity.Order
​
//规则一:所购图书总价在100元以下的没有优惠
rule "book_discount_1"
    when
    	//命名语法,一般用$开头,匹配到的对象命名为order
        $order:Order(originalPrice < 100)//模式匹配,到规则引擎(工作内存)中查找Order对象
    then
        $order.setRealPrice($order.getOriginalPrice());
        System.out.println("成功匹配到规则一:所购图书总价在100元以下的没有优惠");
end
​
//规则二:所购图书总价在100到200元的优惠20元
rule "book_discount_2"
    when
        $order:Order(originalPrice < 200 && originalPrice >= 100)
    then
        $order.setRealPrice($order.getOriginalPrice() - 20);
        System.out.println("成功匹配到规则二:所购图书总价在100到200元的优惠20元");
end
​
//规则三:所购图书总价在200到300元的优惠50元
rule "book_discount_3"
    when
        $order:Order(originalPrice <= 300 && originalPrice >= 200)
    then
        $order.setRealPrice($order.getOriginalPrice() - 50);
        System.out.println("成功匹配到规则三:所购图书总价在200到300元的优惠50元");
end
​
//规则四:所购图书总价在300元以上的优惠100元
rule "book_discount_4"
    when
        $order:Order(originalPrice >= 300)
    then
        $order.setRealPrice($order.getOriginalPrice() - 100);
        System.out.println("成功匹配到规则四:所购图书总价在300元以上的优惠100元");
end
  1. 单元测试
    在test下创建包和测试类
@Test
public void test1(){
    //获取KieServices
    KieServices kieServices = KieServices.Factory.get();
    //获取KieContainer对象
    KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer();
    //从Kie容器对象中获取会话对象,用于和规则引擎交互
    KieSession kieSession = kieClasspathContainer.newKieSession();

    //Fact对象,事实对象
    //构造订单对象,设置原始价格,由规则引擎根据优惠规则计算优惠后的价格
    Order order = new Order();
    order.setOriginalPrice(210D);//double类型

    //将数据提供给规则引擎,规则引擎会根据提供的数据进行规则匹配
    kieSession.insert(order);
   //激活规则引擎,由Drools框架自动进行规则匹配,如果规则匹配成功则执行规则
    kieSession.fireAllRules();
    //关闭会话
    kieSession.dispose();
​
    System.out.println("优惠前原始价格:" + order.getOriginalPrice() +
                       ",优惠后价格:" + order.getRealPrice());
}

在这里插入图片描述
测试结果:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值