DELIMITER // CREATE OR REPLACE PROCEDURE zen_create_json_prepare( IN p_uuid VARCHAR(100), IN p_FunctionTag VARCHAR(100), IN p_code_id VARCHAR(100), -- Wizard Template Id IN p_is_extend VARCHAR(1), IN p_query_type VARCHAR(1), IN p_funcName VARCHAR(100), IN p_tblName VARCHAR(100), IN p_pk VARCHAR(100), IN p_database VARCHAR(100), IN p_op_width INT ) /* 功能 : amis Wizard 產生 json UI 的欲處理核心程式(通常是非 Fields 的相關獨立設定) 描述: 本段 sp 主要是 1.修正原 Wizard 資料表中的預設值 2.設定一些 button, picker 及預設值的 json 定義 建立日期 : 2023/12/22 修改歷史 項目 誰 日期 修改說明 ==== ========== ========== ================================================ 1 Michael 2023/12/22 根據 v1.0 重構 */ BEGIN DECLARE v_ip VARCHAR(100); DECLARE v_db VARCHAR(100); DECLARE v_ext_button_U TEXT; DECLARE v_ext_button_I TEXT; DECLARE v_frequency VARCHAR(100); DECLARE v_menuid VARCHAR(100); DECLARE v_imax INT; DECLARE v_y INT; DECLARE v_cnt INT; DECLARE v_imin INT; DECLARE v_picker_datas TEXT; DECLARE v_fieldnames VARCHAR(600); DECLARE v_FieldName VARCHAR(100); DECLARE v_iscolumnmatch VARCHAR(1); DECLARE v_crlf VARCHAR(2); DECLARE v_lastsep VARCHAR(1); DECLARE v_fielddefault VARCHAR(200); DECLARE v_insert_default VARCHAR(800); DECLARE v_update_default VARCHAR(800); DECLARE v_detail_fields VARCHAR(800); DECLARE v_formsize VARCHAR(100); DECLARE v_formsize_drawer VARCHAR(100); -- 專門給 Drawer 用的 Form Size(要配合修改 Template), 但是舊資料就有點麻煩 20230521 -- 通用寫法 SET v_crlf = CONCAT(CHAR(13), CHAR(10)); SET v_ip = '${ls:base_ip}'; SET v_db = '${ls:base_db}'; /* 待處理, 持續整理中 */ INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'is_query_header',CASE WHEN p_query_type = 'C' THEN 'true' ELSE 'false' END,NOW()); -- 簡單的固定變數也統一寫入暫存 INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'functionName',p_funcName,NOW()); INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'TableName',p_tblName,NOW()); INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'pk',p_pk,NOW()); INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'database',p_database,NOW()); INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'ip-port',v_ip,NOW()); INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'op-width',CAST(p_op_width AS CHAR),NOW()); -- transfer 的 initApi(在 trans 中累加即可) INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'init_api_org','',NOW()); -- 配合 md uuid 的 template 使用 INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'TableName:4_6',SUBSTRING(p_tblName,4,6),NOW()); /* 擴充 button 處理 2022-2-5(可能有多個 button), 分為2個位置 get data from zen_function_button */ SELECT zen_get_ext_button(p_FunctionTag,'U',v_ip,v_db) INTO v_ext_button_U; SELECT zen_get_ext_button(p_FunctionTag,'I',v_ip,v_db) INTO v_ext_button_I; -- 取得週期性的欄位名稱 SELECT FieldName INTO v_frequency FROM zen_fields WHERE FunctionTag = p_FunctionTag AND fieldObject = 'cycle-frequency'; -- 如果是擴充表單, 權限同主 Form (要加判斷) IF p_is_extend = 'Y' THEN IF LOCATE('_',p_FunctionTag) > 0 THEN SET v_menuid = SUBSTRING(p_FunctionTag,1,LOCATE('_',p_FunctionTag)-1); ELSE SET v_menuid = p_FunctionTag; END IF; ELSE SET v_menuid = p_FunctionTag; END IF; -- 將傳入的 json 寫入暫存表方便處理 INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'ext_button_U',v_ext_button_U,NOW()); INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'ext_button_I',v_ext_button_I,NOW()); INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'frequency',IFNULL(v_frequency,''),NOW()); INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'menuid',v_menuid,NOW()); /* picker 的 data */ SET v_y = 0; SET v_imax = 0; SET v_picker_datas = ''; SET v_lastsep = ''; SET v_cnt = 0; SELECT MIN(rowid) INTO v_y FROM zen_wizard_jsondata WHERE uuid = p_uuid; SELECT MAX(rowid) INTO v_imax FROM zen_wizard_jsondata WHERE uuid = p_uuid; WHILE v_y <= v_imax DO SELECT FieldName,iscolumnmatch INTO v_FieldName,v_iscolumnmatch FROM zen_wizard_jsondata WHERE uuid = p_uuid AND rowid = v_y; IF v_y = v_imax THEN SET v_lastsep = ''; ELSE SET v_lastsep = ','; END IF; -- 組出 @picker_datas@ IF v_iscolumnmatch = 'Y' THEN SET v_picker_datas = CONCAT(v_picker_datas, ' "', v_FieldName, '": "${', v_FieldName, '.', v_FieldName, ' === null | isTrue: ', v_FieldName, ' : ', v_FieldName, '.', v_FieldName, '}"', v_lastsep, v_crlf); SET v_cnt = v_cnt + 1; ELSE SET v_picker_datas = CONCAT(v_picker_datas, ' "', v_FieldName, '": "${', v_FieldName, '}"', v_lastsep, v_crlf); END IF; SET v_y = v_y + 1; END WHILE; IF v_cnt > 0 THEN SET v_picker_datas = CONCAT(' "data": {', v_crlf, CASE WHEN LOCATE('MasterDetail',p_code_id) > 0 THEN ' "details": "${details}",' ELSE '' END, v_crlf, v_picker_datas, ' },', v_crlf); END IF; INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'picker_datas',v_picker_datas,NOW()); /* 處理 default 的 data domain (@insert_default@, @update_default@) 預設值第一碼 Michael 20230909 @ 目前無任何設定, 我已經忘了原先是要定義甚麼 $ 表示設定值是 ${ls:userid} # 新增, 專門配合 picker 多回傳欄位用, 也要加 ${ls:userid} Michael 20230901 */ SET v_insert_default = ''; SET v_update_default = ''; SET v_lastsep = ''; -- 處理 $ 開頭的預設值 SELECT MAX(rowid) INTO v_imax FROM zen_wizard_jsondata WHERE uuid = p_uuid AND IFNULL(fielddefault,'') <> '' AND SUBSTRING(fielddefault,1,1) <> '@' AND LOCATE('$',fielddefault) > 0; SELECT MIN(rowid) INTO v_imin FROM zen_wizard_jsondata WHERE uuid = p_uuid AND IFNULL(fielddefault,'') <> '' AND SUBSTRING(fielddefault,1,1) <> '@' AND LOCATE('$',fielddefault) > 0; WHILE v_imin <= v_imax DO SELECT fieldname,fielddefault INTO v_FieldName,v_fielddefault FROM zen_wizard_jsondata WHERE uuid = p_uuid AND IFNULL(fielddefault,'') <> '' AND SUBSTRING(fielddefault,1,1) <> '@' AND LOCATE('$',fielddefault) > 0 AND rowid = v_imin; IF v_imin = v_imax THEN SET v_lastsep = ''; ELSE SET v_lastsep = ','; END IF; SET v_insert_default = CONCAT(v_insert_default, '"', v_FieldName, '": "${', SUBSTRING(v_fielddefault,2,100), '}"', v_lastsep, v_crlf); SELECT MIN(rowid) INTO v_imin FROM zen_wizard_jsondata WHERE uuid = p_uuid AND IFNULL(fielddefault,'') <> '' AND SUBSTRING(fielddefault,1,1) <> '@' AND LOCATE('$',fielddefault) > 0 AND rowid > v_imin; END WHILE; IF v_insert_default <> '' THEN SET v_insert_default = CONCAT('"data": { ', v_crlf, v_insert_default, ' },'); END IF; -- 處理 @ 開頭的預設值 SELECT MAX(rowid) INTO v_imax FROM zen_wizard_jsondata WHERE uuid = p_uuid AND IFNULL(fielddefault,'') <> '' AND SUBSTRING(fielddefault,1,1) = '@'; SELECT MIN(rowid) INTO v_imin FROM zen_wizard_jsondata WHERE uuid = p_uuid AND IFNULL(fielddefault,'') <> '' AND SUBSTRING(fielddefault,1,1) = '@'; WHILE v_imin <= v_imax DO SELECT fieldname,fielddefault INTO v_FieldName,v_fielddefault FROM zen_wizard_jsondata WHERE uuid = p_uuid AND IFNULL(fielddefault,'') <> '' AND SUBSTRING(fielddefault,1,1) = '@' AND rowid = v_imin; IF v_imin = v_imax THEN SET v_lastsep = ''; ELSE SET v_lastsep = ','; END IF; SET v_update_default = CONCAT(v_update_default, '"', v_FieldName, '": "${', SUBSTRING(v_fielddefault,3,100), '}"', v_lastsep, v_crlf); SELECT MIN(rowid) INTO v_imin FROM zen_wizard_jsondata WHERE uuid = p_uuid AND IFNULL(fielddefault,'') <> '' AND SUBSTRING(fielddefault,1,1) = '@' AND rowid > v_imin; END WHILE; IF v_update_default <> '' THEN SET v_update_default = CONCAT('"data": { ', v_crlf, v_update_default, ' },'); END IF; INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'insert_default',v_insert_default,NOW()); INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'update_default',v_update_default,NOW()); /* 以下是幾個一般設定, 就不獨立開 proc 寫 code 了 */ SELECT COUNT(*) INTO v_imax FROM zen_wizard_jsondata WHERE uuid = p_uuid; -- form size (xs,sm,md,lg,xl,full) Dialog 才有 full -- drawer 抽屉尺寸((xs,sm,md,lg,xl) IF v_imax <= 6 THEN SET v_formsize = 'md'; SET v_formsize_drawer = 'md'; ELSEIF v_imax < 25 THEN SET v_formsize = 'lg'; SET v_formsize_drawer = 'lg'; ELSE SET v_formsize = 'full'; SET v_formsize_drawer = 'xl'; END IF; INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'formsize',v_formsize,NOW()); INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'formsize_drawer',v_formsize_drawer,NOW()); END // DELIMITER ;