DELIMITER //

CREATE OR REPLACE PROCEDURE orm_exec_update_v2(
  IN p_tablename VARCHAR(200),  -- 表名
  IN p_pk VARCHAR(100),         -- 主键(用于更新/删除)
  IN p_action VARCHAR(20),      -- CRUDP操作
  IN p_uuid VARCHAR(100),       -- UUID标识
  IN p_userid VARCHAR(100)      -- 用户ID
)
/*
  功能: orm_api_v2 [更新]的核心程序，智能构建相应SQL
  描述: 用于更新操作的ORM核心逻辑
  创建日期: 2023/12/16
  MariaDB转换版本
*/
BEGIN
  DECLARE v_maxcount, v_rec INT;
  DECLARE v_currid INT;
  DECLARE v_cnt INT;
  DECLARE v_un_field VARCHAR(100);
  DECLARE v_ud_field VARCHAR(100);
  
  -- 步骤1: 获取最小parent_id (rows)
  SELECT MIN(parent_id) INTO v_maxcount 
  FROM orm_json_tmp 
  WHERE uuid = p_uuid; -- AND valuetype in ('ARRAY','object');
  
  -- 取得欲更新筆數
  SELECT MAX(object_id) INTO v_rec
  FROM orm_json_tmp 
  WHERE uuid = p_uuid AND parent_id = v_maxcount;
  
  -- 步骤2: 更新/插入update_user和update_date字段
  SET v_un_field = 'update_user';
  SET v_ud_field = 'update_date';
  
  -- 检查update_user字段是否存在
  SELECT COUNT(*) INTO v_cnt 
  FROM information_schema.columns 
  WHERE table_name = p_tablename AND column_name = v_un_field;
  
  IF v_cnt > 0 THEN
    SELECT COUNT(*) INTO v_cnt 
    FROM orm_json_tmp 
    WHERE uuid = p_uuid AND json_key = v_un_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_un_field, p_userid, 'string');
    ELSE 
      UPDATE orm_json_tmp 
      SET json_value = p_userid 
      WHERE uuid = p_uuid AND json_key = v_un_field;
    END IF;
  END IF;
  
  -- 检查update_date字段是否存在    
  SELECT COUNT(*) INTO v_cnt 
  FROM information_schema.columns 
  WHERE table_name = p_tablename AND column_name = v_ud_field;
  
  IF v_cnt > 0 THEN
    SELECT COUNT(*) INTO v_cnt 
    FROM orm_json_tmp 
    WHERE uuid = p_uuid AND json_key = v_ud_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_ud_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_ud_field;
    END IF;
  END IF;
  
  -- 日期欄位要格式化處理(待驗證)
  UPDATE orm_json_tmp 
  SET json_value = DATE_FORMAT(substr(json_value,1,10), '%Y-%m-%d')
  WHERE uuid = p_uuid AND json_key in (select column_name from information_schema.columns WHERE table_name = p_tablename and substr(data_type,1,4) = 'date')
  and json_value is not null;
  
  -- 判断是否有多笔资料
  IF v_rec > 1 THEN  -- v_maxcount
    SET v_currid = 1;
    WHILE v_currid <= v_rec DO
      -- 执行核心程序
      CALL orm_api_kernel_v2(p_tablename, p_pk, p_action, p_uuid, v_maxcount*1000 + 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 ;