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

2sbarzqh  于 2021-06-17  发布在  Mysql
关注(0)|答案(0)|浏览(203)

申请目的:
我正在为物业管理的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.

谢谢你的时间和帮助

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题