以下是几个基于 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 规则示例的核心是:

  1. when 定义条件(匹配业务数据),用 then 定义动作(修改数据或执行逻辑)。
  2. 通过规则属性(如 salience)控制执行顺序,解决冲突。
  3. 支持多种格式(.drl、Excel),兼顾技术人员和业务人员的使用需求。

这些示例可直接集成到 Java 项目中,通过 Drools API 加载规则并执行,实现业务逻辑与代码的解耦。