Files
student_manage_system/docs/02-business-design.md
T

199 lines
8.0 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. 业务背景
本系统服务于教育培训机构的日常教务运营,解决以下核心业务问题:
- **学生信息管理**:统一管理学员档案,支持按班级、顾问老师查询
- **教学过程跟踪**:记录各阶段考核成绩,分析学习效果
- **就业数据沉淀**:追踪毕业生去向,统计就业率和薪资水平
- **班级师资配置**:管理班主任、授课老师、助教老师的协作关系
---
## 2. 用户角色
| 角色 | 说明 | 主要操作 |
|------|------|----------|
| 教务管理员 | 系统最高权限,负责全局数据维护 | 全部 CRUD、统计查看 |
| 班主任 | 负责班级管理 | 查看/编辑本班学生、班级信息 |
| 授课老师 | 负责成绩录入 | 录入/修改学生成绩 |
| 顾问老师 | 负责学生职业规划 | 查看所带学生信息、就业状态 |
| 就业专员 | 负责就业数据维护 | 录入/更新就业记录 |
> 当前阶段为内部工具,暂未实现角色权限控制;V2.0 规划接入 OAuth2 + RBAC。
---
## 3. 业务流程
### 3.1 学生入班流程
```
[创建教师] → [创建班级并分配师资] → [录入学生信息并绑定班级]
│ │ │
└──── 教师编号唯一 ──┘ └── 学号唯一,班级必填
```
**规则**:
- 新建学生时,`class_id` 必须指向已存在的未删除班级
- `advisor_id`(顾问老师)可选,必须指向有效教师
- 学生编号(`num`)全局唯一
### 3.2 成绩录入流程
```
[选择学生] → [填写考核序次(num)] → [录入分数]
│
└── 同一学生同一考核序次不可重复录入(业务约束)
```
**规则**:
- 成绩 `score` 保留两位小数(DECIMAL(10,2))
- 考核序次(如"第一次考核"、"期中")由业务方定义,系统不做枚举约束
- 支持按学生 ID 或考核序次模糊查询
### 3.3 就业登记流程
```
[开放就业通道] → [登记就业公司信息] → [下发 Offer] → [记录薪资]
│ │ │
employment_open employment_company offer_received
_time _time time
```
**规则**:
- 一个学生只能有一条有效就业记录(`sid` 唯一约束)
- `employment_open_time` 和 `offer_recived_time` 可为空(流程进行中)
- 平均签约周期 = `offer_recived_time - employment_open_time`(天数)
### 3.4 统计查询流程
```
[请求统计数据] → [按班级/考核序次过滤] → [聚合计算] → [返回统计结果]
```
| 统计类型 | 维度 | 指标 |
|----------|------|------|
| 班级人数统计 | 按班级 | 总人数、男生数、女生数 |
| 成绩统计 | 按考核序次+班级 | 平均分、最高分、最低分、参考人数 |
| 就业统计 | 按班级 | 已就业人数、就业率、平均薪资、平均签约周期 |
---
## 4. 核心业务实体关系
```
┌──────────┐ 1:N ┌──────────┐ 1:N ┌──────────┐
│ Teacher │◄───────────►│ Class │◄───────────►│ Student │
│ 教师 │ 班主任/授课 │ 班级 │ 所属班级 │ 学生 │
│ │ 助教老师 │ │ │ │
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │
│ 1:N │ 1:1 │ 1:N
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Score │ │Employment│◄──────────►│ Student │
│ 成绩 │ │ 就业 │ 一对一 │ │
└──────────┘ └──────────┘ └──────────┘
```
### 关联说明
- **Teacher ↔ Class**:一对多(一个老师可担任多个班级的班主任/授课老师/助教)
- **Class ↔ Student**:一对多(一个班级有多个学生)
- **Student ↔ Score**:一对多(一个学生有多次考核成绩)
- **Student ↔ Employment**:一对一(一个学生只有一条有效就业记录)
- **Teacher ↔ Student**:多对一(一个顾问老师带多个学生)
---
## 5. 业务规则与约束
### 5.1 唯一性约束
| 字段 | 表 | 规则 |
|------|-----|------|
| `num` | teachers | 教师编号全局唯一 |
| `num` | classes | 班级编号全局唯一 |
| `num` | students | 学生编号全局唯一 |
| (sid, num) | scores | 同一学生同一考核序次只允许一条记录 |
| `sid` | employment | 一名学生只允许一条就业记录 |
### 5.2 外键约束(业务层校验)
| 字段 | 引用表 | 级联策略 |
|------|--------|----------|
| `students.class_id` | `classes.id` | 删除班级时限制(restrict),更新级联 |
| `students.advisor_id` | `teachers.id` | 删除教师时置空,更新级联 |
| `classes.head_teacher_id` | `teachers.id` | 同左 |
| `scores.sid` | `students.id` | 删除学生时级联删除成绩 |
| `employment.sid` | `students.id` | 删除学生时级联删除就业记录 |
### 5.3 软删除规则
- 所有表均支持软删除(`is_deleted = true` + `delete_time` 记录时间)
- 所有查询默认过滤 `is_deleted = false`
- 软删除不影响关联数据(成绩/就业随学生级联删除)
---
## 6. 统计业务逻辑详细说明
### 6.1 班级人数统计(`GET /api/stats/classes`)
```
SELECT class_id, class_name, COUNT(*) as total,
SUM(CASE WHEN sex=1 THEN 1 ELSE 0 END) as male_count,
SUM(CASE WHEN sex=2 THEN 1 ELSE 0 END) as female_count
FROM students s JOIN classes c ON s.class_id = c.id
WHERE s.is_deleted=0 AND c.is_deleted=0
GROUP BY s.class_id, c.name
```
### 6.2 成绩统计(`GET /api/stats/scores?class_id=&score_num=`)
```
SELECT score_num, class_id, AVG(score), MAX(score), MIN(score), COUNT(*)
FROM scores sc JOIN students s ON sc.sid = s.id
WHERE s.is_deleted=0 AND sc.is_deleted=0
GROUP BY score_num, class_id
[可选过滤 class_id / score_num]
```
### 6.3 就业统计(`GET /api/stats/employment?class_id=`)
```
SELECT e.class_id, c.name,
COUNT(e.id) as employed_count,
COUNT(s.id) as total_count,
AVG(e.employment_salary) as avg_salary
FROM employment e
JOIN classes c ON e.class_id = c.id
JOIN students s ON e.sid = s.id
WHERE e.is_deleted=0 AND s.is_deleted=0 AND c.is_deleted=0
GROUP BY e.class_id, c.name
[可选过滤 class_id]
-- 额外计算:平均签约周期(天数)
AVG(JULIANDAY(offer_recived_time) - JULIANDAY(employment_open_time))
WHERE employment_open_time IS NOT NULL AND offer_recived_time IS NOT NULL
```
---
## 7. 数据字典(待 V2.0 实现)
以下字段当前以字符串或整数存储,建议 V2.0 升级为字典表管理:
| 字段 | 当前存储 | 建议字典类型 | 候选值 |
|------|----------|-------------|--------|
| `sex` | TINYINT (0/1/2) | dict_type=sex | 0:未知, 1:男, 2:女 |
| `education` | VARCHAR | dict_type=education | bachelor:本科, master:硕士, phd:博士 |
| `coach_area` | VARCHAR | dict_type=coach_area | app:应用, project:项目, algorithm:算法 |
| `college` | VARCHAR | dict_type=college | 院校代码 → 名称映射 |
| `specialty` | VARCHAR | dict_type=specialty | 专业代码 → 名称映射 |
---
## 8. 分期业务规划
| 阶段 | 业务目标 | 功能范围 |
|------|----------|----------|
| V1.0(当前)| 基础数据管理 | 五模块 CRUD + 三类统计 |
| V2.0 | 数据治理与权限 | 字典表、用户认证、部门/顾问模块、数据源配置 |
| V3.0 | 智能分析 | AI 知识库接入、自然语言查询、预测分析 |
| V4.0 | 多租户 SaaS | 租户隔离、多机构支持、API 开放平台 |