19.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
Copy to Clipboard Toggle word wrap

执行示例的代码遵循典型的执行模式:规则已加载,插入事实,并且创建了无状态 KIE 会话。本例中的区别在于,规则在 ExamplePolicyPricing.xls 文件中定义,而不是 DRL 文件或其他源。电子表格文件使用模板和 DRL 规则加载到决策引擎中。

电子表格决策设置

ExamplePolicyPricing.xls 电子表在第一个标签页中包含两个决策表:

  • 基本定价规则
  • 促销活动规则

在示例电子表格演示时,您只能使用电子表的第一个标签页来创建路由表,但多个表可以在单个标签页内。决策表不一定遵循顶层逻辑,但更容易地捕获导致规则的数据。对规则的评估不一定是以给定顺序的评估,因为决策引擎的所有正常机制仍适用。这就是您可以在电子表的同一标签页中有多个决策表的原因。

决策表通过对应的规则模板文件 BasePricing.drtPromotionalPricing.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
Copy to Clipboard Toggle word wrap

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
Copy to Clipboard Toggle word wrap

规则通过 KIE Session DTableWithTemplateKBkmodule.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>
Copy to Clipboard Toggle word wrap

作为使用规则模板文件执行决策表的替代选择,您可以使用 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 );
Copy to Clipboard Toggle word wrap

比较示例使用两种事实类型:

  • 驱动
  • 策略.

这个示例在对应的 Java 类 Driver.javaPolicy.java 中为事实设置默认值。驱动程序存在 30 年,没有之前的声明,目前具有风险配置文件 LOW驱动程序 所应用的策略是 COMPREHENSIVE

在任何决策表中,每行都被视为不同的规则,每个列都是一个条件或一个操作。每行在决策表中评估,除非在执行时清除了电缆。

决策表分布表(XLS 或 XLSX)需要两个关键区域来定义规则数据:

  • RuleSet 区域
  • RuleTable 区域

电子表格的 RuleSet 区域定义了您要全局应用到同一软件包中的所有规则的元素(不仅仅是电子表格),如规则集名称或通用规则属性。RuleTable 区域定义实际规则(箭头),以及组成指定规则集中的规则表的条件、操作和其他规则属性(columns)。决策表电子表格可以包含多个 RuleTable 区域,但只能包含一个 RuleSet 区域。

图 19.11. 决策表配置

RuleTable 区域还定义规则属性应用到的对象,本例中为 DriverPolicy,以及对象的限制。例如,定义 Age Bracket 列的 Driver 对象约束是 age >= $1, age <= $2,其中以逗号分隔的范围在表列值中定义,如 18,24

基本定价规则

定价示例中的基本定价规则 决策表评估驱动程序的年龄、风险配置文件、声明数和策略类型,并根据这些条件生成策略的基本价格。

图 19.12. 基本价格计算

Driver 属性在下表中定义:

  • 年龄 Bracket :年龄括号包含条件 年龄 >=$1 的定义,年龄 <=$2,它定义了驱动程序期限的条件边界。此条件列突出显示 $1 和 $2 的使用,后者在电子表格中用逗号分开。您可以将这些值写入 18、2418,且两个格式都在执行自定义规则中工作。
  • 位置风险配置文件 : risk 配置集是一个字符串,示例程序始终以 LOW 的形式传递,但可以更改为反映 MEDHIGH
  • 之前的声明数量 :声明的数量定义为 condition 列必须完全等于触发该操作的整数。该值不是范围,仅完全匹配。

决策表的策略用于条件和规则操作,并在下表中定义属性:

  • 应用的策略类型 :策略类型是一个条件,它作为字符串传递,用于定义覆盖范围类型:COMPREHENSIVE、FIRE_THEFT、或 THIRD_PARTY
  • Base $ AUDbasePrice 定义为一个 ACTION,它根据与此值对应的电子表格单元,通过约束 policy.setBasePrice ($param) 设置价格。当您为此决策表执行对应的 DRL 规则时,该规则部分对与事实匹配的 true 条件执行这个 action 语句,并将基本价格设置为对应的值。
  • 记录原因 :当规则成功执行时,此操作会在 System.out 控制台中生成输出消息,反映触发的规则。之后会在应用程序中捕获并打印。

该示例也使用左侧的第一列对规则进行分类。此列仅用于注解,不会影响规则执行。

促销活动规则

计费示例中的促销活动规则 决策表评估了驱动程序的年龄、之前声明数量和策略类型,以根据销售政策价格产生潜在的参与。

图 19.13. 主要计算

此决策表包含该驱动程序可能有资格的条件。与基本价格计算类似,此表评估驱动程序的期限、之前声明的数量以及应用 Policy 类型 以确定要应用的 Discount % 速率。例如,如果驱动程序存在 30 年,没有之前的声明,并且针对 COMPREHENSIVE 策略应用,则驱动程序被指定为 20 百分比。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat