fix sql logic
This commit is contained in:
@@ -2,17 +2,18 @@ DELIMITER //
|
|||||||
|
|
||||||
CREATE OR REPLACE FUNCTION bpmm02_udf_spread_signer(
|
CREATE OR REPLACE FUNCTION bpmm02_udf_spread_signer(
|
||||||
p_uuid VARCHAR(100),
|
p_uuid VARCHAR(100),
|
||||||
p_personid VARCHAR(20),
|
p_personid VARCHAR(20), -- 起單人
|
||||||
p_source_pk_value VARCHAR(100),
|
p_source_pk_value VARCHAR(100), -- 原單單號
|
||||||
p_stepId VARCHAR(100),
|
p_stepId VARCHAR(100),
|
||||||
p_typeName VARCHAR(20),
|
p_typeName VARCHAR(20),
|
||||||
p_nodeName VARCHAR(20),
|
p_nodeName VARCHAR(20),
|
||||||
p_filterSet TEXT,
|
p_filterSet VARCHAR(2000),
|
||||||
p_step INT
|
p_step INT
|
||||||
)
|
)
|
||||||
RETURNS TEXT
|
RETURNS TEXT
|
||||||
BEGIN
|
BEGIN
|
||||||
DECLARE v_sql TEXT DEFAULT '';
|
-- 變數宣告 (對應 MS-SQL 的 declare)
|
||||||
|
DECLARE v_sql VARCHAR(1000);
|
||||||
DECLARE v_tablename VARCHAR(100);
|
DECLARE v_tablename VARCHAR(100);
|
||||||
DECLARE v_source_pk VARCHAR(100);
|
DECLARE v_source_pk VARCHAR(100);
|
||||||
DECLARE v_stepName VARCHAR(100);
|
DECLARE v_stepName VARCHAR(100);
|
||||||
@@ -21,57 +22,61 @@ BEGIN
|
|||||||
DECLARE v_userid VARCHAR(100);
|
DECLARE v_userid VARCHAR(100);
|
||||||
DECLARE v_status CHAR(1);
|
DECLARE v_status CHAR(1);
|
||||||
|
|
||||||
-- 設定初始狀態:第一關為 'P' (簽核中),其餘為 'N' (待簽)
|
-- 簡化狀態邏輯:第一關為 P,其餘為 N
|
||||||
SET v_status = CASE WHEN p_step = 1 THEN 'P' ELSE 'N' END;
|
SET v_status = CASE WHEN p_step = 1 THEN 'P' ELSE 'N' END;
|
||||||
|
|
||||||
IF p_nodeName = 'nodeNode' THEN
|
IF p_nodeName = 'nodeNode' THEN
|
||||||
|
-- 取得來源表資訊
|
||||||
SELECT source_table, source_pk, source_note
|
SELECT source_table, source_pk, source_note
|
||||||
INTO v_tablename, v_source_pk, v_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
|
SELECT roleName, stepName
|
||||||
INTO v_roleName, v_stepName
|
INTO v_roleName, v_stepName
|
||||||
FROM bpm_setup WHERE flow_id = p_uuid AND stepId = p_stepId;
|
FROM bpm_setup WHERE flow_id = p_uuid AND stepId = p_stepId;
|
||||||
|
|
||||||
-- 修正:使用 INSERT ... SELECT 單一語句,避免分號造成的執行錯誤
|
-- 1. fields 模式
|
||||||
IF p_typeName = 'fields' THEN
|
IF p_typeName = 'fields' THEN
|
||||||
|
-- 直接用 INSERT ... SELECT,省去組裝宣告變數的字串
|
||||||
SET v_sql = CONCAT(
|
SET v_sql = CONCAT(
|
||||||
'INSERT INTO bpm_flow_sign (flow_id, sourceid, stepName, flow_level, signerid, sign_status, create_date, sign_note) ',
|
'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, ', ',
|
'SELECT ', QUOTE(p_uuid), ', ', QUOTE(p_source_pk_value), ', ', QUOTE(v_stepName), ', ', p_step, ', ',
|
||||||
v_roleName, ', ''', v_status, ''', NOW(), ', v_source_note,
|
v_roleName, ', ', QUOTE(v_status), ', NOW(), ', v_source_note,
|
||||||
' FROM ', v_tablename, ' WHERE ', v_source_pk, ' = ''', p_source_pk_value, ''''
|
' FROM ', v_tablename, ' WHERE ', v_source_pk, ' = ', QUOTE(p_source_pk_value)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
-- 2. roles 模式
|
||||||
ELSEIF p_typeName = 'roles' THEN
|
ELSEIF p_typeName = 'roles' THEN
|
||||||
IF v_roleName = 'manager' THEN
|
IF v_roleName = 'manager' THEN
|
||||||
|
-- 取直屬主管 (目前僅能處理起單人的直屬主管)
|
||||||
SELECT bossid INTO v_userid FROM sys_users WHERE userid = p_personid;
|
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(
|
SET v_sql = CONCAT(
|
||||||
'INSERT INTO bpm_flow_sign (flow_id, sourceid, stepName, flow_level, signerid, sign_status, create_date, sign_note) ',
|
'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, ', ',
|
'SELECT ', QUOTE(p_uuid), ', ', QUOTE(p_source_pk_value), ', ', QUOTE(v_stepName), ', ', p_step, ', ',
|
||||||
'''', v_userid, ''', ''', v_status, ''', NOW(), ', v_source_note,
|
QUOTE(v_userid), ', ', QUOTE(v_status), ', NOW(), ', v_source_note,
|
||||||
' FROM ', v_tablename, ' WHERE ', v_source_pk, ' = ''', p_source_pk_value, ''''
|
' FROM ', v_tablename, ' WHERE ', v_source_pk, ' = ', QUOTE(p_source_pk_value)
|
||||||
);
|
);
|
||||||
ELSE
|
ELSE
|
||||||
-- 處理角色多人的情況
|
-- 取 role table 處理多人角色,利用 CROSS JOIN 合併表單資訊
|
||||||
SET v_sql = CONCAT(
|
SET v_sql = CONCAT(
|
||||||
'INSERT INTO bpm_flow_sign (flow_id, sourceid, stepName, flow_level, signerid, sign_status, create_date, sign_note) ',
|
'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, ', ',
|
'SELECT ', QUOTE(p_uuid), ', ', QUOTE(p_source_pk_value), ', ', QUOTE(v_stepName), ', ', p_step, ', ',
|
||||||
'UR.userid, ''', v_status, ''', NOW(), T.', v_source_note,
|
'UR.userid, ', QUOTE(v_status), ', NOW(), T.', v_source_note,
|
||||||
' FROM sys_userroles UR ',
|
' FROM sys_userroles UR CROSS JOIN ', v_tablename, ' T ',
|
||||||
' CROSS JOIN ', v_tablename, ' T ',
|
' WHERE UR.roleid = ', QUOTE(v_roleName), ' AND T.', v_source_pk, ' = ', QUOTE(p_source_pk_value)
|
||||||
' WHERE UR.roleid = ''', v_roleName, ''' AND T.', v_source_pk, ' = ''', p_source_pk_value, ''''
|
|
||||||
);
|
);
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
|
-- 3. users 模式
|
||||||
ELSEIF p_typeName = 'users' THEN
|
ELSEIF p_typeName = 'users' THEN
|
||||||
-- 修正:補齊 sign_status 欄位
|
|
||||||
SET v_sql = CONCAT(
|
SET v_sql = CONCAT(
|
||||||
'INSERT INTO bpm_flow_sign (flow_id, sourceid, stepName, flow_level, signerid, sign_status, create_date, sign_note) ',
|
'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, ', ',
|
'SELECT ', QUOTE(p_uuid), ', ', QUOTE(p_source_pk_value), ', ', QUOTE(v_stepName), ', ', p_step, ', ',
|
||||||
'''', v_roleName, ''', ''', v_status, ''', NOW(), ', v_source_note,
|
QUOTE(v_roleName), ', ', QUOTE(v_status), ', NOW(), ', v_source_note,
|
||||||
' FROM ', v_tablename, ' WHERE ', v_source_pk, ' = ''', p_source_pk_value, ''''
|
' FROM ', v_tablename, ' WHERE ', v_source_pk, ' = ', QUOTE(p_source_pk_value)
|
||||||
);
|
);
|
||||||
END IF;
|
END IF;
|
||||||
END IF;
|
END IF;
|
||||||
|
|||||||
Reference in New Issue
Block a user