drools学习3--积分计算例子

基于业务规则的客户风险评分 - Drools实现 Drools是一个开源的规则引擎,经过多年的发展,也提供如下商业BRMS具备的功能组件: 基于Eclipse的集成开发环境, 独立集中的规则存储库 基于WEB的规则维护环境 提供decision table 和 ruleflow等规则制品为规则的运行书写提供更多的灵活性 本文将使用Drools来实现典型的风险评分,并将相关功能与IBM ODM/JRules做一个简单比较。客户风险评分具体 阅读详情
我们假定如下情景:网站伴随业务产生而进行的积分发放操作。比如支付宝信用卡还款奖励积分等。
我们定义一下发放规则:
积分的发放参考因素有:交易笔数、交易金额数目、信用卡还款次数、生日特别优惠等。
定义规则:
// 过生日,则加10分,并且将当月交易比数翻倍后再计算积分
// 2011-01-08 - 2011-08-08每月信用卡还款3次以上,每满3笔赠送30分
// 当月购物总金额100以上,每100元赠送10分
// 当月购物次数5次以上,每五次赠送50分
// 特别的,如果全部满足了要求,则额外奖励100分
// 发生退货,扣减10分

// 退货金额大于100,扣减100分


pom.xml,kmdomule.xml请参考上个hello world 例子

源码下载


PointDomain.java

package com.fei.drools.bean;

/**
 * 积分计算对象
 */
public class PointDomain implements java.io.Serializable {
	static final long serialVersionUID = 1L;

	public PointDomain() {}
	// 用户名
	private String userName;
	// 是否当日生日
	private boolean birthDay;
	// 增加积分数目
	private long point;
	// 当月购物次数
	private int buyNums;
	// 当月退货次数
	private int backNums;
	// 当月购物总金额
	private double buyMoney;
	// 当月退货总金额
	private double backMondy;
	// 当月信用卡还款次数
	private int billThisMonth;
	
	/**
	 * 记录积分发送流水,防止重复发放
	 * @param userName 用户名
	 * @param type 积分发放类型
	 */
	public void recordPointLog(String userName, String type){
		System.out.println("增加对"+userName+"的类型为"+type+"的积分操作记录.");
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public boolean isBirthDay() {
		return birthDay;
	}

	public void setBirthDay(boolean birthDay) {
		this.birthDay = birthDay;
	}

	public long getPoint() {
		return point;
	}

	public void setPoint(long point) {
		this.point = point;
	}

	public int getBuyNums() {
		return buyNums;
	}

	public void setBuyNums(int buyNums) {
		this.buyNums = buyNums;
	}

	public int getBackNums() {
		return backNums;
	}

	public void setBackNums(int backNums) {
		this.backNums = backNums;
	}

	public double getBuyMoney() {
		return buyMoney;
	}

	public void setBuyMoney(double buyMoney) {
		this.buyMoney = buyMoney;
	}

	public double getBackMondy() {
		return backMondy;
	}

	public void setBackMondy(double backMondy) {
		this.backMondy = backMondy;
	}

	public int getBillThisMonth() {
		return billThisMonth;
	}

	public void setBillThisMonth(int billThisMonth) {
		this.billThisMonth = billThisMonth;
	}

}

addpoint.drl

package com.fei.drools;

import com.fei.drools.bean.PointDomain;

rule birthdayPoint
	// 过生日,则加10分,并且将当月交易比数翻倍后再计算积分
	salience 100
	lock-on-active true
	when
		$pointDomain : PointDomain(birthDay == true)
	then
	    System.out.println ( "执行规则: "+drools.getRule().getName());
		$pointDomain.setPoint($pointDomain.getPoint()+100);
		$pointDomain.setBuyNums($pointDomain.getBuyNums()*2);
		$pointDomain.setBuyMoney($pointDomain.getBuyMoney()*2);
		$pointDomain.setBillThisMonth($pointDomain.getBillThisMonth()*2);
		
