Files
yunzerwebsiteallinone/go/docs/sql/oa_scheduling_menus.sql
2026-10-26 08:54:34 +08:00

95 lines
4.1 KiB
SQL
Raw Permalink 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 应用根(path = '/apps/oa')
-- OA
-- └─ 排班考勤(目录,/apps/oa/scheduling)
-- └─ 工作排班(页面,/apps/oa/scheduling/board)
--
-- 对应页面:backend/src/views/apps/oa/scheduling/index.vue
-- 同一页面内完成:班次管理、排班方案(公司/部门/小组/指定员工)、
-- 周看板、单个或批量员工的临时调配、变更记录查看。
--
-- 说明:
-- 1. 排班看板是 Web 管理端功能,platforms 显式为 ["web"],
-- 移动端菜单不出现(后续若开放员工查看排班,再补 APP 端页面)。
-- 2. 租户端角色(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
);
-- ---------- 排班考勤(目录) ----------
INSERT INTO yz_system_menu
(pid, title, path, component_path, icon, sort, status, is_visible, views, platforms, type, creater, remark)
SELECT @oa_id, '排班考勤', '/apps/oa/scheduling', NULL,
'Calendar', 88, 1, 1, '[2]', '["web"]', 1, 'system',
'按公司、部门、小组或指定员工制定排班方案,支持临时调配'
FROM DUAL
WHERE @oa_id IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM yz_system_menu WHERE path = '/apps/oa/scheduling' AND delete_time IS NULL) x);
SET @scheduling_id := (
SELECT id FROM yz_system_menu
WHERE path = '/apps/oa/scheduling' AND delete_time IS NULL
LIMIT 1
);
-- ---------- 工作排班(页面) ----------
INSERT INTO yz_system_menu
(pid, title, path, component_path, icon, sort, status, is_visible, views, platforms, type, creater, remark)
SELECT @scheduling_id, '工作排班', '/apps/oa/scheduling/board', '/apps/oa/scheduling/index.vue',
'Clock', 1, 1, 1, '[2]', '["web"]', 2, 'system',
'排班看板:按周查看排班,支持方案发布、单条调班与批量临时排班'
FROM DUAL
WHERE @scheduling_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);
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), '$', @scheduling_id) AS CHAR)
WHERE cid = 2
AND rights IS NOT NULL
AND TRIM(rights) <> ''
AND JSON_VALID(rights)
AND @scheduling_id IS NOT NULL
AND NOT JSON_CONTAINS(CAST(rights AS JSON), CAST(@scheduling_id AS JSON));
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
FROM yz_system_menu
WHERE delete_time IS NULL AND path LIKE '/apps/oa/scheduling%'
ORDER BY pid, sort;
SELECT id, name, tenant_id,
JSON_CONTAINS(CAST(rights AS JSON), CAST(@scheduling_id AS JSON)) AS has_dir,
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;