From b7c3654fb5ffbf6005a12d6bb6a89a01e06f1d58 Mon Sep 17 00:00:00 2001 From: "LAPTOP-EJ2PF6VA\\genie" Date: Wed, 18 Mar 2026 21:03:42 +0800 Subject: [PATCH] fix sql logic --- bpmm02_udf_spread_signer.txt | 51 ++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/bpmm02_udf_spread_signer.txt b/bpmm02_udf_spread_signer.txt index d71650d..37bc909 100644 --- a/bpmm02_udf_spread_signer.txt +++ b/bpmm02_udf_spread_signer.txt @@ -2,17 +2,18 @@ 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_filterSet VARCHAR(2000), p_step INT ) RETURNS TEXT BEGIN - DECLARE v_sql TEXT DEFAULT ''; + -- 變數宣告 (對應 MS-SQL 的 declare) + DECLARE v_sql VARCHAR(1000); DECLARE v_tablename VARCHAR(100); DECLARE v_source_pk VARCHAR(100); DECLARE v_stepName VARCHAR(100); @@ -21,57 +22,61 @@ BEGIN DECLARE v_userid VARCHAR(100); DECLARE v_status CHAR(1); - -- 設定初始狀態:第一關為 'P' (簽核中),其餘為 'N' (待簽) + -- 簡化狀態邏輯:第一關為 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; + -- 取得關卡設定資訊 SELECT roleName, stepName INTO v_roleName, v_stepName FROM bpm_setup WHERE flow_id = p_uuid AND stepId = p_stepId; - -- 修正:使用 INSERT ... SELECT 單一語句,避免分號造成的執行錯誤 + -- 1. fields 模式 IF p_typeName = 'fields' THEN + -- 直接用 INSERT ... SELECT,省去組裝宣告變數的字串 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_roleName, ', ''', v_status, ''', NOW(), ', v_source_note, - ' FROM ', v_tablename, ' WHERE ', v_source_pk, ' = ''', p_source_pk_value, '''' + 'SELECT ', QUOTE(p_uuid), ', ', QUOTE(p_source_pk_value), ', ', QUOTE(v_stepName), ', ', p_step, ', ', + v_roleName, ', ', QUOTE(v_status), ', NOW(), ', v_source_note, + ' FROM ', v_tablename, ' WHERE ', v_source_pk, ' = ', QUOTE(p_source_pk_value) ); + -- 2. roles 模式 ELSEIF p_typeName = 'roles' THEN IF v_roleName = 'manager' THEN + -- 取直屬主管 (目前僅能處理起單人的直屬主管) SELECT bossid INTO v_userid FROM sys_users WHERE userid = p_personid; - SET v_userid = IFNULL(v_userid, '4734'); + SET v_userid = IFNULL(v_userid, '4734'); -- ISNULL 替換為 IFNULL 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, '''' + 'SELECT ', QUOTE(p_uuid), ', ', QUOTE(p_source_pk_value), ', ', QUOTE(v_stepName), ', ', p_step, ', ', + QUOTE(v_userid), ', ', QUOTE(v_status), ', NOW(), ', v_source_note, + ' FROM ', v_tablename, ' WHERE ', v_source_pk, ' = ', QUOTE(p_source_pk_value) ); ELSE - -- 處理角色多人的情況 + -- 取 role table 處理多人角色,利用 CROSS JOIN 合併表單資訊 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, '''' + 'SELECT ', QUOTE(p_uuid), ', ', QUOTE(p_source_pk_value), ', ', QUOTE(v_stepName), ', ', p_step, ', ', + 'UR.userid, ', QUOTE(v_status), ', NOW(), T.', v_source_note, + ' FROM sys_userroles UR CROSS JOIN ', v_tablename, ' T ', + ' WHERE UR.roleid = ', QUOTE(v_roleName), ' AND T.', v_source_pk, ' = ', QUOTE(p_source_pk_value) ); END IF; + -- 3. users 模式 ELSEIF p_typeName = 'users' THEN - -- 修正:補齊 sign_status 欄位 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_roleName, ''', ''', v_status, ''', NOW(), ', v_source_note, - ' FROM ', v_tablename, ' WHERE ', v_source_pk, ' = ''', p_source_pk_value, '''' + 'SELECT ', QUOTE(p_uuid), ', ', QUOTE(p_source_pk_value), ', ', QUOTE(v_stepName), ', ', p_step, ', ', + QUOTE(v_roleName), ', ', QUOTE(v_status), ', NOW(), ', v_source_note, + ' FROM ', v_tablename, ' WHERE ', v_source_pk, ' = ', QUOTE(p_source_pk_value) ); END IF; END IF;