first commit

This commit is contained in:
DATAEXPRESS\4734
2026-02-06 14:35:36 +08:00
commit b1b86343ed
15 changed files with 1419 additions and 0 deletions
+190
View File
@@ -0,0 +1,190 @@
DELIMITER //
CREATE OR REPLACE PROCEDURE bpmm02_spread (
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 的通用機制
*/
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;
SET v_crlf = CHAR(10);
-- 以請假單為例(由 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;
WHILE v_now_elementId <> 'stopNode' 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;
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;
-- 動態更新原表
SET @sql = CONCAT(
'UPDATE ', v_tablename, ' SET flow_status = ''P''',
', flow_signer = ''', IFNULL(v_all_signers, ''), '''',
' WHERE ', v_source_pk, ' = ''', p_source_pk_value, ''''
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END //
DELIMITER ;