DELIMITER // CREATE OR REPLACE PROCEDURE zen_create_json_prepare_detaildata( IN p_uuid VARCHAR(100), IN p_FunctionTag VARCHAR(100), IN p_code_id VARCHAR(100), IN p_detail_table VARCHAR(100), IN p_detail_key VARCHAR(100), IN p_detail_sort_fieldname VARCHAR(100), IN p_query_type VARCHAR(1) ) /* 功能 : amis Wizard 產生 json UI 的核心程式(每個 Component 有各自的 json UI 定義) 描述: 本段 sp 主要是設定 master-detail 中 detail 相關的 json 定義 建立日期 : 2023/12/20 修改歷史 項目 誰 日期 修改說明 ==== ========== ========== ================================================ 1 Michael 2023/12/20 根據 v1.0 重構 */ BEGIN DECLARE v_uuid_d VARCHAR(100); DECLARE v_detail_fields VARCHAR(800); DECLARE v_GridFooter_Sum VARCHAR(2000); DECLARE v_is_footer_sum VARCHAR(1); DECLARE v_grid_footer_sum VARCHAR(2000); DECLARE v_first_formula_in INT; DECLARE v_pos INT; DECLARE v_imax INT; DECLARE v_imin INT; DECLARE v_crlf VARCHAR(2); DECLARE v_lastsep VARCHAR(1); DECLARE v_comps TEXT; DECLARE v_db VARCHAR(200); DECLARE v_ip VARCHAR(200); DECLARE v_query_type_data TEXT; DECLARE v_keyword_search VARCHAR(600); DECLARE v_fieldname VARCHAR(100); DECLARE v_rowid INT; SET v_crlf = CONCAT(CHAR(13), CHAR(10)); SET v_ip = '${ls:base_ip}'; SET v_db = '${ls:base_db}'; /* 建立臨時表儲存 detail 欄位資訊 */ CREATE TEMPORARY TABLE IF NOT EXISTS tmp_default3 ( fieldname VARCHAR(100), is_footer_sum VARCHAR(1), rowid INT AUTO_INCREMENT PRIMARY KEY ); TRUNCATE TABLE tmp_default3; -- 取得 detail 的欄位名稱(要包含 pk 欄位) INSERT INTO tmp_default3 (fieldname, is_footer_sum) SELECT fieldname, is_footer_sum FROM zen_fields WHERE functiontag = p_functiontag and fieldblock >= 90 and fieldsh = 'Y' ORDER BY seqno; SET v_detail_fields = ''; SET v_GridFooter_Sum = ''; SET v_grid_footer_sum = ''; SET v_pos = 0; SELECT MAX(rowid) INTO v_imax FROM tmp_default3; SELECT MIN(rowid) INTO v_imin FROM tmp_default3; WHILE v_imin <= v_imax DO SELECT fieldname, is_footer_sum INTO v_fieldname, v_is_footer_sum FROM tmp_default3 WHERE rowid = v_imin; IF v_imin = v_imax THEN SET v_lastsep = ''; ELSE SET v_lastsep = ','; END IF; SET v_detail_fields = CONCAT(v_detail_fields, v_fieldname, v_lastsep); -- 加入 grid_footer_sum 的判斷 SET v_pos = v_pos + 1; IF v_is_footer_sum = 'Y' THEN IF v_grid_footer_sum = '' THEN SET v_grid_footer_sum = CONCAT( ' {', v_crlf, ' "type": "text",', v_crlf, ' "text": "合計",', v_crlf, ' "className": "right-10",', v_crlf, ' "colSpan": ', CAST(v_pos-1 AS CHAR), v_crlf, ' },', v_crlf, ' {', v_crlf, ' "type": "tpl",', v_crlf, ' "tpl": "${details|pick:',v_fieldname,'|sum}"', v_crlf, ' },', v_crlf); ELSE SET v_grid_footer_sum = CONCAT(v_grid_footer_sum, ' {', v_crlf, ' "type": "tpl",', v_crlf, ' "tpl": "${details|pick:',v_fieldname,'|sum}"', v_crlf, ' },', v_crlf); END IF; END IF; SELECT MIN(rowid) INTO v_imin FROM tmp_default3 WHERE rowid > v_imin; END WHILE; DROP TEMPORARY TABLE IF EXISTS tmp_default3; IF v_grid_footer_sum <> '' THEN SET v_grid_footer_sum = CONCAT(SUBSTRING(v_grid_footer_sum,1,LENGTH(v_grid_footer_sum)-3), v_crlf); SET v_GridFooter_Sum = CONCAT(',', v_crlf, '"affixRow": [', v_crlf, v_grid_footer_sum, ' ]', v_crlf); END IF; -- 將傳入的 json 寫入暫存表方便處理 INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'Sub_TableName',IFNULL(p_detail_table,''),NOW()); -- MD 中 uuid template 的 d 檔暫存檔(目前先 hard code) Michael 20240319 INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'Sub_TableName_x',REPLACE(IFNULL(p_detail_table,''),'_d','_x'),NOW()); INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'Sub_pk',IFNULL(p_detail_key,''),NOW()); INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'seqno',IFNULL(p_detail_sort_fieldname,''),NOW()); INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'GridFooter_Sum',IFNULL(v_GridFooter_Sum,''),NOW()); INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'detail_fields',IFNULL(v_detail_fields,''),NOW()); -- Master-detail 的 detail IF SUBSTRING(p_code_id,1,12) = 'MasterDetail' THEN SET v_uuid_d = UUID(); -- v2: 將主要的 dataset 整理後寫入 CALL zen_create_json_prepare_ds('D',v_uuid_d,p_FunctionTag); -- v2: kernel compoment CALL zen_create_json_kernel(v_uuid_d,p_FunctionTag,p_detail_table,p_detail_key,p_query_type,p_code_id); -- v2: 寫入暫存表的3個變數(部分參考 final 的寫法) CALL zen_create_json_detail(v_uuid_d,p_uuid,p_FunctionTag,p_code_id,p_detail_key); END IF; END // DELIMITER ;