From 3b3e190726c93ddf4655168c690572a07d69e3ff Mon Sep 17 00:00:00 2001 From: "DATAEXPRESS\\4734" Date: Fri, 6 Feb 2026 14:44:08 +0800 Subject: [PATCH] first commit --- readme.txt | 188 ++++++++++++++ tools/cloud_addtime.txt | 34 +++ tools/cloud_adjusttime.txt | 35 +++ tools/gf_trans_json_v7.txt | 61 +++++ tools/sysexec.txt | 62 +++++ tools/trans_cname.txt | 67 +++++ tools/usp_GetErrorInfo_v2.txt | 22 ++ tools/zen_bpm_define.txt | 121 +++++++++ tools/zen_create_table.txt | 180 +++++++++++++ tools/zen_fieldspec_best.txt | 286 +++++++++++++++++++++ tools/zen_get_ext_button.txt | 258 +++++++++++++++++++ tools/zen_get_keyvalue.txt | 87 +++++++ tools/zen_get_mapping.txt | 81 ++++++ tools/zen_get_picker.txt | 51 ++++ tools/zen_import_fields.txt | 91 +++++++ tools/zen_null.txt | 18 ++ tools/zen_parse_sp.txt | 124 +++++++++ tools/zen_picker.txt | 272 ++++++++++++++++++++ tools/zen_read_schema.txt | 38 +++ tools/zen_showsource.txt | 111 ++++++++ tools/zen_tri_json_log.txt | 25 ++ tools/zen_updatesource.txt | 63 +++++ udf_create_json_comps_blob.txt | 104 ++++++++ zen_create_json_comps_block.txt | 140 ++++++++++ zen_create_json_comps_cycles.txt | 209 +++++++++++++++ zen_create_json_comps_formula.txt | 210 +++++++++++++++ zen_create_json_comps_others.txt | 209 +++++++++++++++ zen_create_json_comps_others_gridview.txt | 204 +++++++++++++++ zen_create_json_comps_others_quickedit.txt | 155 +++++++++++ zen_create_json_comps_others_view.txt | 163 ++++++++++++ zen_create_json_comps_picker.txt | 133 ++++++++++ zen_create_json_comps_transfer.txt | 113 ++++++++ zen_create_json_detail.txt | 147 +++++++++++ zen_create_json_final.txt | 246 ++++++++++++++++++ zen_create_json_kernel.txt | 127 +++++++++ zen_create_json_prepare.txt | 234 +++++++++++++++++ zen_create_json_prepare_aside.txt | 95 +++++++ zen_create_json_prepare_detaildata.txt | 146 +++++++++++ zen_create_json_prepare_ds.txt | 148 +++++++++++ zen_create_json_prepare_gridquery.txt | 119 +++++++++ zen_create_json_reset_codeid.txt | 95 +++++++ zen_create_json_v2.txt | 113 ++++++++ 42 files changed, 5385 insertions(+) create mode 100644 readme.txt create mode 100644 tools/cloud_addtime.txt create mode 100644 tools/cloud_adjusttime.txt create mode 100644 tools/gf_trans_json_v7.txt create mode 100644 tools/sysexec.txt create mode 100644 tools/trans_cname.txt create mode 100644 tools/usp_GetErrorInfo_v2.txt create mode 100644 tools/zen_bpm_define.txt create mode 100644 tools/zen_create_table.txt create mode 100644 tools/zen_fieldspec_best.txt create mode 100644 tools/zen_get_ext_button.txt create mode 100644 tools/zen_get_keyvalue.txt create mode 100644 tools/zen_get_mapping.txt create mode 100644 tools/zen_get_picker.txt create mode 100644 tools/zen_import_fields.txt create mode 100644 tools/zen_null.txt create mode 100644 tools/zen_parse_sp.txt create mode 100644 tools/zen_picker.txt create mode 100644 tools/zen_read_schema.txt create mode 100644 tools/zen_showsource.txt create mode 100644 tools/zen_tri_json_log.txt create mode 100644 tools/zen_updatesource.txt create mode 100644 udf_create_json_comps_blob.txt create mode 100644 zen_create_json_comps_block.txt create mode 100644 zen_create_json_comps_cycles.txt create mode 100644 zen_create_json_comps_formula.txt create mode 100644 zen_create_json_comps_others.txt create mode 100644 zen_create_json_comps_others_gridview.txt create mode 100644 zen_create_json_comps_others_quickedit.txt create mode 100644 zen_create_json_comps_others_view.txt create mode 100644 zen_create_json_comps_picker.txt create mode 100644 zen_create_json_comps_transfer.txt create mode 100644 zen_create_json_detail.txt create mode 100644 zen_create_json_final.txt create mode 100644 zen_create_json_kernel.txt create mode 100644 zen_create_json_prepare.txt create mode 100644 zen_create_json_prepare_aside.txt create mode 100644 zen_create_json_prepare_detaildata.txt create mode 100644 zen_create_json_prepare_ds.txt create mode 100644 zen_create_json_prepare_gridquery.txt create mode 100644 zen_create_json_reset_codeid.txt create mode 100644 zen_create_json_v2.txt diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..84f8c24 --- /dev/null +++ b/readme.txt @@ -0,0 +1,188 @@ +/* + 準備要重構 Wizard 程式 + 基本上每一支程式都不應該超過 150 行(最多不應超過 200 行), 否則日後的維護會非常麻煩, 會改不動 + 所有程式都要加上 xxxx_v2 + 想法是把原程式中一堆的變數, 仍沿用原邏輯, 但是都寫入 zen_wizard_tmp, 最後再開始 replace 變數內容 + 處理變數的過程會變成 update 暫存變數欄位內容的過程 + + 一邊搬 code 一邊讚嘆我自己, 怎麼寫得出這麼複雜的 Wizard, 重構起來真要人命啊 + + Michael 2023/12/19 + + 除了 zen_create_json_v2, 繼續往下重構, 看起來還有 + dbo.zen_get_detail_data + zen_create_query_json_v2 + + 2024/01/03 我真是自找麻煩阿 +*/ + +1.因為邏輯很複雜, 變數一大堆, 我想要設定一個暫存表紀錄, 方便再細分的 proc 或 func 中直接取用, 否則傳參會傳到瘋掉, 也方便 debug +CREATE TABLE zen_wizard_tmp ( + uuid VARCHAR(100), + zen_key VARCHAR(100), + zen_value LONGTEXT, -- Using LONGTEXT instead of NVARCHAR(MAX) for large content + create_date DATETIME DEFAULT CURRENT_TIMESTAMP, + rowid INT AUTO_INCREMENT PRIMARY KEY, + INDEX IDX_zen_wizard_tmp (uuid) +); + +/* + set @temp_code = replace(@temp_code,'@Fields_by_add@',@ret1); + set @temp_code = replace(@temp_code,'@Fields_By_GridView@',@ret2+','); + set @temp_code = replace(@temp_code,'@Fields_By_View@',@ret3); + set @temp_code = replace(@temp_code,'@Fields_By_Edit@',@ret7); -- 原先是 @ret1(Add/Update 不分) + set @temp_code = replace(@temp_code,'@Fields_By_GridView_Edit@',@ret4); +*/ +-- 用以替代程式中的 @jsondata +CREATE TABLE zen_wizard_jsondata ( + uuid VARCHAR(100), + FieldName VARCHAR(100), + FieldCN VARCHAR(100), + FieldWidth INT, + FieldObject VARCHAR(100), + FieldCheckNull VARCHAR(10), + picker_tag VARCHAR(100), + fielddefault VARCHAR(200), + fieldro VARCHAR(1), + fieldfm VARCHAR(20), + FieldBlock SMALLINT, + FieldDS VARCHAR(10), + FieldSH VARCHAR(10), + CELLNO SMALLINT, + CELLX SMALLINT, + CELLY SMALLINT, + CELLLINE SMALLINT, + iscolumnmatch CHAR(1), + visibleOn VARCHAR(100), + _group VARCHAR(10), + _block VARCHAR(10), + rowid INT, + -- JSON data fields + json_bh LONGTEXT, -- block header + json_gh LONGTEXT, -- group header + json_insert LONGTEXT, -- 將這個元件要組出來的新增設定暫存起來 + json_update LONGTEXT, -- 將這個元件要組出來的修改設定暫存起來 + json_quickedit LONGTEXT, -- 將這個元件要組出來的 Quick Edit 設定暫存起來 + json_gridview LONGTEXT, -- 將這個元件要組出來的 GridView 設定暫存起來 + json_view LONGTEXT, -- 將這個元件要組出來的 grid 查詢設定暫存起來 + json_gf LONGTEXT, -- group footer + json_bf LONGTEXT, -- block footer + -- + create_date DATE DEFAULT CURRENT_DATE, + INDEX IDX_zen_zen_wizard_jsondata (uuid) +); + + +/* + zen_fields 新增欄位(Server 已更新) + visibleOn 給 picker 設定一某欄某值是否顯示用 +*/ +alter table zen_fields add visibleOn varchar(100); + +update zen_fields set visibleOn = 'cal_level,Personal' where functiontag='eipm02' and fieldname = 'personid'; +update zen_fields set visibleOn = 'cal_level,Department' where functiontag='eipm02' and fieldname = 'departmentid'; +update zen_fields set visibleOn = 'cal_level,Project' where functiontag='eipm02' and fieldname = 'projectid'; +-- +update zen_fields set visibleOn = 'cal_repeated_flag,none' where functiontag='eipm02' and fieldname = 'cal_repeated_sdate'; +update zen_fields set visibleOn = 'cal_repeated_flag,none' where functiontag='eipm02' and fieldname = 'cal_repeated_edate'; + +alter table zen_jsoncode add jsonCode4 varchar(max); +alter table zen_jsoncode add jsonCode5 varchar(max); + + +/* + 重構後的程式架構如下 +*/ + +zen_create_json_v2 + + zen_create_json_reset_codeid + + zen_create_json_prepare_ds + + zen_create_json_prepare + + zen_get_ext_button (new add) + + zen_create_json_prepare_aside + + zen_create_json_prepare_detaildata + + 原本會呼叫 dbo.zen_get_detail_data, 重構後不再呼叫 + + zen_create_json_prepare_gridquery + + *** main loop *** + + zen_create_json_kernel + + zen_create_json_comps_block + + zen_create_json_comps_others + + udf_create_json_comps_blob + + zen_get_keyvalue (new add) + + zen_create_json_comps_others_gridview + + zen_create_json_comps_others_quickedit + + zen_create_json_comps_others_view + + zen_create_json_comps_picker + + zen_picker (new add) + + zen_create_json_comps_formula + + zen_create_json_comps_cycles + + zen_create_json_comps_transfer + + *** final *** + + zen_create_json_final + + +/* + test sql + select * from zen_jsoncode where functiontag = 'crmm02' +*/ + +delete from zen_wizard_tmp; +delete from zen_wizard_jsondata; + +-- 如果是 MySQL/Maiadb 要改為 call zen_xxx +-- exec zen_create_json_v2 'basm63','SingleGrid'; +-- exec zen_create_json_v2 'basm67','SinglePanels'; +-- exec zen_create_json_v2 'basm51','SingleTabs'; +-- exec zen_create_json_v2 'pmsm11','MasterDetail-New'; +-- exec zen_create_json_v2 'crmm02','MasterDetail-New'; -- 會報錯 +-- exec zen_create_json_v2 'crmm09','MasterDetail-New'; -- 會報錯 +-- exec zen_create_json_v2 'eipm11','MasterDetail-Log'; -- 會報錯 +exec zen_create_json_v2 'eipm02','SingleEntry'; -- 會報錯 + +select * from zen_wizard_tmp; +select * from zen_wizard_jsondata; + + +/* +*/ +zen_create_query_json_v2 + + step 1: prepare + + step 2: sp_para_filter + + step 3: query_fields + + step 4: button + + step 5: query UX + + step 6: final + + +/* + 更版注意事項 +*/ +1.更新本文檔紀錄的新增 Tables 及 sp +2.更新 Template (MasterDetail-New) +3.更新 Wizard 中的 genCode 改呼叫 orm_api_v2 及 zen_create_json_v2 + query 暫時先不更新 + + +/* +eipm02, eipm19 的 zen_fields 的資料內容修改如下 +也有修改 zen_picker, 主要是要配合顯示 picker + +下列欄位不用 +cal_holiday +cal_holiday_country +cal_repeated_time + +新增下面4個欄位 +s_date +s_time +e_date +e_time + +並將 start_time 及 end_time 設為 formula +查詢欄位(公式)設為 +start_time = s_date + CHAR(32) + s_time +end_time = e_date + CHAR(32) + e_time + +*/ diff --git a/tools/cloud_addtime.txt b/tools/cloud_addtime.txt new file mode 100644 index 0000000..d28befc --- /dev/null +++ b/tools/cloud_addtime.txt @@ -0,0 +1,34 @@ +DELIMITER // + +CREATE OR REPLACE PROCEDURE cloud_addtime( + IN date_utc DATETIME +) +/* + Function : 因為所有的雲端主機, 都是存 UTC, 要 -8 換為 Taipei 時間 + Description: 1.如果有多國的來源, 這個方法並不徹底, 目前先暫用 + 2.目前測試 -8 看起來就正常 + 3.這個 stored procedure 只是單純地在 select xx日期 時, 將時間 -8 hrs, 並不會異動資料庫的內容 + 純粹是配合 Azure Cloud 主機的運作而已 + CALL cloud_addtime(NOW()); + Build Date : 2022/12/03 + + Modify History + Item Who Date Modify Docs + ==== ========== ========== ================================================ + 1 Michael 2022/12/03 Init +*/ +BEGIN + DECLARE date_taipei DATETIME; + DECLARE diff_hours SMALLINT; + + SELECT pvalue INTO diff_hours FROM sys_parameter WHERE systemid = 'sys' AND pid = 'diff_hours'; + IF diff_hours IS NULL THEN + SET diff_hours = 8; + END IF; + + SET date_taipei = DATE_ADD(date_utc, INTERVAL diff_hours HOUR); + + SELECT date_taipei AS result; -- You can select the result or do something else with it +END // + +DELIMITER ; diff --git a/tools/cloud_adjusttime.txt b/tools/cloud_adjusttime.txt new file mode 100644 index 0000000..56b41fd --- /dev/null +++ b/tools/cloud_adjusttime.txt @@ -0,0 +1,35 @@ +DELIMITER // + +CREATE OR REPLACE PROCEDURE cloud_adjusttime( + IN date_utc DATETIME, + IN base INT +) +/* + Function : 因為所有的雲端主機, 都是存 UTC, 要 -8 換為 Taipei 時間, 原 cloud_addtime 的反向 udf, FullCalendar 存檔前使用 + Description: 1.如果有多國的來源, 這個方法並不徹底, 目前先暫用 + 2.目前測試 -8 看起來就正常 + 3.這個 stored procedure 只是單純地在 select xx日期 時, 將時間 -8 hrs, 並不會異動資料庫的內容 + 純粹是配合 Azure Cloud 主機的運作而已 + CALL cloud_adjusttime(NOW(), -1); + Build Date : 2023/2/11 + + Modify History + Item Who Date Modify Docs + ==== ========== ========== ================================================ + 1 Michael 2023/02/11 Init +*/ +BEGIN + DECLARE date_taipei DATETIME; + DECLARE diff_hours SMALLINT; + + SELECT pvalue INTO diff_hours FROM sys_parameter WHERE systemid = 'sys' AND pid = 'diff_hours'; + IF diff_hours IS NULL THEN + SET diff_hours = 8; + END IF; + + SET date_taipei = DATE_ADD(date_utc, INTERVAL diff_hours * base HOUR); + + SELECT date_taipei AS result; -- You can select the result or do something else with it +END // + +DELIMITER ; diff --git a/tools/gf_trans_json_v7.txt b/tools/gf_trans_json_v7.txt new file mode 100644 index 0000000..0b51d95 --- /dev/null +++ b/tools/gf_trans_json_v7.txt @@ -0,0 +1,61 @@ +DELIMITER // + +CREATE OR REPLACE FUNCTION `gf_trans_json_v7` ( + p_source TEXT, + p_actions VARCHAR(1) -- C(reate) 或 U(pdate) +) +/* + function : 將 amis 傳入的字串, 轉為標準 json 格式後回傳給 orm_api(配合 mariadb) + 修改自 gf_trans_json(已不使用) + description: 呼叫範例 SELECT gf_trans_json_v7('xxxx', 'C'); + build date : 2021/09/26 + + modify history + item who date modify docs + ==== ========== ========== ================================================ + 1 michael 2021/09/26 新增 + 2 [改寫者] 2023/11/15 改寫為 MariaDB 版本並最佳化 +*/ +RETURNS TEXT +DETERMINISTIC +BEGIN + DECLARE v_max INT; + DECLARE v_now INT; + DECLARE v_rets TEXT; + DECLARE v_rows_pos INT; + DECLARE v_rows_diff_pos INT; + + IF p_actions = 'C' THEN + SET v_rets = SUBSTRING(p_source, 2, CHAR_LENGTH(p_source) - 1); + + -- step1: 先移除數字鍵 (最佳化:使用迴圈而非逐次檢查) + SET v_now = 0; + WHILE v_now <= 1000 DO + IF INSTR(v_rets, CONCAT('"', v_now, '":')) > 0 THEN + SET v_rets = REPLACE(v_rets, CONCAT('"', v_now, '":'), ''); + END IF; + SET v_now = v_now + 1; + END WHILE; + + -- 移除結尾多餘的 } 字符 + IF RIGHT(v_rets, 2) = '}}' THEN + SET v_rets = LEFT(v_rets, CHAR_LENGTH(v_rets) - 1); + END IF; + + SET v_rets = CONCAT('{[', v_rets, ']}'); + ELSEIF p_actions = 'U' THEN + -- 找出 rows 和 rowsDiff 的位置 + SET v_rows_pos = INSTR(p_source, '"rows":'); + SET v_rows_diff_pos = INSTR(p_source, '"rowsDiff":'); + + -- 擷取 rows 內容並格式化 + SET v_rets = SUBSTRING(p_source, 1, v_rows_diff_pos - 3); + SET v_rets = SUBSTRING(v_rets, v_rows_pos + 8, CHAR_LENGTH(v_rets)); + + SET v_rets = CONCAT('{[', v_rets, ']}'); + END IF; + + RETURN v_rets; +END // + +DELIMITER ; \ No newline at end of file diff --git a/tools/sysexec.txt b/tools/sysexec.txt new file mode 100644 index 0000000..e87f70b --- /dev/null +++ b/tools/sysexec.txt @@ -0,0 +1,62 @@ +DELIMITER // + +CREATE OR REPLACE PROCEDURE `sysexec` ( + IN p_token VARCHAR(100), + IN p_sql LONGTEXT +) +/* + function : 傳入 Insert/Update 的 sql 指令並執行 + description: 不允許 drop delete 這類的 sql 語法 + build date : 2018/05/05 + + modify history + item who date modify docs + ==== ========== ========== ================================================ + 1 Michael 2018-11-05 init + 2 [改寫者] 2023-11-15 改寫為 MariaDB 版本並最佳化 +*/ +BEGIN + DECLARE v_userid VARCHAR(100); + DECLARE v_exstr LONGTEXT; + DECLARE v_code INT; + DECLARE v_msg VARCHAR(255); + + -- 根據傳入的 token 取得 userid + SELECT userid INTO v_userid FROM sys_users WHERE token = p_token LIMIT 1; + + IF v_userid IS NULL THEN + SET v_code = 9; + SET v_msg = '請先登入系統再執行!!'; + + SELECT v_code AS code, v_msg AS msg; + SELECT ''; + ELSEIF LOCATE('delete ', LOWER(p_sql)) > 0 OR LOCATE('drop ', LOWER(p_sql)) > 0 THEN + SET v_code = 4; + SET v_msg = '內含不允許執行的 sql 語法, 請重新輸入?!'; + + SELECT v_code AS code, v_msg AS msg; + SELECT ''; + ELSE + BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + SET v_code = 9; + SET v_msg = '語法有錯,請檢查語法後再重新執行!!'; + + SELECT v_code AS code, v_msg AS msg; + SELECT ''; + END; + + SET v_code = 0; + SET v_msg = '成功執行 SQL 語法'; + + SELECT v_code AS code, v_msg AS msg; + SET @dynamic_sql = p_sql; + PREPARE stmt FROM @dynamic_sql; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; + END; + END IF; +END // + +DELIMITER ; \ No newline at end of file diff --git a/tools/trans_cname.txt b/tools/trans_cname.txt new file mode 100644 index 0000000..460ad34 --- /dev/null +++ b/tools/trans_cname.txt @@ -0,0 +1,67 @@ +DELIMITER // + +CREATE OR REPLACE FUNCTION `trans_cname` ( + p_fieldname VARCHAR(100), + p_fieldcn NVARCHAR(100) +) +/* + Function : 根據 zen_fields,zen_dd_erp,zen_dd 的內容, 回傳可能的中文欄位 Title + Description: 通常是配合 sp=zen_fieldspec_best 使用 + Build Date : 2021/11/25 + + Modify History + Item Who Date Modify Docs + ==== ========== ========== ================================================ + 1 Michael 2021/11/25 新增 + 2 [改寫者] 2023-11-15 改寫為 MariaDB 版本並最佳化 +*/ +RETURNS NVARCHAR(100) +DETERMINISTIC +BEGIN + DECLARE v_ret NVARCHAR(100); + DECLARE v_dd_id VARCHAR(100); + DECLARE v_dd_name VARCHAR(100); + + SET v_ret = p_fieldcn; + + IF p_fieldcn = '' OR p_fieldname = p_fieldcn THEN + -- 先找 zen_fields + SELECT fieldcn INTO v_ret + FROM zen_fields + WHERE fieldname = p_fieldname + AND fieldname <> fieldcn + AND IFNULL(fieldcn, '') <> '' + LIMIT 1; + + -- 新增 zen_dd_erp(原 erp) + IF IFNULL(v_ret, '') = '' THEN + SELECT fieldcn INTO v_ret + FROM zen_dd_erp + WHERE fieldname = p_fieldname + AND fieldname <> fieldcn + AND IFNULL(fieldcn, '') <> '' + LIMIT 1; + END IF; + + -- 再找 zen_dd + IF IFNULL(v_ret, '') = '' THEN + SELECT fieldname, cname INTO v_dd_id, v_dd_name + FROM zen_dd + WHERE LOCATE(fieldname, p_fieldname) > 0 + LIMIT 1; + + IF IFNULL(v_dd_id, '') <> '' THEN + SET v_ret = REPLACE(p_fieldname, v_dd_id, v_dd_name); + END IF; + END IF; + END IF; + + -- 實在找不到的話, 只能回傳 fieldname + /* IF IFNULL(v_ret, '') = '' THEN + SET v_ret = p_fieldname; + END IF; */ + + RETURN v_ret; +END // + +DELIMITER ; \ No newline at end of file diff --git a/tools/usp_GetErrorInfo_v2.txt b/tools/usp_GetErrorInfo_v2.txt new file mode 100644 index 0000000..a315ee5 --- /dev/null +++ b/tools/usp_GetErrorInfo_v2.txt @@ -0,0 +1,22 @@ +DELIMITER // + +CREATE OR REPLACE PROCEDURE `usp_GetErrorInfo_v2`() +/* + 傳回簡化錯誤訊息, 通常配合 DECLARE EXIT HANDLER FOR SQLEXCEPTION 中使用 + 對應 MS-SQL 的 usp_GetErrorInfo_v2 +*/ +BEGIN + -- 獲取錯誤資訊 + DECLARE v_err_msg TEXT; + + GET DIAGNOSTICS CONDITION 1 + v_err_msg = MESSAGE_TEXT; + + -- 返回簡化格式 + SELECT + 1 AS code, -- 預設錯誤代碼 + v_err_msg AS msg, + 0 AS recno; +END // + +DELIMITER ; \ No newline at end of file diff --git a/tools/zen_bpm_define.txt b/tools/zen_bpm_define.txt new file mode 100644 index 0000000..ceaf8ca --- /dev/null +++ b/tools/zen_bpm_define.txt @@ -0,0 +1,121 @@ +DELIMITER // + +CREATE OR REPLACE FUNCTION zen_bpm_define ( + p_FunctionTag VARCHAR(100), + p_FunctionTag_org VARCHAR(100), + p_pk VARCHAR(100), + p_ip VARCHAR(100), -- ijѥ~ǤJγ]ww]ȡAMariaDB ѼƤ䴩ܼƷw] + p_db VARCHAR(100) +) +RETURNS LONGTEXT +LANGUAGE SQL +DETERMINISTIC +BEGIN + DECLARE v_rets LONGTEXT; + DECLARE v_crlf CHAR(1); + DECLARE v_type CHAR(1); + + -- ]wŸ [cite: 3, 4] + SET v_crlf = CHAR(10); + + -- P_O_ñ֥ view + IF INSTR(p_FunctionTag_org, '_') > 0 THEN + SET v_type = 'Y'; + ELSE + SET v_type = 'N'; + END IF; + + -- }lզX JSON r [cite: 5] + SET v_rets = CONCAT( + ' {', v_crlf, + ' "type": "button-toolbar",', v_crlf, + ' "buttons": [', v_crlf + ); + + -- ھ @type Mwse [cite: 5] + IF v_type = 'N' THEN + -- Wes [cite: 5, 6] + SET v_rets = CONCAT(v_rets, + ' {', v_crlf, + ' "type": "button",', v_crlf, + ' "label": "We",', v_crlf, + ' "actionType": "ajax",', v_crlf, + ' "confirmText": "TwnWeH",', v_crlf, + ' "disabledOn": "${flow_status != ''N''}",', v_crlf, + ' "api": {', v_crlf, + ' "method": "post",', v_crlf, + ' "url": "${ls:base_ip}/xapi/v3/${ls:base_db}/bpmm02_spread/1/",', v_crlf, + ' "data": {', v_crlf, + ' "para01": "', p_FunctionTag, '",', v_crlf, + ' "para02": "${personid}",', v_crlf, + ' "para03": "${', p_pk, '}"', v_crlf, + ' },', v_crlf, + ' "dataType": "form"', v_crlf, + ' },', v_crlf, + ' "level": "primary"', v_crlf, + ' },', v_crlf + ); + ELSE + -- PNB^B@os (ñּҦ) [cite: 10, 15, 20] + SET v_rets = CONCAT(v_rets, + -- PN [cite: 11, 12] + ' {', v_crlf, + ' "type": "button", "label": "PN", "actionType": "dialog", "level": "success",', v_crlf, + ' "disabledOn": "${ls:bpm_signable == 0}",', v_crlf, + ' "dialog": { "title": "PN", "size": "lg", "body": { "type": "service", "schemaApi": {', v_crlf, + ' "method": "post", "url": "${ls:base_ip}/xapi/v3/${ls:wizard_db}/zen_showsource/0/",', v_crlf, + ' "data": { "para01": "bpmm11_i", "para02": "beta@${', p_pk, '}" }, "dataType": "form"', v_crlf, + ' } } }', v_crlf, + ' },', v_crlf, + -- ^ [cite: 15, 16, 17] + ' {', v_crlf, + ' "type": "button", "label": "^", "actionType": "dialog", "level": "danger",', v_crlf, + ' "disabledOn": "${ls:bpm_signable == 0}",', v_crlf, + ' "dialog": { "title": "^", "size": "lg", "body": { "type": "service", "schemaApi": {', v_crlf, + ' "method": "post", "url": "${ls:base_ip}/xapi/v3/${ls:wizard_db}/zen_showsource/0/",', v_crlf, + ' "data": { "para01": "bpmm12_i", "para02": "beta@${', p_pk, '}" }, "dataType": "form"', v_crlf, + ' } } }', v_crlf, + ' },', v_crlf, + -- @o [cite: 20, 21, 22] + ' {', v_crlf, + ' "type": "button", "label": "@o", "actionType": "dialog", "level": "dark",', v_crlf, + ' "disabledOn": "${ls:bpm_cancelable > 0}",', v_crlf, + ' "dialog": { "title": "@o", "size": "lg", "body": { "type": "service", "schemaApi": {', v_crlf, + ' "method": "post", "url": "${ls:base_ip}/xapi/v3/${ls:wizard_db}/zen_showsource/0/",', v_crlf, + ' "data": { "para01": "bpmm13_i", "para02": "beta@${', p_pk, '}" }, "dataType": "form"', v_crlf, + ' } } }', v_crlf, + ' },', v_crlf + ); + END IF; + + -- ñ־{ [cite: 25, 26, 27] + SET v_rets = CONCAT(v_rets, + ' {', v_crlf, + ' "type": "button", "label": "ñ־{", "actionType": "dialog", "level": "warning",', v_crlf, + ' "dialog": { "title": "ñ־{", "size": "lg", "body": { "type": "service", "schemaApi": {', v_crlf, + ' "method": "post", "url": "${ls:base_ip}/xapi/v3/${ls:wizard_db}/zen_showsource/0/",', v_crlf, + ' "data": { "para01": "bpmq11", "para02": "beta@${', p_pk, '}", "_tag": "', p_FunctionTag, '" },', v_crlf, + ' "dataType": "form", "requestAdaptor": "local_set_params(51, api.data._tag); return { ...api, data: { ...api.data }};"', v_crlf, + ' } } }', v_crlf, + ' },', v_crlf + ); + + -- ˵y{ñ֤H [cite: 30, 31, 32] + SET v_rets = CONCAT(v_rets, + ' {', v_crlf, + ' "type": "button", "label": "˵y{ñ֤H", "actionType": "dialog", "level": "secondary",', v_crlf, + ' "dialog": { "title": "˵y{ñ֤H", "size": "lg", "body": { "type": "service", "schemaApi": {', v_crlf, + ' "method": "post", "url": "${ls:base_ip}/xapi/v3/${ls:wizard_db}/zen_showsource/0/",', v_crlf, + ' "data": { "para01": "bpmq12", "para02": "beta@${', p_pk, '}", "_tag": "', p_FunctionTag, '" },', v_crlf, + ' "dataType": "form", "requestAdaptor": "local_set_params(51, api.data._tag); return { ...api, data: { ...api.data }};"', v_crlf, + ' } } }', v_crlf, + ' }', v_crlf, + ' ]', v_crlf, + ' },', v_crlf, + ' { "type": "divider" },', v_crlf + ); + + RETURN v_rets; +END // + +DELIMITER ; \ No newline at end of file diff --git a/tools/zen_create_table.txt b/tools/zen_create_table.txt new file mode 100644 index 0000000..5f58e06 --- /dev/null +++ b/tools/zen_create_table.txt @@ -0,0 +1,180 @@ +DELIMITER // + +CREATE OR REPLACE PROCEDURE `zen_create_table` ( + IN p_tablename VARCHAR(100), + IN p_source_type VARCHAR(1) -- 1:zen_newtable_d 2:zen_fields join zen_function +) +/* + Function : 配合 api 可以直接產生 table 的 sp + Description: 因為只能在相同的 db 執行, 所以在 zenWinzard 或 zenBusiness 都要有此 sp 及 zen_newtable_m/zen_newtable_d + 在平台的架構中雖然放在 Wizard Menu 中, 但手改 json 連到 zenBusiness(zenEIS) 等 ERP DB, + 因為通常需要新增的 table 都是 MIS 要擴充功能用的 + CALL zen_create_table('tmp_test01','2'); + + 2023-07-07 + 因為希望參考 iCoder 的作法, 匯入 zen_fields 後, 直接就產生程式(接近一鍵產生程式碼), 所以新增 p_source_typ=2 + 但是 zen_fields 是 zenWinzard 的 table, 如果是分離型 db 架構, 就無法支援 p_source_typ=2 這很傷腦筋, 怎麼辦? 如果傳入 db ?? + 看樣子只能先獨立建立 table (p_source_typ=1), 然後匯入 zen_fields, 再產生 Code, 先這樣吧 + + 2023-08-26 用資料庫的同義字功能, 已解決分離式資料庫的問題 + + Build Date : 2022/02/16 + + Modify History + Item Who Date Modify Docs + ==== ========== ========== ================================================ + 1 Michael 2022/02/16 Init + 2 Michael 2023/06/28 新增也可以根據 zen_function/zen_fields 來產生 Table 的寫法(必須配合 zen_function 也已經新增定義才行) + 3 Michael 2023/07/29 create table 後, 要多 select 0 as code 才不會報錯 + 4 [改寫者] 2023-11-15 改寫為 MariaDB 版本並最佳化 +*/ +BEGIN + DECLARE v_sql LONGTEXT; + DECLARE v_rets LONGTEXT; + DECLARE v_maxcount INT; + DECLARE v_currid INT; + DECLARE v_nextrowid INT; + + DECLARE v_fieldname VARCHAR(100); + DECLARE v_field_type VARCHAR(100); + DECLARE v_field_len SMALLINT; + DECLARE v_is_pk CHAR(1); + DECLARE v_is_auto CHAR(1); + DECLARE v_sql_tail VARCHAR(100); + DECLARE v_sql_pk VARCHAR(100); + DECLARE v_row_count INT; + + -- 創建臨時表來存儲字段信息 + DROP TEMPORARY TABLE IF EXISTS temp_table_fields; + CREATE TEMPORARY TABLE temp_table_fields ( + fieldname VARCHAR(100), + field_type VARCHAR(100), + field_len SMALLINT, + is_pk CHAR(1), + is_auto CHAR(1), + rowid INT AUTO_INCREMENT PRIMARY KEY + ); + + -- 根據來源類型填充臨時表 + IF IFNULL(p_source_type, '1') = '1' THEN + INSERT INTO temp_table_fields (fieldname, field_type, field_len, is_pk, is_auto) + SELECT fieldname, field_type, field_len, is_pk, is_auto + FROM zen_newtable_d + WHERE tablename = p_tablename; + ELSE + -- 使用同義字(Synonym)解決跨資料庫問題 + INSERT INTO temp_table_fields (fieldname, field_type, field_len, is_pk, is_auto) + SELECT + x1.fieldname, + CASE + WHEN x1.fieldobject IN ('textarea','input-file','link-file','input-image','nvarchar') THEN 'varchar' + WHEN x1.fieldobject IN ('int','decimal','smallint') THEN x1.fieldobject + WHEN x1.fieldobject IN ('radios','progress') THEN 'smallint' + WHEN x1.fieldobject = 'input-number' THEN 'int' + WHEN x1.fieldobject IN ('input-datetime','datetime') THEN 'datetime' + WHEN x1.fieldobject = 'input-date' THEN 'date' + WHEN LOCATE('cycle', x1.fieldobject) > 0 THEN x1.fieldobject -- 獨立判斷 + ELSE 'varchar' + END field_type, + x1.fieldlength AS field_len, + CASE WHEN LOCATE(x1.fieldname, x2.mainkey) > 0 THEN 'Y' ELSE 'N' END is_pk, + x2.isautoinc AS is_auto + FROM zen_fields x1 + LEFT JOIN zen_function x2 ON x1.functiontag = x2.functiontag + WHERE x1.tablename = p_tablename AND x1.fieldobject <> 'formula'; + END IF; + + -- 初始化變量 + SELECT MAX(rowid), MIN(rowid) INTO v_maxcount, v_currid FROM temp_table_fields; + + SET v_rets = ''; + SET v_sql_pk = ''; + + -- 構建字段定義 + WHILE v_currid <= v_maxcount DO + -- 取得當前字段信息 + SELECT fieldname, field_type, field_len, is_pk, is_auto + INTO v_fieldname, v_field_type, v_field_len, v_is_pk, v_is_auto + FROM temp_table_fields + WHERE rowid = v_currid; + + SET v_sql_tail = ''; + IF v_is_pk = 'Y' THEN + SET v_sql_tail = ' NOT NULL'; + SET v_sql_pk = CONCAT(v_sql_pk, v_fieldname, ','); + END IF; + + IF v_is_auto = 'Y' THEN + SET v_sql_tail = CONCAT(v_sql_tail, ' AUTO_INCREMENT'); + END IF; + + IF LOCATE('transfer', v_field_type) > 0 OR v_field_len < 0 THEN + SET v_rets = CONCAT(v_rets, ' ', v_fieldname, ' ', v_field_type, '(255)', v_sql_tail, ','); + ELSEIF LOCATE('cycle', v_field_type) > 0 THEN + IF v_field_type IN ('cycle-frequency','cycle-weeks','cycle-months') THEN + SET v_rets = CONCAT(v_rets, ' ', v_fieldname, ' varchar(200)', v_sql_tail, ','); + ELSE + SET v_rets = CONCAT(v_rets, ' ', v_fieldname, ' datetime ', v_sql_tail, ','); + END IF; + ELSEIF LOCATE('char', v_field_type) > 0 THEN + IF v_field_len <= 0 THEN + SET v_rets = CONCAT(v_rets, ' ', v_fieldname, ' ', v_field_type, '(200)', v_sql_tail, ','); + ELSE + SET v_rets = CONCAT(v_rets, ' ', v_fieldname, ' ', v_field_type, '(', v_field_len, ')', v_sql_tail, ','); + END IF; + ELSE + SET v_rets = CONCAT(v_rets, ' ', v_fieldname, ' ', v_field_type, v_sql_tail, ','); + END IF; + + -- 取得下一筆資料 + SELECT MIN(rowid) INTO v_nextrowid FROM temp_table_fields WHERE rowid > v_currid; + SET v_currid = v_nextrowid; + END WHILE; + + -- 處理主鍵定義 + IF v_sql_pk = '' THEN + SET v_sql_pk = ''; + SET v_rets = SUBSTRING(v_rets, 1, CHAR_LENGTH(v_rets) - 1); + ELSE + SET v_sql_pk = CONCAT(' PRIMARY KEY (', SUBSTRING(v_sql_pk, 1, CHAR_LENGTH(v_sql_pk) - 1), ')'); + END IF; + + -- 只有當有字段定義時才創建表 + IF v_rets <> '' THEN + -- 檢查表是否存在,如果存在且無數據則刪除 + SET @sql_check = CONCAT('SELECT COUNT(*) INTO @row_count FROM information_schema.tables ', + 'WHERE table_schema = DATABASE() AND table_name = \'', p_tablename, '\''); + PREPARE stmt FROM @sql_check; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; + + IF @row_count > 0 THEN + SET @sql_check = CONCAT('SELECT COUNT(*) INTO @row_count FROM ', p_tablename); + PREPARE stmt FROM @sql_check; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; + + IF @row_count <= 0 THEN + SET @sql = CONCAT('DROP TABLE ', p_tablename); + PREPARE stmt FROM @sql; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; + END IF; + END IF; + + -- 創建新表 + SET v_sql = CONCAT('CREATE TABLE ', p_tablename, '(', + v_rets, + v_sql_pk, ');'); + + -- 執行創建表的SQL + PREPARE stmt FROM v_sql; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; + + -- 返回成功信息 + SELECT 0 AS code, 'OK' AS msg; + END IF; +END // + +DELIMITER ; \ No newline at end of file diff --git a/tools/zen_fieldspec_best.txt b/tools/zen_fieldspec_best.txt new file mode 100644 index 0000000..d4bdcf6 --- /dev/null +++ b/tools/zen_fieldspec_best.txt @@ -0,0 +1,286 @@ +DELIMITER // + +CREATE OR REPLACE PROCEDURE `zen_fieldspec_best` ( + IN p_functiontag VARCHAR(100) +) +/* + Function : 針對 zen_field 的內容, 根據 schema 給出最接近的預設值, 以簡化設定動作 + Description: + Build Date : 2021/08/14 + Call Sample: + CALL zen_fieldspec_best('abc01'); + + Modify History + Item Who Date Modify Docs + ==== ========== ========== ================================================ + 1 Michael 2021-11-25 新增 fieldblock = 90 的判斷(detail) + 2 Michael 2022-04-16 update zen_fields set fieldro = Y (Read Only 預設) + 3 Michael 2022-10-02 加入對 Query 的支援(根據 tag 判斷) + 4 Michael 2023-02-09 加入 flow_status 預設值=N + 5 Michael 2023-09-01 加入 2個系統欄位的預設值 create_user/create_date + 6 [改寫者] 2023-11-15 改寫為 MariaDB 版本並最佳化 +*/ +BEGIN + /* + 根據下列內容設定 + fieldobject 更換為最合理的物件 + fieldcn ==> dd ? (date=日期, id=代號, Name=名稱, 描述 取已經存在的同名? 建立一個常用習慣的詞庫? 這可以和 dd 並存) + fieldwidth 根據 length 推算 width(Grid 顯示寬度) + --fielddefault 日期=today 等 + --fieldchecknull + --fieldds,fieldsh + cellx,celly + */ + + DECLARE v_imax INT; + DECLARE v_inow INT; + DECLARE v_cnt INT; + DECLARE v_x INT; + DECLARE v_y INT; + DECLARE v_row INT; + DECLARE v_line INT; + DECLARE v_block INT; + DECLARE v_tablename VARCHAR(100); + DECLARE v_fieldname VARCHAR(100); + DECLARE v_fieldcn VARCHAR(100); + DECLARE v_fld_type VARCHAR(100); + DECLARE v_fieldobject VARCHAR(100); + DECLARE v_fieldlength INT; + DECLARE v_fld_width VARCHAR(10); + DECLARE v_jump SMALLINT; + -- + DECLARE v_report_type VARCHAR(100); + DECLARE v_type_f SMALLINT; + DECLARE v_type_q SMALLINT; + + -- 創建臨時表 + DROP TEMPORARY TABLE IF EXISTS tmp_fields; + DROP TEMPORARY TABLE IF EXISTS tmp_query_fields; + + -- upgrade data(防錯) + UPDATE zen_fields SET datatype = fieldobject WHERE functiontag = p_functiontag AND datatype IS NULL; + + /* + 根據 p_functiontag 識別是 Form or Query + */ + SELECT COUNT(*) INTO v_type_f FROM zen_fields WHERE functiontag = p_functiontag; + SELECT COUNT(*) INTO v_type_q FROM zen_report_fields WHERE functiontag = p_functiontag; + + IF v_type_f > 0 THEN + -- 創建臨時表並插入數據 + CREATE TEMPORARY TABLE tmp_fields AS + SELECT * FROM zen_fields WHERE functiontag = p_functiontag; + + SELECT MAX(fieldid), MIN(fieldid), COUNT(*) + INTO v_imax, v_y, v_cnt + FROM tmp_fields; + + SET v_row = 1; + IF v_cnt > 10 AND v_cnt <= 30 THEN + SET v_row = 2; + ELSEIF v_cnt > 30 THEN + SET v_row = 2; + END IF; + + SET v_x = 1; + SET v_line = 1; + + WHILE v_y <= v_imax DO + SELECT tablename, fieldname, fieldcn, datatype, fieldlength, fieldblock + INTO v_tablename, v_fieldname, v_fieldcn, v_fieldobject, v_fieldlength, v_block + FROM tmp_fields WHERE fieldid = v_y; + + /* step 1: 設定 object */ + -- varchar, char, nvarchar ... + SET v_fld_type = v_fieldobject; + IF LOCATE('char', v_fieldobject) > 0 THEN + IF v_fieldlength >= 200 THEN + SET v_fld_type = 'textarea'; + ELSEIF v_fieldlength = 1 THEN + SET v_fld_type = 'switch'; + ELSE + SET v_fld_type = 'input-text'; + END IF; + END IF; + + IF LOCATE('int', v_fieldobject) > 0 OR LOCATE('decimal', v_fieldobject) > 0 THEN + SET v_fld_type = 'input-number'; + END IF; + + IF LOCATE('date', v_fieldobject) > 0 THEN + SET v_fld_type = 'input-date'; + END IF; + + -- 防錯 + IF v_fld_type = '' THEN + SET v_fld_type = 'input-text'; + END IF; + + /* + step 2: 推估 width(暫時保留, 但在 amis 中, width 已經幾乎不必設定) + */ + IF v_fld_type = 'input-date' OR v_fld_type = 'input-number' THEN + SET v_fld_width = 80; + ELSE + IF v_fieldlength <= 10 THEN + SET v_fld_width = 80; + ELSEIF v_fieldlength <= 20 THEN + SET v_fld_width = 120; + ELSE + SET v_fld_width = 200; + END IF; + END IF; + + -- 判斷如果是 detail, fieldblock = 90 + SELECT COUNT(*) INTO v_cnt FROM zen_function WHERE detail_table = v_tablename; + IF v_cnt > 0 THEN + SET v_block = 90; + END IF; + + /* + step3: 推算 x/y + */ + SET v_jump = 0; + IF v_row = 2 AND v_fieldlength >= 50 THEN + IF v_x = 1 THEN + SET v_jump = 1; + ELSE + SET v_x = 1; + SET v_line = v_line + 1; + END IF; + END IF; + + IF v_row = 3 AND v_fieldlength >= 50 THEN + IF v_x = 1 THEN + SET v_jump = 1; + ELSE + SET v_x = 1; + SET v_line = v_line + 1; + END IF; + END IF; + + /* + step 4: update & cname(dd) + */ + UPDATE zen_fields + SET fieldobject = v_fld_type, + fieldwidth = v_fld_width, + cellx = v_x, + celly = v_line, + fieldblock = v_block, + fieldcn = trans_cname(v_fieldname, v_fieldcn) + WHERE fieldid = v_y; + + IF v_row = 1 THEN + SET v_line = v_line + 1; + ELSEIF v_row = 2 THEN + SET v_x = v_x + 1; + IF v_x > 2 OR (v_jump = 1) THEN + SET v_x = 1; + SET v_line = v_line + 1; + END IF; + ELSEIF v_row = 3 THEN + SET v_x = v_x + 1; + IF v_x > 3 OR (v_jump = 1) THEN + SET v_x = 1; + SET v_line = v_line + 1; + END IF; + END IF; + + SELECT MIN(fieldid) INTO v_y FROM tmp_fields WHERE fieldid > v_y; + END WHILE; + + /* + 批次更新(不需逐筆寫入) + step 5: setup read only(create_user ..) + step 6: flow_status 的預設值為 N + */ + UPDATE zen_fields + SET fieldro = 'Y' + WHERE functiontag = p_functiontag + AND fieldname IN ('create_user','create_date','update_user','update_date') + AND IFNULL(fieldro, '') = ''; + + UPDATE zen_fields + SET fielddefault = '$ls:userid' + WHERE functiontag = p_functiontag + AND fieldname = 'create_user' + AND IFNULL(fielddefault, '') = ''; + + UPDATE zen_fields + SET fielddefault = 'today' + WHERE functiontag = p_functiontag + AND fieldname = 'create_date' + AND IFNULL(fielddefault, '') = ''; + + UPDATE zen_fields + SET fielddefault = '自動編碼' + WHERE functiontag = p_functiontag + AND fieldname = 'billno' + AND IFNULL(fielddefault, '') = ''; + + UPDATE zen_fields + SET fielddefault = 'today' + WHERE functiontag = p_functiontag + AND fieldname = 'billdate' + AND IFNULL(fielddefault, '') = ''; + + UPDATE zen_fields + SET fielddefault = 'N' + WHERE functiontag = p_functiontag + AND fieldname = 'flow_status' + AND IFNULL(fielddefault, '') = ''; + + -- hidden 的 ds 和 sh 都應該設為 Y ,20230926 + UPDATE zen_fields + SET fieldds = 'Y', fieldsh = 'Y' + WHERE functiontag = p_functiontag + AND fieldobject = 'hidden'; + + SELECT 0 AS code, 'OK' AS msg; + + ELSEIF v_type_q > 0 THEN + -- 處理查詢字段 + CREATE TEMPORARY TABLE tmp_query_fields AS + SELECT * FROM zen_report_fields WHERE functiontag = p_functiontag; + + SELECT MAX(fieldid), MIN(fieldid) + INTO v_imax, v_y + FROM tmp_query_fields; + + SELECT COUNT(*) INTO v_cnt FROM tmp_query_fields; + + SET v_x = 1; + SET v_line = 1; + + WHILE v_y <= v_imax DO + SELECT fieldname, fieldcn, fieldobject, report_type + INTO v_fieldname, v_fieldcn, v_fieldobject, v_report_type + FROM tmp_query_fields WHERE fieldid = v_y; + + /* + step 1: update cname(dd) + */ + UPDATE zen_report_fields + SET fieldcn = trans_cname(v_fieldname, v_fieldcn) + WHERE fieldid = v_y AND fieldname = fieldcn; + + /* + step 2: setup display + */ + UPDATE zen_report_fields + SET fieldds = 'Y' + WHERE fieldid = v_y; + + SELECT MIN(fieldid) INTO v_y FROM tmp_query_fields WHERE fieldid > v_y; + END WHILE; + + SELECT 0 AS code, 'OK' AS msg; + END IF; + + -- 清理臨時表 + DROP TEMPORARY TABLE IF EXISTS tmp_fields; + DROP TEMPORARY TABLE IF EXISTS tmp_query_fields; +END // + +DELIMITER ; \ No newline at end of file diff --git a/tools/zen_get_ext_button.txt b/tools/zen_get_ext_button.txt new file mode 100644 index 0000000..f2849b9 --- /dev/null +++ b/tools/zen_get_ext_button.txt @@ -0,0 +1,258 @@ +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 ; \ No newline at end of file diff --git a/tools/zen_get_keyvalue.txt b/tools/zen_get_keyvalue.txt new file mode 100644 index 0000000..fdb6a79 --- /dev/null +++ b/tools/zen_get_keyvalue.txt @@ -0,0 +1,87 @@ +DELIMITER // + +CREATE OR REPLACE FUNCTION zen_get_keyvalue( + p_tablename VARCHAR(100), + p_fieldname VARCHAR(20) +) +RETURNS TEXT +DETERMINISTIC +/* + Function : 改寫成 api 給 amis 呼叫時, 如果一個 Form 上有多個 select 是固定內容 + Description: 如上 + Build Date : 2022/02/16 + + Modify History + Item Who Date Modify Docs + ===M= ========== ========== ================================================ + 1 Michael 2022/02/16 Init +*/ +BEGIN + DECLARE v_cnt INT; + DECLARE v_crlf VARCHAR(2); + DECLARE v_comma VARCHAR(1); + DECLARE v_value VARCHAR(100); + DECLARE v_label VARCHAR(100); + DECLARE v_rets TEXT; + DECLARE v_imax INT; + DECLARE v_inow INT; + DECLARE v_rowid INT DEFAULT 1; + + -- 臨時表儲存 JSON 數據 + DROP TEMPORARY TABLE IF EXISTS temp_jsondata; + CREATE TEMPORARY TABLE temp_jsondata ( + rowid INT AUTO_INCREMENT PRIMARY KEY, + value VARCHAR(100), + label VARCHAR(100) + ); + + SET v_crlf = CONCAT(CHAR(13), CHAR(10)); + + -- 檢查是否有設定到 tablename + SELECT COUNT(*) INTO v_cnt FROM zen_keyvalue + WHERE tablename = p_tablename AND fieldname = p_fieldname; + + IF v_cnt > 0 THEN + INSERT INTO temp_jsondata (value, label) + SELECT keyid AS value, keyvalue AS label + FROM zen_keyvalue + WHERE tablename = p_tablename AND fieldname = p_fieldname; + ELSE + INSERT INTO temp_jsondata (value, label) + SELECT keyid AS value, keyvalue AS label + FROM zen_keyvalue + WHERE tablename = 'xxxx' AND fieldname = p_fieldname; + END IF; + + -- 回傳 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 + IF v_inow = v_imax THEN + SET v_comma = ''; + END IF; + + SELECT value, label INTO v_value, v_label + FROM temp_jsondata + WHERE rowid = v_inow; + + SET v_rets = CONCAT(v_rets, + ' {', v_crlf, + ' "label": "', v_label, '",', v_crlf, + ' "value": "', v_value, '"', v_crlf, + ' }', v_comma, v_crlf); + + SET v_inow = v_inow + 1; + END WHILE; + + SET v_rets = CONCAT('"options": [ ', v_rets, ' ],', v_crlf); + + DROP TEMPORARY TABLE IF EXISTS temp_jsondata; + + RETURN v_rets; +END // + +DELIMITER ; \ No newline at end of file diff --git a/tools/zen_get_mapping.txt b/tools/zen_get_mapping.txt new file mode 100644 index 0000000..5ad2687 --- /dev/null +++ b/tools/zen_get_mapping.txt @@ -0,0 +1,81 @@ +DELIMITER // + +CREATE OR REPLACE FUNCTION zen_get_mapping( + p_tablename VARCHAR(100), + p_fieldname VARCHAR(20) +) +/* + Function : Rewrite as an API for AMIS to call. Display JSON content with mapping icons + Description: As above + Build Date : 2022/02/16 + + Modify History + Item Who Date Modify Docs + ==== ========== ========== ================================================ + 1 Michael 2022/02/16 Init +*/ +RETURNS TEXT +BEGIN + DECLARE v_cnt INT; + DECLARE v_crlf VARCHAR(2); + DECLARE v_comma VARCHAR(1); + DECLARE v_value VARCHAR(100); + DECLARE v_label VARCHAR(100); + DECLARE v_keydesc VARCHAR(100); + DECLARE v_rets TEXT; + DECLARE v_imax INT; + DECLARE v_inow INT; + + -- 创建临时表来存储JSON数据 + DROP TEMPORARY TABLE IF EXISTS temp_jsondata; + CREATE TEMPORARY TABLE temp_jsondata ( + value VARCHAR(100), + label VARCHAR(100), + keydesc VARCHAR(100), + rowid INT AUTO_INCREMENT PRIMARY KEY + ); + + SET v_crlf = CONCAT(CHAR(13), CHAR(10)); + + -- 检查是否有设置到 tablename + SELECT COUNT(*) INTO v_cnt FROM zen_keyvalue + WHERE tablename = p_tablename AND fieldname = p_fieldname; + + IF v_cnt > 0 THEN + INSERT INTO temp_jsondata (value, label, keydesc) + SELECT keyid AS value, keyvalue AS label, keydesc + FROM zen_keyvalue + WHERE tablename = p_tablename AND fieldname = p_fieldname; + ELSE + INSERT INTO temp_jsondata (value, label, keydesc) + SELECT keyid AS value, keyvalue AS label, keydesc + FROM zen_keyvalue + WHERE tablename = 'xxxx' AND fieldname = p_fieldname; + END IF; + + -- 返回 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 + IF v_inow = v_imax THEN + SET v_comma = ''; + END IF; + + SELECT value, label, keydesc INTO v_value, v_label, v_keydesc + FROM temp_jsondata WHERE rowid = v_inow; + + SET v_rets = CONCAT(v_rets, + -- ' "', v_value, '": "', v_label, '"', v_comma); + ' "', v_value, '": "', v_label, '"', v_comma); + SET v_inow = v_inow + 1; + END WHILE; + + SET v_rets = CONCAT('"map": { ', v_rets, ' },', v_crlf); + + RETURN v_rets; +END // + +DELIMITER ; diff --git a/tools/zen_get_picker.txt b/tools/zen_get_picker.txt new file mode 100644 index 0000000..da516de --- /dev/null +++ b/tools/zen_get_picker.txt @@ -0,0 +1,51 @@ +DELIMITER // + +CREATE PROCEDURE zen_get_picker ( + IN functiontag VARCHAR(100), -- pickerId, basm501=product, basm610=customer + IN fieldname VARCHAR(100), -- return correct field name + IN formsize VARCHAR(10) -- form size 可以由此控制 +) +/* + 因為 picker 是統一的需求, 為了統一控管, 改為 service + schemaApi, 同時也可以大幅縮端程式碼 + 目前測試時有一個 issue 尚待處理, 原定義在 picker 內的 label 會因改為 service + schemaApi 而不顯示, 影響排版 + + 這樣的寫法可以執行, 但無法 update picker.name 傳參數會有問題 + { + "type": "service", + "schemaApi": "get:/pages/zen_picker_basm601.json" + }, + + 以下的寫法測試仍有問題(不會報錯, 但 picker 未顯示) + { + "type": "service", + "schemaApi": { + "method": "post", + "url": "http://127.0.0.1:5050/xapi/v2/zenWizard/zen_get_picker/3/", + "data": { + "para01": "basm61", + "para02": "para05", + "para03": "lg" + }, + "dataType": "form" + } + }, + + CALL zen_get_picker('basm601', 'para05'); +*/ +BEGIN + DECLARE picker TEXT; + DECLARE version VARCHAR(20); + + SET version = 'picker'; + + -- get and replace data + SELECT jsoncode INTO picker FROM zen_jsoncode WHERE functiontag = functiontag AND version = version; + SET picker = REPLACE(picker, '@fieldname@', fieldname); + SET picker = REPLACE(picker, '@formsize@', formsize); + + -- return ds + SELECT 0 AS code, 'OK' AS msg; + SELECT picker AS jsoncode; +END // + +DELIMITER ; diff --git a/tools/zen_import_fields.txt b/tools/zen_import_fields.txt new file mode 100644 index 0000000..c481dde --- /dev/null +++ b/tools/zen_import_fields.txt @@ -0,0 +1,91 @@ +DELIMITER // + +CREATE OR REPLACE PROCEDURE zen_import_fields( + IN p_functiontag VARCHAR(100), + IN p_tablename VARCHAR(100) +) +/* + Function : 回傳指定 table 的 schema 並寫入 zen_fields + Description: + Build Date : 2021/08/14 + Modified : 2025/08/09 (轉換為 MariaDB 並加入自動寫入功能) + + Call Sample: + CALL zen_import_fields('abc01','clinic'); + + Modify History + Item Who Date Modify Docs + ==== ========== ========== ================================================ + 1 Michael + 2 Assistant 2025/08/09 轉換為 MariaDB 並加入自動寫入功能 +*/ +BEGIN + DECLARE v_count INT; + + -- 檢查 zen_fields 表中是否已存在該 functiontag 的記錄 + SELECT COUNT(*) INTO v_count + FROM zen_fields + WHERE functiontag = p_functiontag; + + -- 創建臨時表存儲表結構 + DROP TEMPORARY TABLE IF EXISTS temp_schema; + CREATE TEMPORARY TABLE temp_schema ( + tablename VARCHAR(60), + fieldname VARCHAR(60), + seqno INT, + fieldobject VARCHAR(20), + fieldlength INT, + fielddefault VARCHAR(200), + fieldchecknull VARCHAR(10), + fieldcn NVARCHAR(60) + ); + + -- 從 information_schema 讀取表結構 + INSERT INTO temp_schema + SELECT + p_tablename AS tablename, + COLUMN_NAME AS fieldname, + ORDINAL_POSITION AS seqno, + DATA_TYPE AS fieldobject, + CHARACTER_MAXIMUM_LENGTH AS fieldlength, + COLUMN_DEFAULT AS fielddefault, + IF(IS_NULLABLE = 'YES', 'Y', 'N') AS fieldchecknull, + COLUMN_COMMENT AS fieldcn + FROM information_schema.COLUMNS + WHERE TABLE_NAME = p_tablename + AND TABLE_SCHEMA = DATABASE() + ORDER BY ORDINAL_POSITION; + + -- 處理空值 + UPDATE temp_schema SET fieldcn = '' WHERE fieldcn IS NULL; + + -- 如果 zen_fields 中沒有該 functiontag 的記錄,則插入新記錄 + IF v_count = 0 THEN + INSERT INTO zen_fields ( + functiontag, seqno, tablename, fieldname, fieldcn, fielden, fieldlength, + fieldwidth, fieldobject, fielddefault, fieldchecknull, fieldblock, + fieldds, fieldsh, fieldfm, fieldro, cellno, cellx, celly, cellline, datatype + ) + SELECT + p_functiontag, seqno, tablename, fieldname, fieldcn, '' AS fielden, fieldlength, + 120 AS fieldwidth, fieldobject, fielddefault, fieldchecknull, 0 AS fieldblock, + CASE WHEN seqno <= 6 THEN 'Y' ELSE 'N' END AS fieldds, 'Y' AS fieldsh, + '' AS fieldfm, 'N' AS fieldro, 0 AS cellno, 1 AS cellx, 1 AS celly, 1 AS cellline, fieldobject + FROM temp_schema; + END IF; + + -- 返回結果 + SELECT 0 AS code, 'ok' AS msg; + + SELECT + p_functiontag AS functiontag, seqno, tablename, fieldname, fieldcn, '' AS fielden, fieldlength, + 120 AS fieldwidth, fieldobject, fielddefault, fieldchecknull, 0 AS fieldblock, + CASE WHEN seqno <= 6 THEN 'Y' ELSE 'N' END AS fieldds, 'Y' AS fieldsh, + '' AS fieldfm, 'N' AS fieldro, 0 AS cellno, 1 AS cellx, 1 AS celly, 1 AS cellline + FROM temp_schema; + + DROP TEMPORARY TABLE IF EXISTS temp_schema; + +END // + +DELIMITER ; \ No newline at end of file diff --git a/tools/zen_null.txt b/tools/zen_null.txt new file mode 100644 index 0000000..17fd06d --- /dev/null +++ b/tools/zen_null.txt @@ -0,0 +1,18 @@ +DELIMITER // + +CREATE OR REPLACE PROCEDURE zen_null() +/* + 為了執行 js 跑一段假的 api +*/ +BEGIN + DECLARE code INT; + DECLARE msg VARCHAR(255); + + -- Return a fake response + SELECT 0 AS code, 'OK' AS msg; + + -- Return an empty result set + SELECT * FROM sys_users WHERE 1 = 0; +END // + +DELIMITER ; diff --git a/tools/zen_parse_sp.txt b/tools/zen_parse_sp.txt new file mode 100644 index 0000000..f9ace2b --- /dev/null +++ b/tools/zen_parse_sp.txt @@ -0,0 +1,124 @@ +DELIMITER // + +CREATE PROCEDURE zen_parse_sp( + IN actiontype VARCHAR(10), -- fields/parain + IN sp_name VARCHAR(200), + IN functiontag VARCHAR(200) +) +/* + function : 想辦法取得 sp 最後回傳的欄位名稱列表 + description: 有跨 db 的語法, 記得測試完後要移除 + build date : 2021/12/02 + + call sample: + CALL zen_parse_sp('gexrpt_opor02'); + + modify history + item who date modify docs + ==== ========== ========== ================================================ + 1 michael 2021/12/02 新增 +*/ +BEGIN + DECLARE sql_text TEXT; + DECLARE data_text TEXT; + DECLARE pos INT; + DECLARE ret2_col VARCHAR(100); + DECLARE ret2_fieldobject VARCHAR(100); + DECLARE ret2_related_provider VARCHAR(100); + DECLARE ret2_default_value VARCHAR(100); + DECLARE ret2_celly SMALLINT; + DECLARE ret2_seqno INT; + DECLARE ret2_rowid INT; + + SELECT text INTO sql_text + FROM information_schema.routines + WHERE routine_name = sp_name AND routine_type = 'PROCEDURE'; + + -- 回傳的欄位 + IF actiontype = 'fields' THEN + SELECT 0 AS code, 'ok' AS msg; + + CREATE TEMPORARY TABLE ret2 AS + SELECT + functiontag, + column_name AS fieldname, + column_name AS fieldcn, + CASE WHEN LOCATE('date', data_type) > 0 THEN 'static-date' ELSE 'static' END AS fieldobject, + ordinal_position AS seqno + FROM information_schema.columns + WHERE table_schema = DATABASE() AND table_name = sp_name; + + SELECT * FROM ret2; + + -- 傳入的參數 + ELSEIF actiontype = 'parain' THEN + -- 取得 () 內的資料 + SET pos = LOCATE('/*', sql_text); + IF pos > 0 THEN + SET sql_text = SUBSTRING(sql_text, 1, pos - 5); + END IF; + + SET pos = LOCATE('as', sql_text); + IF pos > 0 THEN + SET sql_text = SUBSTRING(sql_text, 1, pos - 5); + END IF; + + SET pos = LOCATE('(', sql_text); + SET data_text = SUBSTRING(sql_text, pos + 1, LENGTH(sql_text)); + + CREATE TEMPORARY TABLE ret2 ( + col VARCHAR(100), + fieldobject VARCHAR(100), + related_provider VARCHAR(100), + default_value VARCHAR(100), + celly SMALLINT, + rowid INT AUTO_INCREMENT, + PRIMARY KEY (rowid) + ); + + -- 開始分析(, 分隔) + INSERT INTO ret2 (col) + SELECT col FROM gf_split(data_text, ','); + + UPDATE ret2 SET col = SUBSTRING(col, LOCATE('@', col), LENGTH(col)); + UPDATE ret2 SET col = SUBSTRING(col, 1, LOCATE(' ', col) - 1); + + -- 想辦法給定一些 default + UPDATE ret2 SET fieldobject = 'input-text', default_value = '*'; + + UPDATE ret2 SET + fieldobject = 'input-date', + default_value = 'today' + WHERE LOCATE('date', col) > 0; + + UPDATE ret2 SET + fieldobject = 'picker', + related_provider = 'basm61' + WHERE LOCATE('cust', col) > 0; + + UPDATE ret2 SET + fieldobject = 'picker', + related_provider = 'basm51' + WHERE LOCATE('product', col) > 0; + + UPDATE ret2 SET + fieldobject = 'picker', + related_provider = 'basm67' + WHERE LOCATE('person', col) > 0; + + -- 如果第一個 para 是 token + SELECT COUNT(*) INTO pos FROM ret2 WHERE rowid = 1 AND LOCATE('token', col) > 0; + IF pos > 0 THEN + UPDATE ret2 SET default_value = '${ls:token}' WHERE LOCATE('token', col) > 0; + END IF; + + SELECT 0 AS code, 'ok' AS msg; + + SELECT functiontag, col AS fcaption, 1 AS celly, rowid - pos AS seqno, fieldobject, related_provider, default_value + FROM ret2; + + END IF; + +END // + +DELIMITER ; diff --git a/tools/zen_picker.txt b/tools/zen_picker.txt new file mode 100644 index 0000000..9f99253 --- /dev/null +++ b/tools/zen_picker.txt @@ -0,0 +1,272 @@ +DELIMITER // + +CREATE OR REPLACE FUNCTION zen_picker( + p_picker_tag VARCHAR(100), -- 傳入 popup 的資料來源 functiontag + p_fieldname NVARCHAR(100), -- 呼叫端的欄位 + p_fieldcname NVARCHAR(100), -- 呼叫端的欄位名稱 + p_actiontype CHAR(2), -- (R)ead/(E)dit/(Q)uery + p_ip VARCHAR(100), -- 'https://api.gex.com.tw:5443' + p_db VARCHAR(100), -- 'zenBusiness' + p_source_tag VARCHAR(100) -- 原呼叫功能(常需要參考原 tag 的設定) +) +RETURNS TEXT +/* + function : amis Wizard 中負責產生 picker 相關程式片段的 udf + description: + build date : 2021/10/10 + + modify history + item who date modify docs + ==== ========== ========== ================================================ + 1 michael 2021/10/10 新增 + 2 Michael 2023-02-01 為了更加彈性, @ip 及 @db 這2個欄位改傳入 ${ls:xxxx}, 測試可行(程式要調整前端呼叫的程式) + 3 Michael 2023-09-01 新增 picker 可以傳回多欄位的設定 + 4 Michael 2023-09-25 依 amis 建議 keywords 的變數不要用 - + 5 Michael 2024-01-23 @visibleOn 新增欄位, 配合週期性行事曆, 會設定條件顯示/不顯示本元件 + 6 Michael 2024-03-03 修改 labelField 的顯示判斷 +*/ +BEGIN + DECLARE v_ret TEXT; + DECLARE v_dd_table VARCHAR(100); + DECLARE v_dd_pk VARCHAR(100); + DECLARE v_dd_functionname VARCHAR(100); + DECLARE v_dd_name VARCHAR(100); + DECLARE v_labelField VARCHAR(100); + DECLARE v_fieldchecknull VARCHAR(10); -- New + DECLARE v_dd_fieldname VARCHAR(100); + DECLARE v_dd_Fieldcn NVARCHAR(100); + DECLARE v_dd_FieldWidth VARCHAR(10); + DECLARE v_dd_field_object VARCHAR(100); + DECLARE v_dd_field_display_name CHAR(1); + DECLARE v_query_filter VARCHAR(200); + DECLARE v_query_grid TEXT; + DECLARE v_date_fmt VARCHAR(100); + DECLARE v_obj VARCHAR(100); + DECLARE v_FieldWidth VARCHAR(10); + DECLARE v_dvalue VARCHAR(100); + DECLARE v_q_filter VARCHAR(100); + DECLARE v_q_inputClassName VARCHAR(100); + DECLARE v_visibleOn VARCHAR(100); + DECLARE v_vKey VARCHAR(100); + DECLARE v_vVal VARCHAR(100); + DECLARE v_crlf VARCHAR(2); + DECLARE v_imax INT; + DECLARE v_inow INT; + DECLARE v_ipos INT; + + -- 與原呼叫端相關(視情況新增) + DECLARE v_fielddefault NVARCHAR(100); -- 新增的預設值(若無則空) + DECLARE v_iscolumnmatch CHAR(1); -- 是否傳回多欄位 + DECLARE v_dd_fieldblock INT; + + -- 臨時表儲存 JSON 數據 + DROP TEMPORARY TABLE IF EXISTS temp_jsondata_picker; + CREATE TEMPORARY TABLE temp_jsondata_picker ( + rowid INT AUTO_INCREMENT PRIMARY KEY, + fieldname VARCHAR(100), + Fieldcn NVARCHAR(100), + fieldobject VARCHAR(100), + field_display_name CHAR(1), + FieldWidth VARCHAR(10) + ); + + -- 取得欄位設定, 多取是否必填 + -- M-D 表單惡裡可能會取到 2筆資料, 要防錯 20250906 (取表頭) + SELECT fielddefault, iscolumnmatch, fieldblock, FieldWidth, visibleOn, fieldchecknull + INTO v_fielddefault, v_iscolumnmatch, v_dd_fieldblock, v_FieldWidth, v_visibleOn, v_fieldchecknull + FROM zen_fields + WHERE functiontag = p_source_tag AND fieldname = p_fieldname LIMIT 1; + -- and fieldblock < 90; + + SET v_crlf = CONCAT(CHAR(13), CHAR(10)); + + -- 防錯(Query) + IF p_ip = '' THEN SET p_ip = '${ls:base_ip}'; END IF; + IF p_db = '' THEN SET p_db = '${ls:base_db}'; END IF; + + -- 取得資料 + SELECT maintable, mainkey, functionname + INTO v_dd_table, v_dd_pk, v_dd_functionname + FROM zen_function + WHERE functiontag = p_picker_tag; + + -- 插入資料到臨時表 + INSERT INTO temp_jsondata_picker (fieldname, Fieldcn, fieldobject, field_display_name, FieldWidth) + SELECT fieldname, Fieldcn, fieldobject, field_display_name, CAST(FieldWidth AS CHAR) + FROM zen_fields + WHERE functiontag = p_picker_tag AND fieldds = 'Y' + ORDER BY celly, cellx; + + -- 計算 _group (body-group) 排列 + SELECT MAX(rowid) INTO v_imax FROM temp_jsondata_picker; + SELECT MIN(rowid) INTO v_inow FROM temp_jsondata_picker; + -- SET v_inow = 1; + SET v_query_filter = ''; + SET v_query_grid = ''; + + WHILE v_inow <= v_imax DO + SELECT fieldname, Fieldcn, fieldobject, field_display_name, FieldWidth + INTO v_dd_fieldname, v_dd_Fieldcn, v_dd_field_object, v_dd_field_display_name, v_dd_FieldWidth + FROM temp_jsondata_picker + WHERE rowid = v_inow; + + IF v_dd_field_display_name = 'Y' THEN + SET v_labelField = v_dd_fieldname; + END IF; + + IF v_dd_field_object = 'input-text' THEN + SET v_query_filter = CONCAT(v_query_filter, v_dd_fieldname, ','); + END IF; + + SET v_obj = 'text'; + SET v_date_fmt = ''; + + IF v_dd_field_object = 'input-date' THEN + SET v_obj = 'static-date'; + SET v_date_fmt = CONCAT(' "format": "YYYY-MM-DD",', v_crlf); + END IF; + + SET v_query_grid = CONCAT(v_query_grid, + ' {', v_crlf, + ' "type": "', v_obj, '",', v_crlf, + ' "name": "', v_dd_fieldname, '",', v_crlf, + ' "label": "', v_dd_Fieldcn, '",', v_crlf, + v_date_fmt, + ' "toggled": true', v_crlf, + ' },'); + + SET v_inow = v_inow + 1; + END WHILE; + + IF v_query_filter <> '' THEN + SET v_query_filter = SUBSTRING(v_query_filter, 1, CHAR_LENGTH(v_query_filter) - 1); + END IF; + + IF v_query_grid <> '' THEN + SET v_query_grid = CONCAT(SUBSTRING(v_query_grid, 1, CHAR_LENGTH(v_query_grid) - 1), v_crlf); + END IF; + + -- Query 有2處要修改 + IF p_actiontype = 'Q' THEN + SET v_dvalue = '*'; + SET v_q_filter = ''; + SET v_q_inputClassName = ' "inputClassName": "w-60",'; + ELSE + -- 新增也可以給預設值 2023/1/14 Michael + IF v_fielddefault <> '' THEN + IF SUBSTRING(v_fielddefault, 1, 3) = 'ls:' THEN + SET v_fielddefault = CONCAT('${', v_fielddefault, '}'); + END IF; + END IF; + + SET v_dvalue = v_fielddefault; + SET v_q_filter = ''; + SET v_q_inputClassName = ''; + END IF; + + -- 動態顯式否 + IF IFNULL(v_visibleOn, '') <> '' THEN + SET v_ipos = LOCATE(',', v_visibleOn); + IF v_ipos > 0 THEN + SET v_vKey = SUBSTRING(v_visibleOn, 1, v_ipos - 1); + SET v_vVal = SUBSTRING(v_visibleOn, v_ipos + 1, 100); + SET v_q_inputClassName = CONCAT(' "visibleOn": "this.', v_vKey, ' == \\"', v_vVal, '\\"",'); + END IF; + END IF; + + -- 加入是否必填 + IF (IFNULL(v_fieldchecknull, '') = 'Y' or IFNULL(v_fieldchecknull, '') = 'A') THEN + SET v_q_inputClassName = CONCAT(' "required": true,', v_crlf, v_q_inputClassName); + END IF; + + IF SUBSTRING(p_actiontype, 1, 1) = 'E' OR p_actiontype = 'Q' THEN + SET v_ret = CONCAT('{', v_crlf, + ' "type": "picker",', v_crlf, + ' "name": "', p_fieldname, '",', v_crlf, + ' "joinValues": ', IF(v_iscolumnmatch = 'Y', 'false', 'true'), ',', v_crlf, + ' "valueField": "', v_dd_pk, '",', v_crlf, + ' "labelField": "', + IF((v_dd_fieldblock >= 90 AND v_iscolumnmatch = 'Y') OR IFNULL(v_labelField, '') = '', + v_dd_pk, v_labelField), '",', v_crlf, + IF(v_dd_fieldblock >= 90 OR IFNULL(v_labelField, '') = '', + CONCAT(' "width": ', v_FieldWidth, ',', v_crlf), ''), + ' "label": "', p_fieldcname, '",', v_crlf, + v_q_inputClassName, v_crlf, + ' "source": {', v_crlf, + ' "method": "post",', v_crlf, + ' "url": "', p_ip, '/xapi/v2/', p_db, '/orm_api/3/",', v_crlf, + ' "data": {', v_crlf, + ' "token": "${ls:token}",', v_crlf, + ' "page": "${page}",', v_crlf, + ' "perPage": "${perPage}",', v_crlf, + ' "keywords": "${', p_fieldname, '_keywords}",', v_crlf, + ' "_$_tableName": "', v_dd_table, '",', v_crlf, + ' "_$_pk": "', v_dd_pk, '",', v_crlf, + ' "_$_action": "P",', v_crlf, + ' "_$_query_filter": "1^10^', v_dd_pk, '^*^^^', v_query_filter, v_q_filter, '"', v_crlf, + ' },', v_crlf, + ' "dataType": "form"', v_crlf, + ' },', v_crlf, + ' "size": "', IF(v_imax > 6, 'lg', 'md'), '",', v_crlf, + ' "value": "', v_dvalue, '",', v_crlf, + ' "multiple": false,', v_crlf, + ' "pickerSchema": {', v_crlf, + ' "mode": "table",', v_crlf, + ' "tableClassName": "myGridHeader_a",', v_crlf, + ' "title": "', v_dd_functionname, '",', v_crlf, + ' "name": "', v_dd_table, '_', p_fieldname, '",', v_crlf, + ' "headerToolbar": {', v_crlf, + ' "wrapWithPanel": false,', v_crlf, + ' "type": "form",', v_crlf, + ' "className": "text-right",', v_crlf, + ' "target": "', v_dd_table, '_', p_fieldname, '",', v_crlf, + ' "mode": "inline",', v_crlf, + ' "body": [', v_crlf, + ' {', v_crlf, + ' "type": "input-text",', v_crlf, + ' "name": "', p_fieldname, '_keywords",', v_crlf, + ' "addOn": {', v_crlf, + ' "type": "submit",', v_crlf, + ' "label": "查詢",', v_crlf, + ' "tooltip": "輸入 * 可以查詢全部資料",', v_crlf, + ' "level": "primary",', v_crlf, + ' "icon": "fa fa-search pull-left"', v_crlf, + ' }', v_crlf, + ' }', v_crlf, + ' ]', v_crlf, + ' },', v_crlf, + ' "columns": [', v_crlf, + v_query_grid, + ' ]', v_crlf, + ' }', v_crlf, + '}', v_crlf); + ELSE -- for View + SET v_ret = CONCAT('{', v_crlf, + ' "type": "picker",', v_crlf, + ' "name": "', p_fieldname, '",', v_crlf, + ' "disabled": true,', v_crlf, + ' "joinValues": true,', v_crlf, + ' "valueField": "', v_dd_pk, '",', v_crlf, + ' "labelField": "', IFNULL(v_labelField, ''), '",', v_crlf, + ' "label": "', p_fieldcname, '",', v_crlf, + ' "source": {', v_crlf, + ' "method": "post",', v_crlf, + ' "url": "', p_ip, '/xapi/v2/', p_db, '/orm_api/3/",', v_crlf, + ' "data": {', v_crlf, + ' "token": "${ls:token}",', v_crlf, + ' "_$_tableName": "', v_dd_table, '",', v_crlf, + ' "_$_pk": "', v_dd_pk, '",', v_crlf, + ' "_$_action": "P",', v_crlf, + ' "_$_query_filter": "1^10^', v_dd_pk, '^*^^^', v_query_filter, '^${', p_fieldname, '}"', v_crlf, + ' },', v_crlf, + ' "dataType": "form"', v_crlf, + ' }', v_crlf, + '}', v_crlf); + END IF; + + DROP TEMPORARY TABLE IF EXISTS temp_jsondata_picker; + + RETURN v_ret; +END // + +DELIMITER ; \ No newline at end of file diff --git a/tools/zen_read_schema.txt b/tools/zen_read_schema.txt new file mode 100644 index 0000000..b857294 --- /dev/null +++ b/tools/zen_read_schema.txt @@ -0,0 +1,38 @@ +DELIMITER // + +CREATE OR REPLACE PROCEDURE zen_read_schema ( + IN p_tablename VARCHAR(100) +) +/* + 功能:讀取資料表結構資訊 + 範例:CALL zen_read_schema('pmsproject_class'); +*/ +BEGIN + SELECT + t.TABLE_NAME AS '表格名稱', + c.COLUMN_NAME AS '欄位名稱', + c.ORDINAL_POSITION AS '序號', + c.DATA_TYPE AS '資料型別', + IFNULL(c.CHARACTER_MAXIMUM_LENGTH, '') AS '長度', + '' AS '預設值', + CASE WHEN c.IS_NULLABLE = 'YES' THEN 'N' ELSE 'Y' END AS '是否允許空值', + IFNULL( + (SELECT COLUMN_COMMENT + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA = t.TABLE_SCHEMA + AND TABLE_NAME = t.TABLE_NAME + AND COLUMN_NAME = c.COLUMN_NAME), + '' + ) AS '欄位描述' + FROM + INFORMATION_SCHEMA.TABLES t + LEFT JOIN INFORMATION_SCHEMA.COLUMNS c ON t.TABLE_NAME = c.TABLE_NAME AND t.TABLE_SCHEMA = c.TABLE_SCHEMA + WHERE + t.TABLE_TYPE = 'BASE TABLE' + AND t.TABLE_NAME = p_tablename + ORDER BY + t.TABLE_NAME, + c.ORDINAL_POSITION; +END// + +DELIMITER ; \ No newline at end of file diff --git a/tools/zen_showsource.txt b/tools/zen_showsource.txt new file mode 100644 index 0000000..d7f8d14 --- /dev/null +++ b/tools/zen_showsource.txt @@ -0,0 +1,111 @@ +DELIMITER // + +CREATE OR REPLACE PROCEDURE zen_showsource ( + IN p_functiontag VARCHAR(100), + IN p_version VARCHAR(100), + IN p_ip varchar(100) +) +/* + function : 配合 amis 的 Service 元件, 取回 jsoncode, 動態產生程式的核心程式 + description: 開啟表單時通常會有預設條件, 這是一個很接近 hard-code 的機制, 但是因為 amis 限制太多, 只好硬開洞解決 + 1.原程式的 crud 若有 ${ls:query_id} ==> 固定變數設定(如下) + "_$_query_filter": "1^10^functiontag,celly,seqno^*^^^functiontag,report_type,report_orderby^${ls:query_id}" + 2.sp 的 @version 內容如果有傳入 @, 那 @ 後的內容就是要 replace 的內容 + 3.就把 ${ls:query_id} replace 掉, 用這種方式解決動態載入程式, 並能限制資料內容 + 4.目前是針對 zen12(如上設定), 呼叫 zen14 先測試使用, 如果沒問題可以考慮變成標準機制 + + 如果 @version 內容中沒有 @, 那就是一般程式, @_W_ 表示是為可編輯 Source 狀態 + build date : 2021/10/17 + + call sample: + CALL zen_showsource('zen14','beta@crmr02','https://api.gex.com.tw:5443') + + modify history + item who date modify docs + ==== ========== ========== ================================================ + 1 michael 2021-10-17 新增 + 2 Michael 2021-10-18 amis 的 crud grid 傳入的 id 似乎是前一筆, 這個 bug 已經有人提, 等改版(已修正) + 3 Michael 2022-02-05 加入防錯 + 4 Michael 2022-07-14 加入 IP Router 新機制(仍維持向上相容) + 5 Michael 2022-11-26 加入例外機制, bpmq11, q12 + 6 Michael 2023-01-25 新增 @values=_W_ 的判斷, 非 _W_ 為 Read Only, 只有在 Source 編輯狀態下, 才會傳入 _W_ + 7 Michael 2023-02-01 為了更加彈性, @ip 這個欄位改傳入 ${ls:base_ip} + 8 Michael 2023-04-04 改依參數檔設定的程式版本別 + 9 Michael 2023-05-20 size=full, 改為 size=xl, 因 amis 3.0 改版 + 10 Michael 2024-02-12 重構程式後, 重新想清楚邏輯後調整 code + 11 Michael 2024/03/06 擴充 json4 及 json5 2個欄位 +*/ +BEGIN + -- @version 最終會是版本別, 目前應該只會是 beta 或 prod + -- @value 則是表單傳值, 要限制開窗表單的資料內容, 若無, 應該要空白 + DECLARE v_version_org VARCHAR(100); + DECLARE v_values VARCHAR(100); + DECLARE v_pvalue VARCHAR(100); + DECLARE v_ipos SMALLINT; + DECLARE v_rets LONGTEXT; + DECLARE v_isNew INT; + DECLARE v_final_version VARCHAR(100); + + /* + 傳入時 @version 可能會有下列內容 + 1.只要含 _W_ 就表示是編輯 source, 直接顯示原內容, 不要有任何 replace + 2.{ls:query_id} + 3.beta@A001 + */ + SET v_version_org = p_version; + SET v_values = ''; + SET v_ipos = INSTR(p_version, '@'); + SET v_final_version = IFNULL(p_version, 'beta'); + + IF v_ipos > 0 THEN + -- _W_: Writeables(編輯 Source Code 的狀態) + SET v_values = SUBSTRING(p_version, v_ipos+1); + SET v_final_version = SUBSTRING(p_version, 1, v_ipos-1); + END IF; + + -- 依設定的程式版本別設定變數 2023/04/04, @version 一定要有值 + IF (SELECT COUNT(*) FROM information_schema.TABLES + WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'sys_parameter') > 0 THEN + SELECT pvalue INTO v_pvalue FROM sys_parameter + WHERE systemid = 'base' AND pid = 'ver_type' LIMIT 1; + + IF v_pvalue IS NOT NULL AND v_pvalue <> '' THEN + SET v_final_version = v_pvalue; + END IF; + END IF; + + -- 取得 JSON 代碼(擴充欄位) + -- SELECT CONCAT(IFNULL(jsoncode,''), IFNULL(jsoncode2,''), IFNULL(jsoncode3,''), + -- IFNULL(jsoncode4,''), IFNULL(jsoncode5,'')) INTO v_rets + + SELECT jsoncode INTO v_rets + FROM zen_jsoncode + WHERE functiontag = p_functiontag AND version = v_final_version; + + -- 只要有 _W_ 就表示不動 code, 完全顯示原本的內容 + IF INSTR(v_version_org, '_W_') <= 0 THEN + -- 主要的核心程式, 替換掉 ls 的內容 + IF v_values <> '' THEN + SET v_rets = REPLACE(v_rets, '${ls:query_id}', v_values); + END IF; + + /* + 這個地方的原寫法是錯的, 本意是當 localStorage 如果未設定值, 執行時會報錯 + 但是會造成只要先讀再寫, ${ls:query_id} 就會被從 json 設定(source code) 中移除, 那就會造成這個設定不見了 + 正確的作法是要確保 ls 一定會在被呼叫前清除, 再傳入 ls 當作參數 + Michael 2023/1/25 + */ + -- 防錯, 若有多餘的設定要防錯 2022-2-5, 加上除外機制 + IF INSTR(v_rets, '${ls:query_id}') > 0 AND (p_functiontag NOT IN ('bpmq11','bpmq12')) THEN + SET v_rets = REPLACE(v_rets, '${ls:query_id}', ''); + END IF; + ELSE + SET v_rets = REPLACE(v_rets, '_W_', ''); + END IF; + + -- 返回結果 + SELECT 0 AS code, 'OK' AS msg; + SELECT v_rets AS jsoncode; +END// + +DELIMITER ; \ No newline at end of file diff --git a/tools/zen_tri_json_log.txt b/tools/zen_tri_json_log.txt new file mode 100644 index 0000000..100b413 --- /dev/null +++ b/tools/zen_tri_json_log.txt @@ -0,0 +1,25 @@ +DELIMITER // + +CREATE TRIGGER zen_tri_json_log +AFTER UPDATE ON zen_jsoncode +FOR EACH ROW +BEGIN + DECLARE v_cnt INT; + + -- 當 json code 被修改, 就記錄到 log + IF OLD.jsoncode <> NEW.jsoncode OR OLD.jsoncode2 <> NEW.jsoncode2 OR OLD.jsoncode3 <> NEW.jsoncode3 THEN + INSERT INTO zen_jsoncode_log (log_date, functiontag, version, jsoncode, jsoncode2, jsoncode3) + VALUES (NOW(), OLD.functiontag, OLD.version, OLD.jsoncode, OLD.jsoncode2, OLD.jsoncode3); + END IF; +END// + +CREATE TRIGGER zen_tri_json_log_delete +AFTER DELETE ON zen_jsoncode +FOR EACH ROW +BEGIN + -- 當記錄被刪除時記錄到 log + INSERT INTO zen_jsoncode_log (log_date, functiontag, version, jsoncode, jsoncode2, jsoncode3) + VALUES (NOW(), OLD.functiontag, OLD.version, OLD.jsoncode, OLD.jsoncode2, OLD.jsoncode3); +END// + +DELIMITER ; \ No newline at end of file diff --git a/tools/zen_updatesource.txt b/tools/zen_updatesource.txt new file mode 100644 index 0000000..8ff802b --- /dev/null +++ b/tools/zen_updatesource.txt @@ -0,0 +1,63 @@ +DELIMITER // + +CREATE OR REPLACE PROCEDURE zen_updatesource ( + IN p_functiontag VARCHAR(100), + IN p_version VARCHAR(100), + IN p_jsoncode MEDIUMTEXT +) +/* + function : 回寫 json code 的內容(前端有修改傳入) + description: + build date : 2021/10/17 + + call sample: + CALL zen_updatesource('abc01','beta','json-code') + + modify history + item who date modify docs + ==== ========== ========== ================================================ + 1 michael 2021-10-17 新增 + 2 Michael 2023-07-09 新增根據 sys_parameter 的 ver_type 判斷版本 + 3 Michael 2024/03/06 擴充 json4 及 json5 2個欄位 +*/ +BEGIN + DECLARE v_zcode MEDIUMTEXT; + DECLARE v_pvalue VARCHAR(100); + DECLARE v_cnt INT; + DECLARE v_final_version VARCHAR(100) DEFAULT IFNULL(p_version, 'beta'); + + -- 依設定的程式版本別設定變數 2023/07/09 + -- 檢查 sys_parameter 表是否存在 + IF (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'sys_parameter') > 0 THEN + SELECT pvalue INTO v_pvalue FROM sys_parameter WHERE systemid = 'base' AND pid = 'ver_type' LIMIT 1; + IF v_pvalue IS NOT NULL AND v_pvalue <> '' THEN + SET v_final_version = v_pvalue; + END IF; + END IF; + + SET v_zcode = p_jsoncode; + + -- 去除編輯用的特殊字串 2024-02-13 + IF INSTR(v_zcode, '_W_') > 0 THEN + SET v_zcode = REPLACE(v_zcode, '_W_', ''); + END IF; + + -- 檢查記錄是否存在 + SELECT COUNT(*) INTO v_cnt FROM zen_jsoncode WHERE functiontag = p_functiontag AND version = v_final_version; + + -- 如果不存在就新增,否則更新 + -- SET v_zcode = REPLACE(v_zcode, '\n', ''); + IF v_cnt <= 0 THEN + INSERT INTO zen_jsoncode (functiontag, version, jsoncode) + VALUES (p_functiontag, v_final_version, v_zcode); + ELSE + UPDATE zen_jsoncode + SET jsoncode = v_zcode + WHERE functiontag = p_functiontag AND version = v_final_version; + END IF; + + -- 回傳成功結果 + SELECT 0 AS code, 'OK' AS msg; +END // + +DELIMITER ; \ No newline at end of file diff --git a/udf_create_json_comps_blob.txt b/udf_create_json_comps_blob.txt new file mode 100644 index 0000000..3768838 --- /dev/null +++ b/udf_create_json_comps_blob.txt @@ -0,0 +1,104 @@ +DELIMITER // + +CREATE OR REPLACE FUNCTION udf_create_json_comps_blob( + p_FieldObject VARCHAR(200), + p_tblName VARCHAR(100), + p_FieldName VARCHAR(100) +) +RETURNS TEXT +/* + function : zen_create_json_comps_others 的 kernel udf, 處理一段共用元件的基本設定 + description: + build date : 2023/12/22 + modified : 2025/08/09 (轉換為 MariaDB 版本) + + modify history + item who date modify docs + ==== ========== ========== ================================================ + 1 michael 2023/12/22 根據 v1.0 重構 + 2 assistant 2025/08/09 轉換為 MariaDB 版本 +*/ +BEGIN + DECLARE v_blob_data TEXT; + DECLARE v_accept_type VARCHAR(200); + DECLARE v_u_type VARCHAR(200); + DECLARE v_ip VARCHAR(200); + DECLARE v_db VARCHAR(200); + DECLARE v_crlf VARCHAR(2); + + SET v_crlf = CONCAT(CHAR(13), CHAR(10)); + SET v_ip = '${ls:base_ip}'; + SET v_db = '${ls:base_db}'; + + -- Input-image 和 file 會多一些 properties + -- input-file 有 "multiple": true, 但是測試有問題, 所以暫不支援 + SET v_blob_data = ''; + + IF p_FieldObject = 'input-file' OR p_FieldObject = 'input-image' THEN + IF p_FieldObject = 'input-file' THEN + SET v_accept_type = '.pdf,.doc,.docx,.xls,.xlsx,.txt,.csv'; + SET v_u_type = 'files'; + ELSE + SET v_accept_type = '.jpg,.png,.jpeg'; + SET v_u_type = 'images'; + END IF; + + SET v_blob_data = CONCAT( + ' "accept": "', v_accept_type, '",', v_crlf, + ' "//multiple": true,', v_crlf, + ' "receiver": "', v_ip, '/upload/', v_db, '/', v_u_type, '/",', v_crlf + ); + ELSEIF p_FieldObject = 'textarea' THEN + SET v_blob_data = CONCAT( + ' "showCounter": true,', v_crlf + ); + ELSEIF p_FieldObject = 'select' THEN + -- select 要分為2種, 一種是固定內容(直接產生 options), 另一種是動態讀取資料庫(select from source 如下) + SET v_blob_data = CONCAT( + ' "source": {', v_crlf, + ' "method": "post",', v_crlf, + ' "url": "', v_ip, '/xapi/v2/', v_db, '/get_keyvalue/8/",', v_crlf, + ' "data": {', v_crlf, + ' "para01": "', p_tblName, '",', v_crlf, + ' "para02": "', p_FieldName, '"', v_crlf, + ' },', v_crlf, + ' "dataType": "form"', v_crlf, + ' },', v_crlf + ); + ELSEIF p_FieldObject IN ('options', 'options-add', 'mapping') THEN + -- 新增 options-add, 可以臨時新增前端選項(不會存起來) 2022-10-01 + -- 取得 key-value + SET v_blob_data = zen_get_keyvalue(p_tblName, p_FieldName); + + IF p_FieldObject = 'options-add' THEN + SET v_blob_data = CONCAT( + ' "creatable": true,', v_crlf, + ' "addControls": [', v_crlf, + ' {', v_crlf, + ' "type": "text",', v_crlf, + ' "name": "label",', v_crlf, + ' "label": "選項標題"', v_crlf, + ' },', v_crlf, + ' {', v_crlf, + ' "type": "text",', v_crlf, + ' "name": "value",', v_crlf, + ' "label": "選項值"', v_crlf, + ' }', v_crlf, + ' ],', v_crlf, + v_blob_data + ); + END IF; + ELSEIF p_FieldObject = 'radios' THEN + -- 取得 key-value + SET v_blob_data = zen_get_keyvalue(p_tblName, p_FieldName); + ELSEIF p_FieldObject IN ('switch', 'checkbox') THEN + SET v_blob_data = CONCAT( + ' "trueValue": "Y",', v_crlf, + ' "falseValue": "N",', v_crlf + ); + END IF; + + RETURN IFNULL(v_blob_data, ''); +END // + +DELIMITER ; \ No newline at end of file diff --git a/zen_create_json_comps_block.txt b/zen_create_json_comps_block.txt new file mode 100644 index 0000000..c9a4c82 --- /dev/null +++ b/zen_create_json_comps_block.txt @@ -0,0 +1,140 @@ +DELIMITER // + +CREATE OR REPLACE PROCEDURE zen_create_json_comps_block( + IN p_uuid VARCHAR(100), + IN p_FunctionTag VARCHAR(100), + IN p_code_id VARCHAR(100), + IN p_group VARCHAR(10), + IN p_FieldBlock SMALLINT, + IN p_block VARCHAR(2), + IN p_rowid INT +) +/* + function : amis Wizard 產生 json UI 的核心程式(每個 Component 有各自的 json UI 定義) + description: 本段 sp 主要是設定 input-text 中 view 部分的 json 定義(實在是太長了) + 後來發現, 除了特殊的元件要獨立的 sp 特別處理外, 一般元件可以都統一在 input-text 的 sp 加上一些判斷即可 + Build Date : 2023/12/20 + Modified : 2025/08/09 (轉換為 MariaDB 版本) + + Modify History + Item Who Date Modify Docs + ==== ========== ========== ================================================ + 1 Michael 2023/12/20 根據 v1.0 重構 + 2 Assistant 2025/08/09 轉換為 MariaDB 版本 +*/ +BEGIN + DECLARE v_gh TEXT; + DECLARE v_gf TEXT; + DECLARE v_bh TEXT; + DECLARE v_bf TEXT; + DECLARE v_blockname NVARCHAR(100); + DECLARE v_bTab SMALLINT; + DECLARE v_Tab1 VARCHAR(2); + DECLARE v_crlf VARCHAR(2); + DECLARE v_imax_block INT; + DECLARE v_code_para VARCHAR(100); + + SET v_crlf = CONCAT(CHAR(13), CHAR(10)); + + -- 取得最大 FieldBlock 值 + SELECT MAX(FieldBlock) INTO v_imax_block FROM zen_wizard_jsondata WHERE uuid = p_uuid; + + -- get code_para + SET v_code_para = ''; + IF p_code_id IN ('SingleEntry','SingleTabs','SinglePanels') THEN + SELECT code_para INTO v_code_para FROM zen_Wizard_template WHERE code_id = 'SingleEntry'; + -- Master-detail(支援 Tab 和 Panel 2種 UX -- 配合 Single Extend) + ELSEIF p_code_id IN ('MasterDetailTabs','MasterDetailPanels') THEN + SELECT code_para INTO v_code_para FROM zen_Wizard_template WHERE code_id = 'MasterDetail'; + END IF; + + SET v_bh = ''; + SET v_bf = ''; + + -- 取得 block_name + SELECT blockcname INTO v_blockname FROM zen_blockname WHERE menuid = p_FunctionTag AND blockno = p_FieldBlock; + IF IFNULL(v_blockname, '') = '' THEN + SET v_blockname = '區塊標題'; + END IF; + + -- MD Log 允許根據 code_para 決定是 Tabs or Panel(待測試) + IF LOCATE('Tab', p_code_id) > 0 OR LOCATE('Tab', IFNULL(v_code_para, '')) > 0 THEN + SET v_bTab = 1; + SET v_Tab1 = '//'; + ELSE + SET v_bTab = 0; + SET v_Tab1 = ''; + END IF; + + IF p_block = 'BH' OR p_block = 'BA' THEN + IF (p_FieldBlock = 0 AND v_bTab = 1) OR (v_bTab = 0) THEN + SET v_Tab1 = ''; + ELSE + SET v_Tab1 = '//'; + END IF; + + SET v_bh = CONCAT( + ' {', v_crlf, + ' "', v_Tab1, 'type": "fieldSet",', v_crlf, + ' "title": "', v_blockname, '",', v_crlf, + ' "collapsable": true,', v_crlf, + ' "body": [', v_crlf + ); + + IF p_FieldBlock = 1 AND v_bTab = 1 THEN + SET v_bh = CONCAT( + ' {', v_crlf, + ' "type": "tabs",', v_crlf, + ' "mode": "line",', v_crlf, + ' "tabs": [', v_crlf, + ' {', v_crlf, + ' "title": "', v_blockname, '",', v_crlf, + ' "body": [', v_crlf + ); + END IF; + END IF; + + IF p_block = 'BF' OR p_block = 'BA' THEN + SET v_bf = CONCAT( + ' ]', v_crlf, + ' }', v_crlf + ); + + IF p_FieldBlock = v_imax_block AND v_bTab = 1 THEN + SET v_bf = CONCAT( + ' ]', v_crlf, + ' }', v_crlf, + ' ]', v_crlf, + ' }', v_crlf + ); + END IF; + END IF; + + -- 加入簡易排版功能, type=group + SET v_gh = ''; + SET v_gf = ''; + IF p_group = 'GH' THEN + SET v_gh = CONCAT( + '{', v_crlf, + ' "type": "group",', v_crlf, + ' "body": [', v_crlf + ); + END IF; + + IF p_group = 'GF' THEN + SET v_gf = CONCAT( + ' ]', v_crlf, + ' }' + ); + END IF; + + -- 取得並暫存 block / group 的內容 + UPDATE zen_wizard_jsondata + SET json_bh = v_bh, + json_bf = v_bf, + json_gh = v_gh, + json_gf = v_gf + WHERE uuid = p_uuid AND rowid = p_rowid; +END // + +DELIMITER ; \ No newline at end of file diff --git a/zen_create_json_comps_cycles.txt b/zen_create_json_comps_cycles.txt new file mode 100644 index 0000000..cda60d4 --- /dev/null +++ b/zen_create_json_comps_cycles.txt @@ -0,0 +1,209 @@ +DELIMITER // + +CREATE OR REPLACE PROCEDURE zen_create_json_comps_cycles( + IN p_uuid VARCHAR(100), + IN p_FieldObject VARCHAR(100), + IN p_FieldName VARCHAR(100), + IN p_FieldCN NVARCHAR(100), + IN p_rowid INT +) +/* + function : amis Wizard 產生 json UI 的核心程式(每個 Component 有各自的 json UI 定義) + description: 本段 sp 主要是設定 cycle 週期性類元件 的 json 定義 + Build Date : 2023/12/20 + Modified : 2025/08/09 (轉換為 MariaDB 版本) + + Modify History + Item Who Date Modify Docs + ==== ========== ========== ================================================ + 1 Michael 2023/12/20 根據 v1.0 重構 + 2 Assistant 2025/08/09 轉換為 MariaDB 版本 +*/ +BEGIN + DECLARE v_comps TEXT; + DECLARE v_json_insert TEXT; + DECLARE v_json_update TEXT; + DECLARE v_json_quickedit TEXT; + DECLARE v_json_gridview TEXT; + DECLARE v_json_view TEXT; + DECLARE v_code_id VARCHAR(600); + DECLARE v_cnt INT; + + DECLARE v_blob_data TEXT; + DECLARE v_field_df TEXT; + DECLARE v_required TEXT; + DECLARE v_crlf VARCHAR(2); + + DECLARE v_init_api TEXT; + DECLARE v_pos , v_x INT; + DECLARE v_tmp1 VARCHAR(100); + DECLARE v_tmp2 TEXT; + DECLARE v_tmp3 VARCHAR(1000); + DECLARE v_frequency VARCHAR(100); + DECLARE v_FieldWidth VARCHAR(100); + DECLARE v_fld_date VARCHAR(20); + DECLARE v_fld_time VARCHAR(20); + DECLARE v_fld_last VARCHAR(10); + + DECLARE v_visibleOn VARCHAR(100); + DECLARE v_vKey VARCHAR(100); + DECLARE v_vVal VARCHAR(100); + + -- 通用寫法 + SET v_crlf = CONCAT(CHAR(13), CHAR(10)); + SET v_blob_data = ''; + SET v_field_df = ''; + SET v_required = ''; + + SET v_frequency = 'cal_repeated_flag'; + + -- Insert + -- 以下和週期性設定元件相關 20230819 Michael + IF p_FieldObject = 'cycle-frequency' THEN + SET v_comps = CONCAT( + ' {', v_crlf, + ' "label": "', p_FieldCN, '",', v_crlf, + ' "type": "radios",', v_crlf, + ' "name": "', p_FieldName, '",', v_crlf, + ' "inline": true,', v_crlf, + ' "value": "none",', v_crlf, + ' "required": true,', v_crlf, + ' "options": [', v_crlf, + ' {', v_crlf, + ' "label": "不重複",', v_crlf, + ' "value": "none"', v_crlf, + ' },', v_crlf, + ' {', v_crlf, + ' "label": "每天",', v_crlf, + ' "value": "day"', v_crlf, + ' },', v_crlf, + ' {', v_crlf, + ' "label": "每週",', v_crlf, + ' "value": "week"', v_crlf, + ' },', v_crlf, + ' {', v_crlf, + ' "label": "每月",', v_crlf, + ' "value": "month"', v_crlf, + ' }', v_crlf, + ' ]', v_crlf, + ' }' + ); + ELSEIF p_FieldObject = 'cycle-weeks' THEN + SET v_comps = CONCAT( + ' {', v_crlf, + ' "label": "', p_FieldCN, '",', v_crlf, + ' "type": "button-group-select",', v_crlf, + ' "name": "', p_FieldName, '",', v_crlf, + ' "size": "md",', v_crlf, + ' "visibleOn": "this.', IFNULL(v_frequency, ''), ' == \\"week\\"",', v_crlf, + ' "clearable": true,', v_crlf, + ' "multiple": true,', v_crlf, + ' "extractValue": true,', v_crlf, + ' "maxLength": 7,', v_crlf, + ' "options": [', v_crlf, + ' {', v_crlf, + ' "label": "週一",', v_crlf, + ' "value": "2"', v_crlf, + ' },', v_crlf, + ' {', v_crlf, + ' "label": "週二",', v_crlf, + ' "value": "3"', v_crlf, + ' },', v_crlf, + ' {', v_crlf, + ' "label": "週三",', v_crlf, + ' "value": "4"', v_crlf, + ' },', v_crlf, + ' {', v_crlf, + ' "label": "週四",', v_crlf, + ' "value": "5"', v_crlf, + ' },', v_crlf, + ' {', v_crlf, + ' "label": "週五",', v_crlf, + ' "value": "6"', v_crlf, + ' },', v_crlf, + ' {', v_crlf, + ' "label": "週六",', v_crlf, + ' "value": "7"', v_crlf, + ' },', v_crlf, + ' {', v_crlf, + ' "label": "周日",', v_crlf, + ' "value": "1"', v_crlf, + ' }', v_crlf, + ' ]', v_crlf, + ' }' + ); + ELSEIF p_FieldObject = 'cycle-months' THEN + SET v_x = 1; + SET v_tmp2 = ''; + + WHILE v_x <= 31 DO + SET v_tmp2 = CONCAT( + v_tmp2, + ' {', v_crlf, + ' "value": ', v_x, ',', v_crlf, + ' "label": "', IF(v_x < 10, '0', ''), v_x, '"', v_crlf, + ' }', IF(v_x = 31, '', ','), v_crlf + ); + SET v_x = v_x + 1; + END WHILE; + + SET v_comps = CONCAT( + ' {', v_crlf, + ' "label": "', p_FieldCN, '",', v_crlf, + ' "type": "list-select",', v_crlf, + ' "name": "', p_FieldName, '",', v_crlf, + ' "size": "md",', v_crlf, + ' "visibleOn": "this.', IFNULL(v_frequency, ''), ' == \\"month\\"",', v_crlf, + ' "maxLength": 31,', v_crlf, + ' "clearable": true,', v_crlf, + ' "multiple": true,', v_crlf, + ' "extractValue": true,', v_crlf, + ' "options": [', v_crlf, + v_tmp2, + ' ]', v_crlf, + ' }' + ); + ELSEIF p_FieldObject IN ('cycle-startdate', 'cycle-enddate') THEN + SELECT visibleOn INTO v_visibleOn FROM zen_wizard_jsondata WHERE uuid = p_uuid AND rowid = p_rowid; + + -- 動態顯式否 + IF IFNULL(v_visibleOn, '') <> '' THEN + SET v_pos = LOCATE(',', v_visibleOn); + IF v_pos > 0 THEN + SET v_vKey = SUBSTRING(v_visibleOn, 1, v_pos - 1); + SET v_vVal = SUBSTRING(v_visibleOn, v_pos + 1, 100); + END IF; + END IF; + + SET v_comps = CONCAT( + ' {', v_crlf, + ' "type": "input-date",', v_crlf, + ' "name": "', p_FieldName, '",', v_crlf, + ' "label": "', p_FieldCN, '",', v_crlf, + ' "visibleOn": "this.', v_vKey, ' != \\"', v_vVal, '\\"",', v_crlf, + ' "format": "YYYY-MM-DDTHH:mm:ss.SSSZ"', v_crlf, + ' }', v_crlf + ); + END IF; + + SET v_json_insert = v_comps; + SET v_json_update = v_comps; + SET v_json_view = v_comps; + + -- Grid View 內如果要顯示, 應該只能用 text + SET v_json_gridview = CONCAT( + ' {', v_crlf, + ' "type": "text",', v_crlf, + ' "name": "', p_FieldName, '",', v_crlf, + ' "label": "', p_FieldCN, '"', v_crlf, + ' }' + ); + + -- 寫入暫存 Table (zen_wizard_jsondata) + UPDATE zen_wizard_jsondata SET json_insert = v_json_insert WHERE uuid = p_uuid AND rowid = p_rowid; + UPDATE zen_wizard_jsondata SET json_update = v_json_update WHERE uuid = p_uuid AND rowid = p_rowid; + UPDATE zen_wizard_jsondata SET json_gridview = v_json_gridview WHERE uuid = p_uuid AND rowid = p_rowid; + UPDATE zen_wizard_jsondata SET json_view = v_json_view WHERE uuid = p_uuid AND rowid = p_rowid; +END // + +DELIMITER ; \ No newline at end of file diff --git a/zen_create_json_comps_formula.txt b/zen_create_json_comps_formula.txt new file mode 100644 index 0000000..8f6ce0b --- /dev/null +++ b/zen_create_json_comps_formula.txt @@ -0,0 +1,210 @@ +DELIMITER // + +CREATE OR REPLACE PROCEDURE zen_create_json_comps_formula( + IN p_uuid VARCHAR(100), + IN p_FieldObject VARCHAR(100), + IN p_FieldName VARCHAR(100), + IN p_FieldCN NVARCHAR(100), + IN p_picker_tag VARCHAR(100), + IN p_rowid INT +) +/* + function : amis Wizard 產生 json UI 的核心程式(每個 Component 有各自的 json UI 定義) + description: 本段 sp 主要是設定 formula 的 json 定義 + Build Date : 2023/12/20 + Modified : 2025/08/09 (轉換為 MariaDB 版本) + + Modify History + Item Who Date Modify Docs + ==== ========== ========== ================================================ + 1 Michael 2023/12/20 根據 v1.0 重構 + 2 Assistant 2025/08/09 轉換為 MariaDB 版本 +*/ +BEGIN + DECLARE v_comps TEXT; + DECLARE v_json_insert TEXT; + DECLARE v_json_update TEXT; + DECLARE v_json_quickedit TEXT; + DECLARE v_json_gridview TEXT; + DECLARE v_json_view TEXT; + DECLARE v_cnt INT; + + DECLARE v_blob_data TEXT; + DECLARE v_field_df TEXT; + DECLARE v_required TEXT; + DECLARE v_crlf VARCHAR(2); + + DECLARE v_tmp1 TEXT; + DECLARE v_comps_edit TEXT; + DECLARE v_gridType VARCHAR(100); + + -- 通用寫法 + SET v_crlf = CONCAT(CHAR(13), CHAR(10)); + SET v_blob_data = ''; + SET v_field_df = ''; + SET v_required = ''; + + IF SUBSTRING(p_picker_tag, 1, 1) = '^' THEN + -- 此處先 hard code, 因為要將 date + time 變成 datetime Michael 20230902 + -- 新版似乎已不使用, 但程式仍暫時保留(原本是專給行程管理及週期性會議使用) + SET v_tmp1 = SUBSTRING(p_picker_tag, 2, 100); + SET v_tmp1 = REPLACE(v_tmp1, '+', CONCAT('+', CHAR(39), ' ', CHAR(39), '+')); + + SET v_comps = CONCAT( + ' {', v_crlf, + ' "type": "', p_FieldObject, '",', v_crlf, + ' "name": "', p_FieldName, '",', v_crlf, + ' "formula": "', v_tmp1, '"', v_crlf, + ' }' + ); + + SET v_comps_edit = v_comps; + ELSE + -- 專 for Add + SET v_comps = CONCAT( + ' {', v_crlf, + ' "type": "static",', v_crlf, + ' "name": "', p_FieldName, '",', v_crlf, + ' "label": "', p_FieldCN, '"', v_crlf, + ' },', v_crlf, + ' {', v_crlf, + ' "type": "', p_FieldObject, '",', v_crlf, + ' "name": "', p_FieldName, '",', v_crlf, + ' "value": 0,', v_crlf, + ' "formula": "${', p_picker_tag, '}"', v_crlf, + ' }' + ); + + -- 專 for update + IF LOCATE('|', p_picker_tag) > 0 AND LOCATE('pick', p_picker_tag) > 0 THEN + SET v_comps_edit = CONCAT( + ' {', v_crlf, + ' "type": "static",', v_crlf, + ' "id": "_', p_FieldName, '",', v_crlf, + ' "name": "', p_FieldName, '",', v_crlf, + ' "label": "', p_FieldCN, '"', v_crlf, + ' }' + ); + ELSE + SET v_comps_edit = CONCAT( + ' {', v_crlf, + ' "type": "static",', v_crlf, + ' "id": "_', p_FieldName, '",', v_crlf, + ' "name": "', p_FieldName, '",', v_crlf, + ' "label": "', p_FieldCN, '"', v_crlf, + ' },', v_crlf, + ' {', v_crlf, + ' "type": "', p_FieldObject, '",', v_crlf, + ' "name": "', p_FieldName, '",', v_crlf, + ' "value": 0,', v_crlf, + ' "formula": "${', p_picker_tag, '}"', v_crlf, + ' }' + ); + END IF; + + -- 專 for View (m-d 的 details sum) + IF LOCATE('ARRAYMAP', p_picker_tag) > 0 THEN + -- 先 hard code, 再想辦法設定 + IF LOCATE('bill_', p_FieldName) > 0 AND LOCATE('amount', p_FieldName) > 0 THEN + -- 總計(totalamount + taxamount) + SET v_json_view = CONCAT( + ' {', v_crlf, + ' "type": "static",', v_crlf, + ' "id": "_', p_FieldName, '",', v_crlf, + ' "name": "', p_FieldName, '",', v_crlf, + ' "value": "${totalamount + taxamount|round: 0}",', v_crlf, + ' "label": "', p_FieldCN, '"', v_crlf, + ' }' + ); + + SET v_comps_edit = v_json_view; + ELSEIF LOCATE('bill_', p_FieldName) > 0 AND LOCATE('quantity', p_FieldName) > 0 THEN + -- 數量(不顯示) + SET v_json_view = ' '; + + SET v_comps_edit = CONCAT( + ' {', v_crlf, + ' "type": "static",', v_crlf, + ' "id": "_', p_FieldName, '",', v_crlf, + ' "name": "', p_FieldName, '",', v_crlf, + ' "label": "', p_FieldCN, '"', v_crlf, + ' }' + ); + ELSE + -- 有資料庫欄位, 直接顯示 + SET v_json_view = CONCAT( + ' {', v_crlf, + ' "type": "static",', v_crlf, + ' "id": "_', p_FieldName, '",', v_crlf, + ' "name": "', p_FieldName, '",', v_crlf, + ' "label": "', p_FieldCN, '"', v_crlf, + ' }' + ); + + SET v_comps_edit = v_json_view; + END IF; + END IF; + END IF; + + -- insert/edit 要改為 items (原設定為 details) + SET v_comps = REPLACE(v_comps, 'details|', 'items|'); + SET v_comps_edit = REPLACE(v_comps_edit, 'details|', 'items|'); + + -- insert/update: 加入判斷, 是否為 pk 欄位 + SET v_json_insert = v_comps; + SET v_json_update = v_comps_edit; + + /* + GridView 欄位, formula 應該 "visible": false, + */ + -- Grid view + SET v_comps_edit = ''; + SET v_gridType = 'text'; -- Static + IF p_FieldObject = 'formula' AND (SUBSTRING(p_picker_tag, 1, 1) <> '^') THEN + -- 此處先 hard code, 非資料庫欄位, 欄位前固定為 bill_xxxx + IF LOCATE('|', p_picker_tag) > 0 AND LOCATE('pick', p_picker_tag) > 0 THEN + SET v_comps_edit = CONCAT( + ' {', v_crlf, + ' "type": "', v_gridType, '",', v_crlf, + ' "name": "', p_FieldName, '",', v_crlf, + ' "label": "', p_FieldCN, '"', v_crlf, + ' }' + ); + ELSE + SET v_comps_edit = CONCAT( + ' {', v_crlf, + ' "type": "', v_gridType, '",', v_crlf, + ' "name": "', p_FieldName, '",', v_crlf, + ' "label": "', p_FieldCN, '"', v_crlf, + ' },', v_crlf, + ' {', v_crlf, + ' "type": "', p_FieldObject, '",', v_crlf, + ' "name": "', p_FieldName, '",', v_crlf, + ' "visible": false,', v_crlf, + ' "value": 0,', v_crlf, + ' "formula": "${', p_picker_tag, '}"', v_crlf, + ' }' + ); + END IF; + + SET v_comps_edit = REPLACE(v_comps_edit, 'details|', 'items|'); + END IF; + + -- Grid View + SET v_json_gridview = v_comps_edit; + + -- view + IF IFNULL(v_json_view, '') = '' THEN + -- SET v_json_view = v_comps_edit; + SET v_json_view = v_json_update; + END IF; + + -- 寫入暫存 Table (zen_wizard_jsondata) + UPDATE zen_wizard_jsondata SET json_insert = v_json_insert WHERE uuid = p_uuid AND rowid = p_rowid; + UPDATE zen_wizard_jsondata SET json_update = v_json_update WHERE uuid = p_uuid AND rowid = p_rowid; + UPDATE zen_wizard_jsondata SET json_quickedit = v_json_quickedit WHERE uuid = p_uuid AND rowid = p_rowid; + UPDATE zen_wizard_jsondata SET json_gridview = v_json_gridview WHERE uuid = p_uuid AND rowid = p_rowid; + UPDATE zen_wizard_jsondata SET json_view = v_json_view WHERE uuid = p_uuid AND rowid = p_rowid; +END // + +DELIMITER ; \ No newline at end of file diff --git a/zen_create_json_comps_others.txt b/zen_create_json_comps_others.txt new file mode 100644 index 0000000..f585d0f --- /dev/null +++ b/zen_create_json_comps_others.txt @@ -0,0 +1,209 @@ +DELIMITER // + +CREATE OR REPLACE PROCEDURE zen_create_json_comps_others( + IN p_uuid VARCHAR(100), + IN p_FunctionTag VARCHAR(100), + IN p_code_id VARCHAR(100), + IN p_FieldObject VARCHAR(100), + IN p_tblName VARCHAR(100), + IN p_pk VARCHAR(100), + IN p_FieldName VARCHAR(100), + IN p_FieldCN NVARCHAR(100), + IN p_fieldro VARCHAR(100), + IN p_fielddefault VARCHAR(100), + IN p_FieldDS VARCHAR(2), + IN p_FieldSH VARCHAR(1), + IN p_FieldCheckNull VARCHAR(2), + IN p_required VARCHAR(100), + IN p_query_type VARCHAR(1), + IN p_picker_tag VARCHAR(100), + IN p_fieldfm VARCHAR(100), + IN p_rowid INT +) +/* + function : amis Wizard 產生 json UI 的核心程式(每個 Component 有各自的 json UI 定義) + description: 本段 sp 主要是設定非 input-text 且非 picker/formule/transger 的 json 定義 + 後來發現, 除了特殊的元件要獨立的 sp 特別處理外, 一般元件可以都統一在 input-text 的 sp 加上一些判斷即可 + Build Date : 2023/12/22 + Modified : 2025/08/09 (轉換為 MariaDB 版本) + + Modify History + Item Who Date Modify Docs + ==== ========== ========== ================================================ + 1 Michael 2023/12/22 根據 v1.0 重構 + 2 Assistant 2025/08/09 轉換為 MariaDB 版本 +*/ +BEGIN + DECLARE v_comps TEXT; + DECLARE v_json_insert TEXT; + DECLARE v_json_update TEXT; + DECLARE v_cnt INT; + DECLARE v_tmp2, v_tmp3 VARCHAR(800); + DECLARE v_orgObj VARCHAR(100); + DECLARE v_fieldfm_new VARCHAR(20); + + DECLARE v_blob_data TEXT; + DECLARE v_field_df TEXT; + DECLARE v_crlf VARCHAR(2); + + SET v_crlf = CONCAT(CHAR(13), CHAR(10)); + SET v_orgObj = p_FieldObject; + + -- 调用 udf_create_json_comps_blob 函数 + SET v_blob_data = udf_create_json_comps_blob(p_FieldObject, p_tblName, p_FieldName); + + -- 以下新增考慮 default, Readonly(p_fielddefault, p_fieldro) + IF IFNULL(p_fieldro, '') = 'Y' AND LOCATE('"disabled"', v_blob_data) <= 0 THEN + SET v_blob_data = CONCAT(v_blob_data, ' "disabled": true,', v_crlf); + END IF; + + -- option 是特殊的 select, 但還是 select + IF (p_FieldObject = 'options' OR p_FieldObject = 'options-add' OR p_FieldObject = 'mapping') THEN + SET p_FieldObject = 'select'; + ELSEIF p_FieldObject = 'progress' OR p_FieldObject = 'link-file' OR p_FieldObject = 'link' THEN + SET p_FieldObject = 'input-text'; + ELSEIF p_FieldObject = 'qr-code' THEN + SET p_FieldObject = 'input-text'; + END IF; + + /* + -- amis 的預設值機制較特殊, 因為 data domain 的定義方式, 所以要用 data: {} 來定義 + -- ${ls:userid} 這類無法用 value 設定, 才必須用 data domain 設定, 且必須設定在 page 下 + */ + SET v_field_df = ''; + SET v_tmp3 = ''; + + IF IFNULL(p_fielddefault, '') <> '' THEN + IF SUBSTRING(p_fielddefault, 1, 1) <> '@' AND LOCATE('$', p_fielddefault) <= 0 THEN + IF SUBSTRING(p_fielddefault, 1, 1) = '#' THEN + -- 要考慮 add/update 的不同, 要修改 value 的設定內容 + SET v_tmp2 = SUBSTRING(p_fielddefault, 2, 100); + SET v_field_df = CONCAT(' "value": "', '${', v_tmp2, '}",', v_crlf); + + -- for 修改專用 + SET v_tmp3 = CONCAT(' "value": "', '${', v_tmp2, '|isFalse:', p_FieldName, ':', v_tmp2, '}",', v_crlf); + ELSE + -- 因為 json 不能有 #{ 內容, 只會有 ls:user, 所以要判斷加入 + IF SUBSTRING(p_fielddefault, 1, 3) = 'ls:' THEN + SET v_field_df = CONCAT(' "value": "', '${', p_fielddefault, '}",', v_crlf); + ELSE + SET v_field_df = CONCAT(' "value": "', p_fielddefault, '",', v_crlf); + END IF; + END IF; + + -- 加入數字靠右的顯示(default=0 或 1 時加入設定) amis v1.3.x 後的新增功能 + IF p_fielddefault = '0' OR p_fielddefault = '1' THEN + SET v_field_df = CONCAT(v_field_df, ' "align": "right",', v_crlf); + END IF; + END IF; + END IF; + + IF p_FieldObject = 'input-datetime' THEN + SET v_field_df = CONCAT(v_field_df, ' "format": "YYYY-MM-DD HH:mm:ss.SSS",', v_crlf); + END IF; + + IF p_FieldObject = 'input-date' THEN + SET v_field_df = CONCAT(v_field_df, ' "format": "YYYY-MM-DD",', v_crlf); + END IF; + + IF p_FieldObject = 'input-time' THEN + SET v_field_df = CONCAT(v_field_df, ' "format": "HH:mm",', v_crlf); + END IF; + + IF (p_FieldObject = 'input-number') THEN + -- 讀取設定 + IF IFNULL(p_fieldfm, '') = '' THEN + SET p_fieldfm = 'd0'; + END IF; + + SET v_fieldfm_new = CONCAT('"${ls:sys@', p_fieldfm, '}"'); + + SET v_field_df = CONCAT(v_field_df, + -- ' "align": "right",', v_crlf, + ' "precision": ', v_fieldfm_new, ',', v_crlf + ); + END IF; + + -- 新增 + SET v_comps = CONCAT( + ' {', v_crlf, + ' "type": "', p_FieldObject, '",', v_crlf, + ' "name": "', p_FieldName, '",', v_crlf, + v_field_df, + v_blob_data, + p_required, v_crlf, + ' "label": "', p_FieldCN, '"', v_crlf, + ' }' + ); + + SET v_json_insert = v_comps; + + -- update: 加入判斷, 是否為 pk 欄位 + -- PK 修改時不能編輯 + SET v_field_df = v_tmp3; + + -- 检查是否为PK字段 + SELECT COUNT(*) INTO v_cnt FROM ( + SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(p_pk, ',', numbers.n), ',', -1) AS col + FROM ( + SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL + SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL + SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 + ) numbers + WHERE numbers.n <= LENGTH(p_pk) - LENGTH(REPLACE(p_pk, ',', '')) + 1 + ) AS split_pk + WHERE col = p_FieldName; + + -- 怕重複設定 disabled + IF v_cnt > 0 AND LOCATE('"disabled"', v_field_df) <= 0 AND LOCATE('"disabled"', v_blob_data) <= 0 THEN + SET v_field_df = CONCAT(v_field_df, ' "disabled": true,', v_crlf); + END IF; + + -- 只有修改狀態才要設定日期 format + -- 更新版本後會報錯, 應該是真的有輸入時間, 才需要特別加 + IF (p_FieldObject = 'input-date' OR p_FieldObject = 'input-datetime') THEN + SET v_field_df = CONCAT(v_field_df, ' "format": "YYYY-MM-DDTHH:mm:ss.SSSZ",', v_crlf); + END IF; + + IF p_FieldObject = 'input-time' THEN + SET v_field_df = CONCAT(v_field_df, ' "format": "HH:mm",', v_crlf); + END IF; + + SET v_comps = CONCAT( + ' {', v_crlf, + ' "type": "', p_FieldObject, '",', v_crlf, + ' "name": "', p_FieldName, '",', v_crlf, + v_field_df, + v_blob_data, + p_required, v_crlf, + ' "label": "', p_FieldCN, '"', v_crlf, + ' }' + ); + + SET v_json_update = v_comps; + + -- 回復原值 + SET p_FieldObject = v_orgObj; + + -- 调用其他存储过程 + CALL zen_create_json_comps_others_quickedit( + p_uuid, p_FunctionTag, p_FieldObject, p_tblName, p_pk, p_FieldName, + p_FieldCN, p_query_type, p_picker_tag, p_FieldSH, p_required, p_fieldfm, p_rowid + ); + + CALL zen_create_json_comps_others_view( + p_uuid, p_FieldObject, p_tblName, p_FieldName, p_FieldCN, p_fielddefault, + p_FieldDS, p_FieldCheckNull, p_query_type, p_fieldfm, p_rowid + ); + + CALL zen_create_json_comps_others_gridview( + p_uuid, p_FieldObject, p_tblName, p_FieldName, p_FieldCN, p_fielddefault, + p_FieldDS, p_FieldCheckNull, p_query_type, p_fieldfm, p_rowid + ); + + -- 寫入暫存 Table (zen_wizard_jsondata) + UPDATE zen_wizard_jsondata SET json_insert = v_json_insert WHERE uuid = p_uuid AND rowid = p_rowid; + UPDATE zen_wizard_jsondata SET json_update = v_json_update WHERE uuid = p_uuid AND rowid = p_rowid; +END // + +DELIMITER ; \ No newline at end of file diff --git a/zen_create_json_comps_others_gridview.txt b/zen_create_json_comps_others_gridview.txt new file mode 100644 index 0000000..f903c49 --- /dev/null +++ b/zen_create_json_comps_others_gridview.txt @@ -0,0 +1,204 @@ +DELIMITER // + +CREATE OR REPLACE PROCEDURE zen_create_json_comps_others_gridview( + IN p_uuid VARCHAR(100), + IN p_FieldObject VARCHAR(100), + IN p_tblName VARCHAR(100), + IN p_FieldName VARCHAR(100), + IN p_FieldCN NVARCHAR(100), + IN p_fielddefault VARCHAR(100), + IN p_FieldDS VARCHAR(2), + IN p_FieldCheckNull VARCHAR(2), + IN p_query_type VARCHAR(1), + IN p_fieldfm VARCHAR(100), + IN p_rowid INT +) +/* + function : amis Wizard 產生 json UI 的核心程式(每個 Component 有各自的 json UI 定義) + description: 本段 sp 主要是設定 input-text 中 view 部分的 json 定義(實在是太長了) + 後來發現, 除了特殊的元件要獨立的 sp 特別處理外, 一般元件可以都統一在 input-text 的 sp 加上一些判斷即可 + Build Date : 2023/12/20 + Modified : 2025/08/09 (轉換為 MariaDB 版本) + + Modify History + Item Who Date Modify Docs + ==== ========== ========== ================================================ + 1 Michael 2023/12/20 根據 v1.0 重構 + 2 Assistant 2025/08/09 轉換為 MariaDB 版本 +*/ +BEGIN + DECLARE v_comps TEXT; + DECLARE v_QueryFlds VARCHAR(1000); + DECLARE v_QueryData VARCHAR(2000); + DECLARE v_QueryType VARCHAR(600); + DECLARE v_code_para VARCHAR(100); + DECLARE v_gridType VARCHAR(100); + DECLARE v_db VARCHAR(200); + DECLARE v_ip VARCHAR(200); + DECLARE v_field_df TEXT; + DECLARE v_crlf VARCHAR(2); + + SET v_crlf = CONCAT(CHAR(13), CHAR(10)); + SET v_ip = '${ls:base_ip}'; + SET v_db = '${ls:base_db}'; + + /* + for GridView, grid couluns不顯示 + query_type 要傳入 + */ + SET v_QueryFlds = ''; + SET v_QueryData = ''; + SET v_QueryType = ''; + + SET v_gridType = 'text'; -- static(配合 quitEdit 會有跨行的問題) + IF LOCATE('date', p_FieldObject) > 0 THEN + SET v_gridType = 'date'; + END IF; + + IF p_FieldObject = 'hidden' THEN + SET v_gridType = 'hidden'; + END IF; + + -- if p_FieldDS = 'Y' and (p_FieldObject <> 'hidden') begin + IF p_FieldDS = 'Y' THEN + -- Query Header Define + SET v_QueryFlds = CONCAT(v_QueryFlds, p_FieldName, '^'); + SET v_QueryData = CONCAT(v_QueryData, '${search_', p_FieldName, '}', '^'); + + IF LOCATE('int', p_FieldObject) > 0 OR LOCATE('decimal', p_FieldObject) > 0 THEN + SET v_QueryType = CONCAT(v_QueryType, 'I', '^'); + ELSE -- 20230425 C 的預設改為 Clike, 因為大部分的情況應該都是用 like 查詢比較正常 (set v_QueryType = v_QueryType + 'C' + '^';) + SET v_QueryType = CONCAT(v_QueryType, 'Clike', '^'); + END IF; + + /* + amis v1.3.4 後的版本, 支援 Grid 數字靠右的機制 + v1.3.2 後的版本, 支援 Grid 欄位可以拖拉的機制 + 但是都有一個前提, 否則會異常, 就是不能設 Grid Column 的 Width + 所以修改 Wizard, 不再設定 Grid Column 的 Width 2021-10-30 + + 新增 searchable 的多欄位查詢定義 2022-04-23 + */ + SET v_field_df = ''; + + IF p_fielddefault = '0' OR p_fielddefault = '1' THEN + SET v_field_df = CONCAT(' "align": "right",', v_crlf); + END IF; + + /* + 這裡同時應處理 select / options / picker(暫緩處理) 和 mapping 的 setup + 這一段專門在處理 Query Header UX, 認真寫的話會非常複雜, 目前先解決主要的 UX, 慢慢地改善 + 2022-05-18 Michael + */ + + IF p_FieldObject = 'mapping' THEN + -- select @view_blob=dbo.zen_get_mapping(@tblName,@FieldName); + SET v_gridType = 'mapping'; + SET v_field_df = CONCAT(v_field_df, zen_get_mapping(p_tblName, p_FieldName), v_crlf); + + IF p_FieldCheckNull = 'Q' OR p_FieldCheckNull = 'A' THEN + SET v_field_df = CONCAT(v_field_df, + ' "searchable": {', v_crlf, + ' "type": "select",', v_crlf, + ' "name": "search_', p_FieldName, '",', v_crlf, + zen_get_keyvalue(p_tblName, p_FieldName), v_crlf, + ' "label": "', p_FieldCN, '"', v_crlf, + ' },', v_crlf + ); + END IF; + ELSEIF p_FieldObject = 'options' THEN + -- option 是特殊的 select, 但還是 select + SET v_gridType = 'select'; + SET v_field_df = CONCAT(v_field_df, + ' "disabled": true,', v_crlf, + zen_get_keyvalue(p_tblName, p_FieldName), v_crlf + ); + + IF p_FieldCheckNull = 'Q' OR p_FieldCheckNull = 'A' THEN + SET v_field_df = CONCAT(v_field_df, + ' "searchable": {', v_crlf, + ' "type": "select",', v_crlf, + ' "name": "search_', p_FieldName, '",', v_crlf, + zen_get_keyvalue(p_tblName, p_FieldName), v_crlf, + ' "label": "', p_FieldCN, '"', v_crlf, + ' },', v_crlf + ); + END IF; + ELSEIF p_FieldObject = 'switch' THEN + SET v_gridType = 'switch'; + SET v_field_df = CONCAT( + ' "trueValue": "Y",', v_crlf, + ' "falseValue": "N",', v_crlf + ); + ELSEIF p_FieldObject = 'checkbox' THEN + SET v_gridType = 'checkbox'; + SET v_field_df = CONCAT( + ' "trueValue": "Y",', v_crlf, + ' "falseValue": "N",', v_crlf + ); + ELSEIF p_FieldObject = 'progress' THEN + SET v_gridType = 'progress'; + -- Link 下載檔案(格式內容差異較大) + ELSEIF p_FieldObject = 'link-file' THEN + SET v_gridType = 'link'; + SET v_field_df = CONCAT( + ' "href": "${', p_FieldName, '}",', v_crlf, + ' "body": "檔案下載",', v_crlf + ); + ELSEIF p_FieldObject = 'link' THEN + SET v_gridType = 'link'; + SET v_field_df = CONCAT( + ' "href": "${', p_FieldName, '}",', v_crlf, + ' "body": "${', p_FieldName, '}",', v_crlf + ); + -- 其他一般元件 + ELSEIF (p_query_type = 'C') AND (p_FieldCheckNull = 'Q' OR p_FieldCheckNull = 'A') THEN + -- 非日期欄位 + IF LOCATE('date', p_FieldObject) <= 0 THEN + SET v_field_df = CONCAT(v_field_df, + ' "searchable": {', v_crlf, + ' "type": "input-text",', v_crlf, + ' "name": "search_', p_FieldName, '",', v_crlf, + ' "label": "', p_FieldCN, '"', v_crlf, + ' },', v_crlf + ); + ELSE + SET v_field_df = CONCAT(v_field_df, + ' "searchable": {', v_crlf, + ' "type": "input-date-range",', v_crlf, + ' "format": "YYYY-MM-DD",', v_crlf, + ' "name": "search_', p_FieldName, '",', v_crlf, + ' "label": "', p_FieldCN, '"', v_crlf, + ' },', v_crlf + ); + END IF; + ELSEIF p_FieldObject = 'input-date' THEN + SET v_field_df = CONCAT(' "format": "YYYY-MM-DD",', v_crlf); + ELSEIF (p_FieldObject = 'input-number') THEN + -- 讀取設定 + IF IFNULL(p_fieldfm, '') = '' THEN + SET p_fieldfm = 'd0'; + END IF; + + SET p_fieldfm = CONCAT('"${ls:sys@', p_fieldfm, '}"'); + + SET v_field_df = CONCAT( + ' "align": "right",', v_crlf, + ' "precision": ', p_fieldfm, ',', v_crlf + ); + END IF; + + SET v_comps = CONCAT( + ' {', v_crlf, + ' "type": "', v_gridType, '",', v_crlf, + ' "name": "', p_FieldName, '",', v_crlf, + v_field_df, + ' "label": "', p_FieldCN, '"', v_crlf, + ' }' + ); + END IF; + + UPDATE zen_wizard_jsondata SET json_gridview = v_comps WHERE uuid = p_uuid AND rowid = p_rowid; +END // + +DELIMITER ; \ No newline at end of file diff --git a/zen_create_json_comps_others_quickedit.txt b/zen_create_json_comps_others_quickedit.txt new file mode 100644 index 0000000..1beeee5 --- /dev/null +++ b/zen_create_json_comps_others_quickedit.txt @@ -0,0 +1,155 @@ +DELIMITER // + +CREATE OR REPLACE PROCEDURE zen_create_json_comps_others_quickedit( + IN p_uuid VARCHAR(100), + IN p_FunctionTag VARCHAR(100), + IN p_FieldObject VARCHAR(100), + IN p_tblName VARCHAR(100), + IN p_pk VARCHAR(100), + IN p_FieldName VARCHAR(100), + IN p_FieldCN NVARCHAR(100), + IN p_query_type VARCHAR(1), + IN p_picker_tag VARCHAR(100), + IN p_FieldSH VARCHAR(1), + IN p_required VARCHAR(100), + IN p_fieldfm VARCHAR(100), + IN p_rowid INT +) +/* + function : amis Wizard 產生 json UI 的核心程式(每個 Component 有各自的 json UI 定義) + description: 本段 sp 主要是設定 input-text 中 view 部分的 json 定義(實在是太長了) + 後來發現, 除了特殊的元件要獨立的 sp 特別處理外, 一般元件可以都統一在 input-text 的 sp 加上一些判斷即可 + Build Date : 2023/12/20 + Modified : 2025/08/09 (轉換為 MariaDB 版本) + + Modify History + Item Who Date Modify Docs + ==== ========== ========== ================================================ + 1 Michael 2023/12/20 根據 v1.0 重構 + 2 Assistant 2025/08/09 轉換為 MariaDB 版本 +*/ +BEGIN + DECLARE v_comps TEXT; + DECLARE v_ip VARCHAR(200); + DECLARE v_db VARCHAR(200); + DECLARE v_tmp2, v_tmp3 VARCHAR(800); + DECLARE v_gridType VARCHAR(100); + + DECLARE v_blob_data TEXT; + DECLARE v_field_df TEXT; + DECLARE v_crlf VARCHAR(2); + DECLARE v_qEdit TEXT; + DECLARE v_cnt INT; + + SET v_crlf = CONCAT(CHAR(13), CHAR(10)); + SET v_ip = '${ls:base_ip}'; + SET v_db = '${ls:base_db}'; + + -- for SingleGrid (Use quitEdit to Edit) + -- PK 不得編輯, 要判斷 required + SET v_qEdit = ''; + + -- 检查是否为PK字段 + SELECT COUNT(*) INTO v_cnt FROM ( + SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(p_pk, ',', numbers.n), ',', -1) AS col + FROM ( + SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL + SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL + SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 + ) numbers + WHERE numbers.n <= LENGTH(p_pk) - LENGTH(REPLACE(p_pk, ',', '')) + 1 + ) AS split_pk + WHERE col = p_FieldName; + + IF v_cnt <= 0 THEN + SET v_gridType = 'text'; + + IF (p_FieldObject = 'select' OR p_FieldObject = 'options-add' OR p_FieldObject = 'options') THEN + SET v_gridType = 'text'; + SET v_qEdit = zen_get_keyvalue(p_tblName, p_FieldName); + + -- 新增允許臨時再前端新增輸入的選項 2022-10-01 Michael + IF p_FieldObject = 'options-add' THEN + SET v_qEdit = CONCAT( + ' "creatable": true,', v_crlf, + ' "addControls": [', v_crlf, + ' {', v_crlf, + ' "type": "text",', v_crlf, + ' "name": "label",', v_crlf, + ' "label": "選項標題"', v_crlf, + ' },', v_crlf, + ' {', v_crlf, + ' "type": "text",', v_crlf, + ' "name": "value",', v_crlf, + ' "label": "選項值"', v_crlf, + ' }', v_crlf, + ' ],', v_crlf, + v_qEdit + ); + END IF; + + -- option 是特殊的 select, 但還是 select + SET p_FieldObject = 'select'; + ELSEIF (p_FieldObject = 'radios') THEN + SET v_gridType = 'text'; + SET v_qEdit = zen_get_keyvalue(p_tblName, p_FieldName); + ELSEIF (p_FieldObject = 'picker') THEN + -- 待測試 2023/03/17(在 quickEdit 模式時,也能開窗查詢) + SET v_gridType = 'text'; + SET v_qEdit = zen_picker(p_picker_tag, p_FieldName, p_FieldCN, 'R', v_ip, v_db, p_FunctionTag); + ELSEIF (p_FieldObject = 'input-number') THEN + SET v_gridType = 'text'; + -- 讀取設定 + IF IFNULL(p_fieldfm, '') = '' THEN + SET p_fieldfm = 'd0'; + END IF; + + SET p_fieldfm = CONCAT('"${ls:sys@', p_fieldfm, '}"'); + + SET v_qEdit = CONCAT( + ' "align": "right",', v_crlf, + ' "precision": ', p_fieldfm, ',' + ); + ELSEIF (p_FieldObject = 'input-datetime') THEN + SET v_qEdit = CONCAT(v_qEdit, ' "format": "YYYY-MM-DD HH:mm:ss.SSS",', v_crlf); + SET v_gridType = 'static-date'; + ELSEIF (p_FieldObject = 'input-date') THEN + SET v_qEdit = CONCAT(v_qEdit, ' "format": "YYYY-MM-DD",', v_crlf); + SET v_gridType = 'static-date'; + ELSEIF (p_FieldObject = 'checkbox') THEN + SET v_qEdit = CONCAT(v_qEdit, + ' "inputClassName": "p-0 w-6",', v_crlf, + ' "trueValue": "Y",', v_crlf, + ' "falseValue": "N",', v_crlf + ); + SET v_gridType = 'text'; + END IF; + + SET v_qEdit = CONCAT( + ' "quickEdit": {', v_crlf, + ' "type": "', p_FieldObject, '",', v_crlf, + p_required, + v_qEdit, v_crlf, + ' "mode": "inline"', v_crlf, + ' },', v_crlf + ); + ELSE + -- pk 設為唯獨 + SET v_gridType = 'text'; + END IF; + + IF p_FieldSH = 'Y' THEN + SET v_comps = CONCAT( + ' {', v_crlf, + ' "type": "', v_gridType, '",', v_crlf, + ' "name": "', p_FieldName, '",', v_crlf, + v_qEdit, + ' "label": "', p_FieldCN, '"', v_crlf, + ' }' + ); + END IF; + + UPDATE zen_wizard_jsondata SET json_quickedit = v_comps WHERE uuid = p_uuid AND rowid = p_rowid; +END // + +DELIMITER ; \ No newline at end of file diff --git a/zen_create_json_comps_others_view.txt b/zen_create_json_comps_others_view.txt new file mode 100644 index 0000000..1e478a8 --- /dev/null +++ b/zen_create_json_comps_others_view.txt @@ -0,0 +1,163 @@ +DELIMITER // + +CREATE OR REPLACE PROCEDURE zen_create_json_comps_others_view( + IN p_uuid VARCHAR(100), + IN p_FieldObject VARCHAR(100), + IN p_tblName VARCHAR(100), + IN p_FieldName VARCHAR(100), + IN p_FieldCN NVARCHAR(100), + IN p_fielddefault VARCHAR(100), + IN p_FieldDS VARCHAR(2), + IN p_FieldCheckNull VARCHAR(2), + IN p_query_type VARCHAR(1), + IN p_fieldfm VARCHAR(100), + IN p_rowid INT +) +/* + function : amis Wizard 產生 json UI 的核心程式(每個 Component 有各自的 json UI 定義) + description: 本段 sp 主要是設定 input-text 中 view 部分的 json 定義(實在是太長了) + 後來發現, 除了特殊的元件要獨立的 sp 特別處理外, 一般元件可以都統一在 input-text 的 sp 加上一些判斷即可 + Build Date : 2023/12/20 + Modified : 2025/08/09 (轉換為 MariaDB 版本) + + Modify History + Item Who Date Modify Docs + ==== ========== ========== ================================================ + 1 Michael 2023/12/20 根據 v1.0 重構 + 2 Assistant 2025/08/09 轉換為 MariaDB 版本 +*/ +BEGIN + DECLARE v_blob_data TEXT; + DECLARE v_view_blob TEXT; + DECLARE v_comps TEXT; + DECLARE v_field_df VARCHAR(800); + DECLARE v_gridType VARCHAR(100); + DECLARE v_crlf VARCHAR(2); + DECLARE v_ip VARCHAR(100); + DECLARE v_db VARCHAR(100); + + SET v_crlf = CONCAT(CHAR(13), CHAR(10)); + SET v_ip = '${ls:base_ip}'; + SET v_db = '${ls:base_db}'; + + -- for View Component + SET v_view_blob = ''; + SET v_gridType = 'static'; -- text(text 在 FromView 時, label 會不顯示) + + IF LOCATE('date', p_FieldObject) > 0 THEN + SET v_gridType = 'static-date'; + ELSEIF LOCATE('image', p_FieldObject) > 0 THEN + SET v_gridType = 'image'; + SET v_view_blob = CONCAT(' "enlargeAble": true,', v_crlf); + ELSEIF p_FieldObject = 'input-file' THEN + SET v_gridType = p_FieldObject; + SET v_view_blob = CONCAT(' "disabled": true,', v_crlf); + ELSEIF p_FieldObject = 'select' THEN + SET v_gridType = 'select'; + SET v_view_blob = CONCAT( + ' "source": {', v_crlf, + ' "method": "post",', v_crlf, + ' "url": "', v_ip, '/xapi/v2/', v_db, '/get_keyvalue/8/",', v_crlf, + ' "data": {', v_crlf, + ' "para01": "', p_tblName, '",', v_crlf, + ' "para02": "', p_FieldName, '"', v_crlf, + ' },', v_crlf, + ' "dataType": "form"', v_crlf, + ' },', v_crlf, + ' "disabled": true,', v_crlf + ); + ELSEIF p_FieldObject = 'options' THEN + -- option 是特殊的 select, 但還是 select + SET v_gridType = 'select'; + SET v_view_blob = zen_get_keyvalue(p_tblName, p_FieldName); + SET v_view_blob = CONCAT(' "disabled": true,', v_crlf, v_view_blob); + ELSEIF p_FieldObject = 'radios' THEN + -- option 是特殊的 select, 但還是 select + SET v_gridType = p_FieldObject; + SET v_view_blob = zen_get_keyvalue(p_tblName, p_FieldName); + SET v_view_blob = CONCAT(' "disabled": true,', v_crlf, v_view_blob); + ELSEIF p_FieldObject = 'mapping' THEN + -- mapping 是特殊的 select, 但還是 select + SET v_gridType = 'static-mapping'; + SET v_view_blob = zen_get_mapping(p_tblName, p_FieldName); + SET v_view_blob = CONCAT(' "disabled": true,', v_crlf, v_view_blob); + ELSEIF p_FieldObject = 'switch' THEN + SET v_gridType = 'switch'; + SET v_view_blob = CONCAT( + ' "trueValue": "Y",', v_crlf, + ' "falseValue": "N",', v_crlf, + ' "disabled": true,', v_crlf, + v_view_blob + ); + ELSEIF p_FieldObject = 'checkbox' THEN + SET v_gridType = 'checkbox'; + SET v_view_blob = CONCAT( + ' "trueValue": "Y",', v_crlf, + ' "falseValue": "N",', v_crlf, + ' "disabled": true,', v_crlf, + v_view_blob + ); + ELSEIF p_FieldObject = 'textarea' THEN + SET v_gridType = 'textarea'; + SET v_view_blob = CONCAT(' "disabled": true,', v_crlf, v_view_blob); + ELSEIF p_FieldObject = 'hidden' THEN + SET v_gridType = 'hidden'; + ELSEIF p_FieldObject = 'progress' THEN + SET v_gridType = 'static-progress'; + -- 如果是 uuid, View 時要改為 qr-code + ELSEIF p_FieldObject = 'uuid' THEN + -- 多加入 fieldfm 的判斷 20240309 Michael + IF IFNULL(p_fieldfm, '') = '' THEN + SET v_gridType = 'static'; + SET v_view_blob = CONCAT(' "visible": false,', v_crlf, v_view_blob); + ELSE + SET v_gridType = p_fieldfm; + END IF; + ELSE + -- 在 view page, 應該都要加 disable + SET v_view_blob = CONCAT(' "disabled": true,', v_crlf, v_view_blob); + END IF; + + -- 新增數字靠右的機制 + SET v_field_df = ''; + + IF (p_FieldObject = 'input-number') THEN + -- 讀取設定 + IF IFNULL(p_fieldfm, '') = '' THEN + SET p_fieldfm = 'd0'; + END IF; + + SET p_fieldfm = CONCAT('"${ls:sys@', p_fieldfm, '}"'); + + SET v_field_df = CONCAT( + ' "align": "right",', v_crlf, + ' "precision": ', p_fieldfm, ',', v_crlf + ); + ELSEIF p_FieldObject = 'input-date' THEN + SET v_field_df = CONCAT(' "format": "YYYY-MM-DD",', v_crlf); + END IF; + + IF p_FieldObject = 'qr-code' THEN + SET v_comps = CONCAT( + ' {', v_crlf, + ' "type": "', p_FieldObject, '",', v_crlf, + ' "codeSize": 128,', v_crlf, + ' "value": "${', p_FieldName, '}"', v_crlf, + ' }' + ); + ELSE + SET v_comps = CONCAT( + ' {', v_crlf, + ' "type": "', v_gridType, '",', v_crlf, + ' "name": "', p_FieldName, '",', v_crlf, + v_field_df, + v_view_blob, + ' "label": "', p_FieldCN, '"', v_crlf, + ' }' + ); + END IF; + + UPDATE zen_wizard_jsondata SET json_view = v_comps WHERE uuid = p_uuid AND rowid = p_rowid; +END // + +DELIMITER ; \ No newline at end of file diff --git a/zen_create_json_comps_picker.txt b/zen_create_json_comps_picker.txt new file mode 100644 index 0000000..9726ecc --- /dev/null +++ b/zen_create_json_comps_picker.txt @@ -0,0 +1,133 @@ +DELIMITER // + +CREATE OR REPLACE PROCEDURE zen_create_json_comps_picker( + IN p_uuid VARCHAR(100), + IN p_FunctionTag VARCHAR(100), + IN p_FieldName VARCHAR(100), + IN p_FieldCN NVARCHAR(100), + IN p_picker_tag VARCHAR(100), + IN p_pk VARCHAR(100), + IN p_FieldCheckNull VARCHAR(2), + IN p_rowid INT +) +/* + function : amis Wizard 產生 json UI 的核心程式(每個 Component 有各自的 json UI 定義) + description: 本段 sp 主要是設定 picker 的 json 定義 + 後來發現, 除了特殊的元件要獨立的 sp 特別處理外, 一般元件可以都統一在 input-text 的 sp 加上一些判斷即可 + Build Date : 2023/12/20 + Modified : 2025/08/09 (轉換為 MariaDB 版本) + + Modify History + Item Who Date Modify Docs + ==== ========== ========== ================================================ + 1 Michael 2023/12/20 根據 v1.0 重構 + 2 Michael 2024-03-02 修改 value 修改狀態不應有 default + 3 Michael 2024-03-03 補加入 searchable 的 code + 4 Assistant 2025/08/09 轉換為 MariaDB 版本 +*/ +BEGIN + DECLARE v_comps TEXT; + DECLARE v_json_insert TEXT; + DECLARE v_json_update TEXT; + DECLARE v_json_quickedit TEXT; + DECLARE v_json_gridview TEXT; + DECLARE v_json_view TEXT; + DECLARE v_cnt INT; + DECLARE v_pos INT; + + DECLARE v_blob_data TEXT; + DECLARE v_field_df TEXT; + DECLARE v_required TEXT; + DECLARE v_crlf VARCHAR(2); + DECLARE v_ip VARCHAR(100); + DECLARE v_db VARCHAR(100); + DECLARE v_gridType VARCHAR(100); + DECLARE v_picker_data TEXT; + DECLARE v_picker_value VARCHAR(200); + + -- 通用寫法 + SET v_crlf = CONCAT(CHAR(13), CHAR(10)); + SET v_blob_data = ''; + SET v_field_df = ''; + SET v_required = ''; + SET v_ip = ''; + SET v_db = ''; + + SET v_ip = '${ls:base_ip}'; + SET v_db = '${ls:base_db}'; + SET v_gridType = 'static'; -- text(text 在 FromView 時, label 會不顯示) + + -- Insert + SET v_comps = zen_picker(p_picker_tag, p_FieldName, p_FieldCN, 'E', v_ip, v_db, p_FunctionTag); + SET v_json_insert = v_comps; + + -- update: 加入判斷, 是否為 pk 欄位 + SET v_cnt = 0; + + -- 检查是否为PK字段 + SELECT COUNT(*) INTO v_cnt FROM ( + SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(p_pk, ',', numbers.n), ',', -1) AS col + FROM ( + SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL + SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL + SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 + ) numbers + WHERE numbers.n <= LENGTH(p_pk) - LENGTH(REPLACE(p_pk, ',', '')) + 1 + ) AS split_pk + WHERE col = p_FieldName; + + IF v_cnt > 0 THEN + SET v_comps = REPLACE(v_comps, '"joinValues": true,', CONCAT('"disabled": true,', v_crlf, ' "joinValues": true,')); + END IF; + + -- 修改狀態時,不應該有預設值 "value": "${ls:userid}", + SET v_cnt = LOCATE('"value": "${', v_comps); + + IF v_cnt > 0 THEN + SET v_picker_data = SUBSTRING(v_comps, v_cnt, 100); + SET v_pos = LOCATE('}"', v_picker_data); + SET v_picker_value = CONCAT(SUBSTRING(v_picker_data, 1, v_pos), '"'); + + SET v_comps = REPLACE(v_comps, v_picker_value, '"value": ""'); + END IF; + + SET v_json_update = v_comps; + + -- quickEdit + SET v_json_quickedit = v_comps; + + -- Grid view, 要加入 Query 的 searchable 內容 + IF p_FieldCheckNull = 'Q' OR p_FieldCheckNull = 'A' THEN + SET v_field_df = CONCAT( + ' "searchable": {', v_crlf, + ' "type": "input-text",', v_crlf, + ' "name": "search_', p_FieldName, '",', v_crlf, + ' "label": "', p_FieldCN, '"', v_crlf, + ' },', v_crlf + ); + END IF; + + SET v_comps = CONCAT( + ' {', v_crlf, + ' "type": "', v_gridType, '",', v_crlf, + ' "name": "', p_FieldName, '",', v_crlf, + v_field_df, v_crlf, + ' "label": "', p_FieldCN, '"', v_crlf, + ' }' + ); + + SET v_json_gridview = v_comps; + + -- view + SET v_picker_data = zen_picker(p_picker_tag, p_FieldName, p_FieldCN, 'R', v_ip, v_db, p_FunctionTag); + SET v_json_view = v_picker_data; + + -- 寫入暫存 Table (zen_wizard_jsondata) + UPDATE zen_wizard_jsondata SET json_insert = v_json_insert WHERE uuid = p_uuid AND rowid = p_rowid; + UPDATE zen_wizard_jsondata SET json_update = v_json_update WHERE uuid = p_uuid AND rowid = p_rowid; + UPDATE zen_wizard_jsondata SET json_quickedit = v_json_quickedit WHERE uuid = p_uuid AND rowid = p_rowid; + UPDATE zen_wizard_jsondata SET json_gridview = v_json_gridview WHERE uuid = p_uuid AND rowid = p_rowid; + UPDATE zen_wizard_jsondata SET json_view = v_json_view WHERE uuid = p_uuid AND rowid = p_rowid; +END // + +DELIMITER ; \ No newline at end of file diff --git a/zen_create_json_comps_transfer.txt b/zen_create_json_comps_transfer.txt new file mode 100644 index 0000000..a3cf34e --- /dev/null +++ b/zen_create_json_comps_transfer.txt @@ -0,0 +1,113 @@ +DELIMITER // + +CREATE OR REPLACE PROCEDURE zen_create_json_comps_transfer( + IN p_uuid VARCHAR(100), + IN p_FieldName VARCHAR(100), + IN p_FieldCN NVARCHAR(100), + IN p_picker_tag VARCHAR(100), + IN p_code_id VARCHAR(100), + IN p_rowid INT +) +/* + function : amis Wizard 產生 json UI 的核心程式(每個 Component 有各自的 json UI 定義) + description: 本段 sp 主要是設定 transfer 的 json 定義 + Build Date : 2023/12/20 + Modified : 2025/08/09 (轉換為 MariaDB 版本) + + Modify History + Item Who Date Modify Docs + ==== ========== ========== ================================================ + 1 Michael 2023/12/20 根據 v1.0 重構 + 2 Assistant 2025/08/09 轉換為 MariaDB 版本 +*/ +BEGIN + DECLARE v_comps TEXT; + DECLARE v_json_insert TEXT; + DECLARE v_json_update TEXT; + DECLARE v_json_quickedit TEXT; + DECLARE v_json_gridview TEXT; + DECLARE v_json_view TEXT; + DECLARE v_cnt INT; + + DECLARE v_blob_data TEXT; + DECLARE v_field_df TEXT; + DECLARE v_required TEXT; + DECLARE v_init_api TEXT; + DECLARE v_crlf VARCHAR(2); + DECLARE v_ip VARCHAR(100); + DECLARE v_db VARCHAR(100); + + -- 通用寫法 + SET v_crlf = CONCAT(CHAR(13), CHAR(10)); + SET v_blob_data = ''; + SET v_field_df = ''; + SET v_required = ''; + SET v_ip = '${ls:base_ip}'; + SET v_db = '${ls:base_db}'; + + -- Insert + SET v_comps = CONCAT( + ' {', v_crlf, + ' "label": "', p_FieldCN, '選擇",', v_crlf, + ' "type": "transfer",', v_crlf, + ' "name": "', p_FieldName, '",', v_crlf, + ' "selectMode": "tree",', v_crlf, + ' "source": "${config}"', v_crlf, + ' }' + ); + + SET v_json_insert = v_comps; + + -- update: 加入判斷, 是否為 pk 欄位 + SET v_json_update = v_comps; + + -- view + IF LOCATE('MasterDetail', p_code_id) > 0 THEN + SET v_comps = CONCAT( + ' {', v_crlf, + ' "label": "', p_FieldCN, '",', v_crlf, + ' "type": "static",', v_crlf, + ' "name": "', p_FieldName, '"', v_crlf, + ' }' + ); + ELSE + SET v_comps = CONCAT( + ' {', v_crlf, + ' "label": "', p_FieldCN, '選擇",', v_crlf, + ' "type": "transfer",', v_crlf, + ' "name": "', p_FieldName, '",', v_crlf, + ' "selectMode": "tree",', v_crlf, + ' "disabled": true,', v_crlf, + ' "source": "${config}"', v_crlf, + ' }' + ); + END IF; + + SET v_json_view = v_comps; + + -- 寫入暫存 Table (zen_wizard_jsondata) + UPDATE zen_wizard_jsondata SET json_insert = v_json_insert WHERE uuid = p_uuid AND rowid = p_rowid; + UPDATE zen_wizard_jsondata SET json_update = v_json_update WHERE uuid = p_uuid AND rowid = p_rowid; + UPDATE zen_wizard_jsondata SET json_quickedit = '' WHERE uuid = p_uuid AND rowid = p_rowid; + UPDATE zen_wizard_jsondata SET json_gridview = '' WHERE uuid = p_uuid AND rowid = p_rowid; + UPDATE zen_wizard_jsondata SET json_view = v_json_view WHERE uuid = p_uuid AND rowid = p_rowid; + + -- 有其他的資料要寫入 zen_wizard_tmp + -- 要在 form 上新增 initApi 的設定(未完) + SET v_init_api = CONCAT( + ' "initApi": {', v_crlf, + ' "method": "post",', v_crlf, + ' "url": "', v_ip, '/xapi/v2/', v_db, '/get_orgStructure/9/",', v_crlf, + ' "data": {', v_crlf, + ' "para01": "', IF(p_picker_tag = '', 'person', p_picker_tag), '"', v_crlf, + ' },', v_crlf, + ' "dataType": "form"', v_crlf, + ' },', v_crlf + ); + + -- 更新 zen_wizard_tmp 表 + UPDATE zen_wizard_tmp SET zen_value = CONCAT(zen_value, v_init_api) + WHERE uuid = p_uuid AND zen_key = 'init_api_org'; +END // + +DELIMITER ; \ No newline at end of file diff --git a/zen_create_json_detail.txt b/zen_create_json_detail.txt new file mode 100644 index 0000000..8788cfd --- /dev/null +++ b/zen_create_json_detail.txt @@ -0,0 +1,147 @@ +DELIMITER // + +CREATE OR REPLACE PROCEDURE zen_create_json_detail( + IN p_uuid VARCHAR(100), + IN p_uuid_m VARCHAR(100), + IN p_FunctionTag VARCHAR(100), + IN p_code_id VARCHAR(100), -- Wizard Template Id + IN p_pk VARCHAR(100) +) +/* + 功能 : 針對 Master-Detail 的 Detail, 原本是呼叫 dbo.zen_get_detail_data, 重構後就不必呼叫該 udf, 改為本 sp 下方的寫法 + 描述: 主要是由 zen_create_json_prepare_detaildata 呼叫使用 + 主要是計算並替換下面3個變數的內容(寫入暫存檔) + @Detail_By_add@ + @Detail_By_view@ + @Detail_By_Edit@ + 建立日期 : 2024/1/8 + + 修改歷史 + 項目 誰 日期 修改說明 + ==== ========== ========== ================================================ + 1 Michael 2024/1/8 根據 v1.0 重構 +*/ +BEGIN + -- 跟 fields define 相關的部分要專門處理(核心程式) + DECLARE v_code_insert TEXT; + DECLARE v_code_update TEXT; + DECLARE v_code_view TEXT; + DECLARE v_code_gridview TEXT; + DECLARE v_code_quickedit TEXT; + DECLARE v_code_edit_insert TEXT; -- 修改模式下的 insert + + DECLARE v_json_bh VARCHAR(600); + DECLARE v_json_gh VARCHAR(600); + DECLARE v_json_insert TEXT; -- input-table 的 in-line editor + DECLARE v_json_update TEXT; + DECLARE v_json_quickedit TEXT; + DECLARE v_json_gridview TEXT; + DECLARE v_json_view TEXT; + DECLARE v_json_gf VARCHAR(600); + DECLARE v_json_bf VARCHAR(600); + DECLARE v_crlf VARCHAR(2); + DECLARE v_sep VARCHAR(1); + DECLARE v_FieldDS VARCHAR(1); + DECLARE v_FieldSH VARCHAR(1); + DECLARE v_imax INT; + DECLARE v_imin INT; + DECLARE v_inow INT; + DECLARE v_pos INT; + + DECLARE v_zen_key VARCHAR(100); + DECLARE v_zen_value TEXT; + + SET v_crlf = CONCAT(CHAR(13), CHAR(10)); + + /* + 將 zen_wizard_jsondata 相關的欄位定義組好並更新相關變數 + */ + SET v_code_insert = ''; + SET v_code_update = ''; + SET v_code_view = ''; + SET v_code_gridview = ''; + SET v_code_quickedit = ''; + SET v_code_edit_insert = ''; + + -- FieldSH = 'Y' 的處理 + SELECT MAX(rowid) INTO v_imax FROM zen_wizard_jsondata WHERE uuid = p_uuid AND FieldSH = 'Y'; + SELECT MIN(rowid) INTO v_imin FROM zen_wizard_jsondata WHERE uuid = p_uuid AND FieldSH = 'Y'; + + WHILE v_imin <= v_imax DO + SELECT + IFNULL(json_bh,''), IFNULL(json_gh,''), + IFNULL(json_insert,''), IFNULL(json_update,''), IFNULL(json_quickedit,''), + IFNULL(json_gridview,''), IFNULL(json_view,''), + IFNULL(json_gf,''), IFNULL(json_bf,'') + INTO + v_json_bh, v_json_gh, + v_json_insert, v_json_update, v_json_quickedit, + v_json_gridview, v_json_view, + v_json_gf, v_json_bf + FROM zen_wizard_jsondata WHERE uuid = p_uuid AND rowid = v_imin; + + IF (v_imin = v_imax) THEN + SET v_sep = ''; + ELSE + SET v_sep = ','; + END IF; + + IF v_json_insert <> '' THEN + SET v_code_insert = CONCAT(v_code_insert, v_json_insert, v_sep, v_crlf); + SET v_code_edit_insert = CONCAT(v_code_edit_insert, v_json_bh, v_json_gh, v_json_insert, v_json_gf, v_json_bf, v_sep, v_crlf); + END IF; + + IF v_json_update <> '' THEN + SET v_code_update = CONCAT(v_code_update, v_json_bh, v_json_gh, v_json_update, v_json_gf, v_json_bf, v_sep, v_crlf); + END IF; + + IF v_json_view <> '' THEN + SET v_code_view = CONCAT(v_code_view, v_json_bh, v_json_gh, v_json_view, v_json_gf, v_json_bf, v_sep, v_crlf); + END IF; + + SELECT MIN(rowid) INTO v_imin FROM zen_wizard_jsondata WHERE uuid = p_uuid AND rowid > v_imin; + END WHILE; + + -- FieldDS = 'Y' 的處理 + SELECT MAX(rowid) INTO v_imax FROM zen_wizard_jsondata WHERE uuid = p_uuid AND FieldDS = 'Y'; + SELECT MIN(rowid) INTO v_imin FROM zen_wizard_jsondata WHERE uuid = p_uuid AND FieldDS = 'Y'; + + WHILE v_imin <= v_imax DO + SELECT + IFNULL(json_bh,''), IFNULL(json_gh,''), + IFNULL(json_insert,''), IFNULL(json_update,''), IFNULL(json_quickedit,''), + IFNULL(json_gridview,''), IFNULL(json_view,''), + IFNULL(json_gf,''), IFNULL(json_bf,'') + INTO + v_json_bh, v_json_gh, + v_json_insert, v_json_update, v_json_quickedit, + v_json_gridview, v_json_view, + v_json_gf, v_json_bf + FROM zen_wizard_jsondata WHERE uuid = p_uuid AND rowid = v_imin; + + IF (v_imin = v_imax) THEN + SET v_sep = ''; + ELSE + SET v_sep = ','; + END IF; + + IF v_json_gridview <> '' THEN + SET v_code_gridview = CONCAT(v_code_gridview, v_json_gridview, v_sep, v_crlf); + END IF; + + IF v_json_quickedit <> '' THEN + SET v_code_quickedit = CONCAT(v_code_quickedit, v_json_quickedit, ',', v_crlf); + END IF; + + SELECT MIN(rowid) INTO v_imin FROM zen_wizard_jsondata WHERE uuid = p_uuid AND rowid > v_imin; + END WHILE; + + -- 寫入暫存表 + INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid_m,'Detail_By_View',v_code_gridview,NOW()); + INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid_m,'Detail_By_Insert',v_code_insert,NOW()); + INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid_m,'Detail_By_Edit',v_code_update,NOW()); + -- input-table 的 insert + INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid_m,'Detail_By_Edit_Insert',v_code_edit_insert,NOW()); +END // + +DELIMITER ; \ No newline at end of file diff --git a/zen_create_json_final.txt b/zen_create_json_final.txt new file mode 100644 index 0000000..231ef33 --- /dev/null +++ b/zen_create_json_final.txt @@ -0,0 +1,246 @@ +DELIMITER // + +CREATE OR REPLACE PROCEDURE zen_create_json_final( + IN p_uuid VARCHAR(100), + IN p_FunctionTag VARCHAR(100), + IN p_code_id VARCHAR(100), -- Wizard Template Id + IN p_is_extend VARCHAR(100), + IN p_pk VARCHAR(100), + IN p_is_bpm VARCHAR(1), + IN p_FunctionTag_org VARCHAR(100) +) +/* + 功能 : 最後步驟, 將之前所有寫入暫存表的變數, 寫入 source + 描述: 一次性的 update 到 @temp_code, 並寫入 json db + 建立日期 : 2023/12/22 + + 修改歷史 + 項目 誰 日期 修改說明 + ==== ========== ========== ================================================ + 1 Michael 2023/12/22 根據 v1.0 重構 + 2 Michael 2024/03/06 擴充 json4 及 json5 2個欄位 +*/ +BEGIN + DECLARE v_temp_code MEDIUMTEXT; + DECLARE v_temp_code6 MEDIUMTEXT; + -- 跟 fields define 相關的部分要專門處理(核心程式) + DECLARE v_code_insert MEDIUMTEXT; + DECLARE v_code_update MEDIUMTEXT; + DECLARE v_code_view MEDIUMTEXT; + DECLARE v_code_gridview MEDIUMTEXT; + DECLARE v_code_quickedit MEDIUMTEXT; + + DECLARE v_json_bh VARCHAR(600); + DECLARE v_json_gh VARCHAR(600); + DECLARE v_json_insert MEDIUMTEXT; + DECLARE v_json_update MEDIUMTEXT; + DECLARE v_json_quickedit MEDIUMTEXT; + DECLARE v_json_gridview MEDIUMTEXT; + DECLARE v_json_view MEDIUMTEXT; + DECLARE v_json_gf VARCHAR(600); + DECLARE v_json_bf VARCHAR(600); + DECLARE v_crlf VARCHAR(2); + DECLARE v_sep VARCHAR(1); + DECLARE v_FieldDS VARCHAR(1); + DECLARE v_FieldSH VARCHAR(1); + + DECLARE v_ip VARCHAR(100); + DECLARE v_db VARCHAR(100); + DECLARE v_tmp1 VARCHAR(100); + + DECLARE v_imax INT; + DECLARE v_imin INT; + DECLARE v_inow INT; + DECLARE v_pos INT; + + DECLARE v_zen_key VARCHAR(100); + DECLARE v_zen_value MEDIUMTEXT; + + SET v_crlf = CONCAT(CHAR(13), CHAR(10)); + SET v_ip = '${ls:base_ip}'; + SET v_db = '${ls:base_db}'; + + -- Single 類使用相同的樣板, SingleGrid 除外 + IF p_code_id IN ('SingleEntry','SingleTabs','SinglePanels') THEN + SELECT code_content INTO v_temp_code FROM zen_Wizard_template WHERE code_id = 'SingleEntry'; + -- Master-detail(支援 Tab 和 Panel 2種 UX -- 配合 Single Extend) + ELSEIF p_code_id IN ('MasterDetailTabs','MasterDetailPanels') THEN + SELECT code_content INTO v_temp_code FROM zen_Wizard_template WHERE code_id = 'MasterDetail'; + ELSE + SELECT code_content INTO v_temp_code FROM zen_Wizard_template WHERE code_id = p_code_id; + END IF; + + -- 如果是擴充表單, 要手動調整 ${ls:query_id} 的相關內容(較特殊的變數, 暫時仍手動處理) + IF p_is_extend = 'Y' THEN + SET v_tmp1 = p_pk; + SET v_pos = LOCATE(',',p_pk); + IF v_pos > 0 THEN + SET v_tmp1 = SUBSTRING(p_pk,1,v_pos-1); + END IF; + SET v_temp_code = REPLACE(v_temp_code,'${ls:query_id}',CONCAT('^',v_tmp1,'^${ls:query_id}')); + END IF; + + /* + 加入 bpm 表單開始簽核後, 不得編輯的語法, 要記得 template 要先加入 @bpm_edit@ + */ + IF p_is_bpm = 'Y' THEN + -- "disabledOn": "${ls:hrsm12@update == null || flow_status != 'N'}", 高手的解答 + SET v_temp_code = REPLACE(v_temp_code,'@bpm_edit@', CONCAT(' || flow_status != ',CHAR(39),'N',CHAR(39),'}')); + ELSE + SET v_temp_code = REPLACE(v_temp_code,'@bpm_edit@', '}'); + END IF; + + /* + 將 zen_wizard_tmp 的變數 replace + loop 取得所有的變數, 然後 update v_temp_code + */ + SELECT MAX(rowid) INTO v_imax FROM zen_wizard_tmp WHERE uuid = p_uuid; + SELECT MIN(rowid) INTO v_imin FROM zen_wizard_tmp WHERE uuid = p_uuid; + + WHILE v_imin <= v_imax DO + SELECT zen_key, IFNULL(zen_value,'') INTO v_zen_key, v_zen_value + FROM zen_wizard_tmp WHERE uuid = p_uuid AND rowid = v_imin; + + SET v_temp_code = REPLACE(v_temp_code,CONCAT('@',v_zen_key,'@'),v_zen_value); + + SELECT MIN(rowid) INTO v_imin FROM zen_wizard_tmp WHERE uuid = p_uuid AND rowid > v_imin; + END WHILE; + + /* + 將 zen_wizard_jsondata 相關的欄位定義組好並更新相關變數 + */ + SET v_code_insert = ''; + SET v_code_update = ''; + SET v_code_view = ''; + SET v_code_gridview = ''; + SET v_code_quickedit = ''; + + -- FieldSH = 'Y' 的處理 + SELECT MAX(rowid) INTO v_imax FROM zen_wizard_jsondata WHERE uuid = p_uuid AND FieldSH = 'Y'; + SELECT MIN(rowid) INTO v_imin FROM zen_wizard_jsondata WHERE uuid = p_uuid AND FieldSH = 'Y'; + + WHILE v_imin <= v_imax DO + SELECT + IFNULL(json_bh,''), IFNULL(json_gh,''), FieldSH, + IFNULL(json_insert,''), IFNULL(json_update,''), IFNULL(json_quickedit,''), + IFNULL(json_gridview,''), IFNULL(json_view,''), + IFNULL(json_gf,''), IFNULL(json_bf,'') + INTO + v_json_bh, v_json_gh, v_FieldSH, + v_json_insert, v_json_update, v_json_quickedit, + v_json_gridview, v_json_view, + v_json_gf, v_json_bf + FROM zen_wizard_jsondata WHERE uuid = p_uuid AND rowid = v_imin; + + IF v_FieldSH = 'Y' THEN + IF (v_imin = v_imax) THEN + SET v_sep = ''; + ELSE + SET v_sep = ','; + END IF; + + IF v_json_insert <> '' THEN + SET v_code_insert = CONCAT(v_code_insert, v_json_bh, v_json_gh, v_json_insert, v_json_gf, v_json_bf, v_sep, v_crlf); + END IF; + + IF v_json_update <> '' THEN + SET v_code_update = CONCAT(v_code_update, v_json_bh, v_json_gh, v_json_update, v_json_gf, v_json_bf, v_sep, v_crlf); + END IF; + + IF v_json_view <> '' THEN + SET v_code_view = CONCAT(v_code_view, v_json_bh, v_json_gh, v_json_view, v_json_gf, v_json_bf, v_sep, v_crlf); + END IF; + END IF; + + SELECT MIN(rowid) INTO v_imin FROM zen_wizard_jsondata WHERE uuid = p_uuid AND rowid > v_imin; + END WHILE; + + -- FieldDS = 'Y' 的處理 + SELECT MAX(rowid) INTO v_imax FROM zen_wizard_jsondata WHERE uuid = p_uuid AND FieldDS = 'Y'; + SELECT MIN(rowid) INTO v_imin FROM zen_wizard_jsondata WHERE uuid = p_uuid AND FieldDS = 'Y'; + + WHILE v_imin <= v_imax DO + SELECT + IFNULL(json_bh,''), IFNULL(json_gh,''), FieldDS, + IFNULL(json_insert,''), IFNULL(json_update,''), IFNULL(json_quickedit,''), + IFNULL(json_gridview,''), IFNULL(json_view,''), + IFNULL(json_gf,''), IFNULL(json_bf,'') + INTO + v_json_bh, v_json_gh, v_FieldDS, + v_json_insert, v_json_update, v_json_quickedit, + v_json_gridview, v_json_view, + v_json_gf, v_json_bf + FROM zen_wizard_jsondata WHERE uuid = p_uuid AND rowid = v_imin; + + IF v_FieldDS = 'Y' THEN + IF (v_imin = v_imax) THEN + SET v_sep = ''; + ELSE + SET v_sep = ','; + END IF; + + IF v_json_gridview <> '' THEN + SET v_code_gridview = CONCAT(v_code_gridview, v_json_gridview, v_sep, v_crlf); + END IF; + + IF v_json_quickedit <> '' THEN + SET v_code_quickedit = CONCAT(v_code_quickedit, v_json_quickedit, ',', v_crlf); + END IF; + END IF; + + SELECT MIN(rowid) INTO v_imin FROM zen_wizard_jsondata WHERE uuid = p_uuid AND rowid > v_imin; + END WHILE; + + /* + 新增 bpm 的簽核 button-group, 都新增在 view 的程式段中 + 要加入判斷是否為 bpm 表單(在 zenBusiness 中) + */ + IF p_is_bpm = 'Y' THEN + SELECT zen_bpm_define(p_FunctionTag,p_FunctionTag_org,p_pk,v_ip,v_db) INTO v_temp_code6; + SET v_code_view = CONCAT(v_temp_code6, v_code_view); + END IF; + + SET v_temp_code = REPLACE(v_temp_code,'@Fields_by_add@',v_code_insert); + SET v_temp_code = REPLACE(v_temp_code,'@Fields_By_GridView@',CONCAT(v_code_gridview,',')); + SET v_temp_code = REPLACE(v_temp_code,'@Fields_By_View@',v_code_view); + SET v_temp_code = REPLACE(v_temp_code,'@Fields_By_Edit@',v_code_update); + SET v_temp_code = REPLACE(v_temp_code,'@Fields_By_GridView_Edit@',v_code_quickedit); + + /* + 如果內容有誤, 當然就不要更新到 db + */ + IF IFNULL(v_temp_code,'') = '' THEN + SELECT 9 AS code,'error' AS msg; + SELECT v_temp_code AS jsoncode; + ELSE + -- 統一將 orm_api 改為 v3 + -- SET v_temp_code = REPLACE(v_temp_code,'/v2/','/v3/'); + -- 如果專案是 wizard, 將 db 改為 wizard_db (先 hard code, 目前暫時不想再加欄位) + IF SUBSTRING(p_FunctionTag,1,3) = 'zen' THEN + SET v_temp_code = REPLACE(v_temp_code,'${ls:base_db}','${ls:wizard_db}'); + END IF; + + -- 因為有長度的限制, 所以試著將程式依大小(40000) 切割 -- Cancel + + /* + for ViewForm / CreateForm + */ + SET p_FunctionTag = p_FunctionTag_org; + + -- Insert into + SELECT COUNT(*) INTO v_inow FROM zen_jsoncode WHERE FunctionTag = p_FunctionTag AND version = 'beta'; + IF v_inow > 0 THEN + UPDATE zen_jsoncode + SET jsonCode = v_temp_code + WHERE FunctionTag = p_FunctionTag AND version = 'beta'; + ELSE + INSERT INTO zen_jsoncode (FunctionTag,version,jsonCode) + VALUES (p_FunctionTag,'beta',v_temp_code); + END IF; + + SELECT 0 AS code,'ok' AS msg; + SELECT v_temp_code AS jsoncode; + END IF; +END // + +DELIMITER ; \ No newline at end of file diff --git a/zen_create_json_kernel.txt b/zen_create_json_kernel.txt new file mode 100644 index 0000000..643829d --- /dev/null +++ b/zen_create_json_kernel.txt @@ -0,0 +1,127 @@ +DELIMITER // + +CREATE OR REPLACE PROCEDURE zen_create_json_kernel( + IN p_uuid VARCHAR(100), + IN p_FunctionTag VARCHAR(100), + IN p_tblName VARCHAR(100), + IN p_pk VARCHAR(100), + IN p_query_type VARCHAR(1), + IN p_code_id VARCHAR(100) +) +/* + 功能 : amis Wizard 產生 json UI 的核心程式 + 描述: 本段 sp 是設定的主程式, 由此呼叫各自元件 sp, 會重新組合出原 @temp_code 內跟 compoment 的定義內容 + 一般記錄到 zen_wizard_jsondata, 少數情況會寫到 zen_wizard_tmp(zen_create_json_transfer) + 仔細看起來, 似乎只有 Cycle 類元件以及 picker, transfer 及 formula 這幾個特殊元件要特別獨立 function 處理 + 我覺得還是給每個元件一段 sp, 雖然子程式會變多, 但是會更好維護 Thinking + 建立日期 : 2023/12/20 + + 修改歷史 + 項目 誰 日期 修改說明 + ==== ========== ========== ================================================ + 1 Michael 2023/12/20 根據 v1.0 重構 +*/ +BEGIN + /* 目前支援下列 amis 元件(可依需求繼續擴充) + select / options / options-add / checkboxes + input-date / input-datetime / input-time + input-number / input-password / formula + picker + radios + switch + checkbox + static + input-text + textarea + input-image + input-file + link-file + link + transfer + mapping + progress + hidden + uuid + qr-code + cycle-frequency / cycle-weeks / cycle-months / cycle-startdate / cycle-enddate + */ + + DECLARE v_FieldObject VARCHAR(100); + DECLARE v_picker_tag VARCHAR(100); + DECLARE v_FieldName VARCHAR(100); + DECLARE v_FieldCN NVARCHAR(100); + DECLARE v_FieldWidth VARCHAR(100); + DECLARE v_fielddefault VARCHAR(200); + DECLARE v_fieldro VARCHAR(10); + DECLARE v_fieldfm VARCHAR(100); + DECLARE v_FieldDS VARCHAR(1); + DECLARE v_FieldSH VARCHAR(1); + DECLARE v_FieldCheckNull VARCHAR(1); + DECLARE v_iscolumnmatch VARCHAR(10); + DECLARE v_FieldBlock INT; + DECLARE v_group VARCHAR(10); + DECLARE v_block VARCHAR(10); + -- DECLARE v_y SMALLINT; + DECLARE v_cnt INT; + DECLARE v_imax INT; + DECLARE v_imin INT; + DECLARE v_inow INT; + + DECLARE v_required VARCHAR(100); + DECLARE v_others VARCHAR(800); + -- 有非 input-text 標準屬性設定的其他元件, 但又不是 4大特殊元件的元件(picker, cycle-, formula, transfer) + SET v_others = 'input-file^input-image^textarea^select^input-date^input-datetime^options^options-add^mapping^progress^link-file^link^radios^'; + + SELECT MIN(rowid) INTO v_imin FROM zen_wizard_jsondata WHERE uuid = p_uuid; + SELECT MAX(rowid) INTO v_imax FROM zen_wizard_jsondata WHERE uuid = p_uuid; + SET v_inow = v_imin; + -- SET v_y = 1; + + WHILE v_inow <= v_imax DO + SELECT + fieldname, IFNULL(fieldcn,fieldname), fieldwidth, fieldobject, fieldblock, picker_tag, + IFNULL(fielddefault,''), IFNULL(fieldro,'N'), IFNULL(fieldfm,''), + fieldds, fieldsh, fieldchecknull, iscolumnmatch, _group, _block + INTO + v_FieldName, v_FieldCN, v_FieldWidth, v_FieldObject, v_FieldBlock, v_picker_tag, + v_fielddefault, v_fieldro, v_fieldfm, + v_FieldDS, v_FieldSH, v_FieldCheckNull, v_iscolumnmatch, v_group, v_block + FROM zen_wizard_jsondata WHERE uuid = p_uuid AND rowid = v_inow; + + -- 防錯處理 + IF v_FieldObject = 'Picker' AND IFNULL(v_picker_tag,'') = '' THEN + SET v_FieldObject = 'input-text'; + END IF; + + -- 是否為必填 + SET v_required = ''; + IF v_FieldCheckNull = 'A' OR v_FieldCheckNull = 'Y' THEN + SET v_required = ' "required": true,'; + END IF; + + -- 加入簡易排版功能, type=block + -- v2: block / group + CALL zen_create_json_comps_block(p_uuid,p_FunctionTag,p_code_id,v_group,v_FieldBlock,v_block,v_inow); + + -- by 元件產生設定內容, 並寫入暫存 + IF v_FieldObject = 'formula' THEN + CALL zen_create_json_comps_formula(p_uuid,v_FieldObject,v_FieldName,v_FieldCN,v_picker_tag,v_inow); + ELSEIF v_FieldObject = 'picker' THEN + CALL zen_create_json_comps_picker(p_uuid,p_FunctionTag,v_FieldName,v_FieldCN,v_picker_tag,p_pk,v_FieldCheckNull,v_inow); + ELSEIF v_FieldObject = 'transfer' THEN + CALL zen_create_json_comps_transfer(p_uuid,v_FieldName,v_FieldCN,v_picker_tag,p_code_id,v_inow); + ELSEIF LOCATE('cycle-',v_FieldObject) > 0 THEN + CALL zen_create_json_comps_cycles(p_uuid,v_FieldObject,v_FieldName,v_FieldCN,v_inow); + ELSEIF v_FieldSH = 'Y' THEN + CALL zen_create_json_comps_others( + p_uuid,p_FunctionTag,p_code_id,v_FieldObject,p_tblName,p_pk, + v_FieldName,v_FieldCN,v_fieldro,v_fielddefault,v_FieldDS,v_FieldSH, + v_FieldCheckNull,v_required,p_query_type,v_picker_tag,v_fieldfm,v_inow + ); + END IF; + + SET v_inow = v_inow + 1; + END WHILE; +END // + +DELIMITER ; \ No newline at end of file diff --git a/zen_create_json_prepare.txt b/zen_create_json_prepare.txt new file mode 100644 index 0000000..e7b1e40 --- /dev/null +++ b/zen_create_json_prepare.txt @@ -0,0 +1,234 @@ +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 ; \ No newline at end of file diff --git a/zen_create_json_prepare_aside.txt b/zen_create_json_prepare_aside.txt new file mode 100644 index 0000000..d05ba3c --- /dev/null +++ b/zen_create_json_prepare_aside.txt @@ -0,0 +1,95 @@ +DELIMITER // + +CREATE OR REPLACE PROCEDURE zen_create_json_prepare_aside( + IN p_uuid VARCHAR(100), + IN p_aside_setup VARCHAR(100) +) +/* + 功能 : amis Wizard 產生 json UI 的核心程式(每個 Component 有各自的 json UI 定義) + 描述: 本段 sp 主要是設定 aside 中的 json 定義 + 建立日期 : 2023/12/20 + + 修改歷史 + 項目 誰 日期 修改說明 + ==== ========== ========== ================================================ + 1 Michael 2023/12/20 根據 v1.0 重構 +*/ +BEGIN + DECLARE v_aside_setup_id VARCHAR(100); + DECLARE v_aside_field VARCHAR(100); + DECLARE v_aside_filter VARCHAR(600); + DECLARE v_aside_setup_data TEXT; + DECLARE v_ip VARCHAR(100); + DECLARE v_db VARCHAR(100); + DECLARE v_pos INT; + DECLARE v_crlf VARCHAR(2); + + SET v_crlf = CONCAT(CHAR(13), CHAR(10)); + SET v_ip = '${ls:base_ip}'; + SET v_db = '${ls:base_db}'; + + /* + 如果 zen_function.aside_setup 有設定, 程式就要加入下面這一段(@aside_setup@) + zen_function.aside_setup 的內容, 必須等於關聯 table 的欄位名稱(左方關聯的欄位) + zen_function.aside_field 的內容, 是 右方主 table 的欄位名稱(和左方關聯的欄位) + 例如在 pbi 的 aside 是關聯 pms_sprint.sprintid, 就必須設定 aside_setup=sprintid, 右方資料 pbi, 關聯欄位是 aside_field=sprintid(通常會一樣, 但如果不同, 也可以分別設定) + basperson 的 aside 是關聯 basdepartment.departmentid, 就必須設定 departmentid + */ + -- 去除 @aside_setup 中的 tag + SET v_pos = LOCATE('.',p_aside_setup); + IF v_pos > 0 THEN + SET v_aside_setup_id = SUBSTRING(p_aside_setup,v_pos+1,LENGTH(p_aside_setup)); + ELSE + SET v_aside_setup_id = p_aside_setup; + END IF; + + SET v_aside_setup_data = ''; + IF IFNULL(p_aside_setup,'') <> '' THEN + SET v_aside_setup_data = CONCAT( + ' "asideResizor": true,', v_crlf, + ' "asideMinWidth": 150,', v_crlf, + ' "asideMaxWidth": 400,', v_crlf, + ' "aside": {', v_crlf, + ' "type": "form",', v_crlf, + ' "className": "bg-green-100",', v_crlf, + ' "wrapWithPanel": false,', v_crlf, + ' "target": "dataList",', v_crlf, + ' "submitOnInit": true,', v_crlf, + ' "body": [{', v_crlf, + ' "type": "input-tree",', v_crlf, + ' "initiallyOpen": true,', v_crlf, + ' "heightAuto": true,', v_crlf, + ' "name": "',v_aside_setup_id,'",', v_crlf, + ' "inputClassName": "no-border h-full",', v_crlf, + ' "submitOnChange": true,', v_crlf, + ' "selectFirst": false,', v_crlf, + ' "source": {', v_crlf, + ' "method": "post",', v_crlf, + ' "url": "',v_ip,'/xapi/v2/',v_db,'/get_treedata/6/",', v_crlf, + ' "data": {', v_crlf, + ' "para01": "',p_aside_setup,'"', v_crlf, + ' },', v_crlf, + ' "dataType": "form"', v_crlf, + ' }', v_crlf, + ' }]', v_crlf, + ' },'); + + IF IFNULL(v_aside_field,'') = '' THEN + SET v_aside_field = v_aside_setup_id; + END IF; + + SET v_aside_filter = CONCAT( + '"_id_": "${',v_aside_setup_id,'}",', v_crlf, + ' "_field_": "',v_aside_field,'",'); + + -- 寫入暫存表 + INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'aside_setup',v_aside_setup_data,NOW()); + INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'aside_filter',v_aside_filter,NOW()); + ELSE + -- 沒有資料也要填空白 + INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'aside_setup','',NOW()); + INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid,'aside_filter','',NOW()); + END IF; +END // + +DELIMITER ; \ No newline at end of file diff --git a/zen_create_json_prepare_detaildata.txt b/zen_create_json_prepare_detaildata.txt new file mode 100644 index 0000000..e726638 --- /dev/null +++ b/zen_create_json_prepare_detaildata.txt @@ -0,0 +1,146 @@ +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 ; \ No newline at end of file diff --git a/zen_create_json_prepare_ds.txt b/zen_create_json_prepare_ds.txt new file mode 100644 index 0000000..b4de158 --- /dev/null +++ b/zen_create_json_prepare_ds.txt @@ -0,0 +1,148 @@ +DELIMITER // + +CREATE OR REPLACE PROCEDURE zen_create_json_prepare_ds( + IN p_type VARCHAR(1), -- M:Master D:Detail + IN p_uuid VARCHAR(100), + IN p_FunctionTag VARCHAR(100) +) +/* + 功能 : amis Wizard 產生 json UI 核心程式的暫存檔 + 描述: + 建立日期 : 2023/12/20 + + 修改歷史 + 項目 誰 日期 修改說明 + ==== ========== ========== ================================================ + 1 Michael 2023/12/20 根據 v1.0 重構 +*/ +BEGIN + DECLARE v_imax INT; + DECLARE v_imin INT; + DECLARE v_imax_block INT; + DECLARE v_y INT; + DECLARE v_y1 INT; + DECLARE v_y2 INT; + DECLARE v_x INT; + DECLARE v_x1 INT; + DECLARE v_x2 INT; + DECLARE v_g_max INT; + DECLARE v_gx INT; + DECLARE v_gy INT; + DECLARE v_gy1 INT; + DECLARE v_gy2 INT; + + -- 建立臨時表儲存 jsondata + CREATE TEMPORARY TABLE IF NOT EXISTS tmp_json_data ( + fieldname VARCHAR(100), + fieldcn VARCHAR(100), + fieldwidth INT, + fieldobject VARCHAR(100), + fieldchecknull VARCHAR(10), + picker_tag VARCHAR(100), + fielddefault VARCHAR(200), + fieldro VARCHAR(1), + fieldfm VARCHAR(20), + fieldblock SMALLINT, + fieldds VARCHAR(10), + fieldsh VARCHAR(10), + cellno SMALLINT, + cellx SMALLINT, + celly SMALLINT, + cellline SMALLINT, + iscolumnmatch CHAR(1), + visibleon VARCHAR(100), + _group VARCHAR(10), + _block VARCHAR(10), + rowid INT AUTO_INCREMENT PRIMARY KEY + ); + + TRUNCATE TABLE tmp_json_data; + + -- 插入基本資料 + INSERT INTO tmp_json_data ( + fieldname, fieldcn, fieldwidth, fieldobject, fieldchecknull, picker_tag, + fielddefault, fieldro, fieldfm, + fieldblock, fieldds, fieldsh, cellno, cellx, celly, cellline, iscolumnmatch, visibleon + ) + SELECT + fieldname, fieldcn, fieldwidth, fieldobject, fieldchecknull, picker_tag, + fielddefault, fieldro, fieldfm, + fieldblock, fieldds, fieldsh, cellno, cellx, celly, cellline, IFNULL(iscolumnmatch,'N'), visibleon + FROM zen_fields + WHERE functiontag = p_FunctionTag + AND ((p_type = 'M' AND fieldblock < 90) OR (p_type = 'D' AND fieldblock >= 90)) + ORDER BY fieldblock, celly, cellx; + + -- 計算 _block (body-panels or tabs) 排列 + SELECT MAX(fieldblock) INTO v_imax FROM tmp_json_data; + SELECT MIN(fieldblock) INTO v_imin FROM tmp_json_data; + SET v_y = 0; + SET v_imax_block = v_imax; + + WHILE v_y <= v_imax DO + SELECT COUNT(*) INTO v_x FROM tmp_json_data WHERE fieldblock = v_y AND fieldsh = 'Y'; + + IF v_x > 1 AND v_imax > v_imin THEN + -- 找出區塊的開始和結束位置 + SELECT MIN(celly) INTO v_y1 FROM tmp_json_data WHERE fieldblock = v_y AND fieldsh = 'Y'; + SELECT MIN(cellx) INTO v_x1 FROM tmp_json_data WHERE fieldblock = v_y AND celly = v_y1 AND fieldsh = 'Y'; + SELECT rowid INTO v_y1 FROM tmp_json_data WHERE fieldblock = v_y AND celly = v_y1 AND cellx=v_x1 AND fieldsh = 'Y'; + + SELECT MAX(celly) INTO v_y2 FROM tmp_json_data WHERE fieldblock = v_y AND fieldsh = 'Y'; + SELECT MAX(cellx) INTO v_x2 FROM tmp_json_data WHERE fieldblock = v_y AND celly = v_y2 AND fieldsh = 'Y'; + SELECT rowid INTO v_y2 FROM tmp_json_data WHERE fieldblock = v_y AND celly = v_y2 AND cellx=v_x2 AND fieldsh = 'Y'; + + -- 更新區塊標記 + UPDATE tmp_json_data SET _block='BH' WHERE rowid=v_y1; + UPDATE tmp_json_data SET _block='BF' WHERE rowid=v_y2; + END IF; + + -- 針對 Image 特別處理(BA -- Header/Footer All) + SELECT COUNT(*) INTO v_x FROM tmp_json_data WHERE fieldblock = v_y AND fieldobject = 'input-image' AND fieldsh = 'Y'; + IF v_x = 1 THEN + UPDATE tmp_json_data SET _block='BA' WHERE fieldblock = v_y AND fieldsh = 'Y'; + END IF; + + -- 計算 _group (body-group) 排列 + SELECT MAX(celly) INTO v_g_max FROM tmp_json_data WHERE fieldblock = v_y AND fieldsh = 'Y'; + SET v_gy = 1; + + WHILE v_gy <= v_g_max DO + SELECT COUNT(*) INTO v_gx FROM tmp_json_data WHERE fieldblock = v_y AND celly = v_gy AND fieldsh = 'Y'; + + IF v_gx > 1 THEN + -- 找出群組的開始和結束位置 + SELECT MIN(cellx) INTO v_gy1 FROM tmp_json_data WHERE fieldblock = v_y AND celly = v_gy AND fieldsh = 'Y'; + SELECT MIN(rowid) INTO v_gy1 FROM tmp_json_data WHERE fieldblock = v_y AND celly = v_gy AND cellx=v_gy1 AND fieldsh = 'Y'; + + SELECT MAX(cellx) INTO v_gy2 FROM tmp_json_data WHERE fieldblock = v_y AND celly = v_gy AND fieldsh = 'Y'; + SELECT MAX(rowid) INTO v_gy2 FROM tmp_json_data WHERE fieldblock = v_y AND celly = v_gy AND cellx=v_gy2 AND fieldsh = 'Y'; + + -- 更新群組標記 + UPDATE tmp_json_data SET _group='GH' WHERE rowid=v_gy1; + UPDATE tmp_json_data SET _group='GF' WHERE rowid=v_gy2; + END IF; + + SET v_gy = v_gy + 1; + END WHILE; + + SET v_y = v_y + 1; + END WHILE; + + -- 寫入暫存檔 + INSERT INTO zen_wizard_jsondata ( + uuid, fieldname, fieldcn, fieldwidth, fieldobject, fieldchecknull, picker_tag, + fielddefault, fieldro, fieldfm, fieldblock, fieldds, fieldsh, cellno, cellx, celly, cellline, + iscolumnmatch, visibleon, _group, _block, json_bh, json_gh, json_insert, json_update, + json_quickedit, json_gridview, json_view, json_gf, json_bf, create_date + ) + SELECT + p_uuid, fieldname, fieldcn, fieldwidth, fieldobject, fieldchecknull, picker_tag, + fielddefault, fieldro, fieldfm, fieldblock, fieldds, fieldsh, cellno, cellx, celly, cellline, + iscolumnmatch, visibleon, _group, _block, '', '', '', '', '', '', '', '', '', NOW() + FROM tmp_json_data; + + DROP TEMPORARY TABLE IF EXISTS tmp_json_data; +END // + +DELIMITER ; \ No newline at end of file diff --git a/zen_create_json_prepare_gridquery.txt b/zen_create_json_prepare_gridquery.txt new file mode 100644 index 0000000..acae24a --- /dev/null +++ b/zen_create_json_prepare_gridquery.txt @@ -0,0 +1,119 @@ +DELIMITER // + +CREATE OR REPLACE PROCEDURE zen_create_json_prepare_gridquery( + IN p_uuid VARCHAR(100), + IN p_query_type VARCHAR(1) +) +/* + function : amis Wizard 產生 json UI 的核心程式(每個 Component 有各自的 json UI 定義) + description: 本段 sp 主要是設定 master-detail 中 detail 相關的 json 定義 + Build Date : 2023/12/20 + + Modify History + Item Who Date Modify Docs + ==== ========== ========== ================================================ + 1 Michael 2023/12/20 根據 v1.0 重構 +*/ +BEGIN + DECLARE v_QueryFlds VARCHAR(1000); + DECLARE v_QueryData VARCHAR(2000); + DECLARE v_QueryType VARCHAR(600); + DECLARE v_keyword_search VARCHAR(600); + DECLARE v_FieldName VARCHAR(100); + DECLARE v_FieldDS VARCHAR(1); + DECLARE v_FieldCN NVARCHAR(100); + DECLARE v_query_type_data TEXT; + DECLARE v_FieldObject VARCHAR(100); + DECLARE v_Filters TEXT; + DECLARE v_pos INT; + DECLARE v_imax INT; + DECLARE v_imin INT; + DECLARE v_inow INT; + -- DECLARE v_y INT; + DECLARE v_crlf VARCHAR(2); + DECLARE v_count INT; + + SET v_crlf = CONCAT(CHAR(13), CHAR(10)); + SET v_QueryFlds = ''; + SET v_QueryData = ''; + SET v_QueryType = ''; + SET v_Filters = ''; + + /* + 取得 detail 的欄位名稱(要包含 pk 欄位) + 新增 grid footer sum, 含 crud 及 input-table + */ + -- SELECT COUNT(*) INTO v_imax FROM zen_wizard_jsondata WHERE uuid = p_uuid; + SELECT min(rowid) INTO v_inow FROM zen_wizard_jsondata WHERE uuid = p_uuid; + SELECT max(rowid) INTO v_imax FROM zen_wizard_jsondata WHERE uuid = p_uuid; + + WHILE v_inow <= v_imax DO + SELECT + FieldName, IFNULL(FieldCN, FieldName), FieldObject, FieldDS + INTO + v_FieldName, v_FieldCN, v_FieldObject, v_FieldDS + FROM zen_wizard_jsondata WHERE uuid = p_uuid AND rowid = v_inow; + + IF v_FieldDS = 'Y' AND (v_FieldObject <> 'hidden') THEN + -- Query Header Define + SET v_QueryFlds = CONCAT(v_QueryFlds, v_FieldName, '^'); + SET v_QueryData = CONCAT(v_QueryData, '${search_', v_FieldName, '}^'); + + IF v_FieldObject LIKE '%int%' OR v_FieldObject LIKE '%decimal%' THEN + SET v_QueryType = CONCAT(v_QueryType, 'I^'); + ELSE -- 20230425 C 的預設改為 Clike, 因為大部分的情況應該都是用 like 查詢比較正常 + SET v_QueryType = CONCAT(v_QueryType, 'Clike^'); + END IF; + END IF; + + -- 此處要根據顯示元件的定義, 目前還不全(20231103 再加上 select) + IF (v_FieldDS = 'Y' AND (v_FieldObject LIKE '%text%' OR v_FieldObject LIKE '%picker%' OR v_FieldObject LIKE '%select%')) THEN + SET v_Filters = CONCAT(v_Filters, v_FieldName, ','); + END IF; + + SET v_inow = v_inow + 1; + END WHILE; + + IF v_Filters <> '' THEN + SET v_Filters = SUBSTRING(v_Filters, 1, LENGTH(v_Filters)-1); + END IF; + + INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid, 'Filters', v_Filters, NOW()); + + IF v_QueryFlds <> '' THEN + SET v_QueryFlds = SUBSTRING(v_QueryFlds, 1, LENGTH(v_QueryFlds)-1); + END IF; + + IF v_QueryData <> '' THEN + SET v_QueryData = SUBSTRING(v_QueryData, 1, LENGTH(v_QueryData)-1); + END IF; + + IF v_QueryType <> '' THEN + SET v_QueryType = SUBSTRING(v_QueryType, 1, LENGTH(v_QueryType)-1); + END IF; + + -- Query Header + SET v_query_type_data = ''; + SET v_keyword_search = ''; + + IF p_query_type = 'C' THEN + SET v_query_type_data = CONCAT( + '"_$_frmQueryFlds_": "', v_QueryFlds, '",', v_crlf, + ' "_$_frmQueryData_": "', v_QueryData, '",', v_crlf, + ' "_$_frmQueryType_": "', v_QueryType, '",', v_crlf + ); + ELSE + SET v_keyword_search = CONCAT( + '{', v_crlf, + ' "type": "search-box",', v_crlf, + ' "name": "keywords",', v_crlf, + ' "align": "left",', v_crlf, + ' "placeholder": "全文檢索"', v_crlf, + ' },' + ); + END IF; + + INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid, 'query_type_data', v_query_type_data, NOW()); + INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid, 'keyword_search', v_keyword_search, NOW()); + INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid, 'is_query_header', IF(p_query_type = 'C', 'true', 'false'), NOW()); +END // \ No newline at end of file diff --git a/zen_create_json_reset_codeid.txt b/zen_create_json_reset_codeid.txt new file mode 100644 index 0000000..8776c0e --- /dev/null +++ b/zen_create_json_reset_codeid.txt @@ -0,0 +1,95 @@ +DELIMITER // + +CREATE OR REPLACE PROCEDURE zen_create_json_reset_codeid( + IN p_uuid VARCHAR(100), + IN p_FunctionTag VARCHAR(100), + IN p_code_id VARCHAR(100), + IN p_query_type VARCHAR(100) +) +/* + function : 判斷傳入的 FunctionTag, 重新設定 FunctionTag_org/FunctionTag/code_id + description: 此段程式是因為 Wizard 除了支援完整 crud 的程式外, 也一併支援 view only, insert only 等不完全程式, 所以才會有此段程式 + Build Date : 2023/12/20 + + Modify History + Item Who Date Modify Docs + ==== ========== ========== ================================================ + 1 Michael 2023/12/20 根據 v1.0 重構 +*/ +BEGIN + DECLARE v_FunctionTag VARCHAR(100); + DECLARE v_code_id VARCHAR(100); + + -- 通用寫法 + SET v_FunctionTag = p_FunctionTag; + SET v_code_id = p_code_id; + + /* + @FunctionTag = crmm02 產生查詢專用的 ViewForm + @FunctionTag_org = crmm02_V + */ + IF RIGHT(v_FunctionTag, 2) = '_V' THEN + SET v_FunctionTag = SUBSTRING(v_FunctionTag, 1, LENGTH(v_FunctionTag)-2); + + -- 特別判斷一下 Template(先處理 MD, Single 暫時先不處理) + IF v_code_id LIKE '%MasterDetail%' THEN + SET v_code_id = 'MasterDetail-View'; + ELSEIF v_code_id LIKE '%Single%' THEN + -- Single 也一併支援了吧(ok) + SET v_code_id = 'singleEntry-View'; + END IF; + END IF; + + /* + 最單純的 SingleGridView(通常是被開窗查詢用) 2022-09-24 + */ + IF RIGHT(v_FunctionTag, 3) = '_gv' THEN + SET v_FunctionTag = SUBSTRING(v_FunctionTag, 1, LENGTH(v_FunctionTag)-3); + + -- 適用於所有的表單 + SET v_code_id = 'SingleGridView'; + END IF; + + -- MD 的 Detail Insert(開發中...) + IF RIGHT(v_FunctionTag, 3) = '_DI' THEN + SET v_FunctionTag = SUBSTRING(v_FunctionTag, 1, LENGTH(v_FunctionTag)-3); + + -- 特別判斷一下 Template(先處理 MD, Single 暫時先不處理) + IF v_code_id LIKE '%MasterDetail%' THEN + SET v_code_id = 'MasterDetail-Detail-Insert'; + END IF; + END IF; + + IF RIGHT(v_FunctionTag, 2) = '_I' THEN + SET v_FunctionTag = SUBSTRING(v_FunctionTag, 1, LENGTH(v_FunctionTag)-2); + + -- 特別判斷一下 Template(先處理 MD, Single 暫時先不處理) + IF v_code_id LIKE '%Single%' THEN + SET v_code_id = 'singleEntry-Insert'; + ELSEIF v_code_id LIKE '%MasterDetail%' THEN + -- MasterDetail 也一併支援了吧, 但是只會產生 Master 的 Insert(ok) + SET v_code_id = 'MasterDetail-Insert'; + END IF; + END IF; + + -- 將傳入的 json 寫入暫存表方便處理 + INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid, 'FunctionTag', v_FunctionTag, NOW()); + INSERT INTO zen_wizard_tmp (uuid,zen_key,zen_value,create_date) VALUES (p_uuid, 'code_id', v_code_id, NOW()); + + -- 一些簡單的 update 也放此處 + /* + 新增 query_type=C 複雜的多欄位Query + E 簡單的單欄查詢 + */ + UPDATE zen_function SET query_type='E' WHERE IFNULL(query_type,'')=''; + UPDATE zen_function SET op_width=100 WHERE op_width IS NULL; + UPDATE zen_function SET is_bpm='N' WHERE is_bpm IS NULL; + UPDATE zen_function SET is_extend='N' WHERE is_extend IS NULL; + + /* + 處理一下 zen_fields 的 null 值 + fieldchecknull,fieldro + */ + UPDATE zen_fields SET fieldchecknull = 'N' WHERE IFNULL(fieldchecknull,'') = ''; + UPDATE zen_fields SET fieldro = 'N' WHERE IFNULL(fieldro,'') = ''; +END // \ No newline at end of file diff --git a/zen_create_json_v2.txt b/zen_create_json_v2.txt new file mode 100644 index 0000000..d3c27e2 --- /dev/null +++ b/zen_create_json_v2.txt @@ -0,0 +1,113 @@ +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 ; \ No newline at end of file