# 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
在住
已退宿
未知
{{ parseTime(scope.row.checkoutTime, '{y}-{m}-{d} {h}:{i}') }}
-
```
#### 🔄 学生状态变更时的宿舍处理逻辑
##### 📋 处理策略说明
- **休学**: 可选择保留宿舍或办理暂退宿(根据学校政策)
- **退学**: 必须办理正式退宿,释放床位资源
- **毕业**: 办理毕业退宿,释放床位资源
##### 💾 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
待咨询
已完成
已取消
未到访
{{ parseTime(scope.row.appointmentDate, '{y}-{m}-{d}') }}
```
#### 🔄 学生状态变更时的心理咨询处理逻辑
##### 📋 处理策略说明
- **休学**: 取消未来预约,保留历史咨询记录
- **退学**: 取消未来预约,解除未到访限制
- **毕业**: 取消未来预约,保留完整心理健康档案
##### 💾 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
待审核
通过
驳回
个人
团队
```
#### 🔄 学生状态变更时的活动报名处理逻辑
##### 📋 处理策略说明
- **休学**: 驳回未开始的活动报名,保留已完成活动的记录和成绩
- **退学**: 驳回所有进行中的活动报名
- **毕业**: 可选择保留已完成活动的记录和成绩,驳回进行中的报名
##### 💾 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
进行中
已完成
已中断
{{ parseTime(scope.row.startDate, '{y}-{m}-{d}') }} 至
{{ parseTime(scope.row.actualEndDate || scope.row.endDate, '{y}-{m}-{d}') }}
```
#### 🔄 学生状态变更时的实习信息处理逻辑
##### 📋 处理策略说明
- **休学**: 设置为"中断"状态,保留重新实习的可能
- **退学**: 设置为"中断"状态,终止实习关系
- **毕业**: 如果实习已完成保持"已完成",否则设为"中断"
##### 💾 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**: 基于代码分析完善技术实现细节和业务逻辑
- **后续更新**: 根据实际业务需求持续完善
---
*本分文档详细说明学生状态变更时的其他业务模块处理逻辑和技术实现,包括宿舍、心理、实践、实习等各项业务的完整处理方案。*