Files
Omni_bpm.db/bpmm01_spread.txt
T
2026-02-06 14:35:36 +08:00

249 lines
8.7 KiB
Plaintext

DELIMITER //
CREATE OR REPLACE PROCEDURE bpmm01_spread (
IN p_uuid VARCHAR(100)
)
/*
功能 : 配合 vue+jsplumb 的 bpm, 將 flow 的 json 轉為可用的 table 內容
描述 : 本程式可能會在 bpm_list 的 update Trugger 被呼叫(TBD)
建立日期 : 2022/10/30
修改歷史
項目 誰 日期 修改說明
==== ========== ========== ================================================
1 michael 2022-10-30 測試
2 Michael 2022-11-01 新增 stepName 欄位
3 Michael 2022-12-03 刪除已經存在的前次內容(防錯, 並可於修改 flow 後重新產生)
*/
BEGIN
DECLARE v_json LONGTEXT;
DECLARE v_col LONGTEXT;
DECLARE v_type VARCHAR(10);
DECLARE v_count INT;
DECLARE v_group1 INT;
DECLARE v_now INT;
DECLARE v_pos INT;
DECLARE v_rowid INT;
DECLARE v_loop INT;
DECLARE v_flow_id VARCHAR(100);
DECLARE v_elementId VARCHAR(100);
DECLARE v_stepId VARCHAR(100);
DECLARE v_filterSet VARCHAR(1000);
DECLARE v_nextStep VARCHAR(1000);
DECLARE v_nextStep2 VARCHAR(1000);
DECLARE v_nextStep_false VARCHAR(100);
DECLARE v_switchStep VARCHAR(1000);
DECLARE v_stepName VARCHAR(100);
DECLARE v_typeName VARCHAR(100);
DECLARE v_roleName VARCHAR(100);
DECLARE v_max INT;
DECLARE v_currid INT;
DECLARE v_done INT DEFAULT FALSE;
-- 臨時表用於存儲解析的JSON數據
DROP TEMPORARY TABLE IF EXISTS temp_data;
CREATE TEMPORARY TABLE temp_data (
rowid INT AUTO_INCREMENT PRIMARY KEY,
col LONGTEXT,
group1 INT DEFAULT NULL
);
-- 獲取流程JSON
SELECT flow_json INTO v_json FROM bpm_list WHERE flow_id = p_uuid;
-- 防止重複寫入
DELETE FROM bpm_setup WHERE flow_id = p_uuid;
-- 分割JSON字串並存入臨時表
SET @sql = CONCAT('INSERT INTO temp_data (col) VALUES ',
REPLACE(REPLACE(REPLACE(v_json, CHAR(10), CONCAT('''),(', '''')), '\\', '\\\\'), '\"', '\\\"'), ');');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 計算總行數
SELECT COUNT(*) INTO v_max FROM temp_data;
SET v_currid = 1;
-- 標記elementId所在的行組
SET v_type = '';
SET v_count = 1;
WHILE (v_currid <= v_max) DO
SELECT col INTO v_col FROM temp_data WHERE rowid = v_currid;
IF LOCATE('"elementId"', v_col) > 0 THEN
UPDATE temp_data SET group1 = v_count WHERE rowid = v_currid;
SET v_count = v_count + 1;
END IF;
SET v_currid = v_currid + 1;
END WHILE;
-- 填充組標記
SET v_now = 0;
SET v_currid = 1;
WHILE (v_currid <= v_max) DO
SELECT IFNULL(group1, 0) INTO v_group1 FROM temp_data WHERE rowid = v_currid;
IF v_group1 = 0 AND v_now > 0 THEN
UPDATE temp_data SET group1 = v_now WHERE rowid = v_currid;
ELSE
SET v_now = v_group1;
END IF;
SET v_currid = v_currid + 1;
END WHILE;
-- 處理每個組
SET v_currid = 1;
WHILE (v_currid <= v_now) DO
-- 識別節點類型
SELECT col INTO v_col FROM temp_data WHERE group1 = v_currid AND LOCATE('elementId', col) > 0;
IF LOCATE('startNode', v_col) > 0 THEN
SET v_elementId = 'startNode';
ELSEIF LOCATE('nodeNode', v_col) > 0 THEN
SET v_elementId = 'nodeNode';
ELSEIF LOCATE('conditionNode', v_col) > 0 THEN
SET v_elementId = 'conditionNode';
ELSEIF LOCATE('switchNode', v_col) > 0 THEN
SET v_elementId = 'switchNode';
ELSEIF LOCATE('stopNode', v_col) > 0 THEN
SET v_elementId = 'stopNode';
END IF;
-- 提取stepId
SELECT col INTO v_col FROM temp_data WHERE group1 = v_currid AND LOCATE('stepId', col) > 0;
SET v_pos = LOCATE(':', v_col);
SET v_stepId = SUBSTRING(v_col, v_pos+3, LENGTH(v_col));
SET v_pos = LOCATE('"', v_stepId);
SET v_stepId = SUBSTRING(v_stepId, 1, v_pos-1);
-- 提取nextStep
IF v_elementId <> 'stopNode' THEN
SELECT col INTO v_col FROM temp_data WHERE group1 = v_currid AND LOCATE('nextStep', col) > 0;
SET v_pos = LOCATE(':', v_col);
SET v_nextStep = SUBSTRING(v_col, v_pos+3, LENGTH(v_col));
SET v_pos = LOCATE('"', v_nextStep);
SET v_nextStep = SUBSTRING(v_nextStep, 1, v_pos-1);
END IF;
-- 處理條件節點的過濾器和分支
IF v_elementId = 'conditionNode' THEN
SELECT col INTO v_col FROM temp_data WHERE group1 = v_currid AND LOCATE('filterSet', col) > 0;
IF v_col IS NOT NULL THEN
SET v_pos = LOCATE(':', v_col);
SET v_filterSet = SUBSTRING(v_col, v_pos+3, LENGTH(v_col));
SET v_pos = LOCATE('"', v_filterSet);
SET v_filterSet = SUBSTRING(v_filterSet, 1, v_pos-1);
-- 提取"是"分支的下一步
SELECT rowid INTO v_rowid FROM temp_data WHERE group1 = v_currid AND LOCATE('"name": "是"', col) > 0;
SELECT col INTO v_col FROM temp_data WHERE rowid = v_rowid - 1;
SET v_pos = LOCATE(':', v_col);
SET v_nextStep = SUBSTRING(v_col, v_pos+3, LENGTH(v_col));
SET v_pos = LOCATE('"', v_nextStep);
SET v_nextStep = SUBSTRING(v_nextStep, 1, v_pos-1);
-- 提取"否"分支的下一步
SELECT rowid INTO v_rowid FROM temp_data WHERE group1 = v_currid AND LOCATE('"name": "否"', col) > 0;
SELECT col INTO v_col FROM temp_data WHERE rowid = v_rowid - 1;
SET v_pos = LOCATE(':', v_col);
SET v_nextStep_false = SUBSTRING(v_col, v_pos+3, LENGTH(v_col));
SET v_pos = LOCATE('"', v_nextStep_false);
SET v_nextStep_false = SUBSTRING(v_nextStep_false, 1, v_pos-1);
END IF;
END IF;
-- 處理switch節點的多分支
IF v_elementId = 'switchNode' THEN
SET v_loop = 1;
SET v_switchStep = '';
WHILE (v_loop <= 10) DO
SELECT rowid, col INTO v_rowid, v_col FROM temp_data
WHERE group1 = v_currid AND LOCATE(CONCAT('"name": "', v_loop, '"'), col) > 0;
IF v_col IS NOT NULL THEN
SELECT col INTO v_col FROM temp_data WHERE rowid = v_rowid - 1;
SET v_pos = LOCATE(':', v_col);
SET v_nextStep2 = SUBSTRING(v_col, v_pos+3, LENGTH(v_col));
SET v_pos = LOCATE('"', v_nextStep2);
SET v_nextStep2 = SUBSTRING(v_nextStep2, 1, v_pos-1);
SET v_switchStep = CONCAT(v_switchStep, v_nextStep2, '^');
ELSE
SET v_loop = 100; -- 退出循環
END IF;
SET v_loop = v_loop + 1;
END WHILE;
IF LENGTH(v_switchStep) > 0 THEN
SET v_switchStep = SUBSTRING(v_switchStep, 1, LENGTH(v_switchStep)-1);
END IF;
END IF;
-- 提取其他節點屬性
IF v_elementId NOT IN ('stopNode', 'startNode') THEN
-- stepName
SELECT col INTO v_col FROM temp_data WHERE group1 = v_currid AND LOCATE('stepName', col) > 0;
SET v_pos = LOCATE(':', v_col);
SET v_stepName = SUBSTRING(v_col, v_pos+3, LENGTH(v_col));
SET v_pos = LOCATE('"', v_stepName);
SET v_stepName = SUBSTRING(v_stepName, 1, v_pos-1);
-- typeName
SELECT col INTO v_col FROM temp_data WHERE group1 = v_currid AND LOCATE('typeName', col) > 0;
SET v_pos = LOCATE(':', v_col);
SET v_typeName = SUBSTRING(v_col, v_pos+3, LENGTH(v_col));
SET v_pos = LOCATE('"', v_typeName);
SET v_typeName = SUBSTRING(v_typeName, 1, v_pos-1);
-- roleName
SELECT col INTO v_col FROM temp_data WHERE group1 = v_currid AND LOCATE('roleName', col) > 0;
SET v_pos = LOCATE(':', v_col);
SET v_roleName = SUBSTRING(v_col, v_pos+3, LENGTH(v_col));
SET v_pos = LOCATE('"', v_roleName);
SET v_roleName = SUBSTRING(v_roleName, 1, v_pos-1);
END IF;
-- 根據節點類型設置預設值
IF v_elementId = 'startNode' THEN
SET v_filterSet = '';
SET v_nextStep_false = '';
SET v_stepName = '';
SET v_typeName = '';
SET v_roleName = '';
ELSEIF v_elementId = 'stopNode' THEN
SET v_filterSet = '';
SET v_nextStep = '';
SET v_nextStep_false = '';
SET v_stepName = '';
SET v_typeName = '';
SET v_roleName = '';
ELSEIF v_elementId = 'switchNode' THEN
SET v_filterSet = '';
SET v_nextStep = v_switchStep;
SET v_nextStep_false = '';
ELSEIF v_elementId = 'conditionNode' THEN
SET v_typeName = '';
ELSEIF v_elementId = 'nodeNode' THEN
SET v_filterSet = '';
SET v_nextStep_false = '';
END IF;
-- 插入結果到bpm_setup表
INSERT INTO bpm_setup (flow_id, elementId, stepId, filterSet, nextStep, nextStep_false, stepName, typeName, roleName)
VALUES (p_uuid, v_elementId, v_stepId, v_filterSet, v_nextStep, v_nextStep_false, v_stepName, v_typeName, v_roleName);
SET v_currid = v_currid + 1;
END WHILE;
-- 清理臨時表
DROP TEMPORARY TABLE IF EXISTS temp_data;
END //
DELIMITER ;