		$pointDomain.recordPointLog($pointDomain.getUserName(),"birthdayPoint");
end

rule billThisMonthPoint
	// 2016-01-01 - 2016-06-30每月分期还款3次以上,每满3笔赠送30分
	salience 99
	lock-on-active true
	date-effective "31-dec-2015 23:59:59"
	date-expires "30-jun-2016 23:59:59"
	when
		$pointDomain : PointDomain(billThisMonth >= 3)
	then
	    System.out.println ( "执行规则: "+drools.getRule().getName());
		$pointDomain.setPoint($pointDomain.getPoint()+$pointDomain.getBillThisMonth()/3*30);
		$pointDomain.recordPointLog($pointDomain.getUserName(),"billThisMonthPoint");
end

rule buyMoneyPoint
	// 当月购物总金额100以上,每100元赠送10分
	salience 98
	lock-on-active true
	when
		$pointDomain : PointDomain(buyMoney >= 100)
	then
	    System.out.println ( "执行规则: "+drools.getRule().getName());
		$pointDomain.setPoint($pointDomain.getPoint()+ (int)$pointDomain.getBuyMoney()/100 * 10);
		$pointDomain.recordPointLog($pointDomain.getUserName(),"buyMoneyPoint");
end

rule buyNumsPoint
	// 当月购物次数5次以上,每五次赠送50分
	salience 97
	lock-on-active true
	when
		$pointDomain : PointDomain(buyNums >= 5)
	then
	    System.out.println ( "执行规则: "+drools.getRule().getName());
		$pointDomain.setPoint($pointDomain.getPoint()+$pointDomain.getBuyNums()/5 * 50);
		$pointDomain.recordPointLog($pointDomain.getUserName(),"buyNumsPoint");
end

rule allFitPoint
	// 特别的,如果全部满足了要求,则额外奖励100分
	salience 96
	lock-on-active true
	when
		$pointDomain:PointDomain(buyNums >= 5 && billThisMonth >= 3 && buyMoney >= 100)
	then
	    System.out.println ( "执行规则: "+drools.getRule().getName());
		$pointDomain.setPoint($pointDomain.getPoint()+ 100);
		$pointDomain.recordPointLog($pointDomain.getUserName(),"allFitPoint");
end

subpoint.drl

package com.fei.drools;

import com.fei.drools.bean.PointDomain;

rule subBackNumsPoint
	// 发生退货,扣减10分
	salience 10
	lock-on-active true
	when
		$pointDomain : PointDomain(backNums >= 1)
	then
	    System.out.println ( "执行规则: "+drools.getRule().getName());
		$pointDomain.setPoint($pointDomain.getPoint()-10);
		$pointDomain.recordPointLog($pointDomain.getUserName(),"subBackNumsPoint");
end

rule subBackMondyPoint
	// 退货金额大于等于100,扣减100分
	salience 9
	lock-on-active true
	when
		$pointDomain : PointDomain(backMondy >= 100)
	then
	    System.out.println ( "执行规则: "+drools.getRule().getName());
		$pointDomain.setPoint($pointDomain.getPoint()-10);
		$pointDomain.recordPointLog($pointDomain.getUserName(),"subBackMondyPoint");
end
MainTest.java

package com.fei.drools;

import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

import com.fei.drools.bean.Message;
import com.fei.drools.bean.PointDomain;

public class MainTest {

	public static void main(String[] args) {
//		hello();
		point();
	}
	
	public static void hello(){
		
		// load up the knowledge base
		KieServices ks = KieServices.Factory.get();
		KieContainer kContainer = ks.getKieClasspathContainer();
		KieSession kSession = kContainer.newKieSession("ksession-rules");
		
		Message message = new Message();
		message.setMsg("Hello World");
		message.setStatus(Message.HELLO);
		
		kSession.insert(message);
        kSession.fireAllRules();
        kSession.dispose();
	}
	
