# 通知功能实现方案 ## 1. 需求分析 根据业务描述,通知系统需要支持以下功能: ### 1.1 系统通知 - 次级管理员增加/删除学校管理员 → 主要管理员可见 - 次级管理员增加/修改/删除套餐 → 主要管理员可见 - 老师的系统通知 → 主要管理员可见 ### 1.2 管理员对用户通知(层级发送) | 角色 | 可通知对象 | 说明 | |------|-----------|------| | 主要管理员(SUPER) | 次级管理员、学校管理员、学院管理员、老师、学生 | 可多选 | | 次级管理员(SUPER1) | 学校管理员、学院管理员、老师、学生 | 可多选 | | 学校管理员(SCHOOL_ADMIN) | 学院管理员、老师、学生 | 可多选 | | 学院管理员(COLLEGE_ADMIN) | 老师、学生 | 可多选 | | 老师(TEACHER) | 指定课程的学生 | 课程可多选 | | 学生(STUDENT) | 仅收件箱 | 无发送权限 | ### 1.3 核心需求(用户明确) 1. **通知创建人** - 需要记录发送者信息 2. **发送目标** - 需要记录接收人信息 3. **通知类型** - 需要支持多种类型 --- ## 2. 当前代码分析 ### 2.1 现有通知实体 (`SysNotification`) | 字段 | 类型 | 说明 | 当前状态 | |------|------|------|----------| | id | Long | 主键ID | ✅ 存在 | | schoolId | Long | 学校ID(数据隔离) | ✅ 存在 | | userId | Long | 用户ID | ✅ 存在(作为接收者ID) | | title | String | 通知标题 | ✅ 存在 | | content | String | 通知内容 | ✅ 存在 | | type | Integer | 通知类型 | ✅ 存在(仅4种) | | isRead | Integer | 是否已读 | ✅ 存在(用户表示可保留) | | createTime | Date | 创建时间 | ✅ 存在 | ### 2.2 现有问题 | 问题 | 说明 | |------|------| | 缺少发送者信息 | 当前只有接收者ID(userId),缺少发送者ID和姓名 | | 通知类型不足 | 只有4种类型,缺少用户通知和课程通知 | | 缺少批量发送功能 | 当前只能单条发送给单个用户 | | 缺少角色层级控制 | 没有实现角色层级的发送权限控制 | --- ## 3. 实现方案(最小化修改) ### 3.1 数据库表结构调整 **新增字段到 `sys_notification` 表:** | 字段名 | 类型 | 约束 | 说明 | |--------|------|------|------| | sender_id | BIGINT | NULL | 发送者用户ID | | sender_name | VARCHAR(100) | NULL | 发送者姓名 | | target_type | TINYINT(1) | DEFAULT 1 | 目标类型:1-单个用户,2-角色,3-课程 | **更新通知类型定义:** | 类型值 | 类型名称 | 说明 | |--------|----------|------| | 1 | 系统通知 | 系统自动生成的通知 | | 2 | 作业通知 | 作业相关通知 | | 3 | 考试通知 | 考试相关通知 | | 4 | 考勤通知 | 考勤相关通知 | | 5 | 用户通知 | 管理员发送给用户的通知 | | 6 | 课程通知 | 老师发送给课程学生的通知 | ### 3.2 实体类修改 (`SysNotification.java`) ```java // 新增字段 @Schema(description = "发送者用户ID") private Long senderId; @Schema(description = "发送者姓名") private String senderName; @Schema(description = "目标类型:1-单个用户,2-角色,3-课程") private Integer targetType; ``` ### 3.3 新增请求DTO **`SendNotificationRequest.java`** - 发送通知请求 | 字段 | 类型 | 必填 | 说明 | |------|------|------|------| | schoolId | Long | 是 | 学校ID | | title | String | 是 | 通知标题 | | content | String | 是 | 通知内容 | | type | Integer | 是 | 通知类型(5-用户通知, 6-课程通知) | | targetUserIds | List | 否 | 目标用户ID列表 | | targetRoleTypes | List | 否 | 目标角色类型列表 | | courseIds | List | 否 | 课程ID列表(老师群发) | ### 3.4 Service层增强 **新增接口方法 (`SysNotificationService.java`):** ```java /** * 发送用户通知(批量发送给指定角色或用户) */ void sendUserNotification(Long schoolId, Long senderId, String senderName, String title, String content, List targetUserIds, List targetRoleTypes); /** * 发送课程通知(老师群发课程消息) */ void sendCourseNotification(Long schoolId, Long teacherId, String teacherName, String title, String content, List courseIds); /** * 发送系统通知给指定用户 */ void sendSystemNotification(Long schoolId, List targetUserIds, String title, String content); /** * 获取当前用户可通知的下级角色类型 */ List getAvailableTargetRoles(Long currentUserId); /** * 获取指定角色类型下的用户列表 */ List getUsersByRoleTypes(Long schoolId, List roleTypes); ``` ### 3.5 Controller层增强 **新增接口 (`SysNotificationController.java`):** | 接口 | 方法 | 权限 | 说明 | |------|------|------|------| | `/api/notification/send-to-users` | POST | 管理员/老师 | 发送通知给指定用户 | | `/api/notification/send-to-roles` | POST | 管理员/老师 | 发送通知给指定角色 | | `/api/notification/send-to-course` | POST | TEACHER | 发送课程通知 | | `/api/notification/available-targets` | GET | 登录用户 | 获取当前用户可通知的目标角色 | ### 3.6 角色层级权限控制 **角色层级关系与可通知范围:** | 当前角色 | roleType | 可通知角色类型 | |----------|----------|---------------| | SUPER | 1 | [1, 2, 3, 4, 5] | | SUPER1 | 1 | [2, 3, 4, 5] | | SCHOOL_ADMIN | 2 | [3, 4, 5] | | COLLEGE_ADMIN | 3 | [4, 5] | | TEACHER | 4 | [5] (仅限自己课程的学生) | | STUDENT | 5 | [] (无发送权限) | --- ## 4. 文件修改清单 | 文件路径 | 修改类型 | 说明 | |----------|----------|------| | `entity/SysNotification.java` | 修改 | 新增 senderId, senderName, targetType 字段 | | `entity/request/SendNotificationRequest.java` | 新增 | 发送通知请求DTO | | `service/SysNotificationService.java` | 修改 | 新增接口方法 | | `service/impl/SysNotificationServiceImpl.java` | 修改 | 实现新增方法 | | `controller/SysNotificationController.java` | 修改 | 新增接口 | | `mapper/SysNotificationMapper.java` | 修改 | 新增批量插入方法 | | `mapper/SysNotificationMapper.xml` | 修改 | 新增批量插入SQL | | `db/create_edu_tables.sql` | 修改 | 添加新字段 | | `db/sys_role_permission_data_init_merged.sql` | 修改 | 添加发送通知权限 | --- ## 5. 权限配置 **新增权限码:** | 权限码 | 权限名称 | 适用角色 | |--------|----------|----------| | `notification:send:users` | 发送通知给用户 | SUPER, SUPER1, SCHOOL_ADMIN, COLLEGE_ADMIN | | `notification:send:course` | 发送课程通知 | TEACHER | --- ## 6. 总结 **当前代码是否满足需求:** | 需求 | 当前状态 | 需要修改 | |------|----------|----------| | 通知创建人 | ❌ 缺少发送者信息 | 新增 senderId, senderName | | 发送目标 | ✅ userId作为接收者 | 支持批量发送 | | 通知类型 | ❌ 只有4种 | 新增类型5和6 | | 角色层级控制 | ❌ 未实现 | 新增权限验证逻辑 | **结论:当前代码不满足需求,需要进行上述修改。**