跳到主要内容

DMN 1.1 简介

Doubao 中英对照 DMN 1.1 Introduction

什么是 DMN?​

决策模型与记号(DMN)是由 Object Management Group 发布的标准。它是一种用于在组织内描述和建模可重复决策的标准方法,以确保决策模型可在不同组织之间互换。

什么是 DMN 定义​

DMN 1.1 模式的根元素是一个 definitions 元素。在该元素内可以定义多个决策定义(不过我们建议每个文件只放一个决策定义,因为这会简化后续开发过程中的维护)。每个决策内可以定义一个表达式。表达式有多种类型。在 Flowable 中,目前支持 decision table(决策表)表达式类型。

<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 定义​

可以用纯文本编辑器创建 DMN 定义,但在本示例中,我们先使用 Flowable modeler 中自带的决策表编辑器。

我们将实现一个非常简单的用例:根据客户类别确定折扣百分比。

首先在 Flowable modeler 中打开决策表部分。

decision tables 1

然后选择 Create Decision Table。

decision tables 2

提供决策表名称和唯一的决策表 key,并选择 Create new decision table。

decision tables 3

现在就可以定义决策表了。下面介绍编辑器中展示的内容。

命中策略​

在左上角可以选择命中策略。

共有 7 种命中策略可用;

单命中

  • FIRST:可以匹配多条(重叠的)规则,且输出项不同。返回按规则顺序排列的第一个命中(并且可以停止求值)。
  • UNIQUE:不可能重叠,所有规则互不相交。只能匹配一条规则。
  • ANY:可能存在重叠,但所有匹配规则对每个输出都显示相同的输出项,因此可以使用任意一个匹配。如果输出项不相等,则命中策略不正确,结果将为空并标记为失败。当严格模式禁用时,最后一条有效规则将作为结果。(该违规将以校验消息的形式呈现)
  • PRIORITY:可以匹配多条规则,且输出项不同。该策略返回具有最高输出优先级的匹配规则。输出优先级在输出值的有序列表中按优先级递减顺序指定。
When [strict mode](dmn/ch02-Configuration.md#strict-mode) is disabled and there are no output values defined the first valid rule be the result. (The violation will be present as a validation message)

多命中

  • OUTPUT ORDER:按输出优先级递减顺序返回所有命中。输出优先级在输出值的有序列表中按优先级递减顺序指定。
  • RULE ORDER:按规则顺序返回所有命中。
  • COLLECT:按任意顺序返回所有命中。可以添加操作符(“+”、“<”、“>”、“#”)以对输出应用一个简单函数。如果没有操作符,结果是所有输出项的列表。
-   \+ (sum): the result of the decision table is the sum of all the distinct outputs.

- &lt; (min): the result of the decision table is the smallest value of all the outputs.

- &gt; (max): the result of the decision table is the largest value of all the outputs.

- \# (count): the result of the decision table is the number of outputs.

(在 DMN 规范 1.2 版本之前,count collect 命中策略的定义说明只考虑不同的输出。在保存决策表时选择 Force DMN 1.1 仍可强制使用此行为)

输入与输出表达式​

决策表本身的表头分为两部分:蓝色和绿色。蓝色部分是输入表达式;绿色部分是输出表达式。

decision tables 4

在输入表达式中,你可以定义将在规则输入项的表达式中使用的变量(下文解释)。可以通过选择 Add Input(右键选项菜单或点击加号图标)来定义多个输入表达式。

decision tables 5

在输出表达式中,你可以定义将创建什么变量来形成决策表执行的结果(该变量的值由输出项表达式决定;下文解释)。可以通过选择 Add Output(右键选项菜单或点击加号图标)来定义多个输出表达式。

规则​

每条规则由一个或多个输入项和一个或多个输出项组成。
输入项是一个将针对(该“列”的)输入变量求值的表达式。当所有输入项求值为 true 时,该规则被视为 true,并对输出项求值。

注意

DMN 规范定义了一种表达式语言:(S)-FEEL。目前我们尚不支持规范的这一部分。在 Flowable DMN 中,我们使用 JUEL 作为表达式语言。

decision tables 6

要输入表达式,双击相应的单元格。
在本示例中,输入表达式 == BRONZE。结合相应输入表达式(列头)中定义的变量,运行时这将形成完整表达式 customerCat == "BRONZE"。

decision tables 7

要输入输出表达式,双击相应的单元格。
本示例中输入表达式 5。这实际上更像是一次隐式赋值。当该规则的所有输入项求值为 true 时,值 5 将被赋给相应输出项(列)中的变量。

然后我们可以通过添加更多规则(选择 Add Rule)来继续完成决策表。

decision tables 8

在我们的示例中,规则 4 有一个空输入项。空输入项会被引擎求值为 true。这意味着如果其他规则都不成立,规则 4 的结果就是该决策表的输出。在这种情况下,变量 discountPerc 的值将为 0。

decision tables 9

现在可以保存决策表了。提供一个唯一的决策表 key。

在 BPMN2.0 流程中使用​

新创建的决策表可以通过包含一个决策任务并选择决策表引用来在 BPMN2.0 流程中使用。

decision tables 10

在上面的流程中,流程有一个启动表单,它将向流程实例(从而向决策表)提供客户类别。
Display Discount 用户任务使用表达式表单字段显示决策表的结果,表达式为 ${discountperc}。

DMN 1.1 XML​

上面示例的完整 DMN 1.1 XML。

<definitions xmlns="http://www.omg.org/spec/DMN/20151101" id="definition_78d09dd7-374c-11e8-b5d8-0242ac120005" name="Determine Discount" namespace="http://www.flowable.org/dmn">
<decision id="DET_DISC_1" name="Determine Discount">
<decisionTable id="decisionTable_78d09dd7-374c-11e8-b5d8-0242ac120005" hitPolicy="UNIQUE">
<input label="Customer Category">
<inputExpression id="inputExpression_1" typeRef="string">
<text>customerCat</text>
</inputExpression>
<inputValues>
<text>"BRONZE","SILVER","GOLD"</text>
</inputValues>
</input>
<output id="outputExpression_2" label="Discount Percentage" name="discountPerc" typeRef="number">
<outputValues>
<text>"0","5","10","20"</text>
</outputValues>
</output>
<rule>
<inputEntry id="inputEntry_1_1">
<text><![CDATA[== "BRONZE"]]></text>
</inputEntry>
<outputEntry id="outputEntry_2_1">
<text><![CDATA[5]]></text>
</outputEntry>
</rule>
<rule>
<inputEntry id="inputEntry_1_2">
<text><![CDATA[== "SILVER"]]></text>
</inputEntry>
<outputEntry id="outputEntry_2_2">
<text><![CDATA[10]]></text>
</outputEntry>
</rule>
<rule>
<inputEntry id="inputEntry_1_3">
<text><![CDATA[== "GOLD"]]></text>
</inputEntry>
<outputEntry id="outputEntry_2_3">
<text><![CDATA[20]]></text>
</outputEntry>
</rule>
<rule>
<inputEntry id="inputEntry_1_4">
<text><![CDATA[-]]></text>
</inputEntry>
<outputEntry id="outputEntry_2_4">
<text><![CDATA[0]]></text>
</outputEntry>
</rule>
</decisionTable>
</decision>
</definitions>
  • 这里需要重点注意的是,Flowable 中使用的决策表 key 就是 DMN XML 中的决策 ID。*