89.5. 定价示例决策(决策表)
定价示例决策集演示了如何使用电子表格决策表来以表格形式计算保险政策的零售成本,而不是直接在 DRL 文件中计算。
以下是定价示例概述:
-
名称 :
decisiontable
-
主类 :
org.drools.examples.decisiontable.PricingRuleDTExample
(在src/main/java
中) -
模块 :
drools-examples
- 键入: Java 应用程序
-
规则文件 :
org.drools.examples.decisiontable.ExamplePolicyPricing.xls
(src/main/resources
) - 目标 :演示电子表格决策表的使用来定义规则
电子表格决策表是 XLS 或 XLSX 电子表格,其中包含以表格格式定义的业务规则。您可以包括带有独立红帽决策管理器项目的电子表格决策表,或将其上传到 Business Central 中的项目。决策表中的每一行都是一个规则,每个列都是条件、操作或其他规则属性。在您的 Red Hat Decision Manager 项目中创建并上传您的决定表后,您定义的规则会像所有其他规则资产一样编译到 Drools 规则语言(DRL)规则中。
定价示例的目的是提供一组业务规则来计算基础价格和适用于适用于特定类型的保险政策的 car 驱动程序折扣。驱动程序的年龄和历史以及策略类型,所有为计算基本高级的贡献,其他规则计算驱动程序可能有资格获得的潜在折扣。
要执行示例,请运行 org.drools.examples.decisiontable.PricingRuleDTExample
类,作为 IDE 中的 Java 应用程序。
执行后,会在 IDE 控制台窗口中显示以下输出:
Cheapest possible BASE PRICE IS: 120 DISCOUNT IS: 20
执行示例的代码遵循典型的执行模式:加载规则,并插入事实,并且创建一个无状态的 KIE 会话。本例中的区别在于,规则在 ExamplePolicyPricing.xls
文件中定义,而不是 DRL 文件或其他来源。使用模板和 DRL 规则,电子表格文件被加载到决策引擎中。
电子表格决策表设置
ExamplePolicyPricing.xls
spreadsheet 在第一个标签页中包含两个 decision 表:
-
基本定价规则
-
促销折扣规则
当电子表格示例演示时,您只能使用电子表格中的第一个标签页来创建决策表,但多个表可以在一个标签页内。决策表不一定遵循自顶逻辑,但更是捕获规则生成的数据的一种方式。规则的评估不一定按给定顺序使用,因为该决策引擎的所有普通原理仍然适用。因此,您可以在电子表格的同一个标签页中有多个路由表。
决策表通过相应的规则模板文件 BasePricing.drt
和 promotionPricing .drt
执行。这些模板文件通过其模板参数来引用决策表,并直接引用 decision 表中条件和操作的各种标头。
BasePricing.drt 规则模板文件
template header age[] profile priorClaims policyType base reason package org.drools.examples.decisiontable; template "Pricing bracket" age policyType base rule "Pricing bracket_@{row.rowNumber}" when Driver(age >= @{age0}, age <= @{age1} , priorClaims == "@{priorClaims}" , locationRiskProfile == "@{profile}" ) policy: Policy(type == "@{policyType}") then policy.setBasePrice(@{base}); System.out.println("@{reason}"); end end template
促销.drt 规则模板文件
template header age[] priorClaims policyType discount package org.drools.examples.decisiontable; template "discounts" age priorClaims policyType discount rule "Discounts_@{row.rowNumber}" when Driver(age >= @{age0}, age <= @{age1}, priorClaims == "@{priorClaims}") policy: Policy(type == "@{policyType}") then policy.applyDiscount(@{discount}); end end template
规则是通过 KIE Session DTableWithTemplateKB
的 kmodule.xml
参考执行,它特别提到了 ExamplePolicyPricing.xls
spreadsheet,并且需要成功执行规则。这个执行方法可让您将规则作为独立单元(如本例中)执行,或者将规则包括在打包的 JAR(KJAR)文件中,以便电子表格与要执行的规则一起打包。
要成功执行规则和电子表格,需要 kmodule.xml
文件的以下部分:
<kbase name="DecisionTableKB" packages="org.drools.examples.decisiontable"> <ksession name="DecisionTableKS" type="stateless"/> </kbase> <kbase name="DTableWithTemplateKB" packages="org.drools.examples.decisiontable-template"> <ruleTemplate dtable="org/drools/examples/decisiontable-template/ExamplePolicyPricingTemplateData.xls" template="org/drools/examples/decisiontable-template/BasePricing.drt" row="3" col="3"/> <ruleTemplate dtable="org/drools/examples/decisiontable-template/ExamplePolicyPricingTemplateData.xls" template="org/drools/examples/decisiontable-template/PromotionalPricing.drt" row="18" col="3"/> <ksession name="DTableWithTemplateKS"/> </kbase>
作为使用规则模板文件执行决策表的替代方法,您可以使用 DecisionTableConfiguration
对象,并将输入电子表格指定为输入类型,如 DecisionTableInputType.xls
:
DecisionTableConfiguration dtableconfiguration = KnowledgeBuilderFactory.newDecisionTableConfiguration(); dtableconfiguration.setInputType( DecisionTableInputType.XLS ); KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); Resource xlsRes = ResourceFactory.newClassPathResource( "ExamplePolicyPricing.xls", getClass() ); kbuilder.add( xlsRes, ResourceType.DTABLE, dtableconfiguration );
定价示例使用两种事实类型:
-
驱动
-
策略
.
这个示例在相应的 Java 类 Driver.java
和 Policy.java
中同时设置了默认值。Driver
旧是 30 年,没有以前的声明,目前存在 LOW
的风险配置集。为应用该驱动程序的 Policy
是 COMPREHENSIVE
。
在任何决策表中,每行都被视为不同的规则,每个列都是条件或一个操作。每行都在决定表中评估,除非在执行时清除表格。
决策表电子表格(XLS 或 XLSX)需要两个定义规则数据的关键区域:
-
RuleSet
区域 -
规则
区域
电子表格的 RuleSet
区域定义了您要对同一软件包中的所有规则(不仅仅是电子表格)全局应用的元素,如规则集名称或通用规则属性。RuleTable
区域定义了实际规则(箭头)以及条件、操作和其他规则属性(列),这些属性构成指定规则集中的规则表。表格电子表格可以包含多个可 规则
的区域,但只能包含一个 RuleSet
区域。
图 89.11. 决策表配置

