205 lines
7.8 KiB
Plaintext
205 lines
7.8 KiB
Plaintext
DELIMITER //
|
|
|
|
CREATE OR REPLACE PROCEDURE bpmm02_spread (
|
|
IN p_token VARCHAR(100), -- 可轉為 userid
|
|
IN p_uuid VARCHAR(100), -- 也可以傳入 functiontag
|
|
IN p_personid VARCHAR(20), -- 起單人
|
|
IN p_source_pk_value VARCHAR(100) -- 單號
|
|
)
|
|
/*
|
|
功能 : 配合 vue+jsplumb 的 bpm, 將 bpm_setup 的設定, 展開為實際的簽核步驟
|
|
描述 : 本程式可能會在單據按 [上呈] 時呼叫
|
|
可能要寫在 View Form, 包含 [上呈] [同意] [駁回] 等都是
|
|
CALL bpmm02_spread('d9930b1c-26a9-4000-a7ba-0f0292601000','120912','221030-001')
|
|
建立日期 : 2022/10/31
|
|
|
|
修改歷史
|
|
項目 誰 日期 修改說明
|
|
==== ========== ========== ================================================
|
|
1 michael 2022-10-31 測試
|
|
2 Michael 2022-11-05 初版完成基本功能
|
|
3 Michael 2022-11-29 新增 update assign_to
|
|
4 Michale 2023-04-14 配合 Node 機制, 加入 bpm 發送 mail 的通用機制
|
|
5 Michael 2026-03-14 加入 token, 原則上 sp 都必須傳入 token
|
|
*/
|
|
main_block: BEGIN
|
|
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_nodeName VARCHAR(100);
|
|
DECLARE v_roleName VARCHAR(100);
|
|
DECLARE v_userid VARCHAR(100);
|
|
DECLARE v_tablename VARCHAR(100);
|
|
DECLARE v_source_pk VARCHAR(100);
|
|
|
|
DECLARE v_sql_cmd LONGTEXT;
|
|
DECLARE v_now_elementId VARCHAR(100);
|
|
DECLARE v_nowStep VARCHAR(100);
|
|
DECLARE v_step INT;
|
|
DECLARE v_crlf VARCHAR(2);
|
|
|
|
DECLARE v_all_signers VARCHAR(200);
|
|
DECLARE v_done INT DEFAULT FALSE;
|
|
DECLARE v_cnt INT;
|
|
DECLARE v_loop INT;
|
|
|
|
SET v_crlf = CHAR(10);
|
|
|
|
-- 根據 token 取得使用者 ID
|
|
SELECT userid INTO v_userid FROM sys_users WHERE token = p_token LIMIT 1;
|
|
|
|
IF v_userid = '' THEN
|
|
LEAVE main_block; -- 結束程序
|
|
END IF;
|
|
|
|
-- 以請假單為例(由 tag 轉 uuid)
|
|
IF LENGTH(p_uuid) < 20 THEN
|
|
SELECT flow_id INTO p_uuid FROM bpm_list WHERE functiontag = p_uuid;
|
|
END IF;
|
|
|
|
-- 取得 startNode 的 nextStep
|
|
SELECT nextStep INTO v_nextStep FROM bpm_setup WHERE flow_id = p_uuid AND elementId = 'startNode';
|
|
|
|
/*
|
|
寫入申請人的上呈資料(固定第一筆)
|
|
*/
|
|
INSERT INTO bpm_flow_sign (flow_id, sourceid, stepName, flow_level, signerid, sign_status, create_date, sign_note)
|
|
VALUES (p_uuid, p_source_pk_value, '上呈', 0, p_personid, 'N', NOW(), '');
|
|
|
|
-- 取得第一個 node
|
|
SELECT
|
|
s.elementId, s.stepId, s.nextStep, s.filterSet,
|
|
s.nextStep_false, s.typeName, s.roleName
|
|
INTO
|
|
v_elementId, v_stepId, v_nextStep, v_filterSet,
|
|
v_nextStep_false, v_typeName, v_roleName
|
|
FROM bpm_list l
|
|
LEFT JOIN bpm_setup s ON l.flow_id = s.flow_id
|
|
WHERE l.flow_id = p_uuid AND stepId = v_nextStep;
|
|
|
|
-- 刪除超過 7 天的 log 資料
|
|
DELETE FROM bpm_flow_spread_log WHERE create_date < DATE_SUB(NOW(), INTERVAL 7 DAY);
|
|
|
|
-- 往下展開, 一直到 stop
|
|
SET v_nowStep = v_nextStep;
|
|
SET v_now_elementId = v_elementId;
|
|
SET v_step = 1;
|
|
SET v_loop = 1;
|
|
|
|
WHILE v_now_elementId <> 'stopNode' and v_loop < 100 DO
|
|
-- 先判斷 condition true/false
|
|
IF v_elementId = 'conditionNode' THEN
|
|
SELECT source_table, source_pk INTO v_tablename, v_source_pk FROM bpm_list WHERE flow_id = p_uuid;
|
|
SELECT roleName, stepName INTO v_roleName, v_stepName FROM bpm_setup WHERE flow_id = p_uuid AND stepId = v_stepId;
|
|
|
|
DELETE FROM bpm_flow_spread_log WHERE flow_id = p_uuid AND sourceid = p_source_pk_value AND stepId = v_stepId;
|
|
|
|
-- 使用預備語句執行動態SQL
|
|
SET @sql = CONCAT('SELECT COUNT(*) INTO @cnt FROM ', v_tablename,
|
|
' WHERE ', v_source_pk, ' = ''', p_source_pk_value,
|
|
''' AND ', v_filterSet);
|
|
PREPARE stmt FROM @sql;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
-- 根據條件結果插入不同的nextStep
|
|
IF @cnt > 0 THEN
|
|
INSERT INTO bpm_flow_spread_log (flow_id, sourceid, stepId, nextStep, create_date)
|
|
VALUES (p_uuid, p_source_pk_value, v_stepId, v_nextStep, NOW());
|
|
ELSE
|
|
INSERT INTO bpm_flow_spread_log (flow_id, sourceid, stepId, nextStep, create_date)
|
|
VALUES (p_uuid, p_source_pk_value, v_stepId, v_nextStep_false, NOW());
|
|
END IF;
|
|
|
|
SET v_step = v_step - 1;
|
|
SELECT nextStep INTO v_nextStep FROM bpm_flow_spread_log
|
|
WHERE flow_id = p_uuid AND sourceid = p_source_pk_value AND stepId = v_stepId;
|
|
ELSEIF v_elementId = 'switchNode' THEN
|
|
-- 取得所有會簽的名單(我不建議支援此功能, 並不合理, 但程式段暫時保留)
|
|
SELECT 'hello';
|
|
ELSE
|
|
-- 調用用戶定義函數獲取簽核人
|
|
SELECT bpmm02_udf_spread_signer(p_uuid, p_personid, p_source_pk_value, v_stepId, v_typeName, v_elementId, v_filterSet, v_step) INTO v_sql_cmd;
|
|
SET @dynamic_sql = v_sql_cmd;
|
|
PREPARE stmt FROM @dynamic_sql;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
END IF;
|
|
|
|
-- 取得下一個 node
|
|
SELECT
|
|
elementId, stepId, nextStep, filterSet, nextStep_false, typeName, roleName
|
|
INTO
|
|
v_elementId, v_stepId, v_nextStep, v_filterSet, v_nextStep_false, v_typeName, v_roleName
|
|
FROM bpm_setup WHERE flow_id = p_uuid AND stepId = v_nextStep;
|
|
|
|
-- 防止無窮 loop
|
|
SET v_loop = v_loop + 1;
|
|
|
|
SET v_step = v_step + 1;
|
|
SET v_nowStep = v_nextStep;
|
|
SET v_now_elementId = v_elementId;
|
|
END WHILE;
|
|
|
|
-- 先填入 assign_to 的預設值
|
|
UPDATE bpm_flow_sign SET assign_to = 'N'
|
|
WHERE flow_id = p_uuid AND sourceid = p_source_pk_value;
|
|
|
|
-- update bpm_flow_sign
|
|
UPDATE bpm_flow_sign SET sign_status = 'A', assign_to = 'Y'
|
|
WHERE flow_id = p_uuid AND sourceid = p_source_pk_value AND flow_level = 0;
|
|
|
|
-- update bpm_flow_sign 的指派, 此處如果第一關就有多人, 都會被設為 Y(暫時無解)
|
|
UPDATE bpm_flow_sign SET assign_to = 'Y'
|
|
WHERE flow_id = p_uuid AND sourceid = p_source_pk_value AND flow_level = 1;
|
|
|
|
/*
|
|
寫入發送 mail 的統一管控檔(use zenclouddb)
|
|
使用 sys_users.user_extend1 = Y 判斷是否要送 mail
|
|
*/
|
|
INSERT INTO zenclouddb.zen_mail_list (corp_db, recipient, mail_subject, content, mail_status, create_date)
|
|
SELECT
|
|
p.pvalue, u.email, CONCAT('簽核通知:【', s.flow_name, '】', bs.sign_note),
|
|
CONCAT('Hi ', u.username, ',', CHAR(10),
|
|
'您有一個待簽核的電子表單,請登入簽核系統後,速審速核,感謝您的配合 !!', CHAR(10),
|
|
'送達時間:', DATE_FORMAT(bs.create_date, '%Y-%m-%d %H:%i:%s'), CHAR(10),
|
|
'主旨:', bs.sign_note, CHAR(10),
|
|
'簽核步驟:', bs.stepname),
|
|
0, NOW()
|
|
FROM bpm_flow_sign bs
|
|
LEFT JOIN sys_users u ON bs.signerid = u.userid
|
|
LEFT JOIN sys_parameter p ON p.pid = 'corpid'
|
|
LEFT JOIN bpm_list s ON s.flow_id = bs.flow_id
|
|
WHERE bs.flow_id = p_uuid AND bs.flow_level = 1 AND bs.sourceid = p_source_pk_value AND assign_to = 'Y';
|
|
|
|
-- 下一關的簽核人
|
|
SELECT bpmm02_udf_next_signer(p_uuid, p_source_pk_value, 1) INTO v_all_signers;
|
|
|
|
-- 更新原單狀態
|
|
/*
|
|
step 3: 寫回原單的 flow_status
|
|
N:待簽核 P:簽核中 Z:結案 C:作廢
|
|
*/
|
|
-- update 原單(hrs_leave), flow_level 及 flowstatus
|
|
SELECT source_table, source_pk INTO v_tablename, v_source_pk FROM bpm_list WHERE flow_id = p_uuid;
|
|
|
|
-- 動態更新原表(用 QUOTE 代替多單引號)
|
|
SET @sql = CONCAT(
|
|
'UPDATE ', v_tablename,
|
|
' SET flow_status = ', QUOTE('P'),
|
|
', flow_signer = ', QUOTE(IFNULL(v_all_signers, '')),
|
|
' WHERE ', v_source_pk, ' = ', QUOTE(p_source_pk_value)
|
|
);
|
|
|
|
PREPARE stmt FROM @sql;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
END //
|
|
|
|
DELIMITER ; |