Files
Omni_wizard.db/zen_create_json_v2.txt
T
2026-02-06 14:44:08 +08:00

113 lines
4.6 KiB
Plaintext

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 ;