This commit is contained in:
zlwu committed 2025-12-25 09:46:53 +08:00
1 parent 8c0a2d904c
commit a514c26f83
11 files changed
+8406 -120

No files matched your search

@@ -0,0 +1,384 @@
# 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
<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-退学, 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
<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="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**: 基于代码分析完善技术实现细节和业务逻辑
- **后续更新**: 根据实际业务需求持续完善
---
*本分文档详细说明学生状态变更的核心数据修改逻辑和技术实现,是整个处理流程的基础步骤。*
@@ -0,0 +1,391 @@
# 02-组织关系处理
## 📋 概述
本分文档详细说明学生退学、休学、毕业处理中的组织关系处理内容,包括班级干部信息和社团成员关系的变更逻辑。
## 👥 组织关系处理
### 1. 班级干部信息处理
#### 📊 数据库表结构
**表名**: `xg_class_pos_msg`
**主键**: `id` (bigint(20), 雪花ID)
**核心关联字段**:
- `class_id`: 班级ID,关联 `xg_class_msg.id`
- `student_id`: 学生ID,关联 `xg_student_msg.id`
- `student_no`: 学号
- `student_name`: 学生姓名(冗余字段)
#### 🎯 关键业务字段
基于数据库表结构 `xg_class_pos_msg`,关键字段如下:
| 字段名 | 类型 | 说明 | 默认值 |
|--------|------|------|--------|
| `is_current` | tinyint(1) | 是否现任(0-非现任,1-现任) | 1 |
| `cadre_status` | char(1) | 职务任职状态(关联stu_cadre_status字典) | 1 |
| `appointment_date` | date | 任职日期 | - |
| `term_start_date` | date | 任期开始日期 | - |
| `term_end_date` | date | 任期结束日期 | NULL |
| `term_duration` | int(11) | 任期时长(月) | 12 |
| `dismissal_date` | date | 离任日期 | NULL |
| `dismissal_reason` | varchar(200) | 离任原因 | NULL |
| `appointment_method` | varchar(20) | 任命方式(appointment/election/recommendation) | appointment |
#### 🎯 干部状态字典
系统使用 `stu_cadre_status` 字典类型,具体定义如下:
| 状态值 | 状态名称 | 说明 | 样式类 |
|--------|----------|------|--------|
| `1` | 在任 | 正常任职状态 | primary |
| `2` | 到期 | 任期自然到期 | success |
| `3` | 辞职 | 干部主动辞职 | warning |
| `4` | 免职 | 被免去职务 | danger |
| `5` | 调任 | 职务调整调动 | info |
| `6` | 休学 | 因学生休学离任 | danger |
**关键字段说明** (基于实体类代码分析):
- `isCurrent`: 是否现任 (0-非现任,1-现任)
- `cadreStatus`: 学生职务任职状态
- `dismissalDate`: 离任日期
- `dismissalReason`: 离任原因
- `termStartDate`: 任期开始日期
- `termEndDate`: 任期结束日期
- `termDuration`: 任期时长(月)
#### 🔄 离任业务流程
##### 📋 完整离任流程
```
1. 验证干部信息存在性和状态
2. 计算任期时长 (term_start_date 到 term_end_date)
3. 更新干部状态为非现任 (is_current = 0)
4. 设置离任状态和原因
5. 更新任期结束日期和离任日期
6. 删除用户角色关联 (sys_user_role)
7. 记录操作日志
```
##### 💻 后端实现逻辑
**控制器接口**: `POST /xgClassPosMsg/xgClassPosMsg/dismiss/{id}`
**核心方法**: `XgClassPosMsgServiceImpl.dismissCadre()`
```java
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean dismissCadre(Long id, Date termEndDate, String cadreStatus, String dismissalReason) {
// 1. 查询并验证干部信息
XgClassPosMsg classPosMsg = baseMapper.selectById(id);
// 2. 计算任期时长
Long termDuration = calculateTermDuration(classPosMsg.getTermStartDate(), termEndDate);
// 3. 更新干部信息
XgClassPosMsg updateEntity = new XgClassPosMsg();
updateEntity.setId(id);
updateEntity.setTermEndDate(termEndDate);
updateEntity.setTermDuration(termDuration);
updateEntity.setCadreStatus(cadreStatus);
updateEntity.setDismissalReason(dismissalReason);
updateEntity.setDismissalDate(termEndDate);
updateEntity.setIsCurrent(0L); // 设置为非现任
baseMapper.updateById(updateEntity);
// 4. 删除用户角色关联
sysUserRoleMapper.delete(new LambdaQueryWrapper<SysUserRole>()
.eq(SysUserRole::getUserId, classPosMsg.getStudentId()));
return true;
}
```
##### 🎨 前端离任界面
**文件位置**: `web/src/views/xg/xsjcxx/xgClassPosMsg/xgClassPosMsg/index.vue`
**离任按钮**: 仅对 `is_current = 1` 的干部显示
```vue
<!-- 离任按钮 -->
<el-tooltip content="离任" placement="top">
<el-button
link
type="warning"
icon="ArrowDown"
@click="handleDismissal(scope.row)"
v-if="scope.row.isCurrent === 1"
></el-button>
</el-tooltip>
<!-- 离任对话框 -->
<el-dialog title="班级干部离任" v-model="dismissalDialog.visible" width="500px" append-to-body>
<el-form ref="dismissalFormRef" :model="dismissalForm" :rules="dismissalRules" label-width="140px">
<!-- 当前信息(只读) -->
<el-form-item label="班级名称" prop="className">
<el-input v-model="dismissalForm.className" disabled />
</el-form-item>
<el-form-item label="学生姓名" prop="studentName">
<el-input v-model="dismissalForm.studentName" disabled />
</el-form-item>
<el-form-item label="任期开始日期" prop="termStartDate">
<el-input v-model="dismissalForm.termStartDate" disabled />
</el-form-item>
<!-- 离任信息(可填写) -->
<el-form-item label="任期结束日期" prop="termEndDate">
<el-date-picker
clearable
v-model="dismissalForm.termEndDate"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择任期结束日期"
style="width: 100%"
/>
</el-form-item>
<el-form-item label="离任状态" prop="cadreStatus">
<el-select v-model="dismissalForm.cadreStatus" placeholder="请选择离任状态">
<el-option label="到期" value="2" />
<el-option label="辞职" value="3" />
<el-option label="免职" value="4" />
<el-option label="调任" value="5" />
<el-option label="休学" value="6" />
</el-select>
</el-form-item>
<el-form-item label="离任原因" prop="dismissalReason">
<el-input v-model="dismissalForm.dismissalReason" type="textarea" placeholder="请输入离任原因" />
</el-form-item>
</el-form>
</el-dialog>
```
#### 🔄 学生状态变更时的干部处理逻辑
- **休学**: `cadre_status = '6'`(休学),`is_current = 0`,`dismissal_reason = '学生休学'`
- **退学**: `cadre_status = '4'`(免职),`is_current = 0`,`dismissal_reason = '学生退学'`
- **毕业**: `cadre_status = '4'`(免职),`is_current = 0`,`dismissal_reason = '学生毕业'`
#### 💾 SQL批量处理脚本
```sql
-- 参数说明:
-- @student_id: 学生ID
-- @change_type: 变更类型 (XIU_XUE-休学, TUI_XUE-退学, BI_YE-毕业)
-- @operator_id: 操作员ID
-- @dismissal_date: 离任日期 (默认为当前日期)
SET @dismissal_date = COALESCE(@dismissal_date, CURDATE());
-- 1. 更新干部状态(休学)
UPDATE xg_class_pos_msg
SET is_current = 0,
cadre_status = '6', -- 休学状态
term_end_date = @dismissal_date,
dismissal_date = @dismissal_date,
dismissal_reason = '学生休学',
term_duration = TIMESTAMPDIFF(MONTH, term_start_date, @dismissal_date),
update_by = @operator_id,
update_time = NOW()
WHERE student_id = @student_id
AND is_current = 1
AND deleted = 0
AND @change_type = 'XIU_XUE';
-- 2. 更新干部状态(退学/毕业)
UPDATE xg_class_pos_msg
SET is_current = 0,
cadre_status = '4', -- 免职状态
term_end_date = @dismissal_date,
dismissal_date = @dismissal_date,
dismissal_reason = CASE
WHEN @change_type = 'TUI_XUE' THEN '学生退学'
WHEN @change_type = 'BI_YE' THEN '学生毕业'
ELSE '学生状态变更'
END,
term_duration = TIMESTAMPDIFF(MONTH, term_start_date, @dismissal_date),
update_by = @operator_id,
update_time = NOW()
WHERE student_id = @student_id
AND is_current = 1
AND deleted = 0
AND @change_type IN ('TUI_XUE', 'BI_YE');
```
### 2. 社团成员关系处理
#### 📊 数据库表结构
**表名**: `stgl_member` (原名 `club_member`,现已重构)
**主键**: `id` (bigint(20))
**核心关联字段**:
- `user_id`: 用户ID,关联学生用户ID
- `student_no`: 学号
- `student_name`: 学生姓名(冗余字段)
- `relation_id`: 关联ID(社团ID或志愿者队伍ID)
- `member_type`: 成员类型(1-社团成员,2-志愿者)
#### 🎯 成员状态字典
系统使用 `stgl_member_status` 字典类型,具体定义如下:
| 状态值 | 状态名称 | 说明 | 样式类 |
|--------|----------|------|--------|
| `0` | 待审核 | 申请加入,等待审核 | warning |
| `1` | 审核中 | 正在审核中 | info |
| `2` | 已加入 | 正式成员 | success |
| `3` | 已驳回 | 审核未通过 | danger |
| `4` | 已退出 | 已退出组织 | danger |
**关键字段说明** (基于实体类代码分析):
- `memberType`: 成员类型 (1-社团成员,2-志愿者)
- `userId`: 用户ID,对应学生ID
- `studentNo`: 学号
- `studentName`: 学生姓名
- `roleType`: 角色类型 (社长、副社长、部长、普通成员)
- `joinTime`: 加入时间
- `status`: 状态 (0-待审核,1-审核中,2-已加入,3-已驳回,4-已退出)
#### 🔄 退出处理逻辑
##### 📋 退出业务规则
- **适用范围**: 对所有状态为"待审核"(0)、"审核中"(1)、"已加入"(2)的成员
- **处理方式**: 将状态更新为"已退出"(4)
- **数据保留**: 保留历史记录,不物理删除
- **关联清理**: 不涉及其他关联数据的清理
##### 💻 后端实现逻辑
**所在模块**: `ruoyi-stgl` (社团管理模块)
**实体类**: `StglMember.java`
**服务类**: `StglMemberServiceImpl.java`
```java
// 社团成员实体类关键字段
@Data
@TableName("stgl_member")
public class StglMember extends TenantEntity {
private Long userId; // 用户ID
private String studentNo; // 学号
private String studentName; // 学生姓名
private Integer memberType; // 成员类型:1-社团成员,2-志愿者
private Long relationId; // 关联ID
private Integer status; // 状态:0-待审核,1-审核中,2-已加入,3-已驳回,4-已退出
private String roleType; // 角色类型
private Date joinTime; // 加入时间
}
```
##### 🎨 前端界面展示
**管理界面**: `stgl/member/index.vue`
**状态显示**: 使用字典标签显示成员状态
```vue
<!-- 成员状态列 -->
<el-table-column label="状态" align="center" prop="status" width="100">
<template #default="scope">
<dict-tag :options="stgl_member_status" :value="scope.row.status" />
</template>
</el-table-column>
```
#### 🔄 学生状态变更时的成员处理逻辑
- **休学**: 成员状态改为 `4`(已退出),退出原因为"学生休学"
- **退学**: 成员状态改为 `4`(已退出),退出原因为"学生退学"
- **毕业**: 成员状态改为 `4`(已退出),退出原因为"学生毕业"
#### 💾 SQL批量处理脚本
```sql
-- 参数说明:
-- @student_id: 学生ID (对应user_id)
-- @change_type: 变更类型 (XIU_XUE-休学, TUI_XUE-退学, BI_YE-毕业)
-- @operator_id: 操作员ID
-- 更新社团/志愿者成员状态为已退出
UPDATE stgl_member
SET status = 4, -- 已退出状态
update_by = @operator_id,
update_time = NOW(),
remark = CONCAT(COALESCE(remark, ''), ' | 退出原因:', CASE
WHEN @change_type = 'XIU_XUE' THEN '学生休学'
WHEN @change_type = 'TUI_XUE' THEN '学生退学'
WHEN @change_type = 'BI_YE' THEN '学生毕业'
ELSE '学生状态变更'
END, ' - ', NOW())
WHERE user_id = @student_id
AND status IN (0, 1, 2) -- 待审核、审核中、已加入
AND deleted = 0;
```
## 🔗 关联数据处理
### 1. 用户角色权限清理
#### 📋 角色关联表
**表名**: `sys_user_role`
**关联逻辑**: 当干部离任时,需要清理对应的用户角色关联
#### 🔄 清理逻辑
```java
// 在干部离任时执行角色清理
int deleteCount = sysUserRoleMapper.delete(new LambdaQueryWrapper<SysUserRole>()
.eq(SysUserRole::getUserId, classPosMsg.getStudentId()));
```
#### ⚠️ 注意事项
- **仅限干部离任**: 普通社团成员退出时不清理角色权限
- **角色识别**: 根据用户ID清理所有相关角色关联
- **权限回收**: 确保干部权限及时回收,避免安全风险
### 2. 数据一致性保证
#### 🛡️ 事务处理要求
```sql
-- 建议在学生状态变更的大事务中包含组织关系处理
START TRANSACTION;
-- 1. 更新学生学籍状态
UPDATE xg_student_msg SET student_status = ? WHERE id = ?;
-- 2. 处理班级干部关系
UPDATE xg_class_pos_msg SET is_current = 0, cadre_status = ? WHERE student_id = ?;
-- 3. 处理社团成员关系
UPDATE stgl_member SET status = 4 WHERE user_id = ?;
-- 4. 清理用户角色(如果需要)
DELETE FROM sys_user_role WHERE user_id = ?;
COMMIT;
```
#### 📊 处理统计
| 处理类型 | 涉及表数量 | 主要操作 |
|----------|------------|----------|
| 班级干部 | 2 (干部表+角色表) | 更新状态+清理权限 |
| 社团成员 | 1 (成员表) | 更新状态 |
| **总计** | **3个表** | **状态更新+权限清理** |
## ⚠️ 重要注意事项
### 1. 业务规则约束
- **干部离任**: 必须通过专门的离任接口,计算任期时长
- **成员退出**: 直接更新状态,不涉及权限清理
- **数据保留**: 所有操作都保留历史记录,便于审计
- **状态验证**: 操作前验证当前状态的合法性
### 2. 权限与安全
- **操作权限**: 干部离任需要专门的权限验证
- **角色清理**: 确保干部权限及时回收,防止权限泄露
- **审计记录**: 记录所有组织关系变更的操作日志
- **数据完整性**: 保证关联数据的完整性约束
### 3. 性能优化建议
- **批量处理**: 支持对多个学生的组织关系批量处理
- **索引优化**: 确保学生ID相关的查询有适当索引
- **事务控制**: 使用合适的事务隔离级别保证数据一致性
- **异步处理**: 大批量操作考虑异步处理机制
---
## 📅 更新记录
- **2025-12-XX**: 分文档创建,包含组织关系处理逻辑
- **2025-12-XX**: 基于代码分析完善技术实现细节和业务逻辑
- **后续更新**: 根据实际业务需求持续完善
---
*本分文档详细说明学生状态变更时的组织关系处理逻辑和技术实现,包括班级干部职务和社团成员关系的清理。*
@@ -0,0 +1,774 @@
# 03-经济资助处理
## 📋 概述
本分文档详细说明学生退学、休学、毕业处理中的经济资助业务处理内容,包括奖学金申请、获奖记录、勤工俭学和贫困生认定的变更逻辑。
## 💰 经济资助处理
### 1. 奖学金申请处理
#### 📊 数据库表结构
**表名**: `jcbt_scholarship_application`
**主键**: `id` (bigint(20))
**核心关联字段**:
- `batch_id`: 批次ID
- `scholarship_type_id`: 奖学金类型ID
- `student_id`: 学生ID
- `student_no`: 学号
- `student_name`: 学生姓名
#### 🎯 核心业务字段
基于数据库表 `jcbt_scholarship_application` 的实际结构:
| 字段名 | 类型 | 说明 | 默认值 |
|--------|------|------|--------|
| `current_status` | varchar(20) | 当前状态 | PENDING |
| `application_type` | varchar(20) | 申请类型(TEACHER_RECOMMEND/AUTO/DIRECT) | - |
| `calculated_score` | decimal(8,2) | 系统计算分数 | NULL |
| `final_score` | decimal(8,2) | 最终评定分数 | NULL |
| `ranking_in_dept` | int(11) | 院系排名 | NULL |
| `ranking_in_major` | int(11) | 专业排名 | NULL |
| `submit_time` | datetime | 提交时间 | NULL |
| `applicant_type` | varchar(20) | 申请人类型(STUDENT/TEACHER) | TEACHER |
#### 🎯 申请状态字典
系统使用 `jcbt_status` 字典类型(奖学金申请状态),具体定义如下:
| 状态值 | 状态名称 | 说明 | 样式类 |
|--------|----------|------|--------|
| `PENDING` | 待审核 | 申请已提交,等待审核 | warning |
| `APPROVED` | 已通过 | 审核通过,获得奖学金资格 | success |
| `REJECTED` | 已拒绝 | 审核未通过 | danger |
| `WITHDRAWN` | 已撤回 | 申请人主动撤回或系统自动撤回 | info |
**关键字段说明** (基于实体类代码分析):
- `currentStatus`: 当前状态 (PENDING/APPROVED/REJECTED/WITHDRAWN)
- `applicationType`: 申请类型 (RECOMMEND-教师推荐,AUTO-自动评定,DIRECT-直接指定)
- `calculatedScore`: 系统计算分数
- `finalScore`: 最终评定分数
- `rankingInDept`: 院系排名
- `rankingInMajor`: 专业排名
- `submitTime`: 提交时间
#### 🔄 奖学金评选流程
##### 📋 完整评选流程
```
1. 奖学金批次发布 → 学生申请提交
2. 学院初审 → 系统评分计算
3. 学生处终审 → 排名确定
4. 获奖公示 → 证书生成
5. 资金发放 → 档案归档
6. 学生状态变更 → 相应流程调整
```
##### 💻 后端实现逻辑
**实体类**: `JcbtScholarshipApplication.java`
**控制器**: `JcbtScholarshipApplicationController.java`
**服务类**: `JcbtScholarshipApplicationServiceImpl.java`
```java
// 奖学金申请实体类关键字段
@Data
@TableName("jcbt_scholarship_application")
public class JcbtScholarshipApplication extends BaseEntity {
private Long batchId; // 批次ID
private Long scholarshipTypeId; // 奖学金类型ID
private Long studentId; // 学生ID
private String studentNo; // 学号
private String studentName; // 学生姓名
private String currentStatus; // 当前状态
private String applicationType; // 申请类型
private Double calculatedScore; // 系统计算分数
private Double finalScore; // 最终评定分数
private Integer rankingInDept; // 院系排名
private Integer rankingInMajor; // 专业排名
private Date submitTime; // 提交时间
}
```
##### 🎨 前端界面展示
**管理界面**: `jcbt/scholarship/application/index.vue`
**状态显示**: 使用字典标签显示申请状态
```vue
<!-- 申请状态列 -->
<el-table-column label="申请状态" align="center" prop="currentStatus" width="120">
<template #default="scope">
<dict-tag :options="jcbt_application_status" :value="scope.row.currentStatus" />
</template>
</el-table-column>
<!-- 评分页数列 -->
<el-table-column label="最终得分" align="center" prop="finalScore" width="100">
<template #default="scope">
<span v-if="scope.row.finalScore">{{ scope.row.finalScore }}</span>
<span v-else class="text-muted">-</span>
</template>
</el-table-column>
<!-- 排名列 -->
<el-table-column label="院系排名" align="center" prop="rankingInDept" width="100">
<template #default="scope">
<span v-if="scope.row.rankingInDept">第{{ scope.row.rankingInDept }}名</span>
<span v-else class="text-muted">-</span>
</template>
</el-table-column>
```
#### 🔄 学生状态变更时的奖学金申请处理逻辑
- **休学**: `current_status = 'WITHDRAWN'`(撤回),保留重新申请可能
- **退学**: `current_status = 'REJECTED'`(拒绝),终止评选资格
- **毕业**: 保持 `APPROVED` 状态,保留获奖资格;其他状态设为 `WITHDRAWN`
#### 💾 SQL批量处理脚本
```sql
-- 参数说明:
-- @student_id: 学生ID
-- @change_type: 变更类型 (XIU_XUE-休学, TUI_XUE-退学, BI_YE-毕业)
-- @operator_id: 操作员ID
-- 更新奖学金申请状态
UPDATE jcbt_scholarship_application
SET current_status = CASE
WHEN @change_type = 'XIU_XUE' THEN 'WITHDRAWN' -- 休学:撤回,可重新申请
WHEN @change_type = 'TUI_XUE' THEN 'REJECTED' -- 退学:拒绝,终止评选资格
WHEN @change_type = 'BI_YE' THEN
CASE WHEN current_status = 'APPROVED' THEN 'APPROVED' -- 毕业:保持已通过状态
ELSE 'WITHDRAWN' -- 其他状态设为撤回
END
ELSE current_status
END,
update_by = @operator_id,
update_time = NOW()
WHERE student_id = @student_id
AND current_status NOT IN ('REJECTED') -- 已拒绝的不重复处理
AND deleted = 0;
```
### 2. 奖学金获奖记录处理
#### 📊 数据库表结构
**表名**: `jcbt_scholarship_award`
**主键**: `id` (bigint(20))
**核心关联字段**:
- `application_id`: 申请ID
- `batch_id`: 批次ID
- `scholarship_type_id`: 奖学金类型ID
- `student_id`: 学生ID
- `student_no`: 学号
- `student_name`: 学生姓名
#### 🎯 核心业务字段
| 字段名 | 类型 | 说明 | 默认值 |
|--------|------|------|--------|
| `award_no` | varchar(50) | 获奖编号 | - |
| `award_amount` | decimal(10,2) | 奖励金额 | - |
| `award_level` | varchar(20) | 获奖等级 | NULL |
| `final_score` | decimal(8,2) | 最终得分 | NULL |
| `ranking_in_dept` | int(11) | 院系排名 | NULL |
| `award_date` | date | 获奖日期 | - |
| `certificate_no` | varchar(100) | 证书编号 | NULL |
| `is_published` | tinyint(1) | 是否公示 | 0 |
| `publish_date` | date | 公示日期 | NULL |
| `is_paid` | tinyint(1) | 是否已发放 | 0 |
| `pay_date` | date | 发放日期 | NULL |
#### 🔄 奖学金发放流程
##### 📋 完整发放流程
```
1. 申请审核通过 → 生成获奖记录 (jcbt_scholarship_award)
2. 获奖信息确认 → 分配获奖编号和证书编号
3. 公示期开始 → 更新公示状态 (is_published = 1)
4. 公示期结束 → 如无异议,准备发放
5. 资金拨付 → 更新发放状态 (is_paid = 1)
6. 学生状态变更 → 根据情况调整发放流程
```
##### 💻 后端实现逻辑
虽然没有找到对应的实体类,但从数据库表结构可以推断业务逻辑:
```java
// 奖学金获奖记录关键业务逻辑(推断)
public class ScholarshipAwardService {
// 证书生成
public void generateCertificate(Long awardId) {
// 生成证书编号
// 更新 certificate_no 字段
}
// 公示处理
public void publishAward(Long awardId, Date publishDate) {
// 更新 is_published = 1
// 设置 publish_date
}
// 资金发放
public void payAward(Long awardId, Date payDate) {
// 更新 is_paid = 1
// 设置 pay_date
}
}
```
##### 🎨 前端界面展示
**管理界面**: `jcbt/scholarship/award/index.vue`
**状态显示**: 公示和发放状态的展示
```vue
<!-- 公示状态列 -->
<el-table-column label="公示状态" align="center" width="100">
<template #default="scope">
<el-tag v-if="scope.row.isPublished" type="success">已公示</el-tag>
<el-tag v-else type="warning">未公示</el-tag>
</template>
</el-table-column>
<!-- 发放状态列 -->
<el-table-column label="发放状态" align="center" width="100">
<template #default="scope">
<el-tag v-if="scope.row.isPaid" type="success">已发放</el-tag>
<el-tag v-else type="info">未发放</el-tag>
</template>
</el-table-column>
<!-- 证书编号列 -->
<el-table-column label="证书编号" align="center" prop="certificateNo" width="150">
<template #default="scope">
<span v-if="scope.row.certificateNo">{{ scope.row.certificateNo }}</span>
<span v-else class="text-muted">待生成</span>
</template>
</el-table-column>
```
#### 🔄 学生状态变更时的获奖记录处理逻辑
##### 📋 处理策略说明
- **休学**: 获奖记录保留,暂停发放流程,保留恢复发放的可能
- **退学**: 获奖记录保留作为档案,但取消发放资格,记录撤销原因
- **毕业**: 确保完成发放流程,确保证书和资金发放完整
##### 💾 SQL批量处理脚本
```sql
-- 参数说明:
-- @student_id: 学生ID
-- @student_no: 学生学号
-- @change_type: 变更类型 (XIU_XUE-休学, TUI_XUE-退学, BI_YE-毕业)
-- @operator_id: 操作员ID
-- @change_date: 状态变更日期 (默认为当前日期)
SET @change_date = COALESCE(@change_date, CURDATE());
-- 1. 休学处理:暂停发放流程,保留获奖记录
UPDATE jcbt_scholarship_award
SET remark = CONCAT(COALESCE(remark, ''), ' | 学生休学(', @change_date, '),获奖记录保留,发放流程暂停'),
update_by = @operator_id,
update_time = NOW()
WHERE student_id = @student_id
AND deleted = 0
AND @change_type = 'XIU_XUE';
-- 2. 退学处理:取消发放资格,保留获奖记录作为档案
UPDATE jcbt_scholarship_award
SET is_paid = CASE
WHEN is_paid = 0 THEN 0 -- 标记为不发放,保留记录作为档案
ELSE is_paid -- 已发放的不变
END,
pay_date = CASE
WHEN is_paid = 0 AND certificate_no IS NOT NULL THEN NULL -- 取消发放
ELSE pay_date
END,
remark = CONCAT(COALESCE(remark, ''), ' | 学生退学(', @change_date, '),取消发放资格,获奖记录作为档案保留'),
update_by = @operator_id,
update_time = NOW()
WHERE student_id = @student_id
AND deleted = 0
AND @change_type = 'TUI_XUE';
-- 3. 毕业处理:确保完成发放流程,归档获奖记录
UPDATE jcbt_scholarship_award
SET is_paid = CASE
WHEN is_paid = 0 AND certificate_no IS NOT NULL THEN 1 -- 确保证书发放
ELSE is_paid
END,
pay_date = CASE
WHEN is_paid = 0 AND certificate_no IS NOT NULL THEN @change_date -- 确保证书发放
ELSE pay_date
END,
remark = CONCAT(COALESCE(remark, ''), ' | 学生毕业(', @change_date, '),获奖记录正式归档'),
update_by = @operator_id,
update_time = NOW()
WHERE student_id = @student_id
AND deleted = 0
AND @change_type = 'BI_YE';
-- 统计处理结果
SELECT
@change_type as change_type,
COUNT(CASE WHEN @change_type = 'XIU_XUE' THEN 1 END) as leave_records,
COUNT(CASE WHEN @change_type = 'TUI_XUE' THEN 1 END) as drop_records,
COUNT(CASE WHEN @change_type = 'BI_YE' THEN 1 END) as graduate_records,
COUNT(*) as total_processed,
CONCAT('学生', @student_no, '状态变更,奖学金获奖记录处理完成') as operation_note
FROM jcbt_scholarship_award
WHERE student_id = @student_id
AND deleted = 0
AND (
(@change_type = 'XIU_XUE' AND remark LIKE CONCAT('%学生休学(', @change_date, ')%'))
OR (@change_type = 'TUI_XUE' AND remark LIKE CONCAT('%学生退学(', @change_date, ')%'))
OR (@change_type = 'BI_YE' AND remark LIKE CONCAT('%学生毕业(', @change_date, ')%'))
);
```
### 3. 勤工俭学申请处理
#### 📊 数据库表结构
**表名**: `jcbt_work_study_application`
**主键**: `id` (bigint(20), 雪花ID)
**核心关联字段**:
- `position_id`: 岗位ID
- `student_id`: 学生ID
- `student_number`: 学号
- `college_id`: 学院ID
#### 🎯 核心业务字段
| 字段名 | 类型 | 说明 | 默认值 |
|--------|------|------|--------|
| `status` | varchar(20) | 申请状态 | DRAFT |
| `application_date` | datetime | 申请提交时间 | - |
| `college_review_status` | varchar(20) | 学院审核状态 | NULL |
| `college_review_time` | datetime | 学院审核时间 | NULL |
| `final_review_status` | varchar(20) | 学生处审核状态 | NULL |
| `final_review_time` | datetime | 学生处审核时间 | NULL |
| `work_start_date` | date | 工作开始时间 | NULL |
| `work_end_date` | date | 工作结束时间 | NULL |
| `planned_work_hours` | int(11) | 计划工作时长 | NULL |
#### 🎯 申请状态字典
勤工俭学申请状态基于数据库字段定义,包含两级审核状态:
| 状态值 | 状态名称 | 说明 | 样式类 |
|--------|----------|------|--------|
| `DRAFT` | 草稿 | 申请草稿,尚未提交 | info |
| `SUBMITTED` | 已提交 | 已提交,等待审核 | warning |
| `COLLEGE_REVIEWING` | 学院审核中 | 学院正在审核 | primary |
| `COLLEGE_PASSED` | 学院审核通过 | 学院审核通过 | success |
| `COLLEGE_REJECTED` | 学院审核拒绝 | 学院审核拒绝 | danger |
| `FINAL_REVIEWING` | 学生处审核中 | 学生处正在审核 | primary |
| `APPROVED` | 审核通过 | 最终审核通过 | success |
| `REJECTED` | 审核拒绝 | 最终审核拒绝 | danger |
| `WITHDRAWN` | 已撤回 | 申请人撤回 | info |
**审核状态字段说明**:
- `college_review_status`: 学院审核状态(APPROVED/REJECTED)
- `final_review_status`: 学生处审核状态(APPROVED/REJECTED)
#### 🔄 勤工俭学审核流程
##### 📋 完整审核流程
```
1. 学生申请提交 → 状态: SUBMITTED
2. 学院审核 → 状态: COLLEGE_REVIEWING → COLLEGE_PASSED/COLLEGE_REJECTED
3. 学生处终审 → 状态: FINAL_REVIEWING → APPROVED/REJECTED
4. 工作安排 → 设置工作时间 (work_start_date, work_end_date)
5. 学生状态变更 → 相应流程调整
```
##### 💻 后端实现逻辑
**实体类**: `JcbtWorkStudyApplication.java`
**控制器**: `JcbtWorkStudyApplicationController.java`
**服务类**: `JcbtWorkStudyApplicationServiceImpl.java`
```java
// 勤工俭学申请实体类关键字段
@Data
@TableName("jcbt_work_study_application")
public class JcbtWorkStudyApplication extends BaseEntity {
private Long positionId; // 岗位ID
private String positionName; // 岗位名称
private Long studentId; // 学生ID
private String studentName; // 学生姓名
private String studentNumber; // 学号
private String status; // 申请状态
private String collegeReviewStatus; // 学院审核状态
private String finalReviewStatus; // 学生处审核状态
private Date workStartDate; // 工作开始时间
private Date workEndDate; // 工作结束时间
private Integer plannedWorkHours; // 计划工作时长
}
```
##### 🎨 前端界面展示
**管理界面**: `jcbt/workStudy/application/index.vue`
**状态显示**: 两级审核状态的展示
```vue
<!-- 申请状态列 -->
<el-table-column label="申请状态" align="center" prop="status" width="120">
<template #default="scope">
<dict-tag :options="work_study_application_status" :value="scope.row.status" />
</template>
</el-table-column>
<!-- 学院审核状态列 -->
<el-table-column label="学院审核" align="center" width="100">
<template #default="scope">
<el-tag v-if="scope.row.collegeReviewStatus === 'APPROVED'" type="success">通过</el-tag>
<el-tag v-else-if="scope.row.collegeReviewStatus === 'REJECTED'" type="danger">拒绝</el-tag>
<el-tag v-else type="warning">审核中</el-tag>
</template>
</el-table-column>
<!-- 学生处审核状态列 -->
<el-table-column label="学生处审核" align="center" width="100">
<template #default="scope">
<el-tag v-if="scope.row.finalReviewStatus === 'APPROVED'" type="success">通过</el-tag>
<el-tag v-else-if="scope.row.finalReviewStatus === 'REJECTED'" type="danger">拒绝</el-tag>
<el-tag v-else type="warning">审核中</el-tag>
</template>
</el-table-column>
<!-- 工作时间列 -->
<el-table-column label="工作时间" align="center" width="200">
<template #default="scope">
<span v-if="scope.row.workStartDate && scope.row.workEndDate">
{{ parseTime(scope.row.workStartDate, '{y}-{m}-{d}') }} 至
{{ parseTime(scope.row.workEndDate, '{y}-{m}-{d}') }}
</span>
<span v-else class="text-muted">未安排</span>
</template>
</el-table-column>
```
#### 🔄 学生状态变更时的勤工俭学申请处理逻辑
- **休学**: `status = 'WITHDRAWN'`(撤回),终止当前工作,保留重新申请可能
- **退学**: `status = 'REJECTED'`(拒绝),终止所有相关安排
- **毕业**: 保持 `APPROVED` 状态,其他状态设为 `WITHDRAWN`
#### 💾 SQL批量处理脚本
```sql
-- 参数说明:
-- @student_id: 学生ID
-- @change_type: 变更类型 (XIU_XUE-休学, TUI_XUE-退学, BI_YE-毕业)
-- @operator_id: 操作员ID
-- 更新勤工俭学申请状态
UPDATE jcbt_work_study_application
SET status = CASE
WHEN @change_type = 'XIU_XUE' THEN 'WITHDRAWN' -- 休学:撤回,可重新申请
WHEN @change_type = 'TUI_XUE' THEN 'REJECTED' -- 退学:拒绝,终止资格
WHEN @change_type = 'BI_YE' THEN
CASE WHEN status = 'APPROVED' THEN 'APPROVED' -- 毕业:保持已通过状态
ELSE 'WITHDRAWN' -- 其他状态设为撤回
END
ELSE status
END,
-- 更新审核状态
college_review_status = CASE
WHEN @change_type IN ('XIU_XUE', 'TUI_XUE') AND college_review_status IS NOT NULL THEN 'REJECTED'
ELSE college_review_status
END,
final_review_status = CASE
WHEN @change_type IN ('XIU_XUE', 'TUI_XUE') AND final_review_status IS NOT NULL THEN 'REJECTED'
ELSE final_review_status
END,
final_review_time = CASE
WHEN @change_type IN ('XIU_XUE', 'TUI_XUE') THEN NOW()
ELSE final_review_time
END,
final_reviewer_id = CASE
WHEN @change_type IN ('XIU_XUE', 'TUI_XUE') THEN @operator_id
ELSE final_reviewer_id
END,
final_reviewer_name = CASE
WHEN @change_type IN ('XIU_XUE', 'TUI_XUE') THEN '系统'
ELSE final_reviewer_name
END,
final_review_comment = CASE
WHEN @change_type IN ('XIU_XUE', 'TUI_XUE') THEN CONCAT('学生', @change_type, ',岗位申请自动终止')
ELSE final_review_comment
END,
-- 如果是进行中的工作,设置结束时间
work_end_date = CASE
WHEN @change_type IN ('XIU_XUE', 'TUI_XUE') AND status = 'APPROVED' THEN CURDATE()
ELSE work_end_date
END,
update_by = @operator_id,
update_time = NOW()
WHERE student_id = @student_id
AND status NOT IN ('REJECTED', 'COLLEGE_REJECTED') -- 已拒绝的不重复处理
AND deleted = 0;
```
### 4. 贫困生认定申请处理
#### 📊 数据库表结构
**表名**: `jcbt_poverty_application`
**主键**: `id` (bigint(20))
**核心关联字段**:
- `student_id`: 学生ID
- `student_no`: 学号
- `college_id`: 学院ID
- `major_id`: 专业ID
- `class_id`: 班级ID
#### 🎯 核心业务字段
| 字段名 | 类型 | 说明 | 默认值 |
|--------|------|------|--------|
| `application_no` | varchar(32) | 申请编号 | - |
| `academic_year` | varchar(20) | 学年 | - |
| `term` | tinyint(1) | 学期 | - |
| `status` | varchar(20) | 申请状态 | DRAFT |
| `recognition_group` | varchar(20) | 认定群体 | - |
| `recognition_type_id` | bigint(20) | 认定类型ID | - |
| `submit_time` | datetime | 提交时间 | NULL |
| `audit_time` | datetime | 审核时间 | NULL |
#### 🎯 申请状态字典
贫困生认定申请状态基于数据库表定义:
| 状态值 | 状态名称 | 说明 | 样式类 |
|--------|----------|------|--------|
| `DRAFT` | 草稿 | 申请草稿,尚未提交 | info |
| `SUBMITTED` | 已提交 | 已提交,等待审核 | warning |
| `REVIEWING` | 审核中 | 正在审核中 | primary |
| `APPROVED` | 已通过 | 审核通过,获得贫困生资格 | success |
| `REJECTED` | 已拒绝 | 审核未通过 | danger |
| `WITHDRAWN` | 已撤回 | 申请人主动撤回 | info |
| `REVOKED` | 已撤销 | 资格被撤销 | danger |
**特殊状态说明**:
- `SUSPENDED`: 暂停状态(文档中提到但数据库中未定义,可能需要扩展)
- `COMPLETED`: 完成状态(毕业时的最终状态)
#### 🔄 贫困生认定流程
##### 📋 完整认定流程
```
1. 学生申请提交 → 状态: SUBMITTED
2. 班主任审核 → 学院评审小组审核
3. 学校认定委员会终审 → 状态: APPROVED/REJECTED
4. 资格确认 → 发放相关资助
5. 学生状态变更 → 根据情况调整认定资格
```
##### 💻 后端实现逻辑
**实体类**: `JcbtPovertyApplication.java`
**控制器**: `JcbtPovertyApplicationController.java`
**服务类**: `JcbtPovertyApplicationServiceImpl.java`
```java
// 贫困生认定申请实体类关键字段
@Data
@TableName("jcbt_poverty_application")
public class JcbtPovertyApplication extends BaseEntity {
private String applicationNo; // 申请编号
private String academicYear; // 学年
private Integer term; // 学期
private Long studentId; // 学生ID
private String studentNo; // 学号
private String studentName; // 学生姓名
private String status; // 申请状态
private String recognitionGroup; // 认定群体
private Long recognitionTypeId; // 认定类型ID
private Date submitTime; // 提交时间
private Date auditTime; // 审核时间
}
```
##### 🎨 前端界面展示
**管理界面**: `jcbt/poverty/application/index.vue`
**状态显示**: 认定状态的展示
```vue
<!-- 申请状态列 -->
<el-table-column label="申请状态" align="center" prop="status" width="120">
<template #default="scope">
<dict-tag :options="poverty_application_status" :value="scope.row.status" />
</template>
</el-table-column>
<!-- 认定群体列 -->
<el-table-column label="认定群体" align="center" prop="recognitionGroup" width="120">
<template #default="scope">
<span>{{ scope.row.recognitionGroup }}</span>
</template>
</el-table-column>
<!-- 认定类型列 -->
<el-table-column label="认定类型" align="center" prop="recognitionTypeName" width="150">
<template #default="scope">
<span>{{ scope.row.recognitionTypeName }}</span>
</template>
</el-table-column>
```
#### 🔄 学生状态变更时的贫困生认定处理逻辑
- **休学**: 认定记录保留,资格暂时维持(可根据业务需求调整为WITHDRAWN)
- **退学**: 认定资格撤销(REVOKED),终止贫困生资格
- **毕业**: 认定流程完成,记录保持APPROVED状态
#### 💾 SQL批量处理脚本
```sql
-- 参数说明:
-- @student_id: 学生ID
-- @change_type: 变更类型 (XIU_XUE-休学, TUI_XUE-退学, BI_YE-毕业)
-- @operator_id: 操作员ID
-- 更新贫困生认定状态
UPDATE jcbt_poverty_application
SET status = CASE
WHEN @change_type = 'XIU_XUE' THEN
CASE WHEN status = 'APPROVED' THEN 'APPROVED' -- 休学:保持认定资格
ELSE status
END
WHEN @change_type = 'TUI_XUE' THEN 'REVOKED' -- 退学:撤销认定
WHEN @change_type = 'BI_YE' THEN status -- 毕业:保持现有状态
ELSE status
END,
-- 更新审核信息(仅退学时更新)
audit_time = CASE
WHEN @change_type = 'TUI_XUE' THEN NOW()
ELSE audit_time
END,
auditor_id = CASE
WHEN @change_type = 'TUI_XUE' THEN @operator_id
ELSE auditor_id
END,
auditor_name = CASE
WHEN @change_type = 'TUI_XUE' THEN '系统'
ELSE auditor_name
END,
audit_opinion = CASE
WHEN @change_type = 'TUI_XUE' THEN '学生退学,贫困生认定撤销'
ELSE audit_opinion
END,
update_by = @operator_id,
update_time = NOW()
WHERE student_id = @student_id
AND status NOT IN ('REVOKED') -- 已撤销的不重复处理
AND deleted = 0;
```
## 🔗 经济资助业务关联处理
### 1. 业务数据一致性保证
#### 🛡️ 事务处理要求
```sql
-- 建议在学生状态变更的大事务中包含所有经济资助处理
START TRANSACTION;
-- 1. 更新学生学籍状态
UPDATE xg_student_msg SET student_status = ? WHERE id = ?;
-- 2. 处理奖学金申请
UPDATE jcbt_scholarship_application SET current_status = ? WHERE student_id = ?;
-- 3. 处理奖学金获奖记录
UPDATE jcbt_scholarship_award SET remark = CONCAT(remark, ?) WHERE student_id = ?;
-- 4. 处理勤工俭学申请
UPDATE jcbt_work_study_application SET status = ? WHERE student_id = ?;
-- 5. 处理贫困生认定
UPDATE jcbt_poverty_application SET status = ? WHERE student_id = ?;
COMMIT;
```
#### 📊 处理统计表
| 业务模块 | 涉及表数量 | 处理类型 | 重要程度 |
|----------|------------|----------|----------|
| 奖学金申请 | 1 (jcbt_scholarship_application) | 状态更新 | ⭐⭐⭐⭐ |
| 奖学金获奖 | 1 (jcbt_scholarship_award) | 发放调整 | ⭐⭐⭐⭐⭐ |
| 勤工俭学 | 1 (jcbt_work_study_application) | 审核终止 | ⭐⭐⭐⭐ |
| 贫困生认定 | 1 (jcbt_poverty_application) | 资格调整 | ⭐⭐⭐⭐ |
| **总计** | **4个表** | **状态更新+流程调整** | **⭐⭐⭐⭐⭐** |
### 2. 业务规则和约束
#### 📋 状态变更矩阵
| 当前状态 | 休学处理 | 退学处理 | 毕业处理 |
|----------|----------|----------|----------|
| 奖学金申请中 | 撤回(WITHDRAWN) | 拒绝(REJECTED) | 保持通过/撤回 |
| 奖学金已通过 | 记录保留 | 取消发放 | 确保证书发放 |
| 勤工俭学进行中 | 撤回(WITHDRAWN) | 拒绝(REJECTED) | 保持通过/撤回 |
| 贫困生已认定 | 保持认定资格 | 撤销(REVOKED) | 保持认定状态 |
#### ⚠️ 重要业务约束
- **资金安全**: 奖学金获奖记录涉及实际资金,不得随意删除
- **证书管理**: 已发放证书的记录必须保留发放状态
- **公示流程**: 已公示的奖学金变更可能需要重新公示
- **档案完整性**: 所有经济资助记录作为学生档案的重要组成部分
### 3. 监控和审计要求
#### 📊 数据完整性检查
```sql
-- 检查处理结果的完整性
SELECT
'奖学金申请' as module,
COUNT(*) as total_count,
COUNT(CASE WHEN current_status IN ('WITHDRAWN', 'REJECTED', 'APPROVED') THEN 1 END) as processed_count
FROM jcbt_scholarship_application
WHERE student_id = @student_id AND deleted = 0
UNION ALL
SELECT
'奖学金获奖' as module,
COUNT(*) as total_count,
COUNT(CASE WHEN remark LIKE '%学生%' THEN 1 END) as processed_count
FROM jcbt_scholarship_award
WHERE student_id = @student_id AND deleted = 0
UNION ALL
SELECT
'勤工俭学' as module,
COUNT(*) as total_count,
COUNT(CASE WHEN status IN ('WITHDRAWN', 'REJECTED', 'APPROVED') THEN 1 END) as processed_count
FROM jcbt_work_study_application
WHERE student_id = @student_id AND deleted = 0
UNION ALL
SELECT
'贫困生认定' as module,
COUNT(*) as total_count,
COUNT(CASE WHEN status IN ('SUSPENDED', 'REVOKED', 'COMPLETED') THEN 1 END) as processed_count
FROM jcbt_poverty_application
WHERE student_id = @student_id AND deleted = 0;
```
#### 📝 审计日志记录
```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 (
'经济资助业务处理', 'UPDATE', 'processEconomicSupport', 'PROCEDURE', 'MANAGE',
@operator_name, @dept_name, '/economic/support/process', @client_ip, @location,
CONCAT('学生ID:', @student_id, ',学号:', @student_no, ',变更类型:', @change_type),
@process_result_json, 0, NULL, NOW()
);
```
---
## 📅 更新记录
- **2025-12-XX**: 分文档创建,包含经济资助处理逻辑
- **2025-12-XX**: 基于代码分析完善技术实现细节和业务逻辑
- **后续更新**: 根据实际业务需求持续完善
---
*本分文档详细说明学生状态变更时的经济资助业务处理逻辑和技术实现,包括奖学金、勤工俭学和贫困生认定的完整处理方案。*
@@ -0,0 +1,858 @@
# 04-其他业务处理
## 📋 概述
本分文档详细说明学生退学、休学、毕业处理中的其他业务模块处理内容,包括住宿管理、心理健康、实践活动和其他关联信息的变更逻辑。
## 🏠 住宿管理
### 1. 宿舍管理退宿处理
#### 📊 数据库表结构
##### 床位分配表 (xg_dorm_bed_student)
| 字段名 | 类型 | 说明 | 默认值 |
|--------|------|------|--------|
| `id` | bigint(20) | 主键ID | - |
| `student_id` | bigint(20) | 学生ID | - |
| `bed_id` | bigint(20) | 床位ID | - |
| `room_id` | bigint(20) | 房间ID | - |
| `building_id` | bigint(20) | 宿舍楼ID | - |
| `campus_id` | bigint(20) | 校区ID | - |
| `status` | varchar(10) | 状态(0正常 1已退宿) | - |
| `assign_time` | datetime | 分配时间 | - |
| `checkout_time` | datetime | 退宿时间 | NULL |
| `remark` | varchar(100) | 备注 | NULL |
| `deleted` | varchar(1) | 删除标志 | 0 |
**关键字段说明** (基于实体类代码分析):
- `studentId`: 学生ID
- `bedId`: 床位ID
- `roomId`: 房间ID
- `buildingId`: 宿舍楼ID
- `campusId`: 校区ID
- `status`: 状态(0正常 1已退宿)
- `assignTime`: 分配时间
- `checkoutTime`: 退宿时间
##### 宿舍申请表 (xg_dorm_application)
| 字段名 | 类型 | 说明 |
|--------|------|------|
| `application_type` | char(1) | 申请类型(1调宿 2退宿) |
| `application_status` | varchar(20) | 审批状态 |
#### 🔄 宿舍退宿业务流程
##### 📋 完整退宿流程
```
1. 接收退宿申请或状态变更触发
2. 验证学生当前住宿状态
3. 检查是否有未完成的宿舍申请
4. 更新床位分配状态为已退宿
5. 处理相关的宿舍申请状态
6. 记录退宿操作日志
7. 释放床位资源供其他学生使用
```
##### 💻 后端实现逻辑
**实体类**: `XgDormBedStudent.java`
**服务类**: `XgDormBedStudentServiceImpl.java`
```java
// 宿舍床位学生分配实体类关键字段
@Data
@TableName("xg_dorm_bed_student")
public class XgDormBedStudent extends TenantEntity {
private Long studentId; // 学生ID
private Long bedId; // 床位ID
private Long roomId; // 房间ID
private Long buildingId; // 宿舍楼ID
private Long campusId; // 校区ID
private String status; // 状态:0-正常,1-已退宿
private Date assignTime; // 分配时间
private Date checkoutTime; // 退宿时间
private String remark; // 备注
}
```
##### 🎨 前端界面展示
**管理界面**: `xg/dorm/bedStudent/index.vue`
**状态显示**: 住宿状态的展示
```vue
<!-- 住宿状态列 -->
<el-table-column label="住宿状态" align="center" prop="status" width="100">
<template #default="scope">
<el-tag v-if="scope.row.status === '0'" type="success">在住</el-tag>
<el-tag v-else-if="scope.row.status === '1'" type="info">已退宿</el-tag>
<el-tag v-else type="warning">未知</el-tag>
</template>
</el-table-column>
<!-- 退宿时间列 -->
<el-table-column label="退宿时间" align="center" prop="checkoutTime" width="180">
<template #default="scope">
<span v-if="scope.row.checkoutTime">
{{ parseTime(scope.row.checkoutTime, '{y}-{m}-{d} {h}:{i}') }}
</span>
<span v-else class="text-muted">-</span>
</template>
</el-table-column>
```
#### 🔄 学生状态变更时的宿舍处理逻辑
##### 📋 处理策略说明
- **休学**: 可选择保留宿舍或办理暂退宿(根据学校政策)
- **退学**: 必须办理正式退宿,释放床位资源
- **毕业**: 办理毕业退宿,释放床位资源
##### 💾 SQL批量处理脚本
```sql
-- 参数说明:
-- @student_id: 学生ID
-- @change_type: 变更类型 (XIU_XUE-休学, TUI_XUE-退学, BI_YE-毕业)
-- @operator_id: 操作员ID
-- @checkout_time: 退宿时间 (默认为当前时间)
SET @checkout_time = COALESCE(@checkout_time, NOW());
-- 1. 退学/毕业:必须办理正式退宿
UPDATE xg_dorm_bed_student
SET status = '1', -- 已退宿
checkout_time = @checkout_time,
update_by = @operator_id,
update_time = NOW(),
remark = CONCAT(COALESCE(remark, ''), ' | 学生', @change_type, '退宿')
WHERE student_id = @student_id
AND status = '0' -- 当前在住
AND deleted = '0'
AND @change_type IN ('TUI_XUE', 'BI_YE');
-- 2. 处理进行中的宿舍申请
UPDATE xg_dorm_application
SET application_status = CASE
WHEN application_type = '1' THEN 'cancel' -- 调宿申请:取消
WHEN application_type = '2' THEN 'finish' -- 退宿申请:完成
ELSE application_status
END,
update_by = @operator_id,
update_time = NOW()
WHERE student_id = @student_id
AND application_status IN ('draft', 'waiting') -- 草稿和待审核状态
AND deleted = '0';
-- 3. 休学处理(可选:根据学校政策决定是否保留宿舍)
-- 如果学校允许休学保留宿舍,则注释掉下面的UPDATE语句
-- 如果需要休学退宿,取消下面的注释:
-- UPDATE xg_dorm_bed_student
-- SET status = '1', -- 已退宿
-- checkout_time = @checkout_time,
-- update_by = @operator_id,
-- update_time = NOW(),
-- remark = CONCAT(COALESCE(remark, ''), ' | 学生休学暂退宿')
-- WHERE student_id = @student_id
-- AND status = '0'
-- AND deleted = '0'
-- AND @change_type = 'XIU_XUE';
```
## 🧠 心理健康管理
### 2. 心理咨询预约处理
#### 📊 数据库表结构
##### 咨询预约表 (xljk_consultation_appointment)
| 字段名 | 类型 | 说明 | 默认值 |
|--------|------|------|--------|
| `id` | bigint(20) | 主键ID | - |
| `student_id` | bigint(20) | 学生ID | - |
| `counselor_id` | bigint(20) | 咨询师ID | - |
| `schedule_id` | bigint(20) | 预约时段ID | - |
| `appointment_date` | date | 预约日期 | - |
| `status` | char(1) | 状态(0待咨询 1已完成 2已取消 3未到访) | '0' |
| `appointment_time` | varchar(20) | 预约时间段 | - |
| `reason` | varchar(500) | 咨询原因 | NULL |
| `consult_theme` | varchar(50) | 咨询主题 | NULL |
##### 未到访记录表 (xljk_consultation_no_show)
| 字段名 | 类型 | 说明 |
|--------|------|------|
| `student_id` | bigint(20) | 学生ID |
| `appointment_id` | bigint(20) | 预约记录ID |
| `no_show_date` | date | 未到访日期 |
| `expire_date` | date | 限制到期日 |
| `status` | char(1) | 状态(0生效中 1已过期 2已解除) |
#### 🎯 预约状态字典
| 状态值 | 状态名称 | 说明 |
|--------|----------|------|
| `0` | 待咨询 | 已预约,等待咨询 |
| `1` | 已完成 | 咨询已完成 |
| `2` | 已取消 | 预约已取消 |
| `3` | 未到访 | 预约时间已过,未到访 |
#### 🔄 心理咨询预约处理流程
##### 📋 处理逻辑说明
- **预约取消**: 取消所有未来预约,状态改为"已取消"
- **未到访处理**: 解除未到访限制,避免影响其他学生预约
- **历史保留**: 保留已完成的咨询记录作为心理健康档案
##### 💻 后端实现逻辑
**实体类**: `XljkConsultationAppointment.java`
**服务类**: `XljkConsultationAppointmentServiceImpl.java`
```java
// 心理咨询预约实体类关键字段
@Data
public class XljkConsultationAppointment {
private Long id;
private Long studentId;
private Long counselorId;
private Long scheduleId;
private Date appointmentDate;
private String status; // 状态:0-待咨询,1-已完成,2-已取消,3-未到访
private String appointmentTime;
private String reason;
private String consultTheme;
private Integer communicationDuration; // 沟通时长
private String consultationContent; // 咨询内容
private String counselorSuggestion; // 咨询师建议
}
```
##### 🎨 前端界面展示
**管理界面**: `xljk/consultation/appointment/index.vue`
**状态显示**: 预约状态的展示
```vue
<!-- 预约状态列 -->
<el-table-column label="预约状态" align="center" prop="status" width="100">
<template #default="scope">
<el-tag v-if="scope.row.status === '0'" type="primary">待咨询</el-tag>
<el-tag v-else-if="scope.row.status === '1'" type="success">已完成</el-tag>
<el-tag v-else-if="scope.row.status === '2'" type="warning">已取消</el-tag>
<el-tag v-else-if="scope.row.status === '3'" type="danger">未到访</el-tag>
</template>
</el-table-column>
<!-- 预约日期列 -->
<el-table-column label="预约日期" align="center" prop="appointmentDate" width="120">
<template #default="scope">
{{ parseTime(scope.row.appointmentDate, '{y}-{m}-{d}') }}
</template>
</el-table-column>
```
#### 🔄 学生状态变更时的心理咨询处理逻辑
##### 📋 处理策略说明
- **休学**: 取消未来预约,保留历史咨询记录
- **退学**: 取消未来预约,解除未到访限制
- **毕业**: 取消未来预约,保留完整心理健康档案
##### 💾 SQL批量处理脚本
```sql
-- 参数说明:
-- @student_id: 学生ID
-- @change_type: 变更类型 (XIU_XUE-休学, TUI_XUE-退学, BI_YE-毕业)
-- @operator_id: 操作员ID
-- 1. 取消未来的心理咨询预约
UPDATE xljk_consultation_appointment
SET status = '2', -- 已取消
update_by = @operator_id,
update_time = NOW()
WHERE student_id = @student_id
AND status = '0' -- 待咨询
AND appointment_date >= CURDATE() -- 未来的预约
AND deleted = 0;
-- 2. 处理未到访记录(解除限制)
UPDATE xljk_consultation_no_show
SET status = '2', -- 已解除
expire_date = NOW(), -- 设置过期时间为当前时间
update_by = @operator_id,
update_time = NOW()
WHERE student_id = @student_id
AND status = '0' -- 生效中
AND deleted = 0;
```
## 🎓 实践活动管理
### 3. 学生活动报名处理
#### 📊 数据库表结构
##### 活动报名表 (stgl_activity_registration)
| 字段名 | 类型 | 说明 | 默认值 |
|--------|------|------|--------|
| `id` | bigint(20) | 主键ID | - |
| `activity_id` | bigint(20) | 活动ID | - |
| `user_id` | bigint(20) | 用户ID | - |
| `student_no` | varchar(50) | 学号 | - |
| `student_name` | varchar(50) | 学生姓名 | - |
| `registration_type` | varchar(10) | 报名类型(1个人 2团队) | - |
| `team_id` | bigint(20) | 团队ID | NULL |
| `registration_time` | datetime | 报名时间 | - |
| `approval_status` | varchar(10) | 审核状态(0待审核 1通过 2驳回) | '0' |
**关键字段说明** (基于实体类代码分析):
- `activityId`: 活动ID
- `userId`: 用户ID
- `studentNo`: 学号
- `registrationType`: 报名类型(1个人 2团队)
- `approvalStatus`: 审核状态(0待审核 1通过 2驳回)
- `approvalTime`: 审核时间
- `score`: 获得成绩
| `approval_time` | datetime | 审核时间 | NULL |
| `score` | varchar(20) | 获得成绩 | NULL |
#### 🎯 审核状态字典
| 状态值 | 状态名称 | 说明 |
|--------|----------|------|
| `0` | 待审核 | 报名已提交,等待审核 |
| `1` | 通过 | 审核通过,可以参加活动 |
| `2` | 驳回 | 审核未通过 |
#### 🔄 学生活动报名处理流程
##### 📋 处理逻辑说明
- **活动状态判断**: 需要关联活动表判断活动是否已开始或结束
- **报名类型区分**: 个人报名和团队报名的处理逻辑不同
- **成绩处理**: 已获得成绩的记录需要特殊处理
##### 💻 后端实现逻辑
**实体类**: `StglActivityRegistration.java`
**服务类**: `StglActivityRegistrationServiceImpl.java`
```java
// 学生活动报名实体类关键字段
@Data
@TableName("stgl_activity_registration")
public class StglActivityRegistration extends TenantEntity {
private Long activityId; // 活动ID
private Long userId; // 用户ID
private String studentNo; // 学号
private String studentName; // 学生姓名
private String registrationType; // 报名类型:1-个人,2-团队
private Long teamId; // 团队ID
private Date registrationTime; // 报名时间
private String approvalStatus; // 审核状态:0-待审核,1-通过,2-驳回
private Date approvalTime; // 审核时间
private Long approvalBy; // 审核人
private String approvalRemark; // 审核意见
private String score; // 获得成绩
}
```
##### 🎨 前端界面展示
**管理界面**: `stgl/activity/registration/index.vue`
**状态显示**: 报名审核状态的展示
```vue
<!-- 审核状态列 -->
<el-table-column label="审核状态" align="center" prop="approvalStatus" width="100">
<template #default="scope">
<el-tag v-if="scope.row.approvalStatus === '0'" type="warning">待审核</el-tag>
<el-tag v-else-if="scope.row.approvalStatus === '1'" type="success">通过</el-tag>
<el-tag v-else-if="scope.row.approvalStatus === '2'" type="danger">驳回</el-tag>
</template>
</el-table-column>
<!-- 报名类型列 -->
<el-table-column label="报名类型" align="center" prop="registrationType" width="100">
<template #default="scope">
<span v-if="scope.row.registrationType === '1'">个人</span>
<span v-else-if="scope.row.registrationType === '2'">团队</span>
</template>
</el-table-column>
```
#### 🔄 学生状态变更时的活动报名处理逻辑
##### 📋 处理策略说明
- **休学**: 驳回未开始的活动报名,保留已完成活动的记录和成绩
- **退学**: 驳回所有进行中的活动报名
- **毕业**: 可选择保留已完成活动的记录和成绩,驳回进行中的报名
##### 💾 SQL批量处理脚本
```sql
-- 参数说明:
-- @student_no: 学生学号
-- @change_type: 变更类型 (XIU_XUE-休学, TUI_XUE-退学, BI_YE-毕业)
-- @operator_id: 操作员ID
-- 驳回进行中的活动报名
UPDATE stgl_activity_registration
SET approval_status = '2', -- 驳回状态
approval_time = NOW(),
approval_by = @operator_id,
approval_remark = CONCAT('学生', @change_type, ',活动报名自动驳回'),
update_by = @operator_id,
update_time = NOW()
WHERE student_no = @student_no
AND approval_status = '1' -- 已通过的报名
AND EXISTS (
SELECT 1 FROM stgl_activity a
WHERE a.id = stgl_activity_registration.activity_id
AND a.activity_start_time > NOW() -- 未开始的活动
AND (@change_type = 'TUI_XUE' OR -- 退学:驳回所有进行中
(@change_type IN ('XIU_XUE', 'BI_YE') AND a.activity_end_time > NOW())) -- 休学/毕业:只驳回未结束的
)
AND deleted = 0;
```
### 4. 志愿者队伍管理
#### 📊 数据库表结构
**表名**: `stgl_volunteer_team` (队伍信息表)
- 主要存储志愿者队伍的基本信息
- 成员关系可能通过其他表关联或记录在日志中
#### 🔄 志愿者关系处理逻辑
##### 📋 处理策略说明
- **队伍管理**: 志愿者队伍本身不因学生状态变更而改变
- **成员关系**: 如果有专门的成员关系表,需要更新成员状态
- **日志记录**: 记录志愿服务关系的变更情况
##### 💾 SQL批量处理脚本
```sql
-- 参数说明:
-- @student_no: 学生学号
-- @change_type: 变更类型 (XIU_XUE-休学, TUI_XUE-退学, BI_YE-毕业)
-- @operator_id: 操作员ID
-- 注意:stgl_volunteer_team表主要是队伍信息表
-- 如果存在志愿者成员关系表,执行成员状态更新
-- 这里以假设存在stgl_volunteer_member表为例
-- 如果存在志愿者成员关系表,执行:
UPDATE stgl_volunteer_member
SET member_status = 'INACTIVE',
leave_time = NOW(),
leave_reason = CONCAT('学生', @change_type),
update_by = @operator_id,
update_time = NOW()
WHERE student_no = @student_no
AND member_status = 'ACTIVE'
AND deleted = 0;
-- 记录操作日志
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, cost_time
) VALUES (
'志愿者管理', 'OTHER', 'updateVolunteerStatus', 'UPDATE', 'MANAGE',
'系统', '系统', '/volunteer/status/update', '127.0.0.1', '本地',
CONCAT('学生', @student_no, '状态变更(', @change_type, '),志愿者关系处理'),
'{}', 0, NULL, NOW(), 0
);
```
### 5. 实习信息终止处理
#### 📊 数据库表结构
##### 实习信息表 (zsjy_internship_info)
| 字段名 | 类型 | 说明 | 默认值 |
|--------|------|------|--------|
| `internship_id` | bigint(20) | 主键ID | - |
| `student_id` | bigint(20) | 学生ID | - |
| `student_no` | varchar(50) | 学号 | - |
| `student_name` | varchar(100) | 学生姓名 | - |
| `company_name` | varchar(200) | 实习单位名称 | - |
| `position_name` | varchar(100) | 岗位名称 | - |
| `start_date` | date | 实习开始日期 | - |
| `end_date` | date | 实习结束日期 | - |
| `actual_end_date` | date | 实际结束日期 | NULL |
| `internship_status` | char(1) | 实习状态(1进行中 2已完成 3中断) | '1' |
**关键字段说明** (基于实体类代码分析):
- `internshipId`: 实习ID
- `studentId`: 学生ID
- `studentNo`: 学号
- `companyName`: 实习单位名称
- `positionName`: 岗位名称
- `startDate`: 实习开始日期
- `endDate`: 实习结束日期
- `actualEndDate`: 实际结束日期
- `internshipStatus`: 实习状态(1进行中 2已完成 3中断)
- `changeReason`: 变更原因
| `internship_allowance` | decimal(10,2) | 实习津贴 | NULL |
#### 🎯 实习状态字典
| 状态值 | 状态名称 | 说明 |
|--------|----------|------|
| `1` | 进行中 | 实习正在进行 |
| `2` | 已完成 | 实习已按期完成 |
| `3` | 中断 | 实习因故中断 |
#### 🔄 实习信息终止处理流程
##### 📋 处理逻辑说明
- **状态判断**: 需要根据当前实习状态和学生变更类型决定处理方式
- **时间管理**: 正确设置实际结束日期
- **关联数据**: 实习相关的日报、月报、访问记录等会自动停止更新
- **津贴结算**: 可能涉及实习津贴的结算处理
##### 💻 后端实现逻辑
**实体类**: `ZsjyInternshipInfo.java`
**服务类**: `ZsjyInternshipServiceImpl.java`
```java
// 实习信息实体类关键字段
@Data
@TableName("zsjy_internship_info")
public class ZsjyInternshipInfo extends BaseEntity {
private Long internshipId; // 实习ID
private Long previousInternshipId; // 前一条实习记录ID
private Long studentId; // 学生ID
private String studentNo; // 学号
private String studentName; // 学生姓名
private String companyName; // 实习单位名称
private String positionName; // 岗位名称
private BigDecimal internshipAllowance; // 实习津贴
private Date startDate; // 实习开始日期
private Date endDate; // 实习结束日期
private Date actualEndDate; // 实际结束日期
private String internshipStatus; // 实习状态:1-进行中,2-已完成,3-中断
private String changeReason; // 变更原因
}
```
##### 🎨 前端界面展示
**管理界面**: `zsjy/internship/info/index.vue`
**状态显示**: 实习状态的展示
```vue
<!-- 实习状态列 -->
<el-table-column label="实习状态" align="center" prop="internshipStatus" width="100">
<template #default="scope">
<el-tag v-if="scope.row.internshipStatus === '1'" type="primary">进行中</el-tag>
<el-tag v-else-if="scope.row.internshipStatus === '2'" type="success">已完成</el-tag>
<el-tag v-else-if="scope.row.internshipStatus === '3'" type="warning">已中断</el-tag>
</template>
</el-table-column>
<!-- 实习单位列 -->
<el-table-column label="实习单位" align="center" prop="companyName" width="200" show-overflow-tooltip />
<!-- 实习时间列 -->
<el-table-column label="实习时间" align="center" width="200">
<template #default="scope">
{{ parseTime(scope.row.startDate, '{y}-{m}-{d}') }} 至
{{ parseTime(scope.row.actualEndDate || scope.row.endDate, '{y}-{m}-{d}') }}
</template>
</el-table-column>
```
#### 🔄 学生状态变更时的实习信息处理逻辑
##### 📋 处理策略说明
- **休学**: 设置为"中断"状态,保留重新实习的可能
- **退学**: 设置为"中断"状态,终止实习关系
- **毕业**: 如果实习已完成保持"已完成",否则设为"中断"
##### 💾 SQL批量处理脚本
```sql
-- 参数说明:
-- @student_id: 学生ID
-- @change_type: 变更类型 (XIU_XUE-休学, TUI_XUE-退学, BI_YE-毕业)
-- @operator_id: 操作员ID
-- 终止进行中的实习
UPDATE zsjy_internship_info
SET internship_status = CASE
WHEN @change_type = 'BI_YE' AND internship_status = '2' THEN '2' -- 毕业:保持已完成状态
ELSE '3' -- 休学/退学:设为中断
END,
actual_end_date = CASE
WHEN @change_type IN ('XIU_XUE', 'TUI_XUE') THEN CURDATE()
WHEN @change_type = 'BI_YE' AND internship_status != '2' THEN CURDATE()
ELSE actual_end_date
END,
change_reason = CONCAT(COALESCE(change_reason, ''), ' | 学生', @change_type,
CASE WHEN @change_type = 'BI_YE' AND internship_status = '2' THEN ',实习正常完成'
ELSE ',实习中断' END),
update_by = @operator_id,
update_time = NOW()
WHERE student_id = @student_id
AND internship_status IN ('1', '2') -- 进行中或已完成的实习
AND deleted = 0;
-- 注意:实习结束后,相关的日报、月报、统计、访问记录等数据会自动停止更新
-- 如需清理历史数据,可根据业务需求另行处理
```
## 📝 其他关联信息处理
### 6. 学生请假记录处理
#### 📊 数据库表结构
##### 请假记录表 (xg_student_leave)
| 字段名 | 类型 | 说明 | 默认值 |
|--------|------|------|--------|
| `id` | bigint(20) | 主键ID | - |
| `student_id` | bigint(20) | 学生ID | - |
| `leave_type` | varchar(20) | 请假类型 | - |
| `leave_reason` | text | 请假原因 | - |
| `leave_start_date` | date | 请假开始日期 | - |
| `leave_end_date` | date | 请假结束日期 | - |
| `leave_status` | varchar(20) | 请假状态 | - |
| `cancel_reason` | varchar(500) | 取消原因 | NULL |
##### 销假记录表 (xg_student_cancel_leave)
| 字段名 | 类型 | 说明 |
|--------|------|------|
| `id` | bigint(20) | 主键ID |
| `student_id` | bigint(20) | 学生ID |
| `cancel_status` | varchar(20) | 销假状态 |
#### 🔄 请假记录处理逻辑
##### 📋 处理策略说明
- **进行中请假**: 取消未结束的请假记录
- **销假处理**: 更新相应的销假状态
- **历史保留**: 保留已完成的请假记录
##### 💾 SQL批量处理脚本
```sql
-- 参数说明:
-- @student_id: 学生ID
-- @change_type: 变更类型 (XIU_XUE-休学, TUI_XUE-退学, BI_YE-毕业)
-- @operator_id: 操作员ID
-- 处理进行中的请假记录
UPDATE xg_student_leave
SET leave_status = 'CANCELLED', -- 取消状态
cancel_reason = CONCAT('学生', @change_type, ',请假自动取消'),
cancel_time = NOW(),
cancel_by = @operator_id,
update_by = @operator_id,
update_time = NOW()
WHERE student_id = @student_id
AND leave_status IN ('PENDING', 'APPROVED') -- 待审核、已通过
AND leave_end_date >= CURDATE() -- 未结束的请假
AND deleted = 0;
-- 处理相应的销假记录
UPDATE xg_student_cancel_leave
SET cancel_status = 'AUTO_CANCELLED',
update_by = @operator_id,
update_time = NOW()
WHERE student_id = @student_id
AND cancel_status = 'PENDING'
AND deleted = 0;
```
### 7. 宿舍卫生检查处理
#### 📊 数据库表结构
##### 卫生检查学生评分表 (xg_dorm_hygiene_student_score)
| 字段名 | 类型 | 说明 | 默认值 |
|--------|------|------|--------|
| `id` | bigint(20) | 主键ID | - |
| `student_id` | bigint(20) | 学生ID | - |
| `check_id` | bigint(20) | 检查ID | - |
| `check_date` | date | 检查日期 | - |
| `score` | decimal(5,2) | 得分 | - |
| `remark` | varchar(500) | 备注 | NULL |
#### 🔄 卫生检查处理逻辑
##### 📋 处理策略说明
- **历史数据保留**: 卫生检查记录作为重要档案,通常不删除
- **未来检查备注**: 为未来的卫生检查记录添加状态变更备注
- **评分数据完整性**: 确保持有评分数据的完整性
##### 💾 SQL批量处理脚本
```sql
-- 参数说明:
-- @student_id: 学生ID
-- @change_type: 变更类型 (XIU_XUE-休学, TUI_XUE-退学, BI_YE-毕业)
-- @operator_id: 操作员ID
-- 为未来的卫生检查记录添加备注
UPDATE xg_dorm_hygiene_student_score
SET remark = CONCAT(COALESCE(remark, ''), ' | 学生', @change_type, ',卫生检查记录'),
update_by = @operator_id,
update_time = NOW()
WHERE student_id = @student_id
AND check_date >= CURDATE() -- 未来的检查
AND deleted = 0;
```
### 8. 宿舍违纪记录处理
#### 📊 数据库表结构
##### 宿舍违纪表 (xg_dorm_violation)
| 字段名 | 类型 | 说明 | 默认值 |
|--------|------|------|--------|
| `id` | bigint(20) | 主键ID | - |
| `student_id` | bigint(20) | 学生ID | - |
| `violation_type` | varchar(50) | 违纪类型 | - |
| `violation_date` | date | 违纪日期 | - |
| `violation_description` | text | 违纪描述 | - |
| `punishment` | varchar(200) | 处罚措施 | - |
| `remark` | varchar(500) | 备注 | NULL |
#### 🔄 违纪记录处理逻辑
##### 📋 处理策略说明
- **档案数据保留**: 违纪记录作为学生管理档案,必须永久保留
- **状态变更备注**: 添加状态变更信息,便于档案管理
- **历史追溯**: 确保违纪记录的完整性和可追溯性
##### 💾 SQL批量处理脚本
```sql
-- 参数说明:
-- @student_id: 学生ID
-- @change_type: 变更类型 (XIU_XUE-休学, TUI_XUE-退学, BI_YE-毕业)
-- @operator_id: 操作员ID
-- 为违纪记录添加状态变更备注
UPDATE xg_dorm_violation
SET remark = CONCAT(COALESCE(remark, ''), ' | 学生', @change_type, ',违纪记录归档'),
update_by = @operator_id,
update_time = NOW()
WHERE student_id = @student_id
AND deleted = 0;
```
## 🔗 其他业务模块关联处理
### 1. 业务数据一致性保证
#### 🛡️ 事务处理要求
```sql
-- 建议在学生状态变更的大事务中包含所有其他业务处理
START TRANSACTION;
-- 1. 更新学生学籍状态
UPDATE xg_student_msg SET student_status = ? WHERE id = ?;
-- 2. 处理宿舍退宿
UPDATE xg_dorm_bed_student SET status = '1' WHERE student_id = ?;
-- 3. 处理心理咨询预约
UPDATE xljk_consultation_appointment SET status = '2' WHERE student_id = ?;
-- 4. 处理学生活动报名
UPDATE stgl_activity_registration SET approval_status = '2' WHERE student_no = ?;
-- 5. 处理实习信息
UPDATE zsjy_internship_info SET internship_status = '3' WHERE student_id = ?;
-- 6. 处理其他关联信息
UPDATE xg_student_leave SET leave_status = 'CANCELLED' WHERE student_id = ?;
COMMIT;
```
#### 📊 处理统计表
| 业务模块 | 涉及表数量 | 处理类型 | 重要程度 |
|----------|------------|----------|----------|
| 宿舍管理 | 2 (床位+申请) | 退宿处理 | ⭐⭐⭐⭐⭐ |
| 心理健康 | 2 (预约+未到访) | 预约取消 | ⭐⭐⭐⭐ |
| 实践活动 | 1 (报名表) | 报名驳回 | ⭐⭐⭐⭐ |
| 实习管理 | 1 (实习表) | 状态中断 | ⭐⭐⭐⭐ |
| 请假管理 | 2 (请假+销假) | 请假取消 | ⭐⭐⭐⭐ |
| 卫生检查 | 1 (评分表) | 备注添加 | ⭐⭐⭐ |
| 违纪记录 | 1 (违纪表) | 备注添加 | ⭐⭐⭐ |
| **总计** | **11个表** | **状态更新+关系清理** | **⭐⭐⭐⭐⭐** |
### 2. 业务规则和约束
#### 📋 状态变更处理矩阵
| 当前状态 | 休学处理 | 退学处理 | 毕业处理 |
|----------|----------|----------|----------|
| 宿舍在住 | 可保留/退宿 | 必须退宿 | 必须退宿 |
| 咨询预约 | 取消未来预约 | 取消未来预约 | 取消未来预约 |
| 活动报名 | 驳回未结束活动 | 驳回进行中活动 | 保留已完成活动 |
| 实习进行 | 中断(可恢复) | 中断(终止) | 保持完成状态 |
| 请假进行 | 取消请假 | 取消请假 | 取消请假 |
#### ⚠️ 重要业务约束
- **宿舍资源**: 退学/毕业必须释放宿舍资源,保证公平分配
- **活动公平性**: 学生状态变更后不应继续参加学校组织的活动
- **实习规范**: 实习中断需记录原因,便于管理和追溯
- **档案完整性**: 所有历史记录必须保留,作为学生管理档案
- **数据一致性**: 各业务模块的状态必须与学生学籍状态保持一致
### 3. 监控和审计要求
#### 📊 数据完整性检查
```sql
-- 检查其他业务处理结果的完整性
SELECT
'宿舍管理' as module,
COUNT(*) as total_count,
COUNT(CASE WHEN status = '1' THEN 1 END) as processed_count
FROM xg_dorm_bed_student
WHERE student_id = @student_id
UNION ALL
SELECT
'心理咨询' as module,
COUNT(*) as total_count,
COUNT(CASE WHEN status = '2' THEN 1 END) as processed_count
FROM xljk_consultation_appointment
WHERE student_id = @student_id AND appointment_date >= CURDATE()
UNION ALL
SELECT
'活动报名' as module,
COUNT(*) as total_count,
COUNT(CASE WHEN approval_status = '2' THEN 1 END) as processed_count
FROM stgl_activity_registration
WHERE student_no = @student_no
UNION ALL
SELECT
'实习信息' as module,
COUNT(*) as total_count,
COUNT(CASE WHEN internship_status = '3' THEN 1 END) as processed_count
FROM zsjy_internship_info
WHERE student_id = @student_id AND internship_status IN ('1', '2');
```
#### 📝 审计日志记录
```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 (
'其他业务处理', 'UPDATE', 'processOtherBusiness', 'PROCEDURE', 'MANAGE',
@operator_name, @dept_name, '/other/business/process', @client_ip, @location,
CONCAT('学生ID:', @student_id, ',学号:', @student_no, ',变更类型:', @change_type),
@process_result_json, 0, NULL, NOW()
);
```
---
## 📅 更新记录
- **2025-12-XX**: 分文档创建,包含其他业务处理逻辑
- **2025-12-XX**: 基于代码分析完善技术实现细节和业务逻辑
- **后续更新**: 根据实际业务需求持续完善
---
*本分文档详细说明学生状态变更时的其他业务模块处理逻辑和技术实现,包括宿舍、心理、实践、实习等各项业务的完整处理方案。*
@@ -0,0 +1,742 @@
# 06-完整SQL脚本
## 📋 概述
本分文档提供完整的学生退学、休学、毕业处理SQL脚本,包括数据库事务处理、错误处理和操作日志记录。基于对前后端代码的深入分析,脚本涵盖了所有相关业务模块的联动处理。
## 🔧 完整处理脚本示例
### 学生状态变更通用处理存储过程
```sql
-- ===========================================
-- 学生状态变更通用处理存储过程
-- 支持:休学(XIU_XUE)、退学(TUI_XUE)、复学(FU_XUE)、毕业(BI_YE)
-- 参数说明:
-- @student_id: 学生ID
-- @student_no: 学生学号
-- @change_type: 变更类型
-- @operator_id: 操作员ID
-- @effective_date: 生效日期 (可选,默认当前日期)
-- ===========================================
DELIMITER //
CREATE PROCEDURE process_student_status_change(
IN p_student_id BIGINT,
IN p_student_no VARCHAR(32),
IN p_change_type VARCHAR(20),
IN p_operator_id BIGINT,
IN p_effective_date DATE
)
BEGIN
DECLARE v_current_time DATETIME DEFAULT NOW();
DECLARE v_effective_date DATE DEFAULT COALESCE(p_effective_date, CURDATE());
DECLARE v_new_student_status VARCHAR(10);
DECLARE v_disable_user_account BOOLEAN DEFAULT FALSE;
DECLARE v_exit_reason VARCHAR(100);
DECLARE v_cadre_status VARCHAR(10);
DECLARE v_dismissal_reason VARCHAR(200);
DECLARE v_error_message VARCHAR(500);
DECLARE v_affected_rows INT DEFAULT 0;
-- 声明异常处理
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
SET v_error_message = CONCAT('学生状态变更处理失败: ', p_change_type, ', 学生ID: ', p_student_id);
-- 记录错误日志
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, cost_time
) VALUES (
'学生状态变更', 'UPDATE', 'processStudentStatusChange', 'PROCEDURE', 'MANAGE',
'系统', '教务处', '/student/status/change', '127.0.0.1', '本地',
CONCAT('学生ID:', p_student_id, ',变更类型:', p_change_type), '{}', 1, v_error_message, v_current_time, 0
);
RESIGNAL;
END;
-- 开始事务
START TRANSACTION;
-- 1. 验证学生存在性
SELECT COUNT(1) INTO v_affected_rows FROM xg_student_msg
WHERE id = p_student_id AND deleted = 0;
IF v_affected_rows = 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '学生不存在或已被删除';
END IF;
-- 2. 根据变更类型设置参数
CASE p_change_type
WHEN 'XIU_XUE' THEN
SET v_new_student_status = '2'; -- 休学
SET v_disable_user_account = FALSE; -- 休学可保留账号
SET v_exit_reason = '学生休学';
SET v_cadre_status = '6'; -- 休学离任
SET v_dismissal_reason = '学生休学';
WHEN 'TUI_XUE' THEN
SET v_new_student_status = '4'; -- 退学
SET v_disable_user_account = TRUE; -- 退学必须禁用账号
SET v_exit_reason = '学生退学';
SET v_cadre_status = '4'; -- 免职离任
SET v_dismissal_reason = '学生退学';
WHEN 'FU_XUE' THEN
SET v_new_student_status = '3'; -- 复学
SET v_disable_user_account = FALSE; -- 复学恢复账号
SET v_exit_reason = NULL; -- 复学不涉及退出
SET v_cadre_status = NULL; -- 复学不涉及干部
SET v_dismissal_reason = NULL;
WHEN 'BI_YE' THEN
SET v_new_student_status = '5'; -- 毕业
SET v_disable_user_account = TRUE; -- 毕业禁用账号
SET v_exit_reason = '学生毕业';
SET v_cadre_status = '4'; -- 免职离任
SET v_dismissal_reason = '学生毕业';
ELSE
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '无效的变更类型';
END CASE;
-- 3. 创建状态变更记录
INSERT INTO xg_student_status_change (
student_id, student_no, change_type, apply_date,
effective_date, operator_id, source, process_status
) VALUES (
p_student_id, p_student_no, p_change_type, v_current_time,
v_effective_date, p_operator_id, 'system', 1
);
-- 4. 更新学生学籍状态
UPDATE xg_student_msg
SET student_status = v_new_student_status,
update_by = p_operator_id,
update_time = v_current_time
WHERE id = p_student_id AND deleted = 0;
-- 5. 处理用户账号状态
IF v_disable_user_account THEN
UPDATE sys_user
SET status = '1',
update_by = p_operator_id,
update_time = v_current_time,
remark = CONCAT(COALESCE(remark, ''), ' | ', v_exit_reason, '-', v_current_time)
WHERE user_name = p_student_no AND account_type = '2' AND del_flag = '0';
END IF;
-- 6. 处理班级干部信息(休学、退学、毕业)
IF p_change_type IN ('XIU_XUE', 'TUI_XUE', 'BI_YE') THEN
UPDATE xg_class_pos_msg
SET is_current = 0,
cadre_status = v_cadre_status,
dismissal_date = v_effective_date,
dismissal_reason = v_dismissal_reason,
term_end_date = v_effective_date,
term_duration = TIMESTAMPDIFF(MONTH, term_start_date, v_effective_date),
update_by = p_operator_id,
update_time = v_current_time
WHERE student_id = p_student_id AND is_current = 1 AND deleted = 0;
-- 清理干部用户角色权限
DELETE FROM sys_user_role
WHERE user_id = p_student_id;
END IF;
-- 7. 处理社团成员关系(休学、退学、毕业)
IF p_change_type IN ('XIU_XUE', 'TUI_XUE', 'BI_YE') THEN
UPDATE stgl_member
SET status = 4, -- 已退出
update_by = p_operator_id,
update_time = v_current_time,
remark = CONCAT(COALESCE(remark, ''), ' | ', v_exit_reason, ' - ', v_current_time)
WHERE user_id = p_student_id AND status IN (0, 1, 2) AND deleted = 0;
END IF;
-- 8. 处理经济资助 - 奖学金申请
IF p_change_type IN ('XIU_XUE', 'TUI_XUE', 'BI_YE') THEN
UPDATE jcbt_scholarship_application
SET current_status = CASE
WHEN p_change_type = 'XIU_XUE' THEN 'WITHDRAWN' -- 休学:撤回
WHEN p_change_type = 'TUI_XUE' THEN 'REJECTED' -- 退学:拒绝
WHEN p_change_type = 'BI_YE' THEN
CASE WHEN current_status = 'APPROVED' THEN 'APPROVED' -- 毕业:保持已通过
ELSE 'WITHDRAWN' -- 其他状态撤回
END
ELSE current_status
END,
update_by = p_operator_id,
update_time = v_current_time
WHERE student_id = p_student_id AND current_status NOT IN ('REJECTED') AND deleted = 0;
END IF;
-- 9. 处理经济资助 - 勤工俭学申请
IF p_change_type IN ('XIU_XUE', 'TUI_XUE', 'BI_YE') THEN
UPDATE jcbt_work_study_application
SET status = 'CANCELLED',
college_review_status = CASE
WHEN college_review_status IS NOT NULL THEN 'REJECTED'
ELSE college_review_status
END,
final_review_status = CASE
WHEN final_review_status IS NOT NULL THEN 'REJECTED'
ELSE final_review_status
END,
final_review_time = v_current_time,
final_reviewer_id = p_operator_id,
final_reviewer_name = '系统',
final_review_comment = CONCAT(v_exit_reason, ',岗位申请自动终止'),
update_by = p_operator_id,
update_time = v_current_time
WHERE student_id = p_student_id
AND status NOT IN ('CANCELLED', 'COLLEGE_REJECTED', 'FINAL_REJECTED')
AND deleted = 0;
END IF;
-- 10. 处理经济资助 - 贫困生认定
IF p_change_type IN ('XIU_XUE', 'TUI_XUE', 'BI_YE') THEN
UPDATE jcbt_poverty_application
SET application_status = CASE
WHEN application_status = 'approved' THEN 'revoked' -- 撤销已通过的认定
ELSE application_status
END,
update_by = p_operator_id,
update_time = v_current_time
WHERE student_id = p_student_id
AND application_status NOT IN ('cancel', 'invalid')
AND deleted = 0;
END IF;
-- 11. 处理宿舍住宿关系(退学、毕业)
IF p_change_type IN ('TUI_XUE', 'BI_YE') THEN
UPDATE xg_dorm_bed_student
SET status = '1',
checkout_time = v_current_time,
update_by = p_operator_id,
update_time = v_current_time,
remark = CONCAT(COALESCE(remark, ''), ' | ', v_exit_reason, '退宿')
WHERE student_id = p_student_id AND status = '0' AND deleted = '0';
END IF;
-- 12. 取消心理咨询预约(休学、退学、毕业)
IF p_change_type IN ('XIU_XUE', 'TUI_XUE', 'BI_YE') THEN
UPDATE xljk_consultation_appointment
SET status = '2',
update_by = p_operator_id,
update_time = v_current_time
WHERE student_id = p_student_id AND status = '0'
AND appointment_date >= CURDATE() AND deleted = 0;
END IF;
-- 13. 取消学生活动报名(退学、毕业)
IF p_change_type IN ('TUI_XUE', 'BI_YE') THEN
UPDATE stgl_activity_registration
SET approval_status = '3',
approval_time = v_current_time,
approval_by = p_operator_id,
approval_remark = CONCAT(v_exit_reason, ',活动报名自动取消'),
update_by = p_operator_id,
update_time = v_current_time
WHERE student_no = p_student_no AND approval_status = '1'
AND EXISTS (SELECT 1 FROM stgl_activity a
WHERE a.id = stgl_activity_registration.activity_id
AND a.activity_start_time > v_current_time);
END IF;
-- 14. 终止实习(退学)
IF p_change_type = 'TUI_XUE' THEN
UPDATE zsjy_internship_info
SET internship_status = '3',
actual_end_date = CURDATE(),
update_by = p_operator_id,
update_time = v_current_time,
remark = CONCAT(COALESCE(remark, ''), ' | 学生退学,实习中断')
WHERE student_id = p_student_id AND internship_status = '1' AND deleted = 0;
END IF;
-- 提交事务
COMMIT;
-- 记录操作日志
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, cost_time
) VALUES (
'学生状态变更', 'UPDATE', 'processStudentStatusChange', 'PROCEDURE', 'MANAGE',
'系统', '教务处', '/student/status/change', '127.0.0.1', '本地',
CONCAT('学生ID:', p_student_id, ',学号:', p_student_no, ',变更类型:', p_change_type), '{}', 0, NULL, v_current_time, 0
);
END //
DELIMITER ;
```
### 学生退学处理专用脚本
```sql
-- ===========================================
-- 学生退学处理专用脚本
-- 参数说明:
-- @student_id: 学生ID
-- @student_no: 学生学号
-- @operator_id: 操作员ID
-- ===========================================
DELIMITER //
CREATE PROCEDURE process_student_dropout(
IN p_student_id BIGINT,
IN p_student_no VARCHAR(32),
IN p_operator_id BIGINT
)
BEGIN
CALL process_student_status_change(p_student_id, p_student_no, 'TUI_XUE', p_operator_id, CURDATE());
END //
DELIMITER ;
-- 调用示例:
-- CALL process_student_dropout(123456789, '20240001', 1);
```
### 学生休学处理专用脚本
```sql
-- ===========================================
-- 学生休学处理专用脚本
-- 参数说明:
-- @student_id: 学生ID
-- @student_no: 学生学号
-- @operator_id: 操作员ID
-- ===========================================
DELIMITER //
CREATE PROCEDURE process_student_suspend(
IN p_student_id BIGINT,
IN p_student_no VARCHAR(32),
IN p_operator_id BIGINT
)
BEGIN
CALL process_student_status_change(p_student_id, p_student_no, 'XIU_XUE', p_operator_id, CURDATE());
END //
DELIMITER ;
-- 调用示例:
-- CALL process_student_suspend(123456789, '20240001', 1);
```
### 学生毕业处理专用脚本
```sql
-- ===========================================
-- 学生毕业处理专用脚本
-- 参数说明:
-- @student_id: 学生ID
-- @student_no: 学生学号
-- @operator_id: 操作员ID
-- ===========================================
DELIMITER //
CREATE PROCEDURE process_student_graduation(
IN p_student_id BIGINT,
IN p_student_no VARCHAR(32),
IN p_operator_id BIGINT
)
BEGIN
CALL process_student_status_change(p_student_id, p_student_no, 'BI_YE', p_operator_id, CURDATE());
END //
DELIMITER ;
-- 调用示例:
-- CALL process_student_graduation(123456789, '20240001', 1);
```
## 📋 处理流程图
```mermaid
graph TD
A[开始] --> B[验证学生信息]
B --> C{学生存在?}
C -->|否| D[抛出异常]
C -->|是| E{变更类型}
E -->|休学| F[设置休学参数]
E -->|退学| G[设置退学参数]
E -->|复学| H[设置复学参数]
E -->|毕业| I[设置毕业参数]
F --> J[创建变更记录]
G --> J
H --> J
I --> J
J --> K[更新学生学籍状态]
K --> L[处理用户账号状态]
L --> M{需要禁用账号?}
M -->|是| N[禁用用户账号]
M -->|否| O[保留用户账号]
N --> P{涉及组织关系?}
O --> P
P -->|是| Q[处理班级干部关系]
P -->|否| R[跳过组织关系处理]
Q --> S[处理社团成员关系]
R --> T[处理经济资助]
S --> T
T --> U[奖学金申请处理]
T --> V[勤工俭学申请处理]
T --> W[贫困生认定处理]
U --> X{涉及住宿管理?}
V --> X
W --> X
X -->|是| Y[处理宿舍关系]
X -->|否| Z[处理心理健康]
Y --> Z
Z --> AA[心理咨询预约取消]
AA --> BB{涉及实践活动?}
BB -->|是| CC[取消学生活动报名]
BB -->|否| DD[跳过实践活动处理]
CC --> EE[终止实习信息]
EE --> FF[记录操作日志]
DD --> FF
FF --> GG[提交事务]
GG --> HH[结束]
D --> II[异常处理]
II --> JJ[回滚事务]
JJ --> KK[记录错误日志]
```
## 🛠️ 技术实现细节
### 1. 后端服务层实现
#### 📂 核心类文件
- **实体类**: `XgStudentMsg.java` - 学生信息实体
- **变更实体**: `XgStudentStatusChange.java` - 状态变更记录实体
- **控制器**: `XgStudentStatusChangeController.java` - API接口层
- **服务类**: `XgStudentStatusChangeServiceImpl.java` - 业务逻辑层
- **Mapper**: `XgStudentStatusChangeMapper.java` - 数据访问层
#### 🔧 核心业务方法
```java
@Service
@RequiredArgsConstructor
public class XgStudentStatusChangeServiceImpl implements IXgStudentStatusChangeService {
private final XgStudentStatusChangeMapper baseMapper;
private final XgStudentMsgMapper studentMapper;
private final SysUserMapper userMapper;
private final XgClassPosMsgMapper classPosMapper;
private final StglMemberMapper memberMapper;
@Transactional(rollbackFor = Exception.class)
public Boolean processStudentStatusChange(XgStudentStatusChangeBo bo) {
// 1. 验证学生信息
XgStudentMsg student = validateStudent(bo.getStudentId());
// 2. 验证业务规则
validateChangeRules(student, bo.getChangeType());
// 3. 创建变更记录
XgStudentStatusChange change = createChangeRecord(bo);
// 4. 更新学生状态
updateStudentStatus(student, bo.getChangeType(), bo.getOperatorId());
// 5. 处理用户账号
handleUserAccount(student, bo.getChangeType(), bo.getOperatorId());
// 6. 处理组织关系
handleOrganizationRelations(student, bo.getChangeType(), bo.getOperatorId());
// 7. 处理经济资助
handleEconomicSupport(student, bo.getChangeType(), bo.getOperatorId());
// 8. 处理其他业务
handleOtherBusiness(student, bo.getChangeType(), bo.getOperatorId());
// 9. 记录操作日志
logOperation(change);
return true;
}
private XgStudentMsg validateStudent(Long studentId) {
XgStudentMsg student = studentMapper.selectById(studentId);
if (student == null || student.getDeleted() == 1L) {
throw new ServiceException("学生不存在或已被删除");
}
return student;
}
private void validateChangeRules(XgStudentMsg student, String changeType) {
String currentStatus = student.getStudentStatus();
// 状态变更规则验证
switch (changeType) {
case "XIU_XUE": // 休学
if (!"1".equals(currentStatus)) { // 必须是在读状态
throw new ServiceException("只有在读学生才能申请休学");
}
break;
case "TUI_XUE": // 退学
if ("5".equals(currentStatus)) { // 毕业状态不能退学
throw new ServiceException("已毕业学生不能退学");
}
break;
case "FU_XUE": // 复学
if (!"2".equals(currentStatus)) { // 必须是休学状态
throw new ServiceException("只有休学学生才能复学");
}
break;
case "BI_YE": // 毕业
if (!"1".equals(currentStatus) && !"3".equals(currentStatus)) {
throw new ServiceException("只有在读或复学学生才能毕业");
}
break;
}
}
}
```
### 2. 前端界面实现
#### 📱 状态变更界面
**文件位置**: `web/src/views/xg/xsjcxx/xgStudentStatusChange/index.vue`
```vue
<template>
<div class="app-container">
<!-- 查询表单 -->
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="学号" prop="studentNo">
<el-input v-model="queryParams.studentNo" placeholder="请输入学号" clearable style="width: 200px" @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="变更类型" prop="changeType">
<el-select v-model="queryParams.changeType" placeholder="请选择变更类型" clearable style="width: 200px">
<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>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<!-- 操作按钮 -->
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['studentMsg:studentStatusChange:add']">
新增
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate" v-hasPermi="['studentMsg:studentStatusChange:edit']">
修改
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete" v-hasPermi="['studentMsg:studentStatusChange:remove']">
删除
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Operation" @click="handleBatchProcess" v-hasPermi="['studentMsg:studentStatusChange:process']">
批量处理
</el-button>
</el-col>
</el-row>
<!-- 数据表格 -->
<el-table v-loading="loading" :data="statusChangeList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column label="学号" align="center" prop="studentNo" />
<el-table-column label="学生姓名" align="center">
<template #default="scope">
<span>{{ scope.row.studentName }}</span>
</template>
</el-table-column>
<el-table-column label="变更类型" align="center" prop="changeType">
<template #default="scope">
<el-tag :type="getChangeTypeTagType(scope.row.changeType)">
{{ getChangeTypeLabel(scope.row.changeType) }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="生效日期" align="center" prop="effectiveDate" width="120">
<template #default="scope">
<span>{{ parseTime(scope.row.effectiveDate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="处理状态" align="center" prop="processStatus" width="100">
<template #default="scope">
<el-tag :type="scope.row.processStatus === 1 ? 'success' : 'warning'">
{{ scope.row.processStatus === 1 ? '已处理' : '未处理' }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="操作员" align="center" prop="operatorName" />
<el-table-column label="操作时间" align="center" prop="createTime" width="180" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope">
<el-button size="small" type="text" icon="View" @click="handleView(scope.row)" v-hasPermi="['studentMsg:studentStatusChange:query']">详情</el-button>
<el-button size="small" type="text" icon="Edit" @click="handleUpdate(scope.row)" v-if="scope.row.processStatus === 0" v-hasPermi="['studentMsg:studentStatusChange:edit']">修改</el-button>
<el-button size="small" type="text" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['studentMsg:studentStatusChange:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination
v-show="total>0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
<!-- 状态变更对话框 -->
<el-dialog :title="title" v-model="open" width="600px" append-to-body>
<el-form ref="statusChangeForm" :model="form" :rules="rules" label-width="100px">
<!-- 学生信息选择 -->
<el-row>
<el-col :span="12">
<el-form-item label="学号" prop="studentNo">
<el-input v-model="form.studentNo" placeholder="请输入学号" @blur="handleStudentNoBlur" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="学生姓名">
<el-input v-model="form.studentName" disabled />
</el-form-item>
</el-col>
</el-row>
<!-- 变更信息 -->
<el-row>
<el-col :span="12">
<el-form-item label="变更类型" prop="changeType">
<el-select v-model="form.changeType" placeholder="请选择变更类型" style="width: 100%">
<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-col>
<el-col :span="12">
<el-form-item label="生效日期" prop="effectiveDate">
<el-date-picker
v-model="form.effectiveDate"
type="date"
placeholder="选择生效日期"
value-format="YYYY-MM-DD"
style="width: 100%"
/>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="变更原因" prop="reason">
<el-input
v-model="form.reason"
type="textarea"
placeholder="请输入变更原因"
maxlength="500"
show-word-limit
:rows="3"
/>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
```
## 🔄 业务规则总结
### 1. 状态变更矩阵
| 当前状态 | 可变更状态 | 说明 | 账号处理 | 组织关系 | 经济资助 | 住宿管理 |
|----------|------------|------|----------|----------|----------|----------|
| 在读(1) | 休学(2)、退学(4)、毕业(5) | 正常学籍状态 | 休学保留,退学/毕业禁用 | 处理干部和社团 | 终止申请 | 退学/毕业退宿 |
| 休学(2) | 复学(3)、退学(4) | 休学后状态 | 复学恢复,退学禁用 | 退学处理干部和社团 | 终止申请 | 退学退宿 |
| 复学(3) | 休学(2)、退学(4)、毕业(5) | 复学后状态 | 毕业禁用 | 退学处理干部和社团 | 终止申请 | 退学/毕业退宿 |
| 其他状态 | 需特殊审批 | 异常状态 | 根据情况 | 根据情况 | 根据情况 | 根据情况 |
### 2. 处理优先级
1. **数据验证**: 学生存在性、状态合法性
2. **核心状态**: 学籍状态、用户账号
3. **组织关系**: 班级干部、社团成员
4. **经济资助**: 奖学金、勤工俭学、贫困生认定
5. **其他业务**: 宿舍、心理咨询、活动报名、实习
6. **日志记录**: 操作审计和异常处理
### 3. 事务管理
- **大事务模式**: 所有操作在一个事务中完成
- **回滚机制**: 任何步骤失败都回滚整个操作
- **异常处理**: 详细记录错误信息和上下文
- **操作日志**: 记录完整的操作轨迹
## ⚠️ 注意事项
### 1. 性能优化
- **批量处理**: 支持多个学生的批量状态变更
- **索引优化**: 确保学生ID、学号相关的查询有适当索引
- **异步处理**: 大批量操作考虑异步处理机制
- **缓存更新**: 变更后及时更新相关缓存
### 2. 安全考虑
- **权限验证**: 严格验证操作员权限
- **数据校验**: 多重验证防止数据污染
- **审计记录**: 完整记录所有操作日志
- **敏感操作**: 重要操作需要二次确认
### 3. 扩展性设计
- **模块化处理**: 每个业务模块独立处理方法
- **配置化规则**: 状态变更规则可配置化
- **插件化扩展**: 支持业务模块的插件化扩展
- **流程编排**: 支持复杂业务流程的编排
---
## 📅 更新记录
- **2025-12-XX**: 分文档创建,包含完整SQL处理脚本
- **2025-12-XX**: 基于前后端代码分析完善完整SQL脚本和处理流程
- **2025-12-XX**: 增加通用处理存储过程和专用处理脚本
- **2025-12-XX**: 添加详细的技术实现细节和前端界面代码
- **后续更新**: 根据实际业务需求持续完善
---
*本分文档基于对前后端代码的深入分析,提供完整的SQL处理脚本和详细的技术实现方案,确保业务逻辑的准确性和系统的高可用性。*
@@ -0,0 +1,165 @@
# 07-快速执行脚本
## 📋 概述
本分文档提供快速执行的简化SQL脚本,适用于紧急处理或批量操作场景。这些脚本去除了复杂的事务处理和日志记录,专注于核心数据更新操作。
## ⚡ 快速执行脚本
### 休学处理快速脚本
```sql
-- 休学处理:保留账号,暂停业务
SET @student_id = 123456789;
SET @student_no = '20240001';
SET @operator_id = 1;
UPDATE xg_student_msg SET student_status = '2', update_by = @operator_id, update_time = NOW() WHERE id = @student_id;
UPDATE xg_class_pos_msg SET is_current = 0, cadre_status = '6', dismissal_date = CURDATE(), dismissal_reason = '学生休学' WHERE student_id = @student_id AND is_current = 1;
UPDATE club_member SET member_status = '4' WHERE user_id = @student_id AND member_status IN ('0', '1', '2');
UPDATE jcbt_scholarship_application SET current_status = 'WITHDRAWN' WHERE student_id = @student_id AND current_status IN ('PENDING', 'APPROVED');
UPDATE jcbt_work_study_application SET status = 'CANCELLED' WHERE student_id = @student_id AND status NOT IN ('CANCELLED', 'COLLEGE_REJECTED', 'FINAL_REJECTED');
UPDATE xljk_consultation_appointment SET status = '2' WHERE student_id = @student_id AND status = '0' AND appointment_date >= CURDATE();
UPDATE stgl_activity_registration SET approval_status = 2 WHERE student_no = @student_no AND approval_status = 1;
UPDATE zsjy_internship_info SET internship_status = '3', actual_end_date = CURDATE() WHERE student_id = @student_id AND internship_status = '1';
```
### 退学处理快速脚本
```sql
-- 退学处理:禁用账号,终止所有业务
SET @student_id = 123456789;
SET @student_no = '20240001';
SET @operator_id = 1;
UPDATE xg_student_msg SET student_status = '4', update_by = @operator_id, update_time = NOW() WHERE id = @student_id;
UPDATE sys_user SET status = '1' WHERE user_name = @student_no AND account_type = '2';
UPDATE xg_class_pos_msg SET is_current = 0, cadre_status = '4', dismissal_date = CURDATE() WHERE student_id = @student_id AND is_current = 1;
UPDATE club_member SET member_status = '4' WHERE user_id = @student_id AND member_status IN ('0', '1', '2');
UPDATE jcbt_scholarship_application SET current_status = 'WITHDRAWN' WHERE student_id = @student_id AND current_status IN ('PENDING', 'APPROVED');
UPDATE jcbt_work_study_application SET status = 'CANCELLED' WHERE student_id = @student_id AND status NOT IN ('CANCELLED', 'COLLEGE_REJECTED', 'FINAL_REJECTED');
UPDATE xg_dorm_bed_student SET status = '1', checkout_time = NOW() WHERE student_id = @student_id AND status = '0';
UPDATE xljk_consultation_appointment SET status = '2' WHERE student_id = @student_id AND status = '0' AND appointment_date >= CURDATE();
UPDATE stgl_activity_registration SET approval_status = 2 WHERE student_no = @student_no AND approval_status = 1;
UPDATE zsjy_internship_info SET internship_status = '3', actual_end_date = CURDATE() WHERE student_id = @student_id AND internship_status = '1';
```
### 毕业处理快速脚本
```sql
-- 毕业处理:归档所有业务
SET @student_id = 123456789;
SET @student_no = '20240001';
SET @operator_id = 1;
UPDATE xg_student_msg SET student_status = '5', update_by = @operator_id, update_time = NOW() WHERE id = @student_id;
UPDATE sys_user SET status = '1' WHERE user_name = @student_no AND account_type = '2';
UPDATE xg_class_pos_msg SET is_current = 0, cadre_status = '4', dismissal_date = CURDATE() WHERE student_id = @student_id AND is_current = 1;
UPDATE club_member SET member_status = '4' WHERE user_id = @student_id AND member_status IN ('0', '1', '2');
UPDATE xg_dorm_bed_student SET status = '1', checkout_time = NOW() WHERE student_id = @student_id AND status = '0';
```
## 🔧 批量处理脚本
### 批量休学处理
```sql
-- 批量休学处理脚本
-- 使用前请将学生信息填入临时表 student_leave_batch
DROP TEMPORARY TABLE IF EXISTS student_leave_batch;
CREATE TEMPORARY TABLE student_leave_batch (
student_id BIGINT PRIMARY KEY,
student_no VARCHAR(32),
leave_date DATE DEFAULT CURDATE()
);
-- 插入待处理的學生信息
-- INSERT INTO student_leave_batch (student_id, student_no) VALUES (123, '20240001'), (456, '20240002');
-- 批量更新学生状态
UPDATE xg_student_msg
SET student_status = '2',
update_by = 1,
update_time = NOW()
WHERE id IN (SELECT student_id FROM student_leave_batch)
AND deleted = 0;
-- 批量处理班级干部
UPDATE xg_class_pos_msg
SET is_current = 0,
cadre_status = '6',
dismissal_date = CURDATE(),
dismissal_reason = '学生休学',
update_by = 1,
update_time = NOW()
WHERE student_id IN (SELECT student_id FROM student_leave_batch)
AND is_current = 1
AND deleted = 0;
-- 批量处理社团成员
UPDATE club_member
SET member_status = '4',
update_by = 1,
update_time = NOW()
WHERE user_id IN (SELECT student_id FROM student_leave_batch)
AND member_status IN ('0', '1', '2')
AND deleted = 0;
-- 批量处理奖学金申请
UPDATE jcbt_scholarship_application
SET current_status = 'WITHDRAWN',
update_by = 1,
update_time = NOW()
WHERE student_id IN (SELECT student_id FROM student_leave_batch)
AND current_status IN ('PENDING', 'APPROVED')
AND deleted = 0;
-- 显示处理结果
SELECT '休学处理完成' as result,
COUNT(*) as processed_count
FROM student_leave_batch;
```
## ⚠️ 使用注意事项
### 快速脚本特点
- **简化处理**: 去除了复杂的事务管理和详细日志记录
- **快速执行**: 适用于紧急情况或已知数据环境
- **手动确认**: 执行前请仔细检查参数设置
- **备份要求**: 重要操作前必须备份数据
### 参数设置要求
```sql
-- 必须设置的参数
SET @student_id = 123456789; -- 学生ID
SET @student_no = '20240001'; -- 学生学号
SET @operator_id = 1; -- 操作员ID
-- 可选参数
SET @change_date = '2025-12-24'; -- 变更日期,默认为当前日期
```
### 执行顺序建议
1. **备份数据**: 执行任何修改前备份相关表
2. **设置参数**: 确认所有参数正确设置
3. **逐步执行**: 可以分批次执行,便于问题排查
4. **验证结果**: 执行后检查各表更新结果
5. **记录日志**: 手动记录操作日志
### 错误处理
- 如果脚本执行失败,回滚事务
- 检查约束冲突和外键关系
- 确认用户权限和数据权限
- 查看数据库错误日志
---
## 📅 更新记录
- **2025-12-XX**: 分文档创建,包含快速执行脚本
- **后续更新**: 根据实际业务需求持续完善
---
*本分文档提供快速执行的简化脚本,适用于紧急处理场景,使用时请谨慎并做好数据备份。*
@@ -0,0 +1,71 @@
# 学生退学、休学、毕业处理文档
## 📋 文档概述
本目录包含完整的学生退学、休学、毕业处理文档体系,采用模块化组织方式,便于查阅和维护。
## 📚 文档结构
### 📋 主文档
- **[学生退学休学毕业处理清单.md](学生退学休学毕业处理清单.md)** - 总览文档,包含处理流程概览和各分文档导航
### 📋 分文档
#### 核心处理文档
- **[01-核心状态修改.md](01-核心状态修改.md)** - 学生学籍状态、用户登录状态
- **[02-组织关系处理.md](02-组织关系处理.md)** - 班级干部信息、社团成员关系
- **[03-经济资助处理.md](03-经济资助处理.md)** - 奖学金申请、获奖记录、勤工俭学、贫困生认定
- **[04-其他业务处理.md](04-其他业务处理.md)** - 住宿管理、心理健康、学生活动、志愿者、实习等
#### 实施文档
- **[06-完整SQL脚本.md](06-完整SQL脚本.md)** - 完整的数据库处理脚本和事务管理
- **[07-快速执行脚本.md](07-快速执行脚本.md)** - 快速执行的简化脚本和批量处理
### 🗃️ 数据文件
- **dict字典.sql** - 字典数据
- **hzdyjs_xg.sql** - 数据库结构和基础数据
- **xg_student_status_change.sql** - 学生状态变更相关SQL
## 🎯 处理流程
```
1. 阅读主文档了解概览 → 学生退学休学毕业处理清单.md
2. 根据业务模块查阅分文档 → 01-04各业务模块文档
3. 选择合适的实施方式 → 06完整脚本 或 07快速脚本
4. 执行处理并验证结果
```
## ⚠️ 重要提醒
- **数据备份**: 执行任何修改操作前务必备份相关数据
- **权限控制**: 确保操作人员具有相应权限
- **事务处理**: 建议使用数据库事务确保数据一致性
- **日志记录**: 记录所有操作日志便于审计
## 📊 涉及业务模块统计
| 模块 | 涉及表数量 | 重要程度 |
|------|-----------|----------|
| 核心状态管理 | 2 | ⭐⭐⭐⭐⭐ |
| 组织关系 | 2 | ⭐⭐⭐⭐⭐ |
| 经济资助 | 4 | ⭐⭐⭐⭐ |
| 住宿管理 | 1 | ⭐⭐⭐⭐⭐ |
| 心理健康 | 1 | ⭐⭐⭐⭐ |
| 实践活动 | 3 | ⭐⭐⭐⭐ |
| 其他信息 | 3 | ⭐⭐⭐ |
## 🔄 状态映射关系
- **休学**: `student_status=2`,用户账号保留,可恢复业务
- **退学**: `student_status=4`,`sys_user.status=1`,终止所有业务
- **毕业**: `student_status=5`,`sys_user.status=1`,归档处理
## 📅 更新记录
- **2025-12-XX**: 完成文档模块化拆分,原有内容完整保留
- **拆分说明**: 将原来1100+行的单文档拆分为1个主文档 + 6个分文档
- **优化内容**: 基于奖学金获奖记录业务逻辑深度分析,完善了相关处理逻辑
---
*本项目采用模块化文档管理方式,确保文档的可维护性和可读性。*
File diff suppressed because it is too large. Load diff
+119 -119
View File
@@ -243,7 +243,7 @@ CREATE TABLE `club_activity` (
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` tinyint(1) DEFAULT '0' COMMENT '逻辑删除标记:0=正常,1=删除',
`tenant_id` bigint(20) DEFAULT '1' COMMENT '租户ID',
`tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户ID',
PRIMARY KEY (`activity_id`),
KEY `idx_club_id` (`club_id`),
KEY `idx_activity_status` (`activity_status`),
@@ -272,7 +272,7 @@ CREATE TABLE `club_activity_audit` (
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` tinyint(1) DEFAULT '0' COMMENT '逻辑删除标记:0=正常,1=删除',
`tenant_id` bigint(20) DEFAULT '1' COMMENT '租户ID',
`tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户ID',
PRIMARY KEY (`audit_id`),
KEY `idx_activity_id` (`activity_id`),
KEY `idx_auditor_id` (`auditor_id`),
@@ -296,7 +296,7 @@ CREATE TABLE `club_activity_participant` (
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` tinyint(1) DEFAULT '0' COMMENT '逻辑删除标记:0=正常,1=删除',
`tenant_id` bigint(20) DEFAULT '1' COMMENT '租户ID',
`tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户ID',
PRIMARY KEY (`participant_id`),
UNIQUE KEY `uk_activity_user` (`activity_id`,`user_id`,`deleted`),
KEY `idx_user_id` (`user_id`),
@@ -326,7 +326,7 @@ CREATE TABLE `club_info` (
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` tinyint(1) DEFAULT '0' COMMENT '逻辑删除标记:0=正常,1=删除',
`tenant_id` bigint(20) DEFAULT '1' COMMENT '租户ID',
`tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户ID',
PRIMARY KEY (`club_id`),
UNIQUE KEY `uk_club_name` (`club_name`,`deleted`),
KEY `idx_advisor_id` (`advisor_id`),
@@ -355,7 +355,7 @@ CREATE TABLE `club_member` (
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` tinyint(1) DEFAULT '0' COMMENT '逻辑删除标记:0=正常,1=删除',
`tenant_id` bigint(20) DEFAULT '1' COMMENT '租户ID',
`tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户ID',
PRIMARY KEY (`member_id`),
UNIQUE KEY `uk_club_user` (`club_id`,`user_id`,`deleted`),
KEY `idx_user_id` (`user_id`),
@@ -379,7 +379,7 @@ CREATE TABLE `club_permission` (
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` tinyint(1) DEFAULT '0' COMMENT '逻辑删除标记:0=正常,1=删除',
`tenant_id` bigint(20) DEFAULT '1' COMMENT '租户ID',
`tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户ID',
PRIMARY KEY (`permission_id`),
UNIQUE KEY `uk_club_user_permission` (`club_id`,`user_id`,`permission_type`,`deleted`),
KEY `idx_user_id` (`user_id`),
@@ -960,7 +960,7 @@ CREATE TABLE `cw_project_performance_self_evaluation` (
`existing_problems` text COLLATE utf8mb4_unicode_ci COMMENT '存在问题',
`improvement_measures` text COLLATE utf8mb4_unicode_ci COMMENT '改进措施和建议',
`evaluation_status` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT 'draft' COMMENT '自评状态',
`allow_edit_after_submit` tinyint(1) DEFAULT '0' COMMENT '允许已提交后编辑(0-不允许 1-允许)',
`allow_edit_after_submit` tinyint(1) DEFAULT '0' COMMENT '允许已提交后编辑(0-不允许 1-允许)',
`submit_time` datetime DEFAULT NULL COMMENT '提交时间',
`submit_by` bigint(20) DEFAULT NULL COMMENT '提交人ID',
`submit_by_name` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '提交人姓名',
@@ -968,10 +968,10 @@ CREATE TABLE `cw_project_performance_self_evaluation` (
`approve_by` bigint(20) DEFAULT NULL COMMENT '审核人ID',
`approve_by_name` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '审核人姓名',
`approve_opinion` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '审核意见',
`is_locked` tinyint(1) DEFAULT '0' COMMENT '是否锁定(0-未锁定 1-已锁定),锁定后不可修改',
`lock_time` datetime DEFAULT NULL COMMENT '锁定时间',
`lock_by` bigint(20) DEFAULT NULL COMMENT '锁定人ID',
`lock_by_name` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '锁定人姓名',
`is_locked` tinyint(1) DEFAULT '0' COMMENT '是否锁定(0-未锁定 1-已锁定),锁定后不可修改',
`lock_time` datetime DEFAULT NULL COMMENT '锁定时间',
`lock_by` bigint(20) DEFAULT NULL COMMENT '锁定人ID',
`lock_by_name` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '锁定人姓名',
`remark` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注',
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
@@ -984,7 +984,7 @@ CREATE TABLE `cw_project_performance_self_evaluation` (
KEY `idx_evaluation_year` (`evaluation_year`) USING BTREE,
KEY `idx_status` (`evaluation_status`) USING BTREE,
KEY `idx_tenant` (`tenant_id`) USING BTREE,
KEY `idx_application_year` (`project_application_id`,`evaluation_year`,`tenant_id`) COMMENT '项目-年度-租户联合索引',
KEY `idx_application_year` (`project_application_id`,`evaluation_year`,`tenant_id`) COMMENT '关联申请ID-评估年份-租户ID索引',
KEY `idx_is_locked` (`is_locked`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='项目绩效自评表';
@@ -2431,7 +2431,7 @@ CREATE TABLE `jcbt_poverty_application` (
`student_no` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '学号',
`student_name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '学生姓名',
`gender` char(1) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '性别',
`college_id` bigint(20) DEFAULT NULL COMMENT '学院ID',
`college_id` bigint(20) DEFAULT NULL COMMENT '学院ID',
`class_id` bigint(20) DEFAULT NULL COMMENT '班级ID',
`class_code` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '班级代码',
`class_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '班级名称',
@@ -2439,31 +2439,31 @@ CREATE TABLE `jcbt_poverty_application` (
`major_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '专业名称',
`college_code` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '学院代码',
`college_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '学院名称',
`major_id` bigint(20) DEFAULT NULL COMMENT '专业ID',
`teacher_id` bigint(20) DEFAULT NULL COMMENT '班主任教师ID',
`teacher_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '班主任教师姓名',
`major_id` bigint(20) DEFAULT NULL COMMENT '专业ID',
`teacher_id` bigint(20) DEFAULT NULL COMMENT '班主任ID',
`teacher_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '班主任姓名',
`recognition_group` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '认定群体',
`recognition_type_id` bigint(20) NOT NULL COMMENT '认定类型ID',
`recognition_type_code` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '认定类型编码',
`recognition_type_code` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '认定类型编码',
`recognition_type_name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '认定类型名称',
`assistance_type_ids` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '申请资助类型ID数组',
`assistance_type_names` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '申请资助类型名称',
`assistance_types` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '申请资助类型',
`assistance_type_ids` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '申请自助类型ID数组',
`assistance_type_names` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '申请自助类型名称',
`assistance_types` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '申请自助类型',
`family_economic_summary` text COLLATE utf8mb4_unicode_ci COMMENT '家庭经济情况摘要',
`attach_application_form_url` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '申请表附件URL',
`attach_application_form_url` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '申请表附件URL',
`application_status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'draft' COMMENT '申请状态',
`submit_time` datetime DEFAULT NULL COMMENT '提交时间',
`audit_time` datetime DEFAULT NULL COMMENT '审核时间',
`audit_time` datetime DEFAULT NULL COMMENT '审核时间',
`auditor_id` bigint(20) DEFAULT NULL COMMENT '审核人用户ID',
`auditor_name` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '审核人姓名',
`audit_opinion` text COLLATE utf8mb4_unicode_ci COMMENT '审核意见',
`audit_opinion` text COLLATE utf8mb4_unicode_ci COMMENT '审核意见',
`remark` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注',
`status` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT 'DRAFT' COMMENT '申请状态(DRAFT-草稿,SUBMITTED-已提交,REVIEWING-审核中,APPROVED-已通过,REJECTED-已拒绝,WITHDRAWN-已撤回)',
`submitter_id` bigint(20) DEFAULT NULL COMMENT '提交人ID',
`submitter_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '提交人姓名',
`submitter_id` bigint(20) DEFAULT NULL COMMENT '申请人ID',
`submitter_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '申请人姓名',
`attach_application_form_id` bigint(20) DEFAULT NULL COMMENT '申请表附件ID',
`attach_survey_form_url` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '调查表附件URL',
`attach_survey_form_id` bigint(20) DEFAULT NULL COMMENT '调查表附件ID',
`attach_survey_form_url` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '调查表附件URL',
`attach_survey_form_id` bigint(20) DEFAULT NULL COMMENT '调查表附件ID',
`family_economy_summary` text COLLATE utf8mb4_unicode_ci COMMENT '家庭经济情况摘要',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uk_application_no` (`application_no`) USING BTREE,
@@ -2514,7 +2514,7 @@ CREATE TABLE `jcbt_scholarship_application` (
`dept_id` bigint(20) NOT NULL COMMENT '所属部门ID',
`major_id` bigint(20) DEFAULT NULL COMMENT '专业ID',
`class_id` bigint(20) DEFAULT NULL COMMENT '班级ID',
`application_type` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '申请类型:TEACHER_RECOMMEND-教师推荐,AUTO-自动评定,DIRECT-直接指定',
`application_type` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '申请类型:TEACHER_RECOMMEND-教师推荐,AUTO-自动评定,DIRECT-直接评定',
`current_status` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT 'PENDING' COMMENT '当前状态:PENDING-待审核,APPROVED-已通过,REJECTED-已拒绝,WITHDRAWN-已撤回',
`apply_reason` text COLLATE utf8mb4_unicode_ci COMMENT '申请理由',
`self_evaluation` text COLLATE utf8mb4_unicode_ci COMMENT '自我评价',
@@ -2529,9 +2529,9 @@ CREATE TABLE `jcbt_scholarship_application` (
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` tinyint(1) DEFAULT '0' COMMENT '删除标记:0-正常,1-删除',
`applicant_type` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT 'TEACHER' COMMENT '申请人类型:STUDENT-学生申请,TEACHER-教师代申请',
`applicant_id` bigint(20) DEFAULT NULL COMMENT '申请人ID(班主任ID)',
`applicant_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '申请人姓名(班主任姓名)',
`applicant_type` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT 'TEACHER' COMMENT '申请人类型:STUDENT-学生,TEACHER-教师',
`applicant_id` bigint(20) DEFAULT NULL COMMENT '申请人ID',
`applicant_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '申请人姓名',
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_application_no` (`application_no`),
@@ -2559,7 +2559,7 @@ CREATE TABLE `jcbt_scholarship_attachment` (
`file_size` bigint(20) DEFAULT NULL COMMENT '文件大小(字节)',
`file_type` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文件类型',
`upload_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '上传时间',
`is_required` tinyint(1) DEFAULT '0' COMMENT '是否必需:0-否,1-是(新需求中材料非必填)',
`is_required` tinyint(1) DEFAULT '0' COMMENT '是否必填:0-否,1-是(新增附件需手动上传)',
`description` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '附件描述',
`tenant_id` bigint(20) NOT NULL COMMENT '租户ID',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
@@ -2567,9 +2567,9 @@ CREATE TABLE `jcbt_scholarship_attachment` (
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` tinyint(1) DEFAULT '0' COMMENT '删除标记:0-正常,1-删除',
`uploader_type` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT 'TEACHER' COMMENT '上传者类型:STUDENT-学生,TEACHER-教师',
`uploader_id` bigint(20) DEFAULT NULL COMMENT '上传者ID',
`uploader_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '上传者姓名',
`uploader_type` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT 'TEACHER' COMMENT '上传人类型:STUDENT-学生,TEACHER-教师',
`uploader_id` bigint(20) DEFAULT NULL COMMENT '上传人ID',
`uploader_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '上传人姓名',
PRIMARY KEY (`id`),
KEY `idx_application_type` (`application_id`,`attachment_type`),
KEY `idx_upload_time` (`upload_time`),
@@ -2646,8 +2646,8 @@ CREATE TABLE `jcbt_scholarship_batch` (
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` tinyint(1) DEFAULT '0' COMMENT '删除标记:0-正常,1-删除',
`application_start_time` datetime DEFAULT NULL COMMENT '申请开始时间',
`application_end_time` datetime DEFAULT NULL COMMENT '申请结束时间',
`application_start_time` datetime DEFAULT NULL COMMENT '申请开始时间',
`application_end_time` datetime DEFAULT NULL COMMENT '申请结束时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_batch_code_tenant` (`batch_code`,`tenant_id`,`deleted`),
KEY `idx_academic_year` (`academic_year`,`semester`),
@@ -3336,7 +3336,7 @@ CREATE TABLE `rs_overseas_application` (
DROP TABLE IF EXISTS `rs_overseas_application_attachment`;
CREATE TABLE `rs_overseas_application_attachment` (
`attachment_id` bigint(20) NOT NULL COMMENT '附件ID(主键)',
`application_id` bigint(20) NOT NULL COMMENT '出国申请附件对象 rs_overseas_application_attachment\n *\n * @author weizzzz\n * @date 2025-10-10\n */\n@Data\n@EqualsAndHashCode(callSuper = true)\n@TableName("rs_overseas_application_attachment")\npublic class RsOverseasApplicationAttachment extends BaseEntity {\n\n private static final long serialVersionUID = 1L;\n\n /**\n * 附件ID(主键)\n */\n @TableId(value = "attachment_id", type = IdType.ASSIGN_ID)\n private Long attachmentId;\n\n /**\n * 出国申请ID',
`application_id` bigint(20) NOT NULL COMMENT '出国申请ID',
`attachment_title` varchar(200) NOT NULL COMMENT '附件标题',
`attachment_content` text COMMENT '附件内容说明',
`file_name` varchar(200) NOT NULL COMMENT '文件名称',
@@ -3346,7 +3346,7 @@ CREATE TABLE `rs_overseas_application_attachment` (
`file_type` varchar(50) DEFAULT NULL COMMENT '文件类型(如pdf、jpg、png、doc等)',
`mime_type` varchar(100) DEFAULT NULL COMMENT 'MIME类型',
`upload_time` datetime DEFAULT NULL COMMENT '上传时间',
`upload_user_id` bigint(20) DEFAULT NULL COMMENT '上传时间\n */\n @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")\n private Date uploadTime;\n\n /**\n * 上传人ID',
`upload_user_id` bigint(20) DEFAULT NULL COMMENT '上传人ID',
`upload_user_name` varchar(50) DEFAULT NULL COMMENT '上传人姓名',
`tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户ID',
`deleted` char(1) DEFAULT '0' COMMENT '删除标志',
@@ -3356,9 +3356,9 @@ CREATE TABLE `rs_overseas_application_attachment` (
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`attachment_id`),
KEY `idx_application_id` (`application_id`) COMMENT '出国申请ID索引',
KEY `idx_tenant_deleted` (`tenant_id`,`deleted`) COMMENT '租户和删除标志联合索引',
KEY `idx_upload_time` (`upload_time`) COMMENT '上传时间索引'
KEY `idx_application_id` (`application_id`) COMMENT '出国申请ID索引',
KEY `idx_tenant_deleted` (`tenant_id`,`deleted`) COMMENT '租户ID和删除标志索引',
KEY `idx_upload_time` (`upload_time`) COMMENT '上传时间索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='出国申请附件表';
-- ----------------------------
@@ -3367,44 +3367,44 @@ CREATE TABLE `rs_overseas_application_attachment` (
DROP TABLE IF EXISTS `rs_overseas_application_backup_20251011`;
CREATE TABLE `rs_overseas_application_backup_20251011` (
`application_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '申请ID',
`serial_number` varchar(50) DEFAULT NULL COMMENT '编号(自动生成的登记编号)',
`serial_number` varchar(50) DEFAULT NULL COMMENT '申请编号(邀请函编号)',
`applicant_id` bigint(20) NOT NULL COMMENT '申请人ID',
`applicant_name` varchar(50) NOT NULL COMMENT '申请人姓名',
`gender` char(1) DEFAULT NULL COMMENT '性别:0-男,1-女',
`birth_date` date DEFAULT NULL COMMENT '出生日期',
`photo` varchar(500) DEFAULT NULL COMMENT '照片地址(2寸免冠白色或淡蓝色底彩照)',
`id_number` varchar(18) DEFAULT NULL COMMENT '公民身份号码(18位身份证号)',
`political_status` varchar(50) DEFAULT NULL COMMENT '政治面貌',
`registered_address` varchar(200) DEFAULT NULL COMMENT '户籍所在地(填写至县市区)',
`department` varchar(200) DEFAULT NULL COMMENT '所属部门(工作部门/教学系部)',
`gender` char(1) DEFAULT NULL COMMENT '性别:0-男,1-女',
`birth_date` date DEFAULT NULL COMMENT '出生日期',
`photo` varchar(500) DEFAULT NULL COMMENT '照片(2寸照片或电子照片)',
`id_number` varchar(18) DEFAULT NULL COMMENT '身份证号码(18位身份证号码)',
`political_status` varchar(50) DEFAULT NULL COMMENT '政治面貌',
`registered_address` varchar(200) DEFAULT NULL COMMENT '户籍地址(如:家庭地址)',
`department` varchar(200) DEFAULT NULL COMMENT '部门(如:学院/系部)',
`position` varchar(100) DEFAULT NULL COMMENT '职位',
`professional_title` varchar(100) DEFAULT NULL COMMENT '职称',
`administrative_level` varchar(20) DEFAULT NULL COMMENT '行政职级',
`personnel_category` varchar(10) DEFAULT NULL COMMENT '人员类别代码(根据报备人员范围中的情形项填写)',
`registration_unit` varchar(200) DEFAULT NULL COMMENT '登记备案责任单位',
`unit_leader_signature` varchar(100) DEFAULT NULL COMMENT '登记备案责任单位负责人签名',
`unit_contact` varchar(100) DEFAULT NULL COMMENT '登记备案责任单位联系人',
`office_phone` varchar(20) DEFAULT NULL COMMENT '办公电话',
`mobile_phone` varchar(11) DEFAULT NULL COMMENT '移动电话',
`document_name` varchar(100) DEFAULT NULL COMMENT '申领证件名称',
`document_number` varchar(50) DEFAULT NULL COMMENT '证件号码',
`destination_country` varchar(100) DEFAULT NULL COMMENT '前往国家',
`exit_reason` varchar(50) DEFAULT NULL COMMENT '出境事由(旅游/探亲等)',
`visit_relationship` varchar(200) DEFAULT NULL COMMENT '探望对象姓名及与申请者关系',
`remarks` text COMMENT '备注',
`emergency_contact` varchar(200) DEFAULT NULL COMMENT '应急联系人及电话',
`signature` longtext COMMENT '手写签字(base64格式)',
`stamped_registration_file_path` varchar(500) DEFAULT NULL COMMENT '登记备案表盖章文件路径',
`stamped_registration_file_name` varchar(200) DEFAULT NULL COMMENT '登记备案表盖章文件名',
`stamped_file_upload_time` datetime DEFAULT NULL COMMENT '盖章文件上传时间',
`stamped_file_upload_status` char(1) DEFAULT '0' COMMENT '盖章文件上传状态:0-未上传,1-已上传',
`stamped_file_oss_id` bigint(20) DEFAULT NULL COMMENT '盖章文件OSS ID',
`party_retention_file_path` varchar(500) DEFAULT NULL COMMENT '党籍保留附件文件路径',
`party_retention_file_name` varchar(200) DEFAULT NULL COMMENT '党籍保留附件文件名',
`party_retention_upload_time` datetime DEFAULT NULL COMMENT '党籍保留附件上传时间',
`party_retention_upload_status` varchar(1) DEFAULT '0' COMMENT '党籍保留附件上传状态:0-未上传,1-已上传',
`party_retention_file_oss_id` bigint(20) DEFAULT NULL COMMENT '党籍保留附件OSS ID',
`attachment_count` int(11) DEFAULT '0' COMMENT '附件数量',
`professional_title` varchar(100) DEFAULT NULL COMMENT '专业技术职务',
`administrative_level` varchar(20) DEFAULT NULL COMMENT '行政级别',
`personnel_category` varchar(10) DEFAULT NULL COMMENT '人员类别(如:在职人员/退休人员)',
`registration_unit` varchar(200) DEFAULT NULL COMMENT '注册单位',
`unit_leader_signature` varchar(100) DEFAULT NULL COMMENT '注册单位领导签字',
`unit_contact` varchar(100) DEFAULT NULL COMMENT '注册单位联系方式',
`office_phone` varchar(20) DEFAULT NULL COMMENT '办公电话',
`mobile_phone` varchar(11) DEFAULT NULL COMMENT '手机号码',
`document_name` varchar(100) DEFAULT NULL COMMENT '申领证件名称',
`document_number` varchar(50) DEFAULT NULL COMMENT '证件号码',
`destination_country` varchar(100) DEFAULT NULL COMMENT '目的地国家',
`exit_reason` varchar(50) DEFAULT NULL COMMENT '出境事由(如:旅游/探亲/商务等)',
`visit_relationship` varchar(200) DEFAULT NULL COMMENT '探望对象姓名及与申请者关系',
`remarks` text COMMENT '备注',
`emergency_contact` varchar(200) DEFAULT NULL COMMENT '紧急联系人及电话',
`signature` longtext COMMENT '手写签字(base64格式)',
`stamped_registration_file_path` varchar(500) DEFAULT NULL COMMENT '登记备案表盖章文件路径',
`stamped_registration_file_name` varchar(200) DEFAULT NULL COMMENT '登记备案表盖章文件名',
`stamped_file_upload_time` datetime DEFAULT NULL COMMENT '盖章文件上传时间',
`stamped_file_upload_status` char(1) DEFAULT '0' COMMENT '盖章文件上传状态:0-未上传,1-已上传',
`stamped_file_oss_id` bigint(20) DEFAULT NULL COMMENT '盖章文件OSS ID',
`party_retention_file_path` varchar(500) DEFAULT NULL COMMENT '党组织保留附件文件路径',
`party_retention_file_name` varchar(200) DEFAULT NULL COMMENT '党组织保留附件文件名',
`party_retention_upload_time` datetime DEFAULT NULL COMMENT '党组织保留附件上传时间',
`party_retention_upload_status` varchar(1) DEFAULT '0' COMMENT '党组织保留附件上传状态:0-未上传,1-已上传',
`party_retention_file_oss_id` bigint(20) DEFAULT NULL COMMENT '党籍保留附件OSS ID(多个ID用逗号分隔)',
`attachment_count` int(11) DEFAULT '0' COMMENT '附件数量',
`contact_phone` varchar(20) DEFAULT NULL COMMENT '联系电话',
`contact_email` varchar(100) DEFAULT NULL COMMENT '联系邮箱',
`purpose` varchar(50) NOT NULL COMMENT '出国目的',
@@ -3469,8 +3469,8 @@ CREATE TABLE `rs_overseas_approval` (
DROP TABLE IF EXISTS `rs_overseas_itinerary_change`;
CREATE TABLE `rs_overseas_itinerary_change` (
`change_id` bigint(20) NOT NULL COMMENT '变更ID(主键,雪花ID)',
`record_id` bigint(20) NOT NULL COMMENT '出国行程变更对象 rs_overseas_itinerary_change\n *\n * @author zlwu\n * @date 2025-01-13\n */\n@Data\n@EqualsAndHashCode(callSuper = true)\n@TableName("rs_overseas_itinerary_change")\npublic class RsOverseasItineraryChange extends BaseEntity {\n\n private static final long serialVersionUID = 1L;\n\n /**\n * 变更ID(主键,雪花ID)\n */\n @TableId(value = "change_id")\n private Long changeId;\n\n /**\n * 关联备案记录ID(外键,关联rs_overseas_entry_exit_record.record_id)',
`application_id` bigint(20) DEFAULT NULL COMMENT '关联出国申请ID(外键,关联rs_overseas_application.application_id,可为空)',
`record_id` bigint(20) NOT NULL COMMENT '记录ID外键,关联 rs_overseas_record.record_id',
`application_id` bigint(20) DEFAULT NULL COMMENT '关联出国申请ID 外键,关联 rs_overseas_application.application_id',
`applicant_id` bigint(20) NOT NULL COMMENT '申请人ID(外键,关联sys_user.user_id)',
`applicant_name` varchar(100) NOT NULL COMMENT '申请人姓名',
`gender` char(1) DEFAULT NULL COMMENT '性别:0-男,1-女',
@@ -3515,12 +3515,12 @@ CREATE TABLE `rs_overseas_itinerary_change` (
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` tinyint(1) DEFAULT '0' COMMENT '删除标志',
PRIMARY KEY (`change_id`),
KEY `idx_record_id` (`record_id`) COMMENT '出国记录ID索引',
KEY `idx_application_id` (`application_id`) COMMENT '原申请ID索引',
KEY `idx_applicant_id` (`applicant_id`) COMMENT '申请人ID索引',
KEY `idx_status` (`status`) COMMENT '状态索引',
KEY `idx_tenant_id` (`tenant_id`) COMMENT '租户ID索引',
KEY `idx_create_time` (`create_time`) COMMENT '创建时间索引'
KEY `idx_record_id` (`record_id`) COMMENT '记录ID索引',
KEY `idx_application_id` (`application_id`) COMMENT '关联出国申请ID索引',
KEY `idx_applicant_id` (`applicant_id`) COMMENT '申请人ID索引',
KEY `idx_status` (`status`) COMMENT '审批状态索引',
KEY `idx_tenant_id` (`tenant_id`) COMMENT '租户ID索引',
KEY `idx_create_time` (`create_time`) COMMENT '创建时间索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='出国行程变更表';
-- ----------------------------
@@ -3574,7 +3574,7 @@ DROP TABLE IF EXISTS `rs_overseas_record_status_backup`;
CREATE TABLE `rs_overseas_record_status_backup` (
`record_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '记录ID',
`completion_status` char(1) DEFAULT '0' COMMENT '完成状态:0-进行中,1-已完成,2-提前结束',
`old_status_text` varchar(12) NOT NULL DEFAULT '' COMMENT '原状态文本',
`old_status_text` varchar(12) NOT NULL DEFAULT '' COMMENT '审批状态文本',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
@@ -3608,15 +3608,15 @@ CREATE TABLE `rs_overseas_registration` (
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`registration_id`) USING BTREE,
KEY `idx_application_id` (`application_id`) USING BTREE COMMENT '关联申请ID索引',
KEY `idx_name` (`name`) USING BTREE COMMENT '姓名索引(支持模糊查询)',
KEY `idx_id_number` (`id_number`) USING BTREE COMMENT '身份证号索引(唯一性查询)',
KEY `idx_political_status` (`political_status`) USING BTREE COMMENT '政治面貌索引(党员筛选)',
KEY `idx_status` (`status`) USING BTREE COMMENT '状态索引(用于筛选)',
KEY `idx_registration_time` (`registration_time`) USING BTREE COMMENT '登记时间索引(用于排序)',
KEY `idx_tenant_deleted` (`tenant_id`,`deleted`) USING BTREE COMMENT '多租户隔离索引',
KEY `idx_department` (`department`) USING BTREE COMMENT '部门索引',
KEY `idx_create_time` (`create_time`) USING BTREE COMMENT '创建时间索引'
KEY `idx_application_id` (`application_id`) USING BTREE COMMENT '关联出国申请ID索引',
KEY `idx_name` (`name`) USING BTREE COMMENT '姓名索引',
KEY `idx_id_number` (`id_number`) USING BTREE COMMENT '身份证号码索引',
KEY `idx_political_status` (`political_status`) USING BTREE COMMENT '政治面貌索引',
KEY `idx_status` (`status`) USING BTREE COMMENT '登记状态索引',
KEY `idx_registration_time` (`registration_time`) USING BTREE COMMENT '登记时间索引',
KEY `idx_tenant_deleted` (`tenant_id`,`deleted`) USING BTREE COMMENT '租户ID和删除标志索引',
KEY `idx_department` (`department`) USING BTREE COMMENT '部门索引',
KEY `idx_create_time` (`create_time`) USING BTREE COMMENT '创建时间索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='出国登记表';
-- ----------------------------
@@ -3661,19 +3661,19 @@ CREATE TABLE `rs_training_application` (
`user_name` varchar(50) NOT NULL COMMENT '申请人姓名',
`department` varchar(50) NOT NULL COMMENT '所属部门',
`position` varchar(50) DEFAULT NULL COMMENT '职位',
`current_title` varchar(100) DEFAULT NULL COMMENT '现职称',
`current_position` varchar(50) DEFAULT NULL COMMENT '现岗位',
`work_start_time` date DEFAULT NULL COMMENT '参加工作时间',
`phone` varchar(20) DEFAULT NULL COMMENT '联系电话',
`current_title` varchar(100) DEFAULT NULL COMMENT '职称',
`current_position` varchar(50) DEFAULT NULL COMMENT '职务',
`work_start_time` date DEFAULT NULL COMMENT '工作开始时间',
`phone` varchar(20) DEFAULT NULL COMMENT '联系电话',
`emergency_contact` varchar(200) DEFAULT NULL COMMENT '应急联系人及电话',
`organizer_unit` varchar(200) DEFAULT NULL COMMENT '主办单位',
`training_type` varchar(50) DEFAULT NULL COMMENT '培训类型',
`training_fee` decimal(10,2) DEFAULT '0.00' COMMENT '培训费用',
`companions` text COMMENT '同行人员列表(JSON格式)',
`training_purpose` text COMMENT '培训目的',
`attachment_ids` text COMMENT '附件ID列表(逗号分隔)',
`organizer_unit` varchar(200) DEFAULT NULL COMMENT '组织单位',
`training_type` varchar(50) DEFAULT NULL COMMENT '培训类型',
`training_fee` decimal(10,2) DEFAULT '0.00' COMMENT '培训费用',
`companions` text COMMENT '同伴人员(JSON格式存储人员信息)',
`training_purpose` text COMMENT '培训目的',
`attachment_ids` text COMMENT '附件OSS ID列表(逗号分隔)',
`reason` text COMMENT '申请理由',
`status` char(1) DEFAULT '0' COMMENT '状态(0待审核 1已通过 2已拒绝 3进行中 4已完成)',
`status` char(1) DEFAULT '0' COMMENT '状态:0-待审核,1-已通过,2-已拒绝,3-进行中,4-已完成',
`apply_time` datetime DEFAULT NULL COMMENT '申请时间',
`current_approver` varchar(50) DEFAULT NULL COMMENT '当前审批人',
`current_approver_id` bigint(20) DEFAULT NULL COMMENT '当前审批人ID',
@@ -3789,7 +3789,7 @@ CREATE TABLE `rs_training_record` (
`user_name` varchar(50) NOT NULL COMMENT '用户姓名',
`tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号',
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`dept_id` bigint(20) DEFAULT NULL COMMENT '部门ID',
`dept_id` bigint(20) DEFAULT NULL COMMENT '部门ID',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
@@ -3806,13 +3806,13 @@ CREATE TABLE `rs_training_record` (
`current_approver` varchar(255) DEFAULT NULL COMMENT '当前审批人',
`start_time` datetime DEFAULT NULL COMMENT '开始时间',
`end_time` datetime DEFAULT NULL COMMENT '结束时间',
`completion_status` char(1) DEFAULT '0' COMMENT '完成状态(0进行中 1已完成 2未完成)',
`completion_time` datetime DEFAULT NULL COMMENT '完成时间',
`score` decimal(5,2) DEFAULT NULL COMMENT '成绩',
`certificate_path` varchar(255) DEFAULT NULL COMMENT '证书路径',
`certificate_number` varchar(50) DEFAULT NULL COMMENT '证书编号',
`attachment_ids` text COMMENT '证书附件ID',
`feedback` text COMMENT '培训反馈',
`completion_status` char(1) DEFAULT '0' COMMENT '完成状态:0-进行中,1-已完成,2-提前结束',
`completion_time` datetime DEFAULT NULL COMMENT '完成时间',
`score` decimal(5,2) DEFAULT NULL COMMENT '成绩',
`certificate_path` varchar(255) DEFAULT NULL COMMENT '证书文件路径',
`certificate_number` varchar(50) DEFAULT NULL COMMENT '证书号码',
`attachment_ids` text COMMENT '证书附件OSS ID列表(逗号分隔)',
`feedback` text COMMENT '培训反馈',
PRIMARY KEY (`record_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='培训记录表';
@@ -5102,7 +5102,7 @@ CREATE TABLE `stgl_volunteer_team` (
KEY `idx_create_time` (`create_time`),
KEY `idx_status` (`status`),
KEY `idx_tenant_deleted` (`tenant_id`,`deleted`),
KEY `idx_advisors_json` (`advisors_json`(100)) COMMENT '指导老师JSON索引'
KEY `idx_advisors_json` (`advisors_json`(100)) COMMENT '指导老师JSON索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='志愿者队伍表';
-- ----------------------------
@@ -7166,7 +7166,7 @@ CREATE TABLE `xg_student_msg` (
`disability_type` varchar(50) DEFAULT NULL COMMENT '残疾类型 1 - 视力残疾 2 - 听力残疾 3 - 智力残疾 9 - 其他残疾',
`disability_level` varchar(20) DEFAULT NULL COMMENT '残疾等级',
`admission_category` varchar(20) DEFAULT NULL COMMENT '录取类别:统招、自主招生、专项计划等',
`student_status` char(1) DEFAULT '1' COMMENT '学籍状态:1-在籍,2-休学,3-复学,4-退学,5-毕业 , 6- 不在籍',
`student_status` char(1) DEFAULT '1' COMMENT '学籍状态',
`enrollment_year` int(4) DEFAULT NULL COMMENT '入学年份',
`enrollment_date` date DEFAULT NULL COMMENT '入学日期',
`bank_card_no` varchar(30) DEFAULT NULL COMMENT '银行卡号',
@@ -7296,7 +7296,7 @@ CREATE TABLE `xg_student_msg20251112` (
`disability_type` varchar(50) DEFAULT NULL COMMENT '残疾类型 1 - 视力残疾 2 - 听力残疾 3 - 智力残疾 9 - 其他残疾',
`disability_level` varchar(20) DEFAULT NULL COMMENT '残疾等级',
`admission_category` varchar(20) DEFAULT NULL COMMENT '录取类别:统招、自主招生、专项计划等',
`student_status` char(1) DEFAULT '1' COMMENT '学籍状态:1-在籍,2-休学,3-复学,4-退学,5-毕业',
`student_status` char(1) DEFAULT '1' COMMENT '学籍状态',
`enrollment_year` int(4) DEFAULT NULL COMMENT '入学年份',
`enrollment_date` date DEFAULT NULL COMMENT '入学日期',
`bank_card_no` varchar(30) DEFAULT NULL COMMENT '银行卡号',
@@ -7426,7 +7426,7 @@ CREATE TABLE `xg_student_msg20251222` (
`disability_type` varchar(50) DEFAULT NULL COMMENT '残疾类型 1 - 视力残疾 2 - 听力残疾 3 - 智力残疾 9 - 其他残疾',
`disability_level` varchar(20) DEFAULT NULL COMMENT '残疾等级',
`admission_category` varchar(20) DEFAULT NULL COMMENT '录取类别:统招、自主招生、专项计划等',
`student_status` char(1) DEFAULT '1' COMMENT '学籍状态:1-在籍,2-休学,3-复学,4-退学,5-毕业 , 6- 不在籍',
`student_status` char(1) DEFAULT '1' COMMENT '学籍状态',
`enrollment_year` int(4) DEFAULT NULL COMMENT '入学年份',
`enrollment_date` date DEFAULT NULL COMMENT '入学日期',
`bank_card_no` varchar(30) DEFAULT NULL COMMENT '银行卡号',
@@ -7556,7 +7556,7 @@ CREATE TABLE `xg_student_msg_batch` (
`disability_type` varchar(50) DEFAULT NULL COMMENT '残疾类型 1 - 视力残疾 2 - 听力残疾 3 - 智力残疾 9 - 其他残疾',
`disability_level` varchar(20) DEFAULT NULL COMMENT '残疾等级',
`admission_category` varchar(20) DEFAULT NULL COMMENT '录取类别:统招、自主招生、专项计划等',
`student_status` char(1) DEFAULT '1' COMMENT '学籍状态:1-在籍,2-休学,3-复学,4-退学,5-毕业',
`student_status` char(1) DEFAULT '1' COMMENT '学籍状态',
`enrollment_year` int(4) DEFAULT NULL COMMENT '入学年份',
`enrollment_date` date DEFAULT NULL COMMENT '入学日期',
`bank_card_no` varchar(30) DEFAULT NULL COMMENT '银行卡号',
@@ -0,0 +1,132 @@
# 学生退学、休学、毕业处理总览
## 📋 概述
本文档基于校园管理系统(hzdyjs_xg)的数据库表结构和业务逻辑分析,总结了学生退学、休学、毕业时需要处理的业务模块和数据变更。
本文档采用模块化组织方式,将详细的处理内容拆分到各个分文档中,便于查阅和维护。
## 📚 文档结构
### 📋 核心指导文档
- **[01-核心状态修改.md](01-核心状态修改.md)** - 学生学籍状态、用户登录状态
- **[02-组织关系处理.md](02-组织关系处理.md)** - 班级干部信息、社团成员关系
- **[03-经济资助处理.md](03-经济资助处理.md)** - 奖学金申请、获奖记录、勤工俭学、贫困生认定
- **[04-其他业务处理.md](04-其他业务处理.md)** - 住宿管理、心理健康、学生活动、志愿者、实习等
### 🛠️ 实施文档
- **[06-完整SQL脚本.md](06-完整SQL脚本.md)** - 完整的数据库处理脚本和事务管理
- **[07-快速执行脚本.md](07-快速执行脚本.md)** - 快速执行的简化脚本和批量处理
## 🔍 业务逻辑分析
通过分析数据库表结构、外键关系、字段定义和索引设计,可以推断出以下业务规则:
### 核心业务特征
1. **工作流驱动**: 大部分业务模块都涉及审批流程(奖学金、勤工俭学、宿舍等)
2. **批次管理**: 奖学金等业务按批次进行管理
3. **状态流转**: 各业务模块有明确的生命周期状态
4. **关联处理**: 学生状态变更需要联动处理多个相关业务
5. **数据完整性**: 通过外键约束确保数据一致性
### 处理原则
- **状态一致性**: 确保学生状态变更后,各业务模块状态保持逻辑一致
- **流程终止**: 终止进行中的审批流程,避免业务悬空
- **数据追溯**: 保留历史记录,便于审计和分析
- **业务连续性**: 考虑不同状态变更类型的差异化处理
## 🎯 处理流程概览
学生退学、休学、毕业处理涉及多个业务模块的联动更新,具体处理内容请参考各分文档:
### 📋 处理步骤
1. **确定变更类型**: 休学(TUI_XUE)/退学(XIU_XUE)/复学(FU_XUE)/毕业(BI_YE)
2. **创建状态变更记录**: 插入 `xg_student_status_change` 表记录
3. **核心状态修改**: 更新 `xg_student_msg.student_status` 和 `sys_user.status`
4. **组织关系处理**: 处理班级干部、社团成员等关系变更
5. **经济资助处理**: 处理奖学金、勤工俭学、贫困生认定等业务
6. **其他业务处理**: 处理宿舍、心理咨询、学生活动、实习等
7. **更新处理状态**: 将 `xg_student_status_change.process_status` 设为1
8. **数据验证**: 确保所有相关数据已正确处理
### 🔄 状态映射关系
- **休学**: `student_status='2'`,`sys_user.status` 保持不变,可恢复业务
- **退学**: `student_status='4'`,`sys_user.status='1'`,终止所有业务
- **毕业**: `student_status='5'`,`sys_user.status='1'`,归档处理
### 🏗️ 技术架构
基于代码分析,主要涉及以下技术组件:
- **核心实体**:
- `XgStudentMsg`: 学生基本信息实体
- `XgStudentStatusChange`: 学生状态变更记录实体
- `XgClassPosMsg`: 班级干部信息实体
- `StglMember`: 社团成员关系实体
- `JcbtScholarshipApplication`: 奖学金申请实体
- `JcbtWorkStudyApplication`: 勤工俭学申请实体
- `JcbtPovertyApplication`: 贫困生认定申请实体
- **业务服务**:
- `XgStudentStatusChangeServiceImpl`: 学生状态变更服务
- `XgClassPosMsgServiceImpl`: 班级干部管理服务
- `XljkConsultationAppointmentServiceImpl`: 心理咨询预约服务
- `JcbtScholarshipApplicationServiceImpl`: 奖学金申请服务
- **数据访问**: MyBatis-Plus Mapper接口和XML配置
- **事务管理**: Spring `@Transactional` 声明式事务
- **状态机**: 通过状态字段值变化实现业务状态流转
- **工作流引擎**: Warm-Flow工作流框架处理复杂审批流程
### 🎯 业务处理策略
- ✅ **核心状态**: 必须修改
- ✅ **进行中流程**: 全部终止
- ✅ **组织关系**: 全部解除
- ✅ **历史记录**: 保留(奖惩、考核由班主任管理)
- ✅ **关联业务**: 视具体情况终止
## 📊 数据库表统计
涉及的数据库表总数:**25个核心表**
| 模块 | 涉及表数量 | 重要程度 | 核心表名 |
|------|-----------|----------|----------|
| 核心状态管理 | 3 | ⭐⭐⭐⭐⭐ | `xg_student_msg`, `sys_user`, `xg_student_status_change` |
| 组织关系 | 2 | ⭐⭐⭐⭐⭐ | `xg_class_pos_msg`, `stgl_member` |
| 经济资助 | 4 | ⭐⭐⭐⭐ | `jcbt_scholarship_application`, `jcbt_scholarship_award`, `jcbt_work_study_application`, `jcbt_poverty_application` |
| 住宿管理 | 3 | ⭐⭐⭐⭐⭐ | `xg_dorm_bed_student`, `xg_dorm_application`, `xg_dorm_hygiene_student_score` |
| 心理健康 | 4 | ⭐⭐⭐⭐ | `xljk_consultation_appointment`, `xljk_consultation_record`, `xljk_consultation_no_show`, `xljk_evaluation_detail` |
| 实践活动 | 4 | ⭐⭐⭐⭐ | `stgl_activity_registration`, `stgl_volunteer_team`, `zsjy_internship_info`, `xg_student_leave` |
| 其他信息 | 5 | ⭐⭐⭐ | `xg_dorm_violation`, `sys_oper_log`, `sys_dict_data`, `sys_dict_type`, `flow_instance` |
## ⚠️ 重要注意事项
1. **数据备份**: 操作前务必备份相关数据
2. **事务处理**: 建议使用数据库事务确保数据一致性
3. **权限控制**: 确保操作人员具有相应权限
4. **日志记录**: 记录所有操作日志便于审计
5. **业务沟通**: 与相关部门沟通确认处理方案
## 🔄 系统集成考虑
- **审批流程**: 终止相关工作流
- **权限清理**: 清理角色权限
- **数据同步**: 确保各模块一致性
- **业务连续性**: 避免遗留问题
## 📚 快速开始
### 💡 使用指南
1. **确定变更类型**: 根据具体业务场景选择休学/退学/毕业
2. **查阅分文档**: 根据需要处理的业务模块查阅相应分文档
3. **执行处理**: 按分文档中的SQL脚本或业务逻辑进行处理
4. **验证结果**: 使用提供的验证脚本确认处理结果
5. **记录日志**: 确保所有操作都有完整的审计记录
---
## 📅 更新记录
- **2025-01-XX**: 初稿完成
- **2025-01-XX**: 添加完整SQL处理脚本
- **2025-12-XX**: 文档模块化拆分,将详细内容分离到分文档中
- **后续更新**: 根据实际业务需求持续完善
---
*本文档基于hzdyjs_xg校园管理系统数据库结构分析整理,采用模块化组织方式,详细处理内容请参考各分文档。*