85.5. 定价示例决策(精确表)
账单示例决策演示了如何使用电子表格决策表来计算以 tabular 格式而不是直接在 DRL 文件中计算过期策略的成本。
以下是隔离示例的概述:
-
名称:
Decisiontable -
主类 :
org.drools.examples.decisiontable.PricingRuleDTExample(在src/main/java中) -
模块 :
drools-examples - 类型 :Java 应用程序
-
规则文件:
org.drools.examples.decisiontable.ExamplePolicyPricing.xls(在src/main/resources中) - 目标 :演示使用电子表格决策表来定义规则
电子表格决策表是 XLS 或 XLSX 电子表,其中包含以表格格式定义的新规则。您可以使用独立 Red Hat Process Automation Manager 项目包含电子表格决策表,或者在 Business Central 中将它们上传到项目。决策表中的每一行都是一条规则,每个列都是一个条件、操作或其他规则属性。创建决策表并将其上传到 Red Hat Process Automation Manager 项目后,您定义的规则会编译成带有所有其他规则资产的 dols 规则。
定价示例的目的是提供一组新规则来计算基本价格,以及适用于特定类型的销售政策的库存驱动程序的货币。驱动程序的年龄和历史记录以及策略类型包括计算基本 Premium 贡献,其他规则会计算该驱动程序可能有资格的潜在承诺。
要执行示例,请在 IDE 中作为 Java 应用程序运行 org.drools.examples.decisiontable.PricingRuleDTExample 类。
执行后,以下输出会出现在 IDE 控制台窗口中:
Cheapest possible
BASE PRICE IS: 120
DISCOUNT IS: 20
执行示例的代码遵循典型的执行模式:规则已加载,插入事实,并且创建了无状态 KIE 会话。本例中的区别在于,规则在 ExamplePolicyPricing.xls 文件中定义,而不是 DRL 文件或其他源。电子表格文件使用模板和 DRL 规则加载到决策引擎中。
电子表格决策设置
ExamplePolicyPricing.xls 电子表在第一个标签页中包含两个决策表:
-
基本定价规则 -
促销活动规则
在示例电子表格演示时,您只能使用电子表的第一个标签页来创建路由表,但多个表可以在单个标签页内。决策表不一定遵循顶层逻辑,但更容易地捕获导致规则的数据。对规则的评估不一定是以给定顺序的评估,因为决策引擎的所有正常机制仍适用。这就是您可以在电子表的同一标签页中有多个决策表的原因。
决策表通过对应的规则模板文件 BasePricing.drt 和 PromotionalPricing.drt 执行。这些模板文件通过其模板参数引用决策表,并直接引用决策表中的条件和操作的各种标头。
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
PromotionalPricing.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 电子表,它是成功执行规则所必需的。此执行方法允许您将规则作为独立单元(如本例中)执行,或者在打包知识 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 中为事实设置默认值。驱动程序存在 30 年,没有之前的声明,目前具有风险配置文件 LOW。驱动程序 所应用的策略是 COMPREHENSIVE。
在任何决策表中,每行都被视为不同的规则,每个列都是一个条件或一个操作。每行在决策表中评估,除非在执行时清除了电缆。
决策表分布表(XLS 或 XLSX)需要两个关键区域来定义规则数据:
-
RuleSet区域 -
RuleTable区域
电子表格的 RuleSet 区域定义了您要全局应用到同一软件包中的所有规则的元素(不仅仅是电子表格),如规则集名称或通用规则属性。RuleTable 区域定义实际规则(箭头),以及组成指定规则集中的规则表的条件、操作和其他规则属性(columns)。决策表电子表格可以包含多个 RuleTable 区域,但只能包含一个 RuleSet 区域。
图 85.11. 决策表配置
RuleTable 区域还定义规则属性应用到的对象,本例中为 Driver 和 Policy,以及对象的限制。例如,定义 Age Bracket 列的 Driver 对象约束是 age >= $1, age <= $2,其中以逗号分隔的范围在表列值中定义,如 18,24。
基本定价规则
定价示例中的基本定价规则 决策表评估驱动程序的年龄、风险配置文件、声明数和策略类型,并根据这些条件生成策略的基本价格。
图 85.12. 基本价格计算
Driver 属性在下表中定义:
-
年龄
Bracket:年龄括号包含条件年龄 >=$1 的定义,年龄 <=$2,它定义了驱动程序期限的条件边界。此条件列突出显示$1 和 $2的使用,后者在电子表格中用逗号分开。您可以将这些值写入18、24或18,且两个格式都在执行自定义规则中工作。 -
位置风险配置文件: risk 配置集是一个字符串,示例程序始终以LOW的形式传递,但可以更改为反映MED或HIGH。 -
之前的声明数量:声明的数量定义为 condition 列必须完全等于触发该操作的整数。该值不是范围,仅完全匹配。
决策表的策略用于条件和规则操作,并在下表中定义属性:
-
应用的策略类型:策略类型是一个条件,它作为字符串传递,用于定义覆盖范围类型:COMPREHENSIVE、FIRE_THEFT、或THIRD_PARTY。 -
Base $ AUD:basePrice定义为一个ACTION,它根据与此值对应的电子表格单元,通过约束policy.setBasePrice ($param)设置价格。当您为此决策表执行对应的 DRL 规则时,该规则部分对与事实匹配的 true 条件执行这个 action 语句,并将基本价格设置为对应的值。 -
记录原因:当规则成功执行时,此操作会在System.out控制台中生成输出消息,反映触发的规则。之后会在应用程序中捕获并打印。
该示例也使用左侧的第一列对规则进行分类。此列仅用于注解,不会影响规则执行。
促销活动规则
计费示例中的促销活动规则 决策表评估了驱动程序的年龄、之前声明数量和策略类型,以根据销售政策价格产生潜在的参与。
图 85.13. 主要计算
此决策表包含该驱动程序可能有资格的条件。与基本价格计算类似,此表评估驱动程序的期限、之前声明的数量,以及应用 Policy 类型 以确定要应用的 Discount % 速率。例如,如果驱动程序存在 30 年,没有之前的声明,并且针对 COMPREHENSIVE 策略应用,则驱动程序被指定为 20 百分比。