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 ;