项目设计积分模块的时候,采用drools 规则引擎做poc ,做一下Drools规则介绍
一、规则引擎
1.规则
我们的日常生活是由规则驱动的。每次我们在开车的时候停在红灯处,之所以这样做,因为我们遵循一条规则,灯变红时我们应该停下来。如果你跳起来,最终会落到地面,这是由地球引力所决定的,它可以被表示成简单的数学方程。然而,对于我们生活日常中的规则,我们使用更加简单的结构来表示
当 XXX 的时候,做 XXX 的事,
IF <conditions> THEN <actions>。

2.规则引擎
规则引擎是处理复杂规则集合的引擎。通过输入一些基础事件,以推演或者归纳等方式,得到最终的执行结果。规则引擎的核心作用在于将复杂、易变的规则从系统中抽离出来,由灵活可变的规则来描述业务需求。
Drools 是一款基于 Java 的开源规则引擎,以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。

二、问题与矛盾
1.业务规则在实现上的矛盾

2.T管理者角度

3.开发人员易用性角度

三、业务规则技术
1.业务规则技术

2.引入业务规则技术的目的
2.1对系统的使用人员
1.把业务策略(规则)的创建、修改和维护的权利交给业务经理
2.提高业务灵活性
3.加强业务处理的透明度,业务规则可以被管理
4.减少对IT人员的依赖程度
5.避免将来升级的风险
2.2对IT开发人员
1.简化系统架构,优化应用
2.提高系统的可维护性
3.方便系统的整合
4.减少编写“硬代码”业务规则的成本和风险
5.解决复杂的和复合的问题,其中有大量细粒度的规则和事实互动
6.让业务用户开发和维护规则以降低成本
四、Business Rules Management System

五、Drools 规则引擎
1.Drools匹配规则


2.Drools执行流程

3.积分规则场景

3.1 积分和drools模块大致流程

3.2drools相关脚本
rule "order_base_rule"
no-loop true
when
$order : ActuatorOrderDTO(ruleType == 'base')
$time : RuleTimeDTO()
$ruleContext : RuleContext()
eval(ruleCommonCheckService.checkCommonRule($order.getPointsRule(), $time))
eval(orderCheckService.checkFoStore($order))
eval(orderCheckService.checkBaseRuleProduct($order))
eval(orderCheckService.checkOrderType($order.getOrderPointsDTO(), $ruleContext.getPointsRulesOrder()))
eval(orderCheckService.discount($order, $ruleContext.getPointsRule()))
then CalculateCommon.calculateBase($order);
end
rule "order_promotion_rule"
no-loop true
when
$order : ActuatorOrderDTO(ruleType == 'promotion')
$time : RuleTimeDTO()
$ruleContext : RuleContext()
eval(ruleCommonCheckService.checkCommonRule($order.getPointsRule(), $time))
eval(orderCheckService.checkMemberLimit($order.getOrderPointsDTO(), $ruleContext.getPointsRulesMemberLimit()))
eval(orderCheckService.checkFoStore($order))
eval(orderCheckService.checkPromotionProduct($order,$ruleContext))
eval(orderCheckService.checkOrderType($order.getOrderPointsDTO(), $ruleContext.getPointsRulesOrder()))
eval(orderCheckService.checkStore($order.getOrderPointsDTO(), $ruleContext.getPointsRulesStore(), $ruleContext.getStoreInfoVo()))
eval(orderCheckService.checkConsumer($order,$ruleContext.getPointsPromotionRule(), $ruleContext.getPointsRulesConsumer(), $ruleContext.getConsumerCodes()))
eval(orderCheckService.checkPromotion($order.getMatchedOrder(), $order.getPointsPromotionRule()))
then CalculateCommon.calculatePromotion($order);
end
rule "order_birthday_rule"
no-loop true
when
$order : ActuatorOrderDTO(ruleType == 'promotion')
$time : RuleTimeDTO()
$ruleContext : RuleContext()
eval(ruleCommonCheckService.checkCommonRule($order.getPointsRule(), $time))
eval(orderCheckService.checkOrderType($order.getOrderPointsDTO(), $ruleContext.getPointsRulesOrder()))
eval(orderCheckService.checkFoStore($order))
eval(orderCheckService.checkStore($order.getOrderPointsDTO(), $ruleContext.getPointsRulesStore(), $ruleContext.getStoreInfoVo()))
eval(orderCheckService.checkConsumer($order,$ruleContext.getPointsPromotionRule(), $ruleContext.getPointsRulesConsumer(), $ruleContext.getConsumerCodes()))
eval(orderCheckService.checkBirthdayPromotion($order.getOrderPointsDTO(), $order.getPointsPromotionRule()))
then CalculateCommon.calculateBirthDayPromotion($order);
end
5.drools 总结

网友评论