Files
hzdyjs/退学、休学、复学、毕业/01-核心状态修改.md
T
2025-12-25 18:01:27 +08:00

406 lines
12 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.
# 01-核心状态修改
## 📋 概述
本分文档详细说明学生退学、休学、毕业、复学处理中的核心状态修改内容,包括学生学籍状态和用户登录状态的变更逻辑。
## 🎯 核心状态修改
### 1. 学生学籍状态
#### 📊 数据库表结构
**表名**: `xg_student_msg`
**主键**: `id` (bigint(20), 雪花ID)
**核心字段**: `student_status` (char(1))
**关联字段**: `student_no` (varchar(32), 学号)
#### 🎯 字典数据定义
系统使用 `student_status` 字典类型,具体定义如下:
| 字典值 | 标签 | 说明 | 样式类 |
|--------|------|------|--------|
| `1` | 在读 | 正常在校学习状态 | primary |
| `2` | 休学 | 暂时停止学业 | warning |
| `3` | 复学 | 从休学状态恢复 | info |
| `4` | 退学 | 终止学籍 | danger |
| `5` | 毕业 | 正常毕业 | success |
| `6` | 不在籍 | - | - |
| `7` | 结业 | - | - |
| `8` | 停学 | - | - |
| `9` | 分流 | - | - |
#### 🔄 处理逻辑
- **休学**: `student_status = '2'`(休学)
- **退学**: `student_status = '4'`(退学)
- **毕业**: `student_status = '5'`(毕业)
- **复学**: `student_status = '3'`(复学)
#### 📝 前端界面实现
**文件位置**: `web/src/views/xg/xsjcxx/stuPersonalMsg/index.vue`
**字段绑定**: `form.studentStatus`
**字典类型**: `student_status`
```vue
<el-form-item label="学籍状态" prop="studentStatus">
<el-select v-model="form.studentStatus" placeholder="请选择学籍状态" disabled>
<el-option v-for="dict in student_status" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
```
#### 💾 SQL处理脚本
```sql
-- 参数说明:
-- @student_id: 学生ID (主键)
-- @student_no: 学生学号
-- @change_type: 变更类型 (XIU_XUE-休学, TUI_XUE-退学, FU_XUE-复学, BI_YE-毕业)
-- @operator_id: 操作员ID
-- 休学处理
UPDATE xg_student_msg
SET student_status = '2',
update_by = @operator_id,
update_time = NOW()
WHERE id = @student_id
AND deleted = 0;
-- 退学处理
UPDATE xg_student_msg
SET student_status = '4',
update_by = @operator_id,
update_time = NOW()
WHERE id = @student_id
AND deleted = 0;
-- 毕业处理
UPDATE xg_student_msg
SET student_status = '5',
update_by = @operator_id,
update_time = NOW()
WHERE id = @student_id
AND deleted = 0;
-- 复学处理
UPDATE xg_student_msg
SET student_status = '3',
update_by = @operator_id,
update_time = NOW()
WHERE id = @student_id
AND deleted = 0;
```
### 2. 用户登录状态
#### 📊 数据库表结构
**表名**: `sys_user`
**主键**: `user_id` (bigint(20))
**核心字段**: `status` (char(1))
**关联字段**: `user_name` (varchar(30), 对应学生学号)
#### 🎯 状态定义
| 字段值 | 状态 | 说明 |
|--------|------|------|
| `0` | 正常 | 账号正常使用 |
| `1` | 停用 | 账号已被禁用 |
#### 🔄 处理逻辑
- **休学**: 禁用账号(`status = '1'`)
- **退学**: 禁用账号(`status = '1'`)
- **毕业**: 禁用账号(`status = '1'`)
- **复学**: 启用账号(`status = '0'`)
#### 📝 后端实体类
**文件位置**: `backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java`
**状态字段**: `private String status;` (0-正常,1-停用)
**状态变更记录实体**:
**文件位置**: `backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/XgStudentStatusChange.java`
- `changeType`: 异动类型 (TUI_XUE-退学, XIU_XUE-休学, FU_XUE-复学, BI_YE-毕业)
- `processStatus`: 处理状态 (0-未处理,1-已处理)
- `source`: 来源 (manual-手动, import-导入, workflow-工作流)
#### 💾 SQL处理脚本
```sql
-- 参数说明:
-- @student_id: 学生ID (对应sys_user.user_id)
-- @student_no: 学生学号 (对应sys_user.user_name)
-- @change_type: 变更类型 (XIU_XUE-休学, TUI_XUE-退学, FU_XUE-复学, BI_YE-毕业)
-- @operator_id: 操作员ID
-- 1. 备份原始数据到his表
INSERT INTO sys_user_his SELECT * FROM sys_user WHERE user_id = @student_id;
-- 2. 处理用户账号状态
-- 退学/休学/毕业:禁用用户账号
UPDATE sys_user
SET status = '1',
update_by = @operator_id,
update_time = NOW()
WHERE user_id = @student_id
AND account_type = '2' -- 学生账户类型
AND del_flag = '0'
AND @change_type IN ('XIU_XUE', 'TUI_XUE', 'BI_YE');
-- 复学:启用用户账号
UPDATE sys_user
SET status = '0',
update_by = @operator_id,
update_time = NOW()
WHERE user_id = @student_id
AND account_type = '2' -- 学生账户类型
AND del_flag = '0'
AND @change_type = 'FU_XUE';
```
### 3. 学生状态变更记录
#### 📊 数据库表结构
**表名**: `xg_student_status_change`
**主键**: `id` (bigint(20), 雪花ID)
**核心字段**:
- `student_id`: 学生ID
- `student_no`: 学号
- `change_type`: 异动类型 (TUI_XUE/退学, XIU_XUE/休学, FU_XUE/复学, BI_YE/毕业)
- `apply_date`: 申请/登记日期
- `effective_date`: 生效日期
- `reason`: 异动原因
- `operator_id`: 经办人ID
- `operator_name`: 经办人姓名
- `process_status`: 处理状态 (0=未处理,1=已处理)
#### 🔄 业务流程
1. **创建变更记录**: 插入 `xg_student_status_change` 表
2. **更新学生状态**: 修改 `xg_student_msg.student_status`
3. **更新用户状态**: 根据变更类型修改 `sys_user.status`
4. **标记处理完成**: 更新 `process_status = 1`
#### 📝 后端实现
**控制器**: `XgStudentStatusChangeController`
**服务类**: `XgStudentStatusChangeServiceImpl`
**实体类**: `XgStudentStatusChange`
```java
// 变更类型枚举
public enum ChangeType {
XIU_XUE("休学"),
TUI_XUE("退学"),
FU_XUE("复学"),
BI_YE("毕业");
}
```
## 🔄 业务处理逻辑
### 1. 状态变更流程
#### 📋 完整处理流程
```
1. 创建状态变更记录 (xg_student_status_change)
2. 验证学生当前状态和业务规则
3. 备份原始数据到his表
4. 更新学生学籍状态 (xg_student_msg.student_status)
5. 根据变更类型处理用户登录状态 (sys_user.status)
6. 记录操作日志和审计信息
7. 触发后续业务处理 (组织关系、退宿处理等)
```
#### ⚡ 事务处理要求
```sql
-- 建议使用数据库事务确保数据一致性
START TRANSACTION;
-- 步骤1: 创建变更记录
INSERT INTO xg_student_status_change (...) VALUES (...);
-- 步骤2: 备份原始数据到his表
INSERT INTO xg_student_msg_his SELECT * FROM xg_student_msg WHERE id = ?;
INSERT INTO sys_user_his SELECT * FROM sys_user WHERE user_id = ?;
-- 步骤3: 更新学生状态
UPDATE xg_student_msg SET student_status = ?, update_time = NOW() WHERE id = ?;
-- 步骤4: 更新用户状态
UPDATE sys_user SET status = ?, update_time = NOW() WHERE user_id = ?;
-- 提交事务
COMMIT;
```
### 2. 数据一致性考虑
#### 🔗 关联数据验证
- **学生存在性**: 确保 `xg_student_msg.id` 存在且 `deleted = 0`
- **用户关联性**: 确保 `sys_user.user_name` 与学生学号一致
- **状态合法性**: 验证目标状态在字典范围内
- **权限校验**: 确保操作员具有相应权限
#### 🛡️ 数据完整性约束
```sql
-- 检查学生是否存在
SELECT COUNT(1) FROM xg_student_msg
WHERE id = @student_id AND deleted = 0;
-- 检查用户账号状态
SELECT user_id, status FROM sys_user
WHERE user_name = @student_no AND del_flag = '0';
```
### 3. 业务规则说明
#### 📊 状态变更矩阵
| 当前状态 | 可变更状态 | 账号处理 | 说明 |
|----------|------------|----------|------|
| 在读(1) | 休学(2)、退学(4)、毕业(5) | 禁用账号 | 正常学籍状态下的变更 |
| 休学(2) | 复学(3)、退学(4)、毕业(5) | 禁用账号 | 休学状态下的恢复或终止 |
| 复学(3) | 休学(2)、退学(4)、毕业(5) | 禁用账号 | 复学后的再次变更 |
| 其他状态 | 需特殊审批 | 根据情况 | 异常状态需要额外处理 |
#### ⚠️ 业务约束
- **休学限制**: 同一学年内休学不能超过规定次数
- **退学限制**: 退学后不能恢复为正常学籍
- **毕业限制**: 毕业状态为最终状态,不允许变更
- **复学限制**: 只有休学状态才能复学
- **时间约束**: 状态变更需要满足学年学期要求
### 4. 异常处理机制
#### 🔍 错误场景处理
- **学生不存在**: 返回错误信息,提示检查学生ID
- **状态冲突**: 当前状态不允许变更到目标状态
- **用户不存在**: 记录警告,但不阻断业务处理
- **权限不足**: 返回无权限错误
#### 📝 错误日志记录
```sql
-- 记录处理失败的详细信息
INSERT INTO sys_oper_log (
title, business_type, method, request_method,
operator_type, oper_name, dept_name,
oper_url, oper_ip, oper_location,
oper_param, json_result, status, error_msg, oper_time
) VALUES (
'学生状态变更', 2, 'updateStudentStatus', 'PUT',
1, @operator_name, @dept_name,
'/student/status/change', @client_ip, @location,
@request_param, @result_json, 1, @error_msg, NOW()
);
```
## 🛠️ 技术实现细节
### 1. 后端服务层实现
#### 📂 核心类文件
- **实体类**: `XgStudentMsg.java` - 学生信息实体
- **变更实体**: `XgStudentStatusChange.java` - 状态变更记录
- **控制器**: `XgStudentStatusChangeController.java` - API接口
- **服务类**: `XgStudentStatusChangeServiceImpl.java` - 业务逻辑
#### 🔧 关键方法实现
```java
@Service
public class XgStudentStatusChangeServiceImpl implements IXgStudentStatusChangeService {
@Transactional(rollbackFor = Exception.class)
public Boolean processStudentStatusChange(XgStudentStatusChangeBo bo) {
// 1. 验证业务规则
validateChangeRequest(bo);
// 2. 创建变更记录
XgStudentStatusChange change = createChangeRecord(bo);
// 3. 更新学生状态
updateStudentStatus(change);
// 4. 处理用户账号状态
handleUserAccountStatus(change);
// 5. 记录操作日志
logOperation(change);
return true;
}
}
```
### 2. 前端界面实现
#### 📱 状态变更界面
- **表单组件**: 使用 `el-select` 绑定字典数据
- **验证规则**: 必填验证和字典值验证
- **状态联动**: 根据变更类型动态显示相关字段
#### 🎨 UI交互逻辑
```vue
<template>
<el-form :model="form" :rules="rules" ref="statusChangeForm">
<el-form-item label="变更类型" prop="changeType">
<el-select v-model="form.changeType" placeholder="请选择变更类型">
<el-option label="休学" value="XIU_XUE" />
<el-option label="退学" value="TUI_XUE" />
<el-option label="复学" value="FU_XUE" />
<el-option label="毕业" value="BI_YE" />
</el-select>
</el-form-item>
<el-form-item label="生效日期" prop="effectiveDate">
<el-date-picker
v-model="form.effectiveDate"
type="date"
placeholder="选择生效日期"
value-format="YYYY-MM-DD"
/>
</el-form-item>
<el-form-item label="变更原因" prop="reason">
<el-input
v-model="form.reason"
type="textarea"
placeholder="请输入变更原因"
maxlength="500"
show-word-limit
/>
</el-form-item>
</el-form>
</template>
```
## ⚠️ 注意事项
### 1. 操作安全要求
- **权限控制**: 必须验证操作员的变更权限
- **数据备份**: 操作前备份相关数据
- **审计记录**: 记录完整的操作日志
- **业务沟通**: 与相关部门确认处理方案
### 2. 业务连续性考虑
- **流程终止**: 状态变更后终止相关审批流程
- **数据同步**: 确保各模块状态一致性
- **关联处理**: 联动处理组织关系、经济资助等业务
- **状态追溯**: 保留历史状态变更记录
### 3. 性能优化建议
- **批量处理**: 支持多个学生的批量状态变更
- **异步处理**: 大批量操作使用异步处理机制
- **缓存更新**: 变更后及时更新相关缓存
- **索引优化**: 确保查询字段有适当索引
### 4. 监控和告警
- **状态监控**: 监控状态变更的成功率和异常情况
- **业务告警**: 异常状态变更及时告警
- **统计分析**: 定期统计状态变更情况
- **日志分析**: 分析操作日志发现问题
---
## 📅 更新记录
- **2025-12-XX**: 分文档创建,包含核心状态修改逻辑
- **2025-12-XX**: 基于代码分析完善技术实现细节和业务逻辑
- **后续更新**: 根据实际业务需求持续完善
---
*本分文档详细说明学生状态变更的核心数据修改逻辑和技术实现,是整个处理流程的基础步骤。*