使用 DMN 1.3

如果需要在流程中根据多个条件对决策进行建模, 可以使用 业务规则任务 调用 DMN 表,根据业务规则返回输出值。

Decision Model and Notation™(DMN™)- 决策模型和表示法,是一种建模语言和表示方法,是精确的业务决策和业务规则的规范。 不同类型的决策管理参与者都很容易读懂 DMN。 包括制定规则并监控其应用的商业专业人士,或业务分析师。

有关详细信息,请参阅 DMN 规范

BPMN 和 DMN 可以协作运行。 当需要对复杂的决策进行建模时,BPMN 图就会由于复杂度高而不能胜任。 此时,最好在 DMN 中对决策进行建模,然后将控制权返回给 BPMN。

bpmn dmn together

实际上,DMN 与 BPMN 一样,也是一种图形表示法,有自己的图表。 但是,在实践中,软件供应商不会实现完整的表示法,一般只实现表示业务规则的 DMN 表。 因此,Jmix BPM 仅支持 DMN 表。

DMN 引擎

Flowable DMN 引擎 会解析决策表并执行以 DMN 格式定义的业务规则。 支持用户创建复杂决策逻辑,并与 BPMN 流程集成, 支持基于输入数据的动态决策。

DMN 引擎支持多个决策模型,在特定的执行上下文中运行,并提供灵活的输出处理。 请参阅 DMN API 部分,了解如何以编程方式使用。

此外,还可以通过 DMN REST API 访问。 从而支持外部系统以编程方式进行决策。 使用该功能可以提高决策的准确度,从而增强业务流程的敏捷性和响应能力。

DMN 定义

DMN 1.1 架构的根元素是 <definitions> 元素。 在此元素中,可以定义多个决策定义, (但我们建议在每个文件中只有一个决策定义, 以简化开发过程的后期维护)。 在每个决策中,可以定义一个表达式。 有几种类型的表达式。 在 Flowable 中,目前支持表达式类型的决策表。

<definitions xmlns="http://www.omg.org/spec/DMN/20151101"
  namespace="http://www.flowable.org/dmn"
  name="DetermineDiscount">

  <decision id="DET_DISC_1" name="DetermineDiscount">

    <decisionTable id="determineDiscountTable1" hitPolicy="FIRST">
      ..
    </decisionTable>

  </decision>

</definitions>

DMN 工具

Jmix BPM 扩展组件提供了用于创建和部署决策表的工具,决策表可以在 web 应用中使用:

  • 决策表(管理视图)

  • 决策表建模器

决策表建模

在 Web 应用程序中,可以使用 BPM 菜单的 Decision table modeler 创建新的决策表。

dmn modeler in menu

建模器视图:

modeler window

配置 DMN 表:

  • 输入表的 idname

  • 定义 输入(inputs)输出(outputs)

  • 对于输出,设置 预定义值(pre-defined values)(如果需要)

  • 创建 业务规则(business rules)

  • 设置 命中策略(hit policy)(如果有多个规则)

完成配置后,可以部署决策表或保存草稿。

定义输入和输出

决策表使用流程变量作为 inputsoutputs。 输入和输出的类型包括:

  • String

  • Number

  • Boolean

  • Date

如果输出类型是 Number,则数字类型始终是 double

流程变量与决策表的输入和输出名称之间没有映射。 但是,要求表参数的名称必须与流程变量的名称一致。 开发人员需要负责提供准确的名称。

一个新的决策表具有一个输入和一个输出。 可以设置其标签(label)、名称(name)和类型(type)。 点击标签:

input label

例如,配置一个输入:

input definition

输出的配置方式类似。此外,输出可能有额外的属性 — 预定义输出值(Predefined output values)。 在某些命中策略中会用到。

output with predefined

决策表可以有多个输入和输出。 如需创建其他输入或输出,点击如下图所示的 plus 按钮:

add input

系统会创建一个新的列:

new input

按需配置该参数。

创建业务规则

业务规则(business rule) 是基于输入参数的一个或多个逻辑条件,多个逻辑条件通过 AND 连接。

business rule full

例如,color == "red" AND size > 10

条件也可以为空,此时,字段需填入短横(-)。

input entry

命中策略

命中策略(Hit policy) 是决策表的一个参数,定义如何利用数据进行规则判定。 点击如下图所示表头中的链接按钮可以设置命中策略:

set hit policy

可以从下拉列表中选择所需策略。 默认值为 Unique

hit policy list

