DELIMITER // CREATE OR REPLACE FUNCTION bpmm02_udf_spread_signer( p_uuid 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 ) RETURNS TEXT BEGIN 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_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; SELECT roleName, stepName INTO v_roleName, v_stepName FROM bpm_setup WHERE flow_id = p_uuid AND stepId = p_stepId; -- 修正:使用 INSERT ... SELECT 單一語句,避免分號造成的執行錯誤 IF p_typeName = 'fields' THEN 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, '''' ); 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_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_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; 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, '''' ); END IF; END IF; RETURN v_sql; END // DELIMITER ;