Нотация DMN 1.3

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

Вызвать таблицу DMN из процесса можно добавив в него элемент Business Rule Task. Входные значения в соответствии с бизнес-правилами определенными в таблице. В результате вы получите выходные значения в заданном формате.

bpmn dmn together
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 table modeler.

modeler window

Чтобы создать таблицу выполните следующие шаги:

  • Укажите id и name для таблицы

  • Определите inputs and outputs

  • Установите значения по умолчанию если необходимо

  • Создайте business rules

  • В случае, если правил несколько, установите hit policy.

После завершения настройки, таблицы можно развернуть или сохранить как черновик.

Определение входных и выходных значений

В качестве значений inputs and outputs используются процессные переменные. При этом важно, чтобы имена этих значений совпадали с именами переменных. Поддерживаются следующие типы входных и выходных значений:

  • String

  • Number

  • Boolean

  • Date

Новая таблица решений имеет одно входное и одно выходное значение. Вы можете настроить их, установив, имя, имя процессной переменной и тип. Для этого нажмите на название:

input label

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

input definition

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

output with predefined

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

add input

Создание бизнес-правил

Бизнес-правило — это одно или несколько логических условий, основанных на входных параметрах, соединенных логическим оператором 'AND'.

business rule full

Например, color == "red" AND size > 10.

Некоторые условия могут быть пустыми. В этом случае в поле ставится символ дефиса ('-').

Политика Выбора Результата

Таблицы решений могут содержать несколько правил. Если правила пересекаются, т.е. к заданному набору входных значений могут применяться несколько правил применяется политики выбора результата.

Чтобы выбрать политику, нажмите на символ в левом верхнем углу таблицы. Этот символ соответствует начальной букве выбранной политики (Unique, Any, Priority, First, Collect, Output Order, Rule Order).

set hit policy

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

hit policy list

Политики выбора результата можно разделить на два типа: политики выбора допускающие один результат и политики допускающие несколько результатов.

Политики выбора одного результата

FIRST

возвращается первый результат согласно порядку применения правил и после этого оценка может быть остановлена. Последнее правило часто является обработчиком.

UNIQUE

правила не могут пересекаться, применяется только одно правило. Unique является политикой выбора по умолчанию.

ANY

правила могут пересекаться, но в этом случае все они должны давать один и тот же результат. Если выполняется несколько правил, но они возвращают разные результаты, это считается ошибкой, и результат будет пустым и помечен как неудачный.

PRIORITY

правила могут пересекаться и возвращать различные значения. Применяется правило с наивысшим приоритетом. Приоритеты указываются в списке, где самые важные результаты идут первыми. Важно, что приоритеты не зависят от порядка правил.

Политики выбора нескольких результатов

Для политик множественного выбора движок DMN возвращает результат в формате JSON. Он не может быть неявно преобразован в переменные типа String.
OUTPUT ORDER

применяются все подходящие правила формируя список выходных значений упорядоченный по приоритету от высокого к низкому. Результат будет возвращен в переменную процесса с именем, равным имени таблицы решений.

RULE ORDER

применяются все подходящие правила формируя список выходных значений в порядке, в котором они расположены в таблице решений.

COLLECT

применяются все подходящие правила формируя список выходных значений в произвольном порядке. К выходным значениям можно применить операторы (‘+’, ‘<’, ‘>’, ‘#’), в этом случае таблица будет иметь один выходной результат.

  • + (sum): результатом таблицы будет сумма всех уникальных выходных значений.

  • < (min): результатом таблицы будет наименьшее из всех выходных значений.

  • > (max): результатом таблицы будет наибольшее из всех выходных значений.

  • # (count): результат таблицы - количество выходных значений.

Пример таблицы решений

Таблица решений созданная в Jmix BPM:

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>