如何在业务流程中找到当前路径?

时间:2019-01-03 15:22:26

标签: mysql sql bpmn business-logic business-rules

应用目的:

我正在研究Saas的物业管理应用程序。 使用BPMN 2.0工件来建模业务规则。

Pilote BPMN流程:租户离职管理

我的飞行员是following process modelization

此问题的目的 为了使用户更容易理解,用户要求查看时间轴而不是BPMN流程。

时间线基于应提供“当前用户途径”的MySQL请求。

  

告诉我直到流程结束或结束之前我必须做的所有任务   下一个“尚未回答”的网关?

路径规则是:

规则1:从开始事件(位置= 1)开始显示所有伪像,直到找到结果为NULL(用户尚未回答)的网关为止。

规则2:遇到满足答案的网关时-设置了字段结果-,继续在选定的分支上进行

  

我面临的问题与所选分支有关(见下文)。

MySQL模式

我选择通过3个表实现该模型:

  1. 活动有很多伪像-此表未针对此问题设置,因为我们仅关注一项活动。
  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实现

您会发现一个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.

感谢您的时间和帮助

0 个答案:

没有答案