应用目的:
我正在研究Saas的物业管理应用程序。 使用BPMN 2.0工件来建模业务规则。
Pilote BPMN流程:租户离职管理
我的飞行员是following process modelization
此问题的目的 为了使用户更容易理解,用户要求查看时间轴而不是BPMN流程。
时间线基于应提供“当前用户途径”的MySQL请求。
告诉我直到流程结束或结束之前我必须做的所有任务 下一个“尚未回答”的网关?
路径规则是:
规则1:从开始事件(位置= 1)开始显示所有伪像,直到找到结果为NULL(用户尚未回答)的网关为止。
规则2:遇到满足答案的网关时-设置了字段结果-,继续在选定的分支上进行。
我面临的问题与所选分支有关(见下文)。
MySQL模式
我选择通过3个表实现该模型:
人工制品表
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实现
您会发现一个running MySQL fiddle here
这是artefacts_relationships表的值 artefacts_relationships table values
“网关”伪像功能
“ 网关”是一个问题。 这是一个“是/否”问题,是该过程的分支中的“是”-选择= 1-还是“否”-选择= 2-分支。
用户给出的答案存储在网关人工制品行的“结果”字段中。
分支的方向切换是通过artefacts_relationships_table中的字段“选择” 给出的,该表中parent_id是网关artefacts.id的行。
在这里,我展示了当用户对以下问题回答“否”时,人工制品表的情况:choice = 2 artefacts table values
到目前为止,我的查询是:
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.
感谢您的时间和帮助