sxwz2.0/.trae/documents/notification_plan.md

206 lines
7.1 KiB
Markdown
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.

# 通知功能实现方案
## 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<Long> | 否 | 目标用户ID列表 |
| targetRoleTypes | List<Integer> | 否 | 目标角色类型列表 |
| courseIds | List<Long> | 否 | 课程ID列表老师群发 |
### 3.4 Service层增强
**新增接口方法 (`SysNotificationService.java`)**
```java
/**
* 发送用户通知(批量发送给指定角色或用户)
*/
void sendUserNotification(Long schoolId, Long senderId, String senderName,
String title, String content,
List<Long> targetUserIds, List<Integer> targetRoleTypes);
/**
* 发送课程通知(老师群发课程消息)
*/
void sendCourseNotification(Long schoolId, Long teacherId, String teacherName,
String title, String content, List<Long> courseIds);
/**
* 发送系统通知给指定用户
*/
void sendSystemNotification(Long schoolId, List<Long> targetUserIds,
String title, String content);
/**
* 获取当前用户可通知的下级角色类型
*/
List<Integer> getAvailableTargetRoles(Long currentUserId);
/**
* 获取指定角色类型下的用户列表
*/
List<SysUser> getUsersByRoleTypes(Long schoolId, List<Integer> 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 |
| 角色层级控制 | ❌ 未实现 | 新增权限验证逻辑 |
**结论:当前代码不满足需求,需要进行上述修改。**