一共有两种类型的 7 个命中策略:

  • 单一命中 这组命中策略对每个输出仅返回一个结果。

  • 多路命中 对于多路命中,DMN 引擎返回一个 JSON 格式的结果。 不能转换为字符串变量。

有下列命中策略:

FIRST

多个(可以有重叠)规则可以与不同的输出条目匹配。 将返回按规则顺序排序的第一个命中的规则(计算可以停止)。

UNIQUE

不能重叠,所有规则都是互斥的。只能匹配一个规则。

如果违反了唯一性,则会导致 DMN 引擎无法解析业务规则。 例如,当 amount = 300 时,激活两条规则,但这违反了 UNIQUE 策略。

ANY

可能存在重叠,但所有匹配的规则都为每个输出显示相等的输出条目,因此可以使用任何匹配的规则。 如果输出条目不相等,则命中策略不正确,输出结果为空并标记为失败。 当禁用严格匹配模式时,将选择最后一个有效规则作为结果。 (匹配冲突将作为验证消息显示。)

PRIORITY

多个规则可以匹配不同的输出条目。 此策略返回最高输出优先级的匹配规则。 输出优先级在输出值的有序列表中指定,按优先级降序排列。 当禁用严格匹配模式且未定义输出值时,第一个有效规则作为结果。 (匹配冲突将作为验证消息显示。)

OUTPUT ORDER

按输出优先级降序返回所有命中的规则。 输出优先级在输出值的有序列表中指定,按优先级降序排列。

结果将返回至与决策表同名的流程变量中。 例如,'output-order'。该变量的类型是 JSON,不能作为字符串使用。

RULE ORDER

按规则顺序返回所有命中。

与前一个一样,只是没有预定义输出值列表中的优先级。

COLLECT

返回所有命中,顺序不定。 可以添加一个运算符(+<>#),用于对输出进行简单运算。 如果没有运算符,则结果为所有输出项的列表。

如果使用没有聚合参数的 COLLECT 策略(Collect none),则与 RULE ORDER 结果一样。

  • +(总和):决策表的结果为所有输出的和。

  • <(最小值):决策表的结果为所有输出的最小值。

  • >(最大值):决策表的结果为所有输出的最大值。

  • #(计数):决策表的结果为所有输出的计数。

示例

discount example

XML 表示

<?xml version="1.0" encoding="UTF-8"?>

<definitions xmlns="http://www.omg.org/spec/DMN/20151101" namespace="http://www.flowable.org/dmn" name="Evaluate discount">
  <decision id="evaluate-discount" name="Evaluate discount">
    <decisionTable hitPolicy="UNIQUE">
      <input label="Level">
        <inputExpression id="input_U9lbk" typeRef="string">
          <text><![CDATA[level]]></text>
        </inputExpression>
      </input>
      <input label="Amount">
        <inputExpression id="input_dNTA2" typeRef="number">
          <text><![CDATA[amount]]></text>
        </inputExpression>
      </input>
      <output id="output_BV1J5" label="Discount" name="discount" typeRef="number">
        <outputValues>
          <text>"10.0","20.0","25.0"</text>
        </outputValues>
      </output>
      <rule>
        <inputEntry id="inputEntry_fBLZR">
          <text><![CDATA[=="SILVER"]]></text>
        </inputEntry>
        <inputEntry id="inputEntry_JtjHs">
          <text><![CDATA[<1000]]></text>
        </inputEntry>
        <outputEntry id="outputEntry_k78f9">
          <text><![CDATA[5.0]]></text>
        </outputEntry>
      </rule>
      <rule>
        <inputEntry id="inputEntry_ZAVMx">
          <text><![CDATA[=="SILVER"]]></text>
        </inputEntry>
        <inputEntry id="inputEntry_VXpLk">
          <text><![CDATA[>=1000]]></text>
        </inputEntry>
        <outputEntry id="outputEntry_1LiOw">
          <text><![CDATA[10.0]]></text>
        </outputEntry>
      </rule>
      <rule>
        <inputEntry id="inputEntry_Emrus">
          <text><![CDATA[=="GOLD"]]></text>
        </inputEntry>
        <inputEntry id="inputEntry_qc4Kw">
          <text><![CDATA[-]]></text>
        </inputEntry>
        <outputEntry id="outputEntry_kvA1d">
          <text><![CDATA[15.0]]></text>
        </outputEntry>
      </rule>
    </decisionTable>
  </decision>
</definitions>

管理决策表

使用 BPM 菜单的 决策表(Decision tables) 可以管理决策表。

bpm decision tables