以下是几个基于 Drools 的具体业务规则示例,覆盖不同应用场景,展示其在实际开发中的具体用法:
示例 1:电商促销规则
场景:根据用户类型和订单金额应用不同折扣:
- VIP 用户订单满 1000 元,打 8 折;满 500 元,打 9 折
- 普通用户订单满 1000 元,打 9 折
- 所有用户订单满 2000 元,额外减 200 元
// 规则文件:PromotionRules.drl
package com.ecommerce.promotion// 定义事实类型(可映射Java实体类)
declare OrdertotalAmount : double // 订单总金额discount : double // 折扣比例(如0.8表示8折)finalPrice : double // 最终价格
enddeclare Customertype : String // 用户类型:"VIP"或"NORMAL"
end// 规则1:VIP用户满1000元打8折
rule "VIP 1000+ discount 20%"when$customer : Customer(type == "VIP")$order : Order(totalAmount >= 1000, discount == 0) // 未应用过折扣then$order.setDiscount(0.8);update($order); // 更新订单,触发后续规则
end// 规则2:VIP用户满500元打9折(优先级低于规则1)
rule "VIP 500+ discount 10%"salience 5 // 优先级低于默认值(10),确保规则1先执行when$customer : Customer(type == "VIP")$order : Order(totalAmount >= 500, totalAmount < 1000, discount == 0)then$order.setDiscount(0.9);update($order);
end// 规则3:普通用户满1000元打9折
rule "Normal user 1000+ discount 10%"when$customer : Customer(type == "NORMAL")$order : Order(totalAmount >= 1000, discount == 0)then$order.setDiscount(0.9);update($order);
end// 规则4:满2000元额外减200元(所有用户适用)
rule "All users 2000+ subtract 200"when$order : Order(totalAmount >= 2000)thendouble price = $order.getTotalAmount() * $order.getDiscount();$order.setFinalPrice(price - 200);
end
示例 2:银行信贷审批规则
场景:根据用户收入、信用分、负债情况决定是否批准贷款:
- 信用分 ≥ 700 且月收入 ≥ 10000 元,负债 ≤ 30% → 批准
- 信用分 600-699 且月收入 ≥ 8000 元,负债 ≤ 40% → 批准(额度降低)
- 其他情况 → 拒绝
// 规则文件:LoanApprovalRules.drl
package com.bank.loandeclare ApplicantcreditScore : int // 信用分monthlyIncome : double // 月收入debtRatio : double // 负债率(负债/收入)
enddeclare LoanApplicationapproved : boolean // 是否批准amount : double // 申请额度approvedAmount : double // 批准额度
end// 规则1:优质客户批准全额贷款
rule "Approve full amount for excellent applicants"when$applicant : Applicant(creditScore >= 700, monthlyIncome >= 10000, debtRatio <= 0.3)$app : LoanApplication(approved == false)then$app.setApproved(true);$app.setApprovedAmount($app.getAmount());System.out.println("批准全额贷款:" + $app.getApprovedAmount() + "元");
end// 规则2:普通客户批准80%额度
rule "Approve 80% for good applicants"when$applicant : Applicant(creditScore >= 600, creditScore < 700, monthlyIncome >= 8000, debtRatio <= 0.4)$app : LoanApplication(approved == false)then$app.setApproved(true);$app.setApprovedAmount($app.getAmount() * 0.8);System.out.println("批准80%贷款:" + $app.getApprovedAmount() + "元");
end// 规则3:拒绝其他情况
rule "Reject other applicants"when$app : LoanApplication(approved == false)then$app.setApproved(false);System.out.println("贷款申请被拒绝");
end
示例 3:保险理赔规则(使用决策表)
Drools 支持用 Excel 决策表定义规则,适合非技术人员维护。以下是一个简化的车险理赔规则表:
规则序号 | 事故类型 | 责任认定 | 车辆年限 | 理赔比例 | 备注 |
1 | 单方事故 | 全责 | ≤3年 | 100% | 新车全额理赔 |
2 | 单方事故 | 全责 | >3年 | 90% | 旧车90%理赔 |
3 | 双方事故 | 主责 | 任意 | 70% | 主责方承担70%损失 |
4 | 双方事故 | 次责 | 任意 | 30% | 次责方承担30%损失 |
5 | 酒驾/逃逸 | 任意 | 任意 | 0% | 免责条款 |
说明:
- 决策表的列对应规则的条件(事故类型、责任认定等)和动作(理赔比例)。
- 通过 Drools 工具将 Excel 表转换为规则,无需编写 .drl 文件。
示例 4:规则冲突解决
当多条规则同时满足条件时,Drools 提供多种冲突解决策略:
// 规则文件:ConflictResolution.drl
package com.example.conflictdeclare Userlevel : int // 用户等级:1-普通,2-会员,3-VIP
end// 规则A:VIP用户优先获得赠品A(高优先级)
rule "VIP gets Gift A"salience 20 // 优先级最高whenUser(level == 3)thenSystem.out.println("发放赠品A(VIP专属)");
end// 规则B:会员用户获得赠品B(中优先级)
rule "Member gets Gift B"salience 10 // 优先级次之whenUser(level == 2)thenSystem.out.println("发放赠品B(会员专属)");
end// 规则C:所有用户获得基础赠品(低优先级)
rule "All users get Basic Gift"salience 5 // 优先级最低whenUser()thenSystem.out.println("发放基础赠品");
end
执行结果:
- 若用户等级为 3(VIP),仅执行规则A(因优先级最高)。
- 若用户等级为 2(会员),执行规则B(规则C优先级低,不执行)。
总结
Drools 规则示例的核心是:
- 用
when
定义条件(匹配业务数据),用then
定义动作(修改数据或执行逻辑)。 - 通过规则属性(如
salience
)控制执行顺序,解决冲突。 - 支持多种格式(.drl、Excel),兼顾技术人员和业务人员的使用需求。
这些示例可直接集成到 Java 项目中,通过 Drools API 加载规则并执行,实现业务逻辑与代码的解耦。