	public static void point(){
		// load up the knowledge base
		KieServices ks = KieServices.Factory.get();
		KieContainer kContainer = ks.getKieClasspathContainer();
		KieSession kSession = kContainer.newKieSession("ksession-rules");
		
		PointDomain pointDomain = new PointDomain();
		pointDomain.setUserName("ko");
		pointDomain.setBillThisMonth(3);
		pointDomain.setBackMondy(100d);
		pointDomain.setBuyMoney(500d);
		pointDomain.setBackNums(1);
		pointDomain.setBuyNums(5);
		pointDomain.setBirthDay(true);
		pointDomain.setPoint(0l);

		// go !
		kSession.insert(pointDomain);
		kSession.fireAllRules();
		System.out.println("积分 :"+pointDomain.getPoint());
	}
}


运行结果







Drools规则引擎实战项目演示 Drools是一个基于Java的开源规则引擎,它允许开发者通过定义业务逻辑规则来构建复杂的业务决策支持系统。Drools使用了一种被称为DRL(Drools Rule Language)的领域特定语言来表达业务规则,这种语言易于理解且易于维护。该引擎的执行基于Rete算法,这是一种高效的网络系统,用于存储对象和它们之间关系的快照,并将这些信息用于快速模式匹配。在Drools规则引擎中,规则是通过特定的文本文件来定义的,这些文件通常具有.drl(Drools Rule Language)扩展名。 阅读详情

相关推荐

WSL2 Ubuntu 22.04安装NVIDIA驱动避坑指南:从驱动版本选择到CUDA环境验证

本文详细介绍了在WSL2 Ubuntu 22.04中安装NVIDIA驱动和配置CUDA环境的完整流程,包括驱动版本选择、环境变量设置以及常见问题解决方案。通过本指南,用户可以避免常见的安装陷阱,确保GPU加速环境正确配置,适用于深度学习开发和CUDA编程。

weixin_28419039的博客 464

drools规则引擎可视化_智能风控决策引擎系统可落地实现方案(六)风控监控大盘实现...

I.前文提要通过之前五篇文章,分别介绍了决策引擎的主要功能:基于规则流程的规则集、决策流、决策树、决策表、决策矩阵等,以及基于风控模型的模型引擎和评分卡模型等功能,文章参考:规则引擎实现 决策流实现模型引擎实现决策树、决策表、决策矩阵实现评分卡模型今天就决策引擎的输出结果,以及对结果的展示、监控、应用等方面进一步探讨。II.完整决策流通过之前章节,决策引擎执行结...

weixin_39765100的博客 5072

实战|验证码突破思路

漏洞成因:由于逻辑设计缺陷,可绕过验证,比如直接删除COOKIE或验证码参数可绕过、当验证不通过清空session时,验证码参数值为空时绕过等。测试方法:抓包,删除验证码字段,查看是否可以成功发送抓包,正常流程下,记录验证码后的数据包,替换目标包中内容,直接发送,查看是否可以直接绕过验证码案例:Step1.输入正确账户信息和错误验证码,登录时抓包Step2.删除COOKIEStep3.客户端登陆成功。

weixin_46239998的博客 8106

[风控-001]金融风控之评分卡:从本质到精通--001

pdf文件在 https://download.youkuaiyun.com/download/u011539200/10865606   1.问题描述 假设有个样本,每个样本表示一个贷款客户的信息。第个样本表示为,其中,。 具体地说,是一个维向量,每一个维度表示贷款人的一个属性变量。这个变量,是经过填充数据缺失、去除离群点、去除高相关性变量、筛选高IV等之后的入模变量。的值是0或1,表示逾期,表示正常...

大数据和机器学习研究 4482

0/1背包问题:从暴力递归到动态规划详解

题目: 有一组数量为 n 个物品,每个物品都有重量w 和价值v 给定一个背包bag,背包装的物品不能超过背包最大载重容量返回背包bag 能装下的最大价值1. 物品的重量和价值:2. 背包的容量:暴力解法的核心是递归,通过逐一决策每个物品是否放入背包,最终找到最优解。状态定义:递归逻辑:递归终止条件: 动态规划解法 递归的暴力解法有重复子问题,导致了大量的重复计算。为了解决这个问题,我们可以使用动态规划来优化。状态定义:状态转移:边界条件: 测试方法 示例解析 假设:我们希望找到在容量为

Mr.Ayao's blog 2067

STM32CubeMx配置串口使用printf函数打印数据(HAL库开发)

HAL库开发串口,打印printf

m0_58832575的博客 6289

【规则引擎】Drools急速入门

Java规则引擎Drools急速入门

互联网小阿祥 1万+

基于YOLOv11的工业装配完整性智能检测系统

在现代工业生产中,产品质量控制是确保企业竞争力的关键环节。其中,装配完整性检查——即检测产品是否安装了所有应有的部件,是质量检测中的重要一环。传统的人工检测方法存在效率低、易疲劳、主观性强等问题。本文提出了一种基于深度学习的目标检测算法YOLOv11的工业装配完整性智能检测系统,通过计算机视觉技术自动识别和验证产品装配的完整性。本文将详细阐述从数据准备、模型训练到系统部署的完整流程,提供可执行的代码实现,并介绍一个适用于该任务的参考数据集。

YOLO 553

idea中drl文件_得分DRL:在OptaPlanner中更快,更轻松

idea中drl文件 对于OptaPlanner (= Drools Planner)6.0.0.Beta1,我已经用更优雅的ConstraintMatch系统替换了ConstraintOccurrence。 结果是您的DRL评分文件为: 快多了 更容易读写 错误的发生率要低得多,因为它们使得分损坏变得更加困难 让我们先来看结果,然后再看代码可读性的提高。 快点 “给我...

最佳 Java 编程 733

[ vulhub漏洞复现篇 ] ActiveMQ反序列化漏洞复现(CVE-2015-5254)

Apache ActiveMQ是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务、集群、Spring Framework等。由于ActiveMQ是一个纯Java程序,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行。Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞,该漏洞源于程序没有限制可在代理中序列化的类。......

qq_51577576的博客 4444

基于Linux的PCIe设备驱动开发入门到精通-- 11.2 锁机制与并发控制 (自旋锁、互斥锁) 11.3 性能瓶颈分析与优化建议

本文探讨Linux驱动开发中的性能优化方法论,重点聚焦并发控制与性能瓶颈分析。从锁机制选择(自旋锁、互斥锁等)到工具使用(ftrace、perf),详细介绍了定位锁竞争和CPU热点的实战步骤,包括ftrace事件跟踪和perf火焰图分析。针对常见性能瓶颈(CPU/内存/I/O/锁竞争),提出了锁粒度优化、无锁结构替换、中断处理优化等解决方案。强调性能优化需要理论结合实践,通过"假设-测量-验证"的循环持续迭代。为开发者提供了一套从问题定位到解决的完整方法论,助力开发高性能工业级驱动。

MHD0815的博客 130

Drools规则案例实战(消费积分案例)

Drools是为Java量身定制的基于Charles Forgy的RETE算法的规则引擎的实现;由推理引擎发展而来,是一种嵌入在应用程序中的组件,它实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策规则。今天我们通过一个案例来给大家演示下如何实现Drools规则引擎实现决策业务。

qq_25409421的博客 1457

请举手回答,LDO和DC-DC有什么不同?

文章目录1 LDO是什么2 LDO典型电路3 DC-DC是什么4 DC-DC典型电路5 LDO和DC-DC区别10.2.6 小结一下 大家好,我是记得诚。 DC-DC和LDO都是电源芯片,两者差异很大,用法也不同,这篇博客讲述LDO和DC-DC的一些差异,帮助更好的认识LDO和DC-DC并进行选型。 1 LDO是什么 LDO是low dropout regulator的简称,即低压差线性稳压器,这是相对于传统的线性稳压器来说的,传统的稳压器,输入比输出要高出很多,否则无法工作,LDO可能输入比输出高1~2V

记得诚 1万+

Drools简单例子

Drools简单例子 转自:http://www.blogjava.net/diggbag/articles/359347.html 1.Drools简单例子 首先是搭建一个可供进行Drools开发的框架。Jboss官方推荐使用DroolsEcl...

297

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

关于drools的简单笔记

一、什么是drools 简单回答就是把代码变成配置文件,原来写在java类里的东西,现在全部帮到配置文件里。 二、配置文件是什么 配置文件可以是drl结尾的文件,也可以是excel表,现在比较流行的是使用excel表。 三、drools如何调用 首先读取excel表的配置文件,这个叫做初始化。 初始化完成后,需要相应的实体bean用来传递参数供规则判断 如果是drl规则的写法和jav

周二也被占用 2341

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Spring Boot整合Drools:实现订单积分规则的详细入门指南

通过本例,我们展示了如何使用Spring Boot和Drools实现业务规则的管理。Drools作为一款功能强大的规则引擎,可以帮助开发者将业务规则与应用逻辑解耦,使得系统具有更好的扩展性和可维护性。无论是电商平台的积分系统还是其他业务场景,Drools都可以为规则驱动的系统提供一个优雅的解决方案。

Takumilove的博客 1154

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Drools规则引擎范例

无规则不成方圆,软件领域也如此,比如说最常见的“会员积分规则”,会员注册有一个原始积分,这个好处理,在新建对象的时候就给初始化一个原始值,那么这个原始值也有几种,比如平常注册,节假日注册等等,原始值就会有不同,这是一个规则;还有就是注册生效日期,比如立即生效,三天之内生效等等,这也是一个规则;会员消费的时候也会产生多种规则,比如普通消费,节假日消费,逢生日消费;会员消费次数与打折也会产生多种规则,

长沙老码农 1174

Drools规则引擎

通过以上路径,你将系统掌握Drools的核心能力,适配“业务规则频繁变化但系统需稳定运行”的工业级场景。:国内少有的系统化中文教程,覆盖规则语法、Workbench工具、动态规则更新等。:根据用户年龄、VIP等级自动计算订单折扣。:规则不生效、性能瓶颈、与Spring集成。:规则存储在MySQL中,支持在线修改。:规则库管理、版本控制、在线编辑与测试。:支持微服务架构,自动生成REST端点。,逐步从规则编写者成长为规则引擎架构师。:最佳实践、版本升级、第三方工具推荐。(含动态加载、CEP实战)。

一叶之秋的博客 1014

[Drools]JAVA规则引擎2 -- Drools实例

上一篇文章 http://blog.youkuaiyun.com/quzishen/archive/2011/01/25/6163012.aspx 描述了一些常用的drools的语法标签和一个模拟实例即发送积分的场景,这一片优化了一下代码,在此贴一下,希望有这方面使用经验的朋友多多交流沟通,指正不足。通常而言,习惯上我们将规则放到文件系统中,比如以drl结尾的规则文件,现在我们要扩充一下,使其放到数据库中,以供多台服务器同时使用,同时依然保留文件系统的支持。先看下一个接口:/** * 规则接口 * @autho

quzishen的专栏 2万+

drools in java_[Drools]JAVA规则引擎 -- Drools

Drools是一个基于Java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。1、Drools语法开始语法之前首先要了解一下drools的基本工作过程,通常而言我们使用一个接口来做事情,首先要穿进去参数,其次要获取到接口的实现执行完毕后的结果,而drools也是一样的,我们需要传递进去数据,用于...

weixin_29491655的博客 306

别再说你不会,规则引擎Drools了

一、规则引擎的由来 有一天运营想弄一个积分策略,计算额外积分金额,规则如下: 订单原价金额 100以下, 不加分; 100-500 加100分; 500-1000 加500分; 1000 以上 加1000分; 传统java业务实现如下: public class JavaScoreExample { public static void main(String[...

vincent 1万+

规则引擎Drools

规则引擎核心思想:将应用程序中的业务决策部分分离出来使得业务规则的变更不需要修改项目代码、重启服务器就可以在线上环境立即生效我们项目中使用Drools。

qq_64064246的博客 1653

[Drools]JAVA规则引擎 -- Drools

Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。  本文所使用的demo已上传 http://download.youkuaiyun.com/source/3002213 1、Drools语法 开始语法之前首先要了解一下drools的基本工作过程,通常而言我们

caomiao2006的专栏 1049

SpringBoot-Drools规则引擎

规则编号订单金额奖励积分1100元以下不加积分2100元 - 500元加100积分3500元 - 1000元加500积分41000元以上加1000积分规则引擎,全称为业务规则管理系统,英文名为BRMS(即Business Rule Management System)。规则引擎的主要思想是将应用程序中的业务决策部分分离出来,并使用预定义的语义模块编写业务决策(业务规则),由用户或开发者在需要时进行配置、管理。

qq_42211536的博客 3126
上一篇: drools 6学习2--伟大的hello world
下一篇: drools 6学习--动态加载规则
夢_殤
博客等级 码龄15年 348粉丝 140原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值