申请目的:
我正在为物业管理的saas应用程序工作。使用BPMN2.0人工制品来建模业务规则。
试点bpmn流程:租户离职管理
我的pilote是以下流程模型化
这个问题的目的是让用户更容易理解,用户要求查看时间线而不是bpmn流程。
时间表是基于mysql请求的,该请求应该提供“当前用户路径”。
显示在流程结束或下一个“尚未应答”网关之前必须执行的所有任务?
路径规则是:
规则1:from start event(position=1)显示所有人工制品,直到找到一个结果为空的网关(用户还没有回答)。
规则2:当你遇到一个有答案的网关-设置了字段结果-,继续选择分支。
我面临的问题是关于所选分支的(见下文)。
mysql架构
我选择通过3个表来实现模型:
活动有许多人工制品-这个表格不是为这个问题设置的,因为我们只关注一个活动。
手工艺品有一个父母,有一个孩子(对自己)通过手工艺品的不动产关系
artefacts\u关系:用于描述过程“路径”的联接表。请注意,这不是一棵树,因为“叶子可能会在最后连接”。
人工制品表
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;
人工制品关系表
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;
pilote进程的mysql实现
你会在这里找到一把小提琴
以下是artefacts\u relationships表值artefacts\u relationships表值
“网关”人工制品功能
“网关”是一个问题。这里是一个“是/否”的问题,它与流程的“是”-choice=1-或“否”-choice=2-分支有关。
用户给出的答案存储在网关人工制品行的“result”字段中。
分支的方向切换是通过artifacts\u relationships\u表中的字段“choice”给出的,该行的父级\u id是gateway artifacts.id。
这里我展示了当用户对问题回答“否”时artifacts表的情况:choice=2 artifacts表值
到目前为止,我的问题是:
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.
谢谢你的时间和帮助
暂无答案!
目前还没有任何答案,快来回答吧!