# 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 | **重要说明**: - 数据库字段 `student_status` 为 char(1) 类型 - 字典类型为 `xg_student_status` - 状态值与数据库字段值直接对应,无需转换 #### 🔄 处理逻辑 - **休学**: `student_status = '2'`(休学) - **退学**: `student_status = '4'`(退学) - **毕业**: `student_status = '5'`(毕业) #### 📝 前端界面实现 **文件位置**: `web/src/views/xg/xsjcxx/stuPersonalMsg/index.vue` **字段绑定**: `form.studentStatus` **字典类型**: `student_status` ```vue ``` #### 💾 SQL处理脚本 ```sql -- 参数说明: -- @student_id: 学生ID (主键) -- @student_no: 学生学号 -- @change_type: 变更类型 (XIU_XUE-休学, TUI_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 = '3', 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; ``` ### 2. 用户登录状态 #### 📊 数据库表结构 **表名**: `sys_user` **主键**: `user_id` (bigint(20)) **核心字段**: `status` (char(1)) **关联字段**: `user_name` (varchar(30), 对应学生学号) #### 🎯 状态定义 | 字段值 | 状态 | 说明 | |--------|------|------| | `0` | 正常 | 账号正常使用 | | `1` | 停用 | 账号已被禁用 | #### 🔄 处理逻辑 - **休学**: 可选择保留账号(`status` 保持 `0`)或禁用账号(`status = '1'`) - **退学**: 必须禁用账号(`status = '1'`) - **毕业**: 必须禁用账号(`status = '1'`) #### 📝 后端实体类 **文件位置**: `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_no: 学生学号 (对应sys_user.user_name) -- @change_type: 变更类型 (XIU_XUE-休学, TUI_XUE-退学, BI_YE-毕业) -- @operator_id: 操作员ID -- 退学/毕业:禁用用户账号 UPDATE sys_user SET status = '1', update_by = @operator_id, update_time = NOW(), remark = CONCAT(COALESCE(remark, ''), ' | 学生状态变更-', @change_type, '-', NOW()) WHERE user_name = @student_no AND account_type = '2' -- 学生账户类型 AND del_flag = '0'; -- 休学:可选保留账号(根据业务需求决定是否执行) -- UPDATE sys_user -- SET status = '1', -- 如需禁用则取消注释 -- update_by = @operator_id, -- update_time = NOW(), -- remark = CONCAT(COALESCE(remark, ''), ' | 学生休学-', NOW()) -- WHERE user_name = @student_no -- AND account_type = '2' -- AND del_flag = '0'; ``` ### 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 { TUI_XUE("退学"), XIU_XUE("休学"), FU_XUE("复学"), BI_YE("毕业"); } ``` ## 🔄 业务处理逻辑 ### 1. 状态变更流程 #### 📋 完整处理流程 ``` 1. 创建状态变更记录 (xg_student_status_change) 2. 验证学生当前状态和业务规则 3. 更新学生学籍状态 (xg_student_msg.student_status) 4. 根据变更类型处理用户登录状态 (sys_user.status) 5. 记录操作日志和审计信息 6. 触发后续业务处理 (组织关系、经济资助等) ``` #### ⚡ 事务处理要求 ```sql -- 建议使用数据库事务确保数据一致性 START TRANSACTION; -- 步骤1: 创建变更记录 INSERT INTO xg_student_status_change (...) VALUES (...); -- 步骤2: 更新学生状态 UPDATE xg_student_msg SET student_status = ?, update_time = NOW() WHERE id = ?; -- 步骤3: 更新用户状态 (如需要) UPDATE sys_user SET status = ?, update_time = NOW() WHERE user_name = ?; -- 提交事务 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 ``` ## ⚠️ 注意事项 ### 1. 操作安全要求 - **权限控制**: 必须验证操作员的变更权限 - **数据备份**: 操作前备份相关数据 - **审计记录**: 记录完整的操作日志 - **业务沟通**: 与相关部门确认处理方案 ### 2. 业务连续性考虑 - **流程终止**: 状态变更后终止相关审批流程 - **数据同步**: 确保各模块状态一致性 - **关联处理**: 联动处理组织关系、经济资助等业务 - **状态追溯**: 保留历史状态变更记录 ### 3. 性能优化建议 - **批量处理**: 支持多个学生的批量状态变更 - **异步处理**: 大批量操作使用异步处理机制 - **缓存更新**: 变更后及时更新相关缓存 - **索引优化**: 确保查询字段有适当索引 ### 4. 监控和告警 - **状态监控**: 监控状态变更的成功率和异常情况 - **业务告警**: 异常状态变更及时告警 - **统计分析**: 定期统计状态变更情况 - **日志分析**: 分析操作日志发现问题 --- ## 📅 更新记录 - **2025-12-XX**: 分文档创建,包含核心状态修改逻辑 - **2025-12-XX**: 基于代码分析完善技术实现细节和业务逻辑 - **后续更新**: 根据实际业务需求持续完善 --- *本分文档详细说明学生状态变更的核心数据修改逻辑和技术实现,是整个处理流程的基础步骤。*