106 lines
4.4 KiB
SQL
106 lines
4.4 KiB
SQL
-- ============================================================
|
||
-- 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;
|