DELIMITER // CREATE OR REPLACE PROCEDURE zen_create_json_v2( IN p_FunctionTag VARCHAR(100), IN p_code_id VARCHAR(100) -- Wizard Template Id ) /* function : amis Wizard 產生程式的核心程式(Single / Master-Detail) description: 測試時發現還是有長度的限制, 大約超過 1500 行左右, 就會因為長度被截掉的問題而報錯(這是 SQL 本身的問題(寫入 db時會被截掉), 和 amis 無關) 長度問題暫時無解, 目前先改為寫到 3個欄位(40000 字左右為一欄), 只能用原始的 json 存放程式, menu 要多一個外部 json 設定 隨著支援的功能愈來越多, 超過 40000 字應該會是常態, 所以外部 json 應該會是常態(menu 多一個 isLocalMenu 的欄位設定, 測試 ok) build date : 2023-12-19 call sample: CALL zen_create_json_v2('crmm02','MasterDetailTabs'); CALL zen_create_json_v2('basm63','SingleGrid'); -- 單據明細查詢表單 CALL zen_create_json_v2('crmm02_v','MasterDetail-View'); CALL zen_create_json_v2('basm67_i','SingleEntry-Insert'); modify history item who date modify docs ==== ========== ========== ================================================ 1 Michael 2023-12-19 開始重構為 v2.0(先 copy v1 完整 source from 20231215) */ BEGIN DECLARE v_uuid CHAR(36); DECLARE v_FunctionTag_org VARCHAR(100); DECLARE v_funcName VARCHAR(100); DECLARE v_tblName VARCHAR(100); DECLARE v_pk VARCHAR(100); DECLARE v_database VARCHAR(100); DECLARE v_detail_table VARCHAR(100); DECLARE v_detail_key VARCHAR(100); DECLARE v_isautoinc VARCHAR(1); DECLARE v_aside_setup VARCHAR(100); DECLARE v_aside_field VARCHAR(100); DECLARE v_query_type VARCHAR(1); DECLARE v_op_width INT; DECLARE v_is_bpm VARCHAR(1); DECLARE v_is_extend VARCHAR(1); DECLARE v_detail_sort_fieldname VARCHAR(20); SET v_uuid = UUID(); -- v2: 欲處理資料, 變數寫入 zen_wizard_tmp 暫存表 DELETE FROM zen_wizard_tmp WHERE create_date < DATE_SUB(NOW(), INTERVAL 1 DAY); DELETE FROM zen_wizard_jsondata WHERE create_date < DATE_SUB(NOW(), INTERVAL 1 DAY); -- v2: 重新設定 /* 配合 Wizard 有一併支援 view only, insert only 等不完全程式 p_FunctionTag = crmm02 產生查詢專用的 ViewForm v_FunctionTag_org = crmm02_V p_code_id = */ SET v_FunctionTag_org = p_FunctionTag; -- 保留原代號 CALL zen_create_json_reset_codeid(v_uuid, p_FunctionTag, p_code_id, v_query_type); -- 重新讀出變數值 SELECT zen_value INTO p_FunctionTag FROM zen_wizard_tmp WHERE uuid = v_uuid AND zen_key = 'FunctionTag'; SELECT zen_value INTO p_code_id FROM zen_wizard_tmp WHERE uuid = v_uuid AND zen_key = 'code_id'; -- get data from zen_function SELECT fn.FunctionName, fn.MainTable, fn.MainKey, pm.api_DBName, fn.detail_table, fn.detail_key, fn.isautoinc, fn.aside_setup, fn.aside_field, fn.query_type, fn.op_width, fn.is_bpm, fn.is_extend, fn.detail_sort_fieldname INTO v_funcName, v_tblName, v_pk, v_database, v_detail_table, v_detail_key, v_isautoinc, v_aside_setup, v_aside_field, v_query_type, v_op_width, v_is_bpm, v_is_extend, v_detail_sort_fieldname FROM zen_function fn LEFT JOIN zen_project pm ON fn.projectid = pm.projectid WHERE fn.FunctionTag = p_FunctionTag; -- v2: 將主要的 dataset 整理後寫入 CALL zen_create_json_prepare_ds('M', v_uuid, p_FunctionTag); -- v2: 資料預處理 CALL zen_create_json_prepare(v_uuid, p_FunctionTag, p_code_id, v_is_extend, v_query_type, v_funcName, v_tblName, v_pk, v_database, v_op_width); -- 如果 PK 是 identity, 則強制設為 readonly IF IFNULL(v_isautoinc, 'N') = 'Y' THEN UPDATE zen_fields SET fieldro = 'Y' WHERE FunctionTag = p_FunctionTag AND tablename = v_tblName AND fieldname = v_pk; END IF; -- v2: aside CALL zen_create_json_prepare_aside(v_uuid, v_aside_setup); -- v2: 關於 master-detail 的相關設定(TBD) CALL zen_create_json_prepare_detaildata(v_uuid, p_FunctionTag, p_code_id, v_detail_table, v_detail_key, v_detail_sort_fieldname, v_query_type); -- v2: Grid Header 處理(Fields loops) CALL zen_create_json_prepare_gridquery(v_uuid, v_query_type); /* 以下是核心, 主要是準備 gen code 的前置作業 */ -- v2: kernel compoment CALL zen_create_json_kernel(v_uuid, p_FunctionTag, v_tblName, v_pk, v_query_type, p_code_id); -- v2: 將暫存資料整理並寫入 CALL zen_create_json_final(v_uuid, p_FunctionTag, p_code_id, v_is_extend, v_pk, v_is_bpm, v_FunctionTag_org); END // DELIMITER ;