Files
yunzerwebsiteallinone/go/docs/sql/oa_scheduling_menus.sql
T

106 lines
4.4 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- ============================================================
-- OA 工作排班 —— 菜单配置(yz_system_menu)
-- 幂等脚本:按 path 判重,重复执行不会产生重复菜单
-- 执行:mysql -h <host> -P <port> -u <user> -p <db> < oa_scheduling_menus.sql
--
-- 挂载位置:OA → 办公(个人办公),直接是页面,不再套「排班考勤」目录
-- OA
-- └─ 办公
-- ├─ 工作排班(页面,/apps/oa/scheduling/board) ← 本脚本
-- ├─ 考勤管理(页面,/apps/oa/attendance) ← oa_attendance_menus.sql
-- └─ 考勤打卡(App,/apps/oa/attendance/clock) ← oa_attendance_menus.sql
--
-- 对应页面:backend/src/views/apps/oa/scheduling/index.vue
-- 同一页面内完成:班次管理、排班方案(公司/部门/小组/指定员工)、
-- 周看板、单个或批量员工的临时调配、变更记录查看。
--
-- 说明:
-- 1. 排班看板是 Web 管理端功能,platforms 显式为 ["web"],
-- 移动端菜单不出现;
-- 2. 历史版本创建的「排班考勤」目录不再使用,脚本会把它隐藏(保留数据);
-- 3. 租户端角色(cid=2)的 rights 是显式菜单 ID 列表,菜单接口会按
-- rights 过滤。只插菜单不授权,会出现「菜单存在但被过滤」,
-- 因此本脚本同时把菜单 ID 追加到角色 rights。
-- ============================================================
SET @oa_id := (
SELECT id FROM yz_system_menu
WHERE path = '/apps/oa' AND delete_time IS NULL
LIMIT 1
);
-- 「办公」目录:优先同名菜单,其次 /apps/oa/personal;都没有则回落 OA 根
SET @office_id := (
SELECT id FROM yz_system_menu
WHERE delete_time IS NULL
AND type = 1
AND (title = '办公' OR title = '个人办公' OR path = '/apps/oa/personal')
ORDER BY (title = '办公') DESC, (path = '/apps/oa/personal') DESC, sort, id
LIMIT 1
);
SET @parent_id := IFNULL(@office_id, @oa_id);
-- ---------- 工作排班(页面,直接挂在办公下) ----------
INSERT INTO yz_system_menu
(pid, title, path, component_path, icon, sort, status, is_visible, views, platforms, type, creater, remark)
SELECT @parent_id, '工作排班', '/apps/oa/scheduling/board', '/apps/oa/scheduling/index.vue',
'Clock', 88, 1, 1, '[2]', '["web"]', 2, 'system',
'排班看板:按周查看排班,支持方案发布、单条调班与批量临时排班'
FROM DUAL
WHERE @parent_id IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM yz_system_menu WHERE path = '/apps/oa/scheduling/board' AND delete_time IS NULL) x);
-- 已存在则上移到「办公」,并纠正为 Web 页面
UPDATE yz_system_menu
SET pid = IFNULL(@parent_id, pid),
sort = 88,
type = 2,
platforms = '["web"]',
is_visible = 1
WHERE path = '/apps/oa/scheduling/board' AND delete_time IS NULL;
-- 历史的「排班考勤」目录:不再使用,隐藏(保留数据)
-- 仅当目录下已无可见子菜单时才隐藏,避免误伤租户自行添加的子菜单
UPDATE yz_system_menu
SET is_visible = 0
WHERE path = '/apps/oa/scheduling'
AND type = 1
AND delete_time IS NULL
AND id NOT IN (
SELECT pid FROM (
SELECT pid FROM yz_system_menu
WHERE delete_time IS NULL AND is_visible = 1 AND pid > 0
) child
);
SET @board_id := (
SELECT id FROM yz_system_menu
WHERE path = '/apps/oa/scheduling/board' AND delete_time IS NULL
LIMIT 1
);
-- ---------- 角色授权:把菜单追加到所有租户端角色的 rights ----------
-- 只处理 rights 非空(显式授权)的角色;rights 为空表示全权限,无需追加。
UPDATE yz_system_admin_role
SET rights = CAST(JSON_ARRAY_APPEND(CAST(rights AS JSON), '$', @board_id) AS CHAR)
WHERE cid = 2
AND rights IS NOT NULL
AND TRIM(rights) <> ''
AND JSON_VALID(rights)
AND @board_id IS NOT NULL
AND NOT JSON_CONTAINS(CAST(rights AS JSON), CAST(@board_id AS JSON));
-- ---------- 结果校验 ----------
SELECT id, pid, title, path, component_path, platforms, type, sort, is_visible
FROM yz_system_menu
WHERE delete_time IS NULL
AND (path LIKE '/apps/oa/scheduling%' OR path = '/apps/oa/attendance')
ORDER BY pid, sort;
SELECT id, name, tenant_id,
JSON_CONTAINS(CAST(rights AS JSON), CAST(@board_id AS JSON)) AS has_board
FROM yz_system_admin_role
WHERE cid = 2 AND rights IS NOT NULL AND TRIM(rights) <> ''
ORDER BY tenant_id, id;