DELIMITER //

CREATE OR REPLACE PROCEDURE get_gantt_data(
  IN p_projectid VARCHAR(100)
)
/*
  Function   : 配合 amis 的擴充元件(gantt), 取得甘特圖資料
  Description: 獲取專案甘特圖資料，處理雲伺服器時間差問題
  Build Date : 2023/07/19 (MariaDB 版本)
  
  Modify History
    Item Who        Date       Modify Docs
    ==== ========== ========== ================================================
    1    Michael    2022/7/31  初始版本
    2    Michael    2022/12/14 加入 Azure 雲端時間差處理
    3    Michael    2025/07/20 改寫為 MariaDB 並最佳化(ChatGPT+DeepSeek)
*/
BEGIN
  -- 聲明變數
  DECLARE v_year1 INT;
  DECLARE v_start_date VARCHAR(10);
  
  -- 設置默認起始日(去年1月1日)
  SET v_year1 = YEAR(CURDATE()) - 1;
  SET v_start_date = CONCAT(v_year1, '-01-01');
  
  -- 創建臨時表存儲結果
  DROP TEMPORARY TABLE IF EXISTS tmp_gantt_data;
  CREATE TEMPORARY TABLE tmp_gantt_data (
    id VARCHAR(100),
    name VARCHAR(255),
    ower VARCHAR(100),
    per DECIMAL(5,2),
    type TINYINT,
    startTime DATE,
    endTime DATE,
    stoneTime DATE,
    top INT,
    `left` INT,
    widthChild INT,
    widthMe INT,
    isShow TINYINT,
    ROW_ID INT
  );
  
  -- 獲取專案PBI資料
  INSERT INTO tmp_gantt_data
  SELECT
    pbiid AS id,
    pbi_title AS name,      -- 項目名稱
    owner AS ower,          -- 負責人
    pbi_rate AS per,        -- 進度(完成率)
    1 AS type,              -- 項目類型(1.PBI 2.mile stone 3.分組)
    startdate AS startTime,
    DATE_ADD(startdate, INTERVAL CAST(pbi_planworktime AS SIGNED) DAY) AS endTime,
    '2022-01-01' AS stoneTime, -- 里程碑日
    0 AS top,               -- 初始top位置
    DATEDIFF(startdate, v_start_date) * 40 AS `left`,
    CAST(pbi_planworktime AS SIGNED) * 40 AS widthChild,
    CAST(pbi_planworktime AS SIGNED) * 40 AS widthMe,
    1 AS isShow,
    @row_num := @row_num + 1 AS ROW_ID
  FROM pms_pbi, (SELECT @row_num := 0) AS r
  WHERE projectid = p_projectid
  ORDER BY pbiid ASC;
  
  -- 處理雲端時間差並返回結果
  SELECT
    id,
    name,
    ower,
    per,
    type,
    cloud_addtime(startTime) AS startTime,
    cloud_addtime(endTime) AS endTime,
    cloud_addtime(stoneTime) AS stoneTime,
    ((ROW_ID-1) * 40) + 15 AS top,
    `left`,
    widthChild,
    widthMe,
    isShow
  FROM tmp_gantt_data;
  
  -- 臨時表會在會話結束時自動刪除
END //

DELIMITER ;
