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 ;