DELIMITER //

CREATE OR REPLACE PROCEDURE get_orgstructure(
  IN p_type VARCHAR(20)  -- 'person'/'user'/'role'
)
/*
  Function   : 配合 amis 的 transfer, 取得組織結構資料
  Description: 用於選擇會議人員等表單
               person - 獲取部門-人員資料(最常用)
               user   - 獲取角色-使用者資料(功能表使用)
               role   - 獲取角色資料
  Build Date : 2023/07/19 (MariaDB 版本)
  
  Modify History
    Item Who        Date       Modify Docs
    ==== ========== ========== ================================================
    1    Michael    2021/10/19 初始版本
    2    Michael    2021/10/21 新增 type 參數
    3    Developer  2023/07/19 轉換為 MariaDB 版本並優化
*/
BEGIN
  DECLARE v_max INT;
  DECLARE v_curr_id INT;
  DECLARE v_group_id INT;
  DECLARE v_next_group_id INT;
  DECLARE v_json_data TEXT;
  DECLARE v_footer TEXT;
  DECLARE v_dept_name VARCHAR(100);
  DECLARE v_emp_name VARCHAR(100);
  DECLARE v_person_id VARCHAR(100);
  DECLARE v_comm VARCHAR(1);
  
  -- 創建臨時表存儲中間資料
  DROP TEMPORARY TABLE IF EXISTS temp_org_data;
  CREATE TEMPORARY TABLE temp_org_data (
    xr_id VARCHAR(100),
    x_id VARCHAR(100),
    xr_name VARCHAR(100),
    x_name VARCHAR(100),
    group_id INT,
    row_id INT
  );
  
  -- 根據類型插入資料
  IF p_type = 'role' THEN
    INSERT INTO temp_org_data (xr_id, x_id, xr_name, x_name, group_id, row_id)
    SELECT
      '*', roleid, '(全部角色)', CONCAT('(', roleid, ') ', rolename),
      @rownum := @rownum + 1,
      @rownum
    FROM sys_roles, (SELECT @rownum := 0) r
    WHERE roleid IS NOT NULL AND roleid <> ''
    ORDER BY roleid;
    
  ELSEIF p_type = 'user' THEN
    INSERT INTO temp_org_data (xr_id, x_id, xr_name, x_name, group_id, row_id)
    SELECT
      '*', userid, '(全部使用者)', CONCAT('(', userid, ') ', username),
      @rownum := @rownum + 1,
      @rownum
    FROM sys_users, (SELECT @rownum := 0) r
    WHERE userid IS NOT NULL AND userid <> ''
    ORDER BY userid;
    
  ELSE -- 預設獲取部門-人員資料
    INSERT INTO temp_org_data (xr_id, x_id, xr_name, x_name, group_id, row_id)
    SELECT
      bp.departmentid, bp.personid, 
      CONCAT('(', bp.departmentid, ') ', bm.departmentcname),
      CONCAT('(', bp.personid, ') ', bp.personcname),
      IF(@dept = bp.departmentid, @group, @group := @group + 1),
      @rownum := @rownum + 1
    FROM 
      (SELECT @rownum := 0, @group := 0, @dept := '') r,
      basperson bp 
      LEFT JOIN basdepartment bm ON bp.departmentid = bm.departmentid
    WHERE bp.departmentid IS NOT NULL AND bp.departmentid <> ''
    ORDER BY bp.departmentid, bp.personid;
  END IF;
  
  -- 準備生成JSON資料
  SELECT COUNT(*) INTO v_max FROM temp_org_data;
  SELECT MIN(row_id) INTO v_curr_id FROM temp_org_data;
  
  SET v_json_data = '';
  SET v_comm = '';
  
  -- 使用GROUP_CONCAT簡化JSON構建過程
  SELECT 
    CONCAT(
      '[',
      GROUP_CONCAT(
        IF(
          group_id = 1 AND row_id > 1,
          CONCAT(
            '          },\n',
            '        {\n',
            '            "label": "', xr_name, '",\n',
            '            "children": [\n',
            '               {\n',
            '                "label": "', x_name, '",\n',
            '                "value": "', x_id, '"\n',
            '              }', IF(row_id = v_max, '', ',')
          ),
          IF(
            group_id = 1,
            CONCAT(
              '        {\n',
              '            "label": "', xr_name, '",\n',
              '            "children": [\n',
              '               {\n',
              '                "label": "', x_name, '",\n',
              '                "value": "', x_id, '"\n',
              '              }', IF(row_id = v_max, '', ',')
            ),
            CONCAT(
              '               {\n',
              '                "label": "', x_name, '",\n',
              '                "value": "', x_id, '"\n',
              '              }', IF(row_id = v_max, '', ',')
            )
          )
        )
        ORDER BY row_id
        SEPARATOR '\n'
      ),
      '\n            ]\n',
      '        }\n',
      '    ]'
    ) INTO v_json_data
  FROM temp_org_data;
  
  -- 返回結果
  SELECT 0 AS code, 'ok' AS msg;
  SELECT v_json_data AS jsoncode;
  
  -- 臨時表會在會話結束時自動刪除
END //

DELIMITER ;
