first commit

This commit is contained in:
DATAEXPRESS\4734
2026-02-06 14:31:07 +08:00
commit e7f672ddff
13 changed files with 1604 additions and 0 deletions
+179
View File
@@ -0,0 +1,179 @@
DELIMITER //
CREATE OR REPLACE PROCEDURE orm_exec_insert_v2(
IN p_tablename VARCHAR(200), -- tablename
IN p_pk VARCHAR(100), -- primary key(for update delete)
IN p_action VARCHAR(20), -- CRUDP
IN p_uuid VARCHAR(100),
IN p_userid VARCHAR(100)
)
/*
Function : orm_api_v2 [新增]的核心程式, 智慧的組出相應的 sql
Description: 關於 Master-Detail 的補充說明
Build Date : 2023/12/16
Modified for MariaDB
*/
BEGIN
DECLARE v_maxcount INT;
DECLARE v_currid INT;
DECLARE v_is_md SMALLINT;
DECLARE v_is_excel SMALLINT;
DECLARE v_maxid INT;
DECLARE v_excel_id INT;
DECLARE v_cnt INT;
DECLARE v_cn_field VARCHAR(100);
DECLARE v_cd_field VARCHAR(100);
DECLARE v_billno VARCHAR(20);
DECLARE v_sub_table VARCHAR(100);
DECLARE v_sql TEXT;
DECLARE v_max_no VARCHAR(20);
DECLARE v_maxcnt INT;
-- step 1: 判斷狀態: 是否 master-detail 多筆資料?
SELECT MAX(parent_id) INTO v_maxcount FROM orm_json_tmp WHERE uuid = p_uuid;
-- @is_md 是使用 input-table template 用的判斷
SELECT COUNT(*), IFNULL(MAX(parent_id), 0)
INTO v_is_md, v_maxid
FROM orm_json_tmp
WHERE uuid = p_uuid AND json_key = 'details' AND valuetype = 'array';
SELECT COUNT(*), IFNULL(MAX(parent_id), 0)
INTO v_is_excel, v_excel_id
FROM orm_json_tmp
WHERE uuid = p_uuid AND json_key = 'excel' AND valuetype = 'array';
-- step 2: update/insert create_user (僅允許一次一筆資料)
SET v_cn_field = 'create_user';
SET v_cd_field = 'create_date';
-- Check if create_user column exists
SELECT COUNT(*) INTO v_cnt
FROM information_schema.columns
WHERE table_name = p_tablename AND column_name = v_cn_field;
IF v_cnt > 0 THEN
SELECT COUNT(*) INTO v_cnt FROM orm_json_tmp WHERE uuid = p_uuid AND json_key = v_cn_field;
IF v_cnt = 0 THEN
INSERT INTO orm_json_tmp (uuid, parent_id, json_key, json_value, ValueType)
VALUES (p_uuid, v_maxcount, v_cn_field, p_userid, 'string');
ELSE
UPDATE orm_json_tmp SET json_value = p_userid
WHERE uuid = p_uuid AND json_key = v_cn_field;
END IF;
END IF;
-- Check if create_date column exists
SELECT COUNT(*) INTO v_cnt
FROM information_schema.columns
WHERE table_name = p_tablename AND column_name = v_cd_field;
IF v_cnt > 0 THEN
SELECT COUNT(*) INTO v_cnt FROM orm_json_tmp WHERE uuid = p_uuid AND json_key = v_cd_field;
IF v_cnt = 0 THEN
INSERT INTO orm_json_tmp (uuid, parent_id, json_key, json_value, ValueType)
VALUES (p_uuid, v_maxcount, v_cd_field, DATE_FORMAT(NOW(), '%Y-%m-%d'), 'string');
ELSE
UPDATE orm_json_tmp SET json_value = DATE_FORMAT(NOW(), '%Y-%m-%d')
WHERE uuid = p_uuid AND json_key = v_cd_field;
END IF;
END IF;
-- step 3: 針對 m-d 的單號前置處理(針對 billno=自動編碼, 給定新的單號)
SELECT COUNT(*) INTO v_cnt
FROM orm_json_tmp
WHERE uuid = p_uuid AND json_key = 'billno'
AND (json_value LIKE '%自動%' OR json_value LIKE '%Auto%');
IF v_cnt > 0 THEN
-- hard-code
IF p_pk = '' OR p_tablename LIKE '%_d%' THEN
-- master-detail 的 detail insert
SET v_max_no = CONCAT(SUBSTRING(p_tablename, 4, 6), SUBSTRING(p_userid, 1, 6));
ELSE
-- 先取得今天最大號
SET @sql = CONCAT('SELECT MAX(billno) INTO @max_billno FROM ', p_tablename,
' WHERE DATE(billdate) = CURDATE()');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 計算新單號 (需要實現 sys_next_no 函數)
SET v_max_no = sys_next_no(@max_billno);
-- 紀錄新增單號
DELETE FROM sys_new_billno WHERE create_time < DATE_SUB(NOW(), INTERVAL 3 DAY);
-- 防錯
SELECT COUNT(*) INTO v_maxcnt
FROM sys_new_billno
WHERE tablename = p_tablename AND login_user = p_userid;
IF v_maxcnt > 0 THEN
UPDATE sys_new_billno SET billno = v_max_no
WHERE tablename = p_tablename AND login_user = p_userid;
ELSE
INSERT INTO sys_new_billno VALUES (p_tablename, p_userid, v_max_no, NOW());
END IF;
END IF;
UPDATE orm_json_tmp SET json_value = v_max_no
WHERE uuid = p_uuid AND json_key = 'billno'
AND (json_value LIKE '%自動%' OR json_value LIKE '%Auto%');
END IF;
-- master-detail
IF v_is_md > 0 THEN
-- 寫入 master 一筆
CALL orm_api_kernel_v2(p_tablename, p_pk, p_action, p_uuid, v_maxcount);
-- 取得表頭的單號
SELECT billno INTO v_billno
FROM sys_new_billno
WHERE tablename = p_tablename AND login_user = p_userid;
-- 寫入 details 多筆
SELECT detail_table INTO v_sub_table
FROM zen_function
WHERE maintable = p_tablename
LIMIT 1;
IF IFNULL(v_sub_table, '') = '' THEN
SET v_sub_table = CONCAT(SUBSTRING(p_tablename, 1, LENGTH(p_tablename)-1), 'd');
END IF;
-- 多筆 detail 資料寫入
SET v_currid = 1;
WHILE v_currid < v_maxid DO
-- 執行核心程式
CALL orm_api_kernel_v2(v_sub_table, p_pk, p_action, p_uuid, v_currid);
-- 取得下一筆資料
SET v_currid = v_currid + 1;
END WHILE;
ELSEIF v_is_excel > 0 THEN
-- excel 多筆資料匯入
SET v_currid = 1;
WHILE v_currid < v_excel_id-1 DO
-- 執行核心程式
CALL orm_api_kernel_v2(p_tablename, p_pk, p_action, p_uuid, v_currid);
-- 取得下一筆資料
SET v_currid = v_currid + 1;
END WHILE;
ELSEIF v_maxcount > 1 THEN
-- 多筆資料寫入
SET v_currid = 1;
WHILE v_currid <= v_maxcount DO
-- 執行核心程式
CALL orm_api_kernel_v2(p_tablename, p_pk, p_action, p_uuid, v_currid);
-- 取得下一筆資料
SET v_currid = v_currid + 1;
END WHILE;
ELSE
CALL orm_api_kernel_v2(p_tablename, p_pk, p_action, p_uuid, 1);
END IF;
END //
DELIMITER ;