Цель приложения:
Я работаю над приложением Saas для управления имуществом.Использование артефактов BPMN 2.0 для моделирования бизнес-правил.
Процесс пилотирования BPMN: управление отправлением арендатора
Мой пилот - после моделирования процесса
Цель этого вопроса Чтобы пользователь мог легче понять его, пользователь просит увидеть временную шкалу, а не процесс BPMN.
Временная шкала основана на запросе MySQL, которыйдолжен предоставить «текущий путь пользователя».
Показать мне все задачи, которые я должен выполнить до конца процесса или следующего «еще не отвеченного» шлюза?
Правила пути:
правило 1: начиная с события запуска (позиция = 1) показывайте все артефакты, пока не найдете шлюз с результатом NULL (пользователь еще не ответил).
Правило 2: Когда вы встречаете шлюз, где есть ответ - установлен результат поля -, продолжайте идти по выбранной ветви.
Проблема, с которой я сталкиваюсь, связана свыбранная ветвь (см. ниже).
схемы MySQL
Я решил реализовать модель с помощью 3 таблиц:
- Деятельности hasMany артефакты - эта таблица не задана для этого вопроса, поскольку мыфокусируется только на одном действии.
- артефакты hasOne родитель, hasOne дочерний (для себя) через artefacts_realtionships
- 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.
Спасибо за ваше время и помощь