Files
Omni_kernel.db/permission/zen_dynamicmenu.txt
T
2026-02-06 15:09:39 +08:00

402 lines
18 KiB
Plaintext

DELIMITER //
CREATE OR REPLACE PROCEDURE zen_dynamicMenu(
IN p_token VARCHAR(100),
IN p_moduleid VARCHAR(10),
IN p_ip VARCHAR(100),
IN p_db1 VARCHAR(100),
IN p_db2 VARCHAR(100)
)
/*
Function : 根據 menu 產生 amis 所需的 site.json 內容
Description: 每一筆 menu 都預設先有一個 00 role(EveryOne)
Build Date : 2021/08/14
CALL zen_dynamicMenu('89b179f7-72a0-11f0-9c5f-d8bbc15c1404','zen','https://api.gex.com.tw:8033','EIS_demo','EIS_demo');
Modify History
Item Who Date Modify Docs
==== ========== ========== ================================================
1 Michael 2022-05-05 微調2個判斷, 避免組出的 site menu 因逗號錯誤無法顯示 menu
2 Michael 2022-05-21 修改 @ip 內容(配合 https 的大改版), 刪除原程式的 http:// 內容
3 Michael 2023-02-01 為了更加彈性, @ip 及 @db 這2個欄位改傳入 ${ls:xxxx}, 測試可行(程式要調整前端呼叫的程式)
4 Michael 2023-02-04 修改 menu 的排序, 改為依 seq_no(原先是 menuid)
5 Michael 2023-04-04 改依參數檔設定的程式版本別
6 Michael 2023-04-22 新增 Wizard 為 zen 模組的相關判斷
*/
BEGIN
DECLARE v_rets, v_ret_menu, v_all_menu, v_myfavor LONGTEXT;
DECLARE v_userid VARCHAR(20);
DECLARE v_imax1, v_imax2, v_y1, v_y2, v_x1, v_x2 INT DEFAULT 0;
DECLARE v_pid, v_id1, v_name1, v_id2, v_name2 VARCHAR(100);
DECLARE v_isLocalMenu, v_crlf, v_comma CHAR(1);
DECLARE v_ver_type, v_wizard_model VARCHAR(100);
-- 宣告一級選單游標
DECLARE cur_menu00 CURSOR FOR
SELECT menuid, caption
FROM tmp_menu00
ORDER BY rowid;
-- 宣告二級選單游標
DECLARE cur_menu99 CURSOR FOR
SELECT parent_menuid, menuid, caption, isLocalMenu
FROM tmp_menu99
ORDER BY rowid;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET @done = TRUE;
-- 初始化變數
SET v_crlf = CHAR(10);
SET v_wizard_model = 'zen';
-- 取得版本類型(預設 beta)
SELECT COALESCE(pvalue, 'beta') INTO v_ver_type
FROM sys_parameter
WHERE systemid = 'base' AND pid = 'ver_type'
LIMIT 1;
-- 根據 token 取得使用者 ID
SELECT userid INTO v_userid
FROM sys_users
WHERE token = p_token
LIMIT 1;
-- 建立臨時表 (取代原來的表變數)
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_menu00 (
menuid VARCHAR(100),
caption NVARCHAR(100),
rowid INT AUTO_INCREMENT PRIMARY KEY
);
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_menu99 (
parent_menuid VARCHAR(100),
menuid VARCHAR(100),
caption NVARCHAR(100),
isLocalMenu CHAR(1),
rowid INT AUTO_INCREMENT PRIMARY KEY
);
TRUNCATE TABLE tmp_menu00;
TRUNCATE TABLE tmp_menu99;
-- 插入一級選單 (排序用)
INSERT INTO tmp_menu00 (menuid, caption)
SELECT DISTINCT m.menuid, m.caption
FROM sys_menutable m
WHERE m.moduleid = p_moduleid
AND (
EXISTS (
SELECT 1
FROM sys_rolemenusecurity rms
JOIN sys_userroles ur ON ur.roleid = rms.roleid
WHERE ur.userid = v_userid
AND rms.controlname = 'read'
AND rms.menuid = m.menuid
)
OR EXISTS (
SELECT 1
FROM sys_rolemenusecurity rms
WHERE rms.roleid = '00'
AND rms.menuid = m.menuid
)
)
AND COALESCE(m.parent_menuid, '') = ''
ORDER BY (SELECT seq_no FROM sys_menutable WHERE menuid = m.menuid);
-- 插入二級選單 (排序用)
INSERT INTO tmp_menu99 (parent_menuid, menuid, caption, isLocalMenu)
SELECT DISTINCT m.parent_menuid, m.menuid, m.caption, COALESCE(m.isLocalMenu, 'N')
FROM sys_menutable m
WHERE m.moduleid = p_moduleid
AND (
EXISTS (
SELECT 1
FROM sys_rolemenusecurity rms
JOIN sys_userroles ur ON ur.roleid = rms.roleid
WHERE ur.userid = v_userid
AND rms.controlname = 'read'
AND rms.menuid = m.menuid
)
OR EXISTS (
SELECT 1
FROM sys_rolemenusecurity rms
WHERE rms.roleid = '00'
AND rms.menuid = m.menuid
)
)
AND COALESCE(m.parent_menuid, '') <> ''
ORDER BY m.parent_menuid, (SELECT seq_no FROM sys_menutable WHERE menuid = m.menuid);
-- 取得我的最愛選單
SET v_myfavor = udf_myfavor(p_moduleid, v_userid, v_ver_type, p_ip, p_db2);
-- 初始化固定 JSON 結構
SET v_rets = CONCAT(
'{', v_crlf,
' "pages": [', v_crlf,
' {', v_crlf,
' "label": "Home",', v_crlf,
' "url": "/",', v_crlf,
' "redirect": "/', CASE WHEN p_moduleid = 'bpm' THEN 'bpm' ELSE 'sys' END, '/dashboard"', v_crlf,
' },', v_crlf,
' {', v_crlf,
' "children": [', v_crlf
);
-- 加入 Dashboard 項目
IF p_moduleid <> 'bpm' THEN
SET v_rets = CONCAT(v_rets,
' {', v_crlf,
' "label": "Dash Board",', v_crlf,
' "url": "/sys/dashboard",', v_crlf,
' "icon": "fas fa-chart-pie",', v_crlf,
' "schemaApi": "get:/pages/sys-dashboard.json"', v_crlf,
' },', v_crlf,
' {', v_crlf,
' "label": "電子簽核主頁",', v_crlf,
' "visible": false,', v_crlf,
' "url": "/bpm/dashboard",', v_crlf,
' "icon": "fas fa-chart-pie",', v_crlf,
' "schemaApi": "get:/pages/bpm-dashboard.json"', v_crlf,
' }', v_crlf
);
ELSE
SET v_rets = CONCAT(v_rets,
' {', v_crlf,
' "label": "電子簽核主頁",', v_crlf,
' "url": "/bpm/dashboard",', v_crlf,
' "icon": "fas fa-chart-pie",', v_crlf,
' "schemaApi": "get:/pages/bpm-dashboard.json"', v_crlf,
' },', v_crlf,
' {', v_crlf,
' "label": "Dash Board",', v_crlf,
' "visible": false,', v_crlf,
' "url": "/sys/dashboard",', v_crlf,
' "icon": "fas fa-chart-pie",', v_crlf,
' "schemaApi": "get:/pages/sys-dashboard.json"', v_crlf,
' }', v_crlf
);
END IF;
-- 加入我的最愛
SET v_rets = CONCAT(v_rets,
' ]', v_crlf,
' },', v_crlf,
v_myfavor, v_crlf
-- CASE WHEN v_myfavor IS NOT NULL AND v_myfavor <> '' THEN
-- CONCAT(v_crlf, ',') -- 只有當有內容時才加逗號和內容
-- ELSE v_crlf
-- END
);
-- 處理一級選單
SET v_imax1 = (SELECT COALESCE(MAX(rowid), 0) FROM tmp_menu00);
SET v_y1 = 1;
WHILE v_y1 <= v_imax1 DO
-- 取得一級選單資料
SELECT menuid, caption INTO v_id1, v_name1
FROM tmp_menu00
WHERE rowid = v_y1;
SET v_ret_menu = CONCAT(
' {', v_crlf,
' "children": [', v_crlf,
' {', v_crlf,
' "label": "', v_name1, '",', v_crlf,
' "url": "/', p_moduleid, '",', v_crlf,
' "icon": "fa fa-cube",', v_crlf,
' "children": [', v_crlf
);
-- 處理二級選單
SET v_imax2 = (SELECT COALESCE(MAX(rowid), 0) FROM tmp_menu99 WHERE parent_menuid = v_id1);
SET v_y2 = (SELECT COALESCE(MIN(rowid), 0) FROM tmp_menu99 WHERE parent_menuid = v_id1);
WHILE v_y2 <= v_imax2 DO
-- 取得二級選單資料
SELECT menuid, caption, isLocalMenu INTO v_id2, v_name2, v_isLocalMenu
FROM tmp_menu99
WHERE rowid = v_y2
AND parent_menuid = v_id1;
-- 判斷是否為最後一項
IF v_y2 = v_imax2 THEN
SET v_comma = '';
ELSE
SET v_comma = ',';
END IF;
-- 根據是否為本地選單生成不同結構
IF v_isLocalMenu = 'Y' THEN
SET v_ret_menu = CONCAT(v_ret_menu,
' {', v_crlf,
' "label": "', v_name2, '",', v_crlf,
' "url": "/', p_moduleid, '/', v_id2, '",', v_crlf,
' "schemaApi": "get:/pages/', v_id2, '.json"', v_crlf,
' }', v_comma, v_crlf
);
ELSE
SET v_ret_menu = CONCAT(v_ret_menu,
' {', v_crlf,
' "label": "', v_name2, '",', v_crlf,
' "url": "/', p_moduleid, '/', v_id2, '",', v_crlf,
' "schemaApi": {', v_crlf,
' "method": "post",', v_crlf,
' "url": "', p_ip, '/xapi/v2/', p_db2, '/zen_showsource/0/",', v_crlf,
' "data": {', v_crlf,
' "para01": "', v_id2, '",', v_crlf,
' "para02": "', v_ver_type, '",', v_crlf,
' "para03": "', p_ip, '"', v_crlf,
' },', v_crlf,
' "dataType": "form"', v_crlf,
' }', v_crlf,
' }', v_comma, v_crlf
);
END IF;
-- 特殊處理 Wizard 模組
IF (v_id2 = 'zen01' OR v_id2 = 'zen11') AND p_moduleid = v_wizard_model THEN
-- 加入四項 Wizard 相關功能
SET v_ret_menu = CONCAT(v_ret_menu,
' {', v_crlf,
' "label": "Wizard Function",', v_crlf,
' "url": "/', v_wizard_model, '/function",', v_crlf,
' "visible": false,', v_crlf,
' "schemaApi": {', v_crlf,
' "method": "post",', v_crlf,
' "url": "', p_ip, '/xapi/v2/', p_db2, '/zen_showsource/0/",', v_crlf,
' "data": {', v_crlf,
' "para01": "zen02",', v_crlf,
' "para02": "', v_ver_type, '",', v_crlf,
' "para03": "', p_ip, '"', v_crlf,
' },', v_crlf,
' "dataType": "form"', v_crlf,
' }', v_crlf,
' },', v_crlf,
' {', v_crlf,
' "label": "Wizard Fields",', v_crlf,
' "url": "/', v_wizard_model, '/fields",', v_crlf,
' "visible": false,', v_crlf,
' "schemaApi": {', v_crlf,
' "method": "post",', v_crlf,
' "url": "', p_ip, '/xapi/v2/', p_db2, '/zen_showsource/0/",', v_crlf,
' "data": {', v_crlf,
' "para01": "zen03",', v_crlf,
' "para02": "', v_ver_type, '",', v_crlf,
' "para03": "', p_ip, '"', v_crlf,
' },', v_crlf,
' "dataType": "form"', v_crlf,
' }', v_crlf,
' },', v_crlf,
' {', v_crlf,
' "label": "Query Wizard Function",', v_crlf,
' "url": "/', v_wizard_model, '/query_function",', v_crlf,
' "visible": false,', v_crlf,
' "schemaApi": {', v_crlf,
' "method": "post",', v_crlf,
' "url": "', p_ip, '/xapi/v2/', p_db2, '/zen_showsource/0/",', v_crlf,
' "data": {', v_crlf,
' "para01": "zen12",', v_crlf,
' "para02": "', v_ver_type, '",', v_crlf,
' "para03": "', p_ip, '"', v_crlf,
' },', v_crlf,
' "dataType": "form"', v_crlf,
' }', v_crlf,
' },', v_crlf,
' {', v_crlf,
' "label": "Query Wizard Fields",', v_crlf,
' "url": "/', v_wizard_model, '/query_fields",', v_crlf,
' "visible": false,', v_crlf,
' "schemaApi": {', v_crlf,
' "method": "post",', v_crlf,
' "url": "', p_ip, '/xapi/v2/', p_db2, '/zen_showsource/0/",', v_crlf,
' "data": {', v_crlf,
' "para01": "zen13",', v_crlf,
' "para02": "', v_ver_type, '",', v_crlf,
' "para03": "', p_ip, '"', v_crlf,
' },', v_crlf,
' "dataType": "form"', v_crlf,
' }', v_crlf,
' }', v_comma, v_crlf
);
END IF;
SET v_y2 = v_y2 + 1;
END WHILE;
-- 關閉一級選單結構
SET v_ret_menu = CONCAT(v_ret_menu,
' ]', v_crlf,
' }', v_crlf,
' ]', v_crlf,
' }'
);
-- 加入開發測試區(僅 Wizard 模組的最後一項)
IF v_y1 = v_imax1 AND p_moduleid = v_wizard_model THEN
SET v_ret_menu = CONCAT(v_ret_menu, ',', v_crlf,
' {', v_crlf,
' "children": [', v_crlf,
' {', v_crlf,
' "label": "開發公測區",', v_crlf,
' "url": "/dev",', v_crlf,
' "icon": "fab fa-dev",', v_crlf,
-- ' "visibleOn": "1=0",', v_crlf,
' "children": [', v_crlf,
' {', v_crlf,
' "label": "測試程式01",', v_crlf,
' "url": "/dev/dev01",', v_crlf,
' "schemaApi": "get:/pages/dev-test01.json"', v_crlf,
' },', v_crlf,
' {', v_crlf,
' "label": "測試程式02",', v_crlf,
' "url": "/dev/dev02",', v_crlf,
' "schemaApi": "get:/pages/dev-test02.json"', v_crlf,
' },', v_crlf,
' {', v_crlf,
' "label": "測試程式03",', v_crlf,
' "url": "/dev/dev03",', v_crlf,
' "schemaApi": "get:/pages/dev-test03.json"', v_crlf,
' }', v_crlf,
' ]', v_crlf,
' }', v_crlf,
' ]', v_crlf,
' }'
);
END IF;
-- 判斷是否為最後一項
IF v_y1 = v_imax1 THEN
SET v_comma = '';
ELSE
SET v_comma = ',';
END IF;
SET v_ret_menu = CONCAT(v_ret_menu, v_comma, v_crlf);
SET v_all_menu = CONCAT(COALESCE(v_all_menu, ''), v_ret_menu);
SET v_y1 = v_y1 + 1;
END WHILE;
-- 組合最終 JSON
IF v_imax1 <= 0 THEN
-- 移除最後的逗號,保留換行
IF RIGHT(v_rets, 11) = '},\n\n ]\n}' THEN
SET v_rets = CONCAT(LEFT(v_rets, CHAR_LENGTH(v_rets) - 8), '\n\n ]\n}');
ELSEIF RIGHT(v_rets, 3) = '},\n' THEN
SET v_rets = CONCAT(LEFT(v_rets, CHAR_LENGTH(v_rets) - 2), '\n ]', v_crlf, '}');
ELSE
SET v_rets = CONCAT(v_rets, ' ]', v_crlf, '}');
END IF;
ELSE
SET v_rets = CONCAT(v_rets, v_all_menu, v_crlf, ' ]', v_crlf, '}');
END IF;
-- 返回結果
SELECT 0 AS code, '選單生成成功!' AS msg;
SELECT v_rets AS jsoncode;
-- 清理臨時表
DROP TEMPORARY TABLE IF EXISTS tmp_menu00;
DROP TEMPORARY TABLE IF EXISTS tmp_menu99;
END //
DELIMITER ;