first commit
This commit is contained in:
@@ -0,0 +1,140 @@
|
||||
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 ;
|
||||
Reference in New Issue
Block a user