Как найти текущий путь в бизнес-процессе? - PullRequest
0 голосов
/ 03 января 2019

Цель приложения:

Я работаю над приложением Saas для управления имуществом.Использование артефактов BPMN 2.0 для моделирования бизнес-правил.

Процесс пилотирования BPMN: управление отправлением арендатора

Мой пилот - после моделирования процесса

Цель этого вопроса Чтобы пользователь мог легче понять его, пользователь просит увидеть временную шкалу, а не процесс BPMN.

Временная шкала основана на запросе MySQL, которыйдолжен предоставить «текущий путь пользователя».

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

Правила пути:

правило 1: начиная с события запуска (позиция = 1) показывайте все артефакты, пока не найдете шлюз с результатом NULL (пользователь еще не ответил).

Правило 2: Когда вы встречаете шлюз, где есть ответ - установлен результат поля -, продолжайте идти по выбранной ветви.

Проблема, с которой я сталкиваюсь, связана свыбранная ветвь (см. ниже).

схемы MySQL

Я решил реализовать модель с помощью 3 таблиц:

  1. Деятельности hasMany артефакты - эта таблица не задана для этого вопроса, поскольку мыфокусируется только на одном действии.
  2. артефакты hasOne родитель, hasOne дочерний (для себя) через artefacts_realtionships
  3. artefacts_relationships: объединить таблицу, чтобы описать «пути» процесса.Пожалуйста, обратите внимание, что это не может быть дерево для «листья могут соединиться в конце».

таблица артефактов

    CREATE TABLE `artefacts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `activity_id` int(11) DEFAULT NULL,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  `type` varchar(20) DEFAULT NULL,
  `options` json DEFAULT NULL,
  `name` char(255) DEFAULT NULL,
  `description` text,
  `alert_message` text,
  `alert_type` varchar(20) DEFAULT NULL,
  `position` int(3) DEFAULT NULL,
  `date` datetime DEFAULT NULL,
  `reminder` int(3) DEFAULT NULL,
  `status` varchar(20) DEFAULT NULL,
  `result` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

таблица artefacts_relationships

CREATE TABLE `artefacts_relationships` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) DEFAULT NULL,
  `child_id` int(11) DEFAULT NULL,
  `choice` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

Реализация MySQL для процесса пилотирования

Здесь вы найдете работающую скрипту MySQL

Здесьэто значения таблицы artefacts_relationships значения таблицы artefacts_relationships

Функциональность артефакта 'gateway'

A ' gateway ' является вопрос .Здесь это вопрос «да / нет», который связан либо с ветвью процесса «да» - выбор = 1 - или «нет» - выбор = 2.

Ответ, данный пользователемхранится в поле «result» в строке артефакта шлюза.

Переключатель ориентации на ветви задается через поле selection « в artefacts_relationships_table, в строке, где parent_id является шлюзом artefacts.id.

Здесь я показываю случай таблицы артефактов, когда пользователь отвечает «нет» на вопрос: choice = 2 значения таблицы артефактов

Мой запрос на данный момент:

SELECT DISTINCT
    currents.type AS current_type,
    currents.options AS current_options,
    currents.name AS current_name,
    currents.result AS current_result,
    currents.position AS current_position,
    CASE
        -- Traitement de la gateway
        WHEN currents.type = 'gateway'
            AND currents.result IS NULL
        THEN 'stop1'
        WHEN 
            parents.type = 'gateway'
            AND (
                parents.result != parent_relationships.choice
                OR parents.result IS NULL)
        THEN 'stop2'
        WHEN 
            parents.type != 'gateway'
            OR parents.type IS NULL
        THEN currents.position 

        ELSE NULL
    END AS filtered_position,
FROM artefacts AS currents
-- relation parent_current
LEFT JOIN artefacts_relationships AS parent_relationships
ON currents.id = parent_relationships.child_id
LEFT JOIN (
    SELECT *
    FROM artefacts AS parents
    -- WHERE xxx
    )
    AS parents
ON parent_relationships.parent_id = parents.id

  -- relation current_enfant
LEFT JOIN artefacts_relationships AS child_relationships
ON currents.id = child_relationships.parent_id

LEFT JOIN (
    SELECT *
    FROM artefacts 
        -- WHERE xxx
    )
    AS children
ON child_relationships.child_id = children.id
WHERE 
    currents.activity_id = 1
    AND currents.position <= IFNULL(
                        (SELECT position FROM artefacts
                        WHERE type = 'gateway'
                            AND result IS NULL
                        ORDER BY position
                        LIMIT 1), 9999)
    AND (parents.type != 'gateway'
        OR(parents.type = 'gateway' AND parents.result = parent_relationships.choice)
        )
ORDER BY current_position
;

Мы должны сосредоточиться только на «текущей» строке

**The problem:** 
current_position 7 and 8 from the 'yes' branch (choice = 1) should be filtered (removed) since current_position 6 is not selected.

Спасибо за ваше время и помощь

...