本分文档详细说明学生退学、休学、毕业、复学处理中的核心状态修改内容,包括学生学籍状态和用户登录状态的变更逻辑。
表名: 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
<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>
-- 参数说明:
-- @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;
表名: 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-工作流)-- 参数说明:
-- @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';
表名: xg_student_status_change
主键: id (bigint(20), 雪花ID)
核心字段:
student_id: 学生IDstudent_no: 学号change_type: 异动类型 (TUI_XUE/退学, XIU_XUE/休学, FU_XUE/复学, BI_YE/毕业)apply_date: 申请/登记日期effective_date: 生效日期reason: 异动原因operator_id: 经办人IDoperator_name: 经办人姓名process_status: 处理状态 (0=未处理,1=已处理)xg_student_status_change 表xg_student_msg.student_statussys_user.statusprocess_status = 1控制器: XgStudentStatusChangeController
服务类: XgStudentStatusChangeServiceImpl
实体类: XgStudentStatusChange
// 变更类型枚举
public enum ChangeType {
XIU_XUE("休学"),
TUI_XUE("退学"),
FU_XUE("复学"),
BI_YE("毕业");
}
1. 创建状态变更记录 (xg_student_status_change)
2. 验证学生当前状态和业务规则
3. 备份原始数据到his表
4. 更新学生学籍状态 (xg_student_msg.student_status)
5. 根据变更类型处理用户登录状态 (sys_user.status)
6. 记录操作日志和审计信息
7. 触发后续业务处理 (组织关系、退宿处理等)
-- 建议使用数据库事务确保数据一致性
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;
xg_student_msg.id 存在且 deleted = 0sys_user.user_name 与学生学号一致-- 检查学生是否存在
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';
| 当前状态 | 可变更状态 | 账号处理 | 说明 |
|---|---|---|---|
| 在读(1) | 休学(2)、退学(4)、毕业(5) | 禁用账号 | 正常学籍状态下的变更 |
| 休学(2) | 复学(3)、退学(4)、毕业(5) | 禁用账号 | 休学状态下的恢复或终止 |
| 复学(3) | 休学(2)、退学(4)、毕业(5) | 禁用账号 | 复学后的再次变更 |
| 其他状态 | 需特殊审批 | 根据情况 | 异常状态需要额外处理 |
-- 记录处理失败的详细信息
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()
);
XgStudentMsg.java - 学生信息实体XgStudentStatusChange.java - 状态变更记录XgStudentStatusChangeController.java - API接口XgStudentStatusChangeServiceImpl.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;
}
}
el-select 绑定字典数据<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>
本分文档详细说明学生状态变更的核心数据修改逻辑和技术实现,是整个处理流程的基础步骤。