Нотация DMN 1.3
Нотации BPMN и DMN (Decision Model and Notation) разработаны для совместной работы. Когда требуется смоделировать сложное решение, диаграмма BPMN становится слишком сложной. В этом случае лучше смоделировать процесс принятия решения в DMN, а затем вернуть управление в BPMN.
Вызвать таблицу DMN из процесса можно добавив в него элемент Business Rule Task. Входные значения в соответствии с бизнес-правилами определенными в таблице. В результате вы получите выходные значения в заданном формате.

DMN — это графическая нотация, подобная BPMN, с собственными диаграммами. Однако на практике поставщики программного обеспечения не реализуют полную нотацию, а используют только таблицы DMN, представляющие бизнес-правила. Jmix BPM поддерживает только таблицы DMN. |
DMN движок
Jmix BPM использует DMN движок Flowable. Он поддерживает несколько моделей решений, и предоставляет гибкие возможности обработки выходных данных. Доступ к движку можно получить программно через DMN API. Кроме того, можно предоставить доступ для внешних систем через DMN REST API.
DMN definition
Корневым элементом схемы DMN 1.1 является элемент <definitions>
. Внутри этого элемента можно определить несколько элементов <decision>
.
Для читаемости и удобства дальнейшего обслуживания рекомендуется иметь только один элемент <decision> в каждом файле.
|
Элемент <decision>
может иметь один дочерний элемент <decisionTable>
.
<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 Tools
Дополнение Jmix BPM предоставляет инструменты для создания и развертывания таблиц решений, в веб-приложении:
-
Экран Decision Tables
-
Экран Decision Table Modeler
Создание Таблицы Решений
Чтобы начать создание таблицу решений, из главного меню приложения перейдите на экран Decision table modeler.

Чтобы создать таблицу выполните следующие шаги:
-
Укажите
id
иname
для таблицы -
Определите inputs and outputs
-
Установите значения по умолчанию если необходимо
-
Создайте business rules
-
В случае, если правил несколько, установите hit policy.
После завершения настройки, таблицы можно развернуть или сохранить как черновик.
Определение входных и выходных значений
В качестве значений inputs and outputs используются процессные переменные. При этом важно, чтобы имена этих значений совпадали с именами переменных. Поддерживаются следующие типы входных и выходных значений:
-
String
-
Number
-
Boolean
-
Date
Новая таблица решений имеет одно входное и одно выходное значение. Вы можете настроить их, установив, имя, имя процессной переменной и тип. Для этого нажмите на название:

Например, настройте вход:

Выходные значения настраиваются аналогичным образом, но могут иметь дополнительное свойство – предопределенное значения выходов. Оно используется для некоторых Hit Policy.

Как правило, таблица решений содержит несколько входов и выходов. Чтобы создать дополнительный, нажмите плюс в заголовке таблицы:

Политика Выбора Результата
Таблицы решений могут содержать несколько правил. Если правила пересекаются, т.е. к заданному набору входных значений могут применяться несколько правил применяется политики выбора результата.
Чтобы выбрать политику, нажмите на символ в левом верхнем углу таблицы. Этот символ соответствует начальной букве выбранной политики (Unique, Any, Priority, First, Collect, Output Order, Rule Order).

Затем выберите политику из выпадающего списка. Значение по умолчанию — Unique.

Политики выбора результата можно разделить на два типа: политики выбора допускающие один результат и политики допускающие несколько результатов.
Политики выбора одного результата
- FIRST
-
возвращается первый результат согласно порядку применения правил и после этого оценка может быть остановлена. Последнее правило часто является обработчиком.
- UNIQUE
-
правила не могут пересекаться, применяется только одно правило. Unique является политикой выбора по умолчанию.
- ANY
-
правила могут пересекаться, но в этом случае все они должны давать один и тот же результат. Если выполняется несколько правил, но они возвращают разные результаты, это считается ошибкой, и результат будет пустым и помечен как неудачный.
- PRIORITY
-
правила могут пересекаться и возвращать различные значения. Применяется правило с наивысшим приоритетом. Приоритеты указываются в списке, где самые важные результаты идут первыми. Важно, что приоритеты не зависят от порядка правил.
Политики выбора нескольких результатов
Для политик множественного выбора движок DMN возвращает результат в формате JSON. Он не может быть неявно преобразован в переменные типа String.
- OUTPUT ORDER
-
применяются все подходящие правила формируя список выходных значений упорядоченный по приоритету от высокого к низкому. Результат будет возвращен в переменную процесса с именем, равным имени таблицы решений.
- RULE ORDER
-
применяются все подходящие правила формируя список выходных значений в порядке, в котором они расположены в таблице решений.
- COLLECT
-
применяются все подходящие правила формируя список выходных значений в произвольном порядке. К выходным значениям можно применить операторы (‘+’, ‘<’, ‘>’, ‘#’), в этом случае таблица будет иметь один выходной результат.
-
+
(sum): результатом таблицы будет сумма всех уникальных выходных значений. -
<
(min): результатом таблицы будет наименьшее из всех выходных значений. -
>
(max): результатом таблицы будет наибольшее из всех выходных значений. -
#
(count): результат таблицы - количество выходных значений.
-
Пример таблицы решений
Таблица решений созданная в Jmix BPM:

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>