From e49288b6e3898f82184b3efd60e0a5e4e2efcead Mon Sep 17 00:00:00 2001 From: "LAPTOP-EJ2PF6VA\\genie" Date: Mon, 16 Mar 2026 00:38:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bpm_sign_history.txt | 5 ++- bpmm02_spread.txt | 13 +++++- bpmm02_udf_spread_signer.txt | 87 +++++++++++++++--------------------- zen_bpm_define.txt | 3 ++ 4 files changed, 55 insertions(+), 53 deletions(-) diff --git a/bpm_sign_history.txt b/bpm_sign_history.txt index f0f5d39..9b908c9 100644 --- a/bpm_sign_history.txt +++ b/bpm_sign_history.txt @@ -19,9 +19,12 @@ CREATE OR REPLACE PROCEDURE bpm_sign_history ( BEGIN -- token 轉 userid DECLARE v_userid VARCHAR(20); - + -- 根據傳入的 token 取得 userid, 並會判斷 token 是否仍有效(無效傳回空白) main_block: BEGIN + -- 取得 userid + SELECT userid INTO v_userid FROM sys_users WHERE token = p_token; + IF v_userid = '' THEN LEAVE main_block; -- 結束程序 END IF; diff --git a/bpmm02_spread.txt b/bpmm02_spread.txt index 80e2352..6b0390a 100644 --- a/bpmm02_spread.txt +++ b/bpmm02_spread.txt @@ -1,6 +1,7 @@ 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) -- 單號 @@ -19,8 +20,9 @@ CREATE OR REPLACE PROCEDURE bpmm02_spread ( 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 */ -BEGIN +main_block: BEGIN DECLARE v_elementId VARCHAR(100); DECLARE v_stepId VARCHAR(100); DECLARE v_filterSet VARCHAR(1000); @@ -45,8 +47,15 @@ BEGIN DECLARE v_all_signers VARCHAR(200); DECLARE v_done INT DEFAULT FALSE; DECLARE v_cnt 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 diff --git a/bpmm02_udf_spread_signer.txt b/bpmm02_udf_spread_signer.txt index c6c14e7..d71650d 100644 --- a/bpmm02_udf_spread_signer.txt +++ b/bpmm02_udf_spread_signer.txt @@ -2,89 +2,76 @@ DELIMITER // CREATE OR REPLACE FUNCTION bpmm02_udf_spread_signer( p_uuid VARCHAR(100), - p_personid VARCHAR(20), -- 起單人 - p_source_pk_value VARCHAR(100), -- 單號 + p_personid VARCHAR(20), + p_source_pk_value VARCHAR(100), p_stepId VARCHAR(100), p_typeName VARCHAR(20), p_nodeName VARCHAR(20), p_filterSet TEXT, p_step INT ) -/* - Function : bpmm02_spread 產生簽核人 SQL script for insert bpm_flow_sign - Description: - Build Date : 2022/11/04 - - Modify History - Item Who Date Modify Docs - ==== ========== ========== ================================================= - 1 Michael 2022/11/04 Init -*/ RETURNS TEXT BEGIN - DECLARE v_sql TEXT; + DECLARE v_sql TEXT DEFAULT ''; DECLARE v_tablename VARCHAR(100); DECLARE v_source_pk VARCHAR(100); DECLARE v_stepName VARCHAR(100); DECLARE v_roleName VARCHAR(100); DECLARE v_source_note VARCHAR(100); DECLARE v_userid VARCHAR(100); - DECLARE v_role_users TEXT; - DECLARE v_notes VARCHAR(600); - DECLARE v_crlf VARCHAR(2); - - SET v_crlf = CHAR(10); + DECLARE v_status CHAR(1); + -- 設定初始狀態:第一關為 'P' (簽核中),其餘為 'N' (待簽) + SET v_status = CASE WHEN p_step = 1 THEN 'P' ELSE 'N' END; + IF p_nodeName = 'nodeNode' THEN - -- 獲取基本資訊 SELECT source_table, source_pk, source_note INTO v_tablename, v_source_pk, v_source_note - FROM bpm_list WHERE flow_id = p_uuid; - + 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 = p_stepId; - - -- 根據類型生成不同的SQL + + -- 修正:使用 INSERT ... SELECT 單一語句,避免分號造成的執行錯誤 IF p_typeName = 'fields' THEN SET v_sql = CONCAT( - 'SELECT @userid:=', v_roleName, ', @notes:=', v_source_note, - ' FROM ', v_tablename, ' WHERE ', v_source_pk, ' = ''', p_source_pk_value, ''';', v_crlf, - 'INSERT INTO bpm_flow_sign (flow_id, sourceid, stepName, flow_level, signerid, sign_status, create_date, sign_note)', v_crlf, - 'VALUES (''', p_uuid, ''', ''', p_source_pk_value, ''', ''', v_stepName, ''', ', p_step, ', @userid, ''', - CASE WHEN p_step = 1 THEN 'P' ELSE 'N' END, ''', NOW(), @notes);' + 'INSERT INTO bpm_flow_sign (flow_id, sourceid, stepName, flow_level, signerid, sign_status, create_date, sign_note) ', + 'SELECT ''', p_uuid, ''', ''', p_source_pk_value, ''', ''', v_stepName, ''', ', p_step, ', ', + v_roleName, ', ''', v_status, ''', NOW(), ', v_source_note, + ' FROM ', v_tablename, ' WHERE ', v_source_pk, ' = ''', p_source_pk_value, '''' ); + ELSEIF p_typeName = 'roles' THEN - -- 處理角色類型 IF v_roleName = 'manager' THEN SELECT bossid INTO v_userid FROM sys_users WHERE userid = p_personid; - SET v_role_users = CONCAT( - 'VALUES (''', p_uuid, ''', ''', p_source_pk_value, ''', ''', v_stepName, ''', ', p_step, ', ''', - IFNULL(v_userid, '4734'), ''', ''', - CASE WHEN p_step = 1 THEN 'P' ELSE 'N' END, ''', NOW(), @notes)' + SET v_userid = IFNULL(v_userid, '4734'); + + SET v_sql = CONCAT( + 'INSERT INTO bpm_flow_sign (flow_id, sourceid, stepName, flow_level, signerid, sign_status, create_date, sign_note) ', + 'SELECT ''', p_uuid, ''', ''', p_source_pk_value, ''', ''', v_stepName, ''', ', p_step, ', ', + '''', v_userid, ''', ''', v_status, ''', NOW(), ', v_source_note, + ' FROM ', v_tablename, ' WHERE ', v_source_pk, ' = ''', p_source_pk_value, '''' ); ELSE - SET v_role_users = CONCAT( - 'SELECT ''', p_uuid, ''', ''', p_source_pk_value, ''', ''', v_stepName, ''', ', p_step, - ', userid, ''', CASE WHEN p_step = 1 THEN 'P' ELSE 'N' END, ''', NOW(), @notes ', - 'FROM sys_userroles WHERE roleid = ''', v_roleName, '''' + -- 處理角色多人的情況 + SET v_sql = CONCAT( + 'INSERT INTO bpm_flow_sign (flow_id, sourceid, stepName, flow_level, signerid, sign_status, create_date, sign_note) ', + 'SELECT ''', p_uuid, ''', ''', p_source_pk_value, ''', ''', v_stepName, ''', ', p_step, ', ', + 'UR.userid, ''', v_status, ''', NOW(), T.', v_source_note, + ' FROM sys_userroles UR ', + ' CROSS JOIN ', v_tablename, ' T ', + ' WHERE UR.roleid = ''', v_roleName, ''' AND T.', v_source_pk, ' = ''', p_source_pk_value, '''' ); END IF; - - SET v_sql = CONCAT( - 'SELECT @notes:=', v_source_note, ' FROM ', v_tablename, - ' WHERE ', v_source_pk, ' = ''', p_source_pk_value, ''';', v_crlf, - 'INSERT INTO bpm_flow_sign (flow_id, sourceid, stepName, flow_level, signerid, sign_status, create_date, sign_note)', v_crlf, - v_role_users, ';' - ); + ELSEIF p_typeName = 'users' THEN - -- 處理用戶類型 + -- 修正:補齊 sign_status 欄位 SET v_sql = CONCAT( - 'SELECT @notes:=', v_source_note, ' FROM ', v_tablename, - ' WHERE ', v_source_pk, ' = ''', p_source_pk_value, ''';', v_crlf, - 'INSERT INTO bpm_flow_sign (flow_id, sourceid, stepName, flow_level, signerid, sign_status, create_date, sign_note)', v_crlf, - 'VALUES (''', p_uuid, ''', ''', p_source_pk_value, ''', ''', v_stepName, ''', ', p_step, - ', ''', v_roleName, ''', NOW(), @notes);' + 'INSERT INTO bpm_flow_sign (flow_id, sourceid, stepName, flow_level, signerid, sign_status, create_date, sign_note) ', + 'SELECT ''', p_uuid, ''', ''', p_source_pk_value, ''', ''', v_stepName, ''', ', p_step, ', ', + '''', v_roleName, ''', ''', v_status, ''', NOW(), ', v_source_note, + ' FROM ', v_tablename, ' WHERE ', v_source_pk, ' = ''', p_source_pk_value, '''' ); END IF; END IF; diff --git a/zen_bpm_define.txt b/zen_bpm_define.txt index 10282dd..2507f25 100644 --- a/zen_bpm_define.txt +++ b/zen_bpm_define.txt @@ -21,6 +21,7 @@ BEGIN 2 Michael 2023-02-01 為了更加彈性, @ip 及 @db 這2個欄位改傳入 ${ls:xxxx}, 測試可行(程式要調整前端呼叫的程式) 3 Michael 2024-02-04 將 hard code 的 ip 及 db 改為 local store, 版本也改為 v2 4 Michael 2024-03-02 amis 之前改版, 命名時不能使用 bpm-xxx 否則會無法識別, 一次修正 + 5 Michael 2026-03-14 建議所有 sp 都統一加入 token, 先從上呈開始 */ DECLARE v_rets TEXT; @@ -50,6 +51,8 @@ BEGIN ' "method": "post",', v_crlf, ' "url": "${ls:base_ip}/xapi/v2/${ls:base_db}/bpmm02_spread/1/",', v_crlf, ' "data": {', v_crlf, + -- 新版統一加入 token 2026/03/14 + ' "token": "${ls:token}",', v_crlf, ' "para01": "', p_FunctionTag, '",', v_crlf, -- 上呈人暫時先 hard code(慢慢想辦法), 目前是定義在 bpm_list.source_applicant (跨 db) ' "para02": "${personid}",', v_crlf,