first commit

This commit is contained in:
DATAEXPRESS\4734
2026-02-06 15:09:39 +08:00
commit 3f342cee87
35 changed files with 3572 additions and 0 deletions
+272
View File
@@ -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 ;