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 ;