DELIMITER //

CREATE OR REPLACE PROCEDURE orm_exec_aftersave_v2(
  IN p_tablename VARCHAR(100),
  IN p_pk VARCHAR(100),         -- primary key(for update delete)
  IN p_action VARCHAR(10),
  IN p_userid VARCHAR(100)
)
/*
  功能: orm_api_v2 [存档后处理]的核心程序，智能构建相应SQL
  描述: 用于保存后执行额外处理逻辑
  创建日期: 2023/12/16
  MariaDB转换版本
*/
BEGIN
    DECLARE v_sp_name TEXT;
    DECLARE v_para01 TEXT;
    DECLARE v_para02 TEXT;
    DECLARE v_sql_command TEXT;
    DECLARE v_dest_table TEXT;
    DECLARE v_dest_field TEXT;
    DECLARE v_dest_field2 TEXT;
    DECLARE v_RelationKey TEXT;
    DECLARE v_filter_user_fieldname TEXT;
    DECLARE v_max_id INT;

    -- 取得 sys_transaction 信息
    SELECT 
        sp_name,
        para01,
        para02,
        dest_table,
        dest_field,
        dest_field2,
        RelationKey,
        filter_user_fieldname 
    INTO 
        v_sp_name,
        v_para01,
        v_para02,
        v_dest_table,
        v_dest_field,
        v_dest_field2,
        v_RelationKey,
        v_filter_user_fieldname
    FROM sys_transaction
    WHERE tablename = p_tablename AND (actiontype = '*' OR LOCATE(p_action, actiontype) > 0)
    LIMIT 1;

    IF v_sp_name IS NOT NULL AND v_sp_name != '' THEN
        -- 检查是否为特殊情况
        IF (v_sp_name != 'sys_transfer_owned2rolemenusecurity') AND (v_sp_name != 'sys_transfer_owned2userroles') THEN
            -- 如果 pk 是 identity
            IF v_para01 = 'identity' THEN
                -- 处理 identity 的情况
                IF IFNULL(v_filter_user_fieldname, '') = '' THEN
                    SET @sql = CONCAT('SELECT MAX(', p_pk, ') INTO @max_id FROM ', p_tablename);
                    PREPARE stmt FROM @sql;
                    EXECUTE stmt;
                    DEALLOCATE PREPARE stmt;
                    
                    SET v_sql_command = CONCAT('UPDATE sys_transaction SET para01 = ? WHERE tablename = ''', p_tablename, '''');
                    PREPARE stmt FROM v_sql_command;
                    EXECUTE stmt USING @max_id;
                    DEALLOCATE PREPARE stmt;
                ELSE
                    SET @sql = CONCAT('SELECT MAX(', p_pk, ') INTO @max_id FROM ', p_tablename, 
                                     ' WHERE ', v_filter_user_fieldname, ' = ''', p_userid, '''');
                    PREPARE stmt FROM @sql;
                    EXECUTE stmt;
                    DEALLOCATE PREPARE stmt;
                    
                    SET v_sql_command = CONCAT('UPDATE sys_transaction SET para01 = ? WHERE tablename = ''', p_tablename, '''');
                    PREPARE stmt FROM v_sql_command;
                    EXECUTE stmt USING @max_id;
                    DEALLOCATE PREPARE stmt;
                END IF;
            END IF;

            SET v_sql_command = CONCAT('CALL ', v_sp_name, '( ''', p_tablename, ''' )');
        ELSE
            -- 针对特殊情况特别改写 sp 的方案
            IF IFNULL(v_para01, '') != '' AND IFNULL(v_para02, '') != '' THEN
                SET v_sql_command = CONCAT('CALL ', v_sp_name, '( ''', v_para01, ''', ''', v_para02, ''' )');
            ELSEIF IFNULL(v_para01, '') != '' AND IFNULL(v_para02, '') = '' THEN
                SET v_sql_command = CONCAT('CALL ', v_sp_name, '( ''', v_para01, ''' )');
            ELSE 
                SET v_sql_command = CONCAT('CALL ', v_sp_name, '()');
            END IF;
        END IF;

        -- 执行 SQL
        SET @dynamic_sql = v_sql_command;
        PREPARE stmt FROM @dynamic_sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END IF;
END //

DELIMITER ;