RuleTable
区域还定义了规则属性应用到的对象,在本例中为 Driver
和 Policy
,后面接对象的限制。例如,定义 Age Bracket
列的 Driver
对象约束为 age >= $1, age <
;= $2,其中以逗号分隔的范围在表列中值中定义,如 18,24
。
基本定价规则
定价示例中的基本价格规则
表评估驱动程序的年龄、风险配置集、声明次数和策略类型,并根据这些条件生成策略的基本价格。
图 89.12. 基本价格计算

Driver
属性在下表中定义:
-
age
Bracket
: age bracket 为条件年龄 >=$1, age <=$2
的定义,它定义了驱动程序年龄的条件界限。此条件列突出显示了$1 和 $2
的使用,在电子表格中用逗号分隔。您可以将这些值写为18、24
或18,24
或 18,这两种格式都可以执行业务规则。 -
位置风险配置集
: risk 配置集是一个字符串,该示例程序始终以LOW
形式传递,但可以改为反映MED
或 HIGH。
-
之前声明
的数量:声明的数量定义为一个整数,条件列必须完全等于触发操作。该值不是范围,仅完全匹配。
决策表的 Policy
可在条件和规则操作和规则操作中使用,并在下表列中定义属性:
-
策略类型适用于
:策略类型是以字符串形式传递的条件:COMPREHENSIVE
、FIRE_THEFT
或THIRD_PARTY
。 -
Base $ AUD
:basePrice
作为ACTION
,它通过约束策略.setBasePrice($param)设置价格;
基于与这个值对应的电子表格单元。当您为这个决定表执行对应的 DRL 规则时,规则的然后
部分针对与事实匹配的 true 条件执行这个 action 语句,并将基本价格设置为对应的值。 -
Record Reason
:当规则成功执行时,此操作会在System.out
控制台上生成一个输出信息,它反映了哪些规则触发。之后会在应用程序中捕获并打印。
这个示例也使用左侧的第一列来分类规则。此列仅用于注释,对规则执行没有影响。
促销折扣规则
定价 示例中的促销折扣规则
表格评估了驱动程序的年龄、之前声明和策略类型,以便根据保险政策的价格生成可能的折扣。
图 89.13. 折扣计算

此决定表包含驱动程序可能有资格享受的折扣条件。与基本价格计算类似,此表评估了驱动程序之前声明的期限、驱动程序之前的声明数量
,以及用于确定要应用的 Discount %
速率的策略 类型
。例如,如果驱动程序是过去 30 年,没有之前的声明,并且会申请
COMPREHENSIVE
策略,则驱动程序将享有 20% 的折扣。