first commit
This commit is contained in:
@@ -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 ;
|
||||
Reference in New Issue
Block a user