Загрузить изображение для проекта: 'Citeck Community'
  1. Citeck Community
  2. ECOSCOM-4717

DMN. Develop decision tables in ECOS

    XMLWordДля печати

Детали задачи

    • Icon: История История
    • Решение: Нет решения
    • Icon: Medium Medium
    • Не заполнено
    • Не заполнено
    • Не заполнено
    • Не заполнено

    Описание

      1. Добавить новую сущность в системе - “DecisionTable” (таблица принятия решений). Модель:
      decision-table
      {
        "id": String, // идентификатор таблицы
        "lineTypeRef": RecordRef, // тип строки в таблице
        "conditions": Condition[] // условия для успешного сопоставления со строкой в таблице
      }
      Condition
      {
        id: String,
        name: MLText,
        predicate: Predicate
      }

      В conditions будет список предикатов, которые объединяются по И и проверяются в некотором контексте. Контекстом может быть любая запись или произвольный объект, у которого можно загрузить атрибуты через RecordsAPI. Пример предиката:

      {
        "t": "ge", //тип предиката
        "a": "ecos:totalAmount", // значение в поле "a" (или "att") загружаются из контекста проверки
        "v": "${maxTotalAmount}" // значение в ${...} загружаются из строки таблицы
      }

      2. Добавить новый тип ECOS - “decision-table-line“ с атрибутами:

      [
        {
          "id": "order",  // порядок строк
          "name": {"ru": "Порядок"},
          "type": "NUMBER"
        }
      ]

      Этот тип будет абстрактным и предполагается, что для его использования нужно создать новый, который будет унаследован от decision-table-line

      3. Добавить в ecos-model-lib сервис для вычисления соответствия между таблицей и текущим контекстом.


      Общая логика работы

      Схематично:

      {контекст} <условия> {строки_таблицы} = значения_для_которых_выполнились_условия

      Т.е. мы последовательно для каждой строки таблицы проверяем условия для [контекст + строка] и для первого (или для всех. зависит от требований) совпадения возвращаем значение строки или true если значение не задано.

      Инфраструктурно:


      Область применения

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

      1. Вычисление представителей ролей (например настраиваемый по условиям список согласующих)
      2. Вычисление условий (да/нет).
        1. Проверка соблюдения условий при переходах в бизнес-процессах
        2. Отправка уведомлений через определенный sender по условию - https://citeck.atlassian.net/browse/ECOSCOM-4679
      3. Вычисляемые атрибуты у сущностей
      4. _список_можно_продолжать_

      Способ вызова таблиц решений:

      • Из бизнес-процесса
      • Подписка на событие (как транзакционные события с возможностью отката транзакции, так и не транзакционные)
      • Вручную в коде

      Список атрибутов на вход в таблицу:

      • Администратор выбирает атрибуты из типа данных, указанного для таблицы (включая вычисляемые атрибуты)
      • Администратор передает на вход переменные из бизнес-процесса
      • Произвольное поле с указанием атрибута (например, для глобальных mixin, в том числе роли пользователя)

      Низкоуровневая постановка:

      Библиотека ecos-model-lib

      1. Добавить в интерфейс EcosModelAppApi методы
        1. getAttsForDecisionTable(tableRef: RecordRef): Set<String>
        2. calculateDecisionTable(tableRef: RecordRef, attributes: ObjectData): List<DataValue>
      2. Добавить интерфейс EcosDecisionTableService с методом getBool(context: Any?, tableRef: RecordRef?): Boolean
      3. Добавить реализацию интерфейса из п.2 EcosDecisionTableServiceImpl в которой мы в методе getBool
        1. Если RecordRef.isEmpty(tableRef) вернуло true, то возвращаем false
        2. вызываем getAttsForDecisionTable, получаем атрибуты у context через recordsService
        3. вызываем calculateDecisionTable и преобразуем результат в boolean следующим образом:
          1. Если лист пустой, то возвращаем false
          2. Если лист не пустой, то возвращаем первый элемент вызвав на нем asBoolean
      4. Добавить команды для методов getAttsForDecisionTable и calculateDecisionTable

      Микросервис ecos-model

      1. Добавить новую сущность DecisionTable и для неё repo/entity/records dao/service + form/journal/type
      2. Добавить реализацию command executor'ов из п.4 предыдущего раздела

      Вложенные файлы

        Активность

          Люди

            Не назначен Не назначен
            pavel.simonov@citeck.ru Pavel Simonov
            Голоса:
            0 Голосовать за эту задачу
            Наблюдатели:
            2 Начать наблюдение за этой задачей

            Даты

              Создано:
              Обновленo:

              Учет времени

                Оценка:
                Первоначальная оценка - 1 неделя
                1w
                Осталось:
                Оставшееся время - 1 неделя
                1w
                Затрачено:
                Затраченное время - Не определено
                Не определено