249 lines
8.7 KiB
Plaintext
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 ; |