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

161 lines
6.8 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_attendance_menus.sql
--
-- 挂载位置:OA → 办公(个人办公),直接是页面,不再套「排班考勤」目录
-- OA
-- └─ 办公(/apps/oa/personal,找不到时回落到 OA 根)
-- ├─ 工作排班(Web,/apps/oa/scheduling/board)
-- ├─ 考勤管理(Web,/apps/oa/attendance) ← 本脚本
-- └─ 考勤打卡(App,/apps/oa/attendance/clock) ← 本脚本
--
-- 页面:
-- backend/src/views/apps/oa/attendance/index.vue 考勤管理(考勤汇总 + 考勤明细)
-- uniapp/pages/oa/attendance/index.vue 考勤打卡(移动端)
--
-- 说明:
-- 1. 「考勤管理」是直接页面(type=2),点菜单即打开,不再有子菜单;
-- 2. 打卡动作在移动端完成,Web 端只做考勤汇总 / 明细 / 缺卡名单 / 备注,
-- 因此「考勤管理」platforms 为 ["web"];
-- 3. 「考勤打卡」platforms 为 ["app"],通过 uniapp 菜单跳转原生页面
-- (uniapp/utils/nav.js 的 NATIVE_RULES 按「考勤」匹配);
-- 4. 历史版本创建的「排班考勤」目录不再使用,脚本会把它隐藏(保留数据);
-- 其下的「工作排班」直接上移到「办公」;
-- 5. 租户端角色(cid=2)的 rights 是显式菜单 ID 列表,只插菜单不授权
-- 会被过滤掉,因此本脚本把菜单 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);
-- ---------- 考勤管理(Web 页面,直接挂在办公下) ----------
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/attendance', '/apps/oa/attendance/index.vue',
'Stopwatch', 89, 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/attendance' AND delete_time IS NULL) x);
-- 已存在则纠正为「直接页面」:改名、上移、确保是页面与 Web 端可见
UPDATE yz_system_menu
SET title = '考勤管理',
pid = IFNULL(@parent_id, pid),
sort = 89,
type = 2,
component_path = '/apps/oa/attendance/index.vue',
platforms = '["web"]',
is_visible = 1
WHERE path = '/apps/oa/attendance' AND delete_time IS NULL;
SET @records_id := (
SELECT id FROM yz_system_menu
WHERE path = '/apps/oa/attendance' 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 @parent_id, '考勤打卡', '/apps/oa/attendance/clock', NULL,
'AlarmClock', 90, 1, 1, '[2]', '["app"]', 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/attendance/clock' AND delete_time IS NULL) x);
UPDATE yz_system_menu
SET pid = IFNULL(@parent_id, pid),
sort = 90,
platforms = '["app"]',
is_visible = 1
WHERE path = '/apps/oa/attendance/clock' AND delete_time IS NULL;
SET @clock_id := (
SELECT id FROM yz_system_menu
WHERE path = '/apps/oa/attendance/clock' AND delete_time IS NULL
LIMIT 1
);
-- ---------- 工作排班上移:不再保留「排班考勤」目录 ----------
UPDATE yz_system_menu
SET pid = IFNULL(@parent_id, pid), sort = 88
WHERE path = '/apps/oa/scheduling/board'
AND delete_time IS NULL
AND @parent_id IS NOT NULL
AND (pid IS NULL OR pid <> @parent_id);
-- 历史的「排班考勤」目录:不再使用,隐藏(保留数据,避免影响已有角色授权)
-- 仅当目录下已无可见子菜单时才隐藏,避免误伤租户自行添加的子菜单
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), '$', @records_id) AS CHAR)
WHERE cid = 2
AND rights IS NOT NULL AND TRIM(rights) <> '' AND JSON_VALID(rights)
AND @records_id IS NOT NULL
AND NOT JSON_CONTAINS(CAST(rights AS JSON), CAST(@records_id AS JSON));
UPDATE yz_system_admin_role
SET rights = CAST(JSON_ARRAY_APPEND(CAST(rights AS JSON), '$', @clock_id) AS CHAR)
WHERE cid = 2
AND rights IS NOT NULL AND TRIM(rights) <> '' AND JSON_VALID(rights)
AND @clock_id IS NOT NULL
AND NOT JSON_CONTAINS(CAST(rights AS JSON), CAST(@clock_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, is_visible
FROM yz_system_menu
WHERE delete_time IS NULL
AND (path LIKE '/apps/oa/attendance%' OR path LIKE '/apps/oa/scheduling%')
ORDER BY pid, sort;
SELECT id, name, tenant_id,
JSON_CONTAINS(CAST(rights AS JSON), CAST(@records_id AS JSON)) AS has_attendance,
JSON_CONTAINS(CAST(rights AS JSON), CAST(@clock_id AS JSON)) AS has_clock
FROM yz_system_admin_role
WHERE cid = 2 AND rights IS NOT NULL AND TRIM(rights) <> ''
ORDER BY tenant_id, id;