以下是几个基于 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 加载规则并执行,实现业务逻辑与代码的解耦。
