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

258 lines
11 KiB
Plaintext

DELIMITER //
CREATE OR REPLACE FUNCTION zen_get_ext_button(
p_functionTag VARCHAR(20),
p_button_type CHAR(1),
p_ip VARCHAR(100), -- 'https://api.gex.com.tw:5443'
p_db VARCHAR(100) -- 'zenBusiness'
)
RETURNS TEXT
/*
function : 回傳擴充 button 的設定內容
description:
build date : 2022/2/5
call sample:
SELECT zen_get_ext_button('basm67','U');
modify history
item who date modify docs
==== ========== ========== ================================================
1 Michael 2022-2-5 新增
2 Michael 2023-1-29 重新想清處並定義相關設定, 然後修改相關程式, 詳細請參見註解
3 Michael 2023-02-01 為了更加彈性, @ip 及 @db 這2個欄位改傳入 ${ls:xxxx}, 測試可行(程式要調整前端呼叫的程式)
*/
BEGIN
DECLARE v_cnt INT;
DECLARE v_crlf VARCHAR(2);
DECLARE v_comma VARCHAR(1);
DECLARE v_fcaption VARCHAR(100);
DECLARE v_icon VARCHAR(100);
DECLARE v_related_menuid VARCHAR(100);
DECLARE v_rets TEXT;
DECLARE v_para_field VARCHAR(100);
DECLARE v_new_para_field VARCHAR(100);
DECLARE v_ls_paras_field VARCHAR(100); -- button 按下後, 要帶到另一個表單的 pk 值
DECLARE v_ls_paras_no INT; -- 參數代號 zenutil.js -> function local_set_params(id, value)
DECLARE v_imax INT;
DECLARE v_inow INT;
--
DECLARE p_uuid VARCHAR(100);
DECLARE v_sp_name VARCHAR(100); -- sp_name
DECLARE v_para1 VARCHAR(100); -- 有 token 一定要放在第一個
DECLARE v_para2 VARCHAR(100);
DECLARE v_para3 VARCHAR(100);
DECLARE v_para4 VARCHAR(100);
DECLARE v_data_para1 VARCHAR(200);
DECLARE v_data_para2 VARCHAR(200);
-- 臨時表儲存 JSON 數據
DROP TEMPORARY TABLE IF EXISTS temp_jsondata;
CREATE TEMPORARY TABLE temp_jsondata (
rowid INT AUTO_INCREMENT PRIMARY KEY,
fcaption VARCHAR(20),
icon VARCHAR(50),
related_menuid VARCHAR(200), -- 關聯功能(或是呼叫某 sp)
para_field VARCHAR(100),
ls_paras_field VARCHAR(100),
ls_paras_no INT
);
SET v_crlf = CONCAT(CHAR(13), CHAR(10));
-- 插入資料到臨時表
INSERT INTO temp_jsondata (fcaption, icon, related_menuid, para_field, ls_paras_field, ls_paras_no)
SELECT
fcaption, icon, related_menuid, para_field, ls_paras_field, ls_paras_no
FROM zen_function_button fn
WHERE fn.FunctionTag = p_functionTag AND button_type = p_button_type
ORDER BY buttonid;
-- 回傳 options []
SELECT COUNT(*) INTO v_imax FROM temp_jsondata;
SET v_inow = 1;
SET v_rets = '';
SET v_comma = ',';
WHILE v_inow <= v_imax DO
-- 取得當前行數據
SELECT fcaption, icon, related_menuid, para_field, ls_paras_field, ls_paras_no
INTO v_fcaption, v_icon, v_related_menuid, v_para_field, v_ls_paras_field, v_ls_paras_no
FROM temp_jsondata
WHERE rowid = v_inow;
IF IFNULL(v_icon, '') = '' THEN
SET v_icon = 'fas fa-binoculars';
END IF;
IF IFNULL(v_ls_paras_no, 0) = 0 THEN
SET v_ls_paras_no = 0;
END IF;
/*
只要後 2個參數 ls_paras_field,ls_paras_no 有值, 就表示是呼叫外部專案, 否則就只是單純的 v_new_para_field
接下來, 判斷 para_field 是否為空
a.如果為空, 表示要傳入 ls_paras_field 這個欄位的值
b.如果不為空, 且首碼為 _ , 表示要傳入固定字串, 否則還是傳入 ls_paras_field 這個欄位的值(自定義變數, 防錯而已)
Michael 2023-1-29 好難理解阿, 會這麼複雜, 是因為不斷擴充定義, 且沒有完全考慮清楚的後果, 目前這樣定義應該是 OK 的
*/
SET v_data_para1 = '';
SET v_data_para2 = '';
SET v_new_para_field = '';
-- 取得傳遞參數的資料
IF IFNULL(v_ls_paras_field, '') <> '' AND IFNULL(v_ls_paras_no, 0) > 0 THEN
-- 防錯碼(重複設定)
IF IFNULL(v_para_field, '') = CONCAT('_', v_ls_paras_field) THEN
SET v_para_field = '';
END IF;
IF IFNULL(v_para_field, '') = '' THEN
SET v_data_para1 = CONCAT(',', v_crlf, ' "_', v_ls_paras_field, '": "${', v_ls_paras_field, '}"', v_crlf);
SET v_data_para2 = CONCAT(',', v_crlf, ' "requestAdaptor": "local_set_params(', CAST(v_ls_paras_no AS CHAR), ',api.data._', v_ls_paras_field, '); return { ...api, data: { ...api.data }};"', v_crlf);
ELSEIF SUBSTRING(v_para_field, 1, 1) = '_' THEN
-- 表示要傳入固定值內容, 非欄位值內容
SET v_data_para1 = CONCAT(',', v_crlf, ' "', v_para_field, '": "', v_ls_paras_field, '"', v_crlf);
SET v_data_para2 = CONCAT(',', v_crlf, ' "requestAdaptor": "local_set_params(', CAST(v_ls_paras_no AS CHAR), ',api.data.', v_para_field, '); return { ...api, data: { ...api.data }};"', v_crlf);
ELSE
-- 要自己命名變數(防錯而已, 不應有此設定)
SET v_data_para1 = CONCAT(',', v_crlf, ' "_', v_para_field, '": "${', v_ls_paras_field, '}"', v_crlf);
SET v_data_para2 = CONCAT(',', v_crlf, ' "requestAdaptor": "local_set_params(', CAST(v_ls_paras_no AS CHAR), ',api.data._', v_para_field, '); return { ...api, data: { ...api.data }};"', v_crlf);
END IF;
ELSE
IF IFNULL(v_para_field, '') <> '' THEN
SET v_new_para_field = CONCAT('@${', v_para_field, '}');
END IF;
END IF;
-- 新支援 button call sp 並傳參數
IF LOCATE(',', v_related_menuid) > 0 THEN
IF IFNULL(v_icon, '') = '' THEN
SET v_icon = 'fab fa-angellist text-success';
END IF;
-- 取出 sp 及參數(目前做多允許 4 個參數)
SET p_uuid = UUID();
CALL gp_split(p_uuid, v_related_menuid,',');
select col INTO v_sp_name from _split where guid = p_uuid and rowid = 1;
select col INTO v_para1 from _split where guid = p_uuid and rowid = 2;
select col INTO v_para2 from _split where guid = p_uuid and rowid = 3;
select col INTO v_para3 from _split where guid = p_uuid and rowid = 4;
select col INTO v_para4 from _split where guid = p_uuid and rowid = 5;
DELETE FROM _split WHERE guid = p_uuid;
-- 要特殊控制 db, 目前先 hard code 2023-02-04 Michael
IF v_sp_name = 'zen_showsource' THEN
SET p_db = '${ls:wizard_db}';
END IF;
IF IFNULL(v_para1, '') = '' THEN SET v_para1 = ''; END IF;
IF IFNULL(v_para2, '') = '' THEN SET v_para2 = ''; END IF;
IF IFNULL(v_para3, '') = '' THEN SET v_para3 = ''; END IF;
IF IFNULL(v_para4, '') = '' THEN SET v_para4 = ''; END IF;
IF v_para1 = 'token' THEN
SET v_para1 = CONCAT(' "token": "${ls:token}"', IF(v_para2 = '', '', ','), v_crlf);
IF v_para2 <> '' THEN
SET v_para2 = CONCAT(' "para02": "${', v_para2, '}"', IF(v_para3 = '', '', ','), v_crlf);
END IF;
IF v_para3 <> '' THEN
SET v_para3 = CONCAT(' "para03": "${', v_para3, '}"', IF(v_para4 = '', '', ','), v_crlf);
END IF;
IF v_para4 <> '' THEN
SET v_para4 = CONCAT(' "para04": "${', v_para4, '}"', v_crlf);
END IF;
ELSE
IF v_para1 <> '' THEN
SET v_para1 = CONCAT(' "para01": "${', v_para1, '}"', IF(v_para2 = '', '', ','), v_crlf);
END IF;
IF v_para2 <> '' THEN
SET v_para2 = CONCAT(' "para02": "${', v_para2, '}"', IF(v_para3 = '', '', ','), v_crlf);
END IF;
IF v_para3 <> '' THEN
SET v_para3 = CONCAT(' "para03": "${', v_para3, '}"', IF(v_para4 = '', '', ','), v_crlf);
END IF;
IF v_para4 <> '' THEN
SET v_para4 = CONCAT(' "para04": "${', v_para4, '}"', v_crlf);
END IF;
END IF;
-- button & call sp
SET v_rets = CONCAT(v_rets,
'{', v_crlf,
' "type": "button",', v_crlf,
' "icon": "', v_icon, '",', v_crlf,
' "actionType": "ajax",', v_crlf,
' "tooltip": "', v_fcaption, '",', v_crlf,
' "confirmText": "確定要執行本作業?",', v_crlf, -- 將本公告設為已讀
' "api": {', v_crlf,
' "method": "post",', v_crlf,
' "url": "', p_ip, '/xapi/v2/', p_db, '/', v_sp_name, '/1/",', v_crlf,
' "data": {', v_crlf,
v_para1, v_para2, v_para3, v_para4,
' },', v_crlf,
' "dataType": "form"', v_crlf,
' }', v_crlf,
' }', v_comma, v_crlf);
SET v_inow = v_inow + 1;
ELSE
/*
此處目前總共有3種情況, 稍後繼續改
1.呼叫擴充子表單, 如 person call person_agent, 要傳 personid
2.呼叫另一支程式, 如 會議記錄 call 協同工作單, 要傳 functiontag (來源單別)
3.呼叫外部專案程式, 如行事曆 call FullCalendar, 傳參必須透過 local_set_params
4.執行 sp, (在前一段程式專門處理了)
5.其他(目前無)
related_menuid 關聯表單代號
para_field 傳參欄名 -> 欄位名稱前是否要加 _ , 主要是看是否為外部專案程式, 如果是呼叫外部程式, 才要加 _ , 且要在 data 區定義
ls_paras_field 擴充參數名
ls_paras_no 參數代碼
PS: 昨天晚上查了半天, 怎麼我產生的程式 ${ls:query_id} 都不見了, 後來才發現是因為 zen_showsource 這支 core sp 會在顯示 Code 時 replace
資料庫中的 code 是 ok 的。所以這並不是問題, 一個問題是因為現在是利用 orm_api 的 para 8, 這個機制一般 ok,
但是 basperson_agent 同時有 personid 和 agentid 時就有問題, 可能要改用 para 9/10 才行, Thinking
*/
SET v_rets = CONCAT(v_rets,
'{', v_crlf,
' "type": "button",', v_crlf,
-- Inner 不須加 title, level 可以後續手動修改
IF(p_button_type = 'U',
CONCAT(' "label": "', v_fcaption, '",', v_crlf,
' "level": "success",', v_crlf),
''),
' "icon": "', v_icon, '",', v_crlf,
' "actionType": "dialog",', v_crlf,
' "tooltip": "', v_fcaption, '",', v_crlf,
' "dialog": {', v_crlf,
' "//title": "新增-', v_fcaption, '",', v_crlf,
' "actions": [],', v_crlf,
' "size": "full",', v_crlf,
' "body": {', v_crlf,
' "type": "service",', v_crlf,
' "schemaApi": {', v_crlf,
' "method": "post",', v_crlf,
' "url": "', p_ip, '/xapi/v2/${ls:wizard_db}/zen_showsource/0/",', v_crlf,
' "data": {', v_crlf,
' "para01": "', v_related_menuid, '",', v_crlf,
' "para02": "beta', v_new_para_field, '"', v_crlf,
v_data_para1,
' },', v_crlf,
' "dataType": "form"', v_crlf,
v_data_para2,
' }', v_crlf,
' }', v_crlf,
' }', v_crlf,
' }', v_comma, v_crlf);
SET v_inow = v_inow + 1;
END IF;
END WHILE;
DROP TEMPORARY TABLE IF EXISTS temp_jsondata;
RETURN IFNULL(v_rets, '');
END //
DELIMITER ;