176 lines
5.2 KiB
Markdown
176 lines
5.2 KiB
Markdown
# 学生退宿逻辑详细说明
|
|
|
|
## 概述
|
|
|
|
本文档详细描述了学生宿舍管理系统中退宿操作的具体实现逻辑,包括前端界面、后端服务调用、数据库操作等各个层面的详细说明。
|
|
|
|
## 业务流程
|
|
|
|
### 1. 前端界面操作
|
|
|
|
**文件位置**: `web/src/views/xg/xsjcxx/xssssq/index.vue`
|
|
|
|
学生可以通过前端界面提交退宿申请:
|
|
|
|
- **申请类型**: `applicationType = "2"` (退宿申请)
|
|
- **申请状态**: 初始状态为 `draft` (草稿)
|
|
- **关键字段**:
|
|
- `currentBedId`: 当前床位ID
|
|
- `studentId`: 学生ID
|
|
- `classId`: 班级ID
|
|
|
|
### 2. 审批流程
|
|
|
|
退宿申请需要通过工作流审批,流程代码:`hzdyjs-tsts`
|
|
|
|
审批完成后,当 `applicationStatus = "finish"` 时,触发实际的退宿操作。
|
|
|
|
## 核心退宿逻辑
|
|
|
|
### 方法调用链
|
|
|
|
```java
|
|
// 1. 工作流监听器触发
|
|
@EventListener(condition = "#processEvent.flowCode=='hzdyjs-tsts'")
|
|
public void processHandler(ProcessEvent processEvent) {
|
|
// 当审批完成时,执行调宿/退宿操作
|
|
if ("finish".equals(processEvent.getStatus())) {
|
|
executeApplicationOperation(xgDormApplication);
|
|
}
|
|
}
|
|
|
|
// 2. 执行申请操作
|
|
private void executeApplicationOperation(XgDormApplication application) {
|
|
if ("2".equals(application.getApplicationType())) {
|
|
// 退宿申请 - 调用退宿接口
|
|
List<Long> bedIds = List.of(application.getCurrentBedId());
|
|
Boolean stayawayResult = xgDormBedStudentService.classTeacherStayawaySelectedBeds(
|
|
bedIds, // 床位ID列表
|
|
application.getClassId() // 班级ID
|
|
);
|
|
}
|
|
}
|
|
|
|
// 3. 实际退宿实现
|
|
@Override
|
|
@Transactional(rollbackFor = Exception.class)
|
|
public Boolean classTeacherStayawaySelectedBeds(List<Long> bedIds, Long classId)
|
|
```
|
|
|
|
### 详细SQL操作
|
|
|
|
**文件位置**: `backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormBedStudentServiceImpl.java`
|
|
|
|
退宿操作涉及三个表的更新,按顺序执行:
|
|
|
|
#### 1. 更新学生基本信息表 (`xg_student_msg`)
|
|
|
|
```sql
|
|
-- 清理学生宿舍信息
|
|
UPDATE xg_student_msg
|
|
SET
|
|
dormitory_building = NULL, -- 清空宿舍楼信息
|
|
dormitory_room = NULL, -- 清空宿舍房间信息
|
|
ext_field1 = NULL, -- 清空床位ID(存储在扩展字段1中)
|
|
update_time = NOW(), -- 更新时间
|
|
update_by = ? -- 操作人ID
|
|
WHERE
|
|
ext_field1 IN (?) -- 床位ID列表(字符串形式)
|
|
AND deleted = 0 -- 未删除
|
|
AND student_status = '1'; -- 在校生状态
|
|
```
|
|
|
|
**说明**:
|
|
- `ext_field1` 字段存储床位ID
|
|
- 只处理在校生 (`student_status = '1'`)
|
|
- 将宿舍相关信息全部清空
|
|
|
|
#### 2. 更新床位学生分配表 (`xg_dorm_bed_student`)
|
|
|
|
```sql
|
|
-- 标记床位为退宿状态
|
|
UPDATE xg_dorm_bed_student
|
|
SET
|
|
status = '1', -- 状态:1-退宿
|
|
checkout_time = NOW(), -- 退宿时间
|
|
update_time = NOW(), -- 更新时间
|
|
update_by = ? -- 操作人ID
|
|
WHERE
|
|
bed_id IN (?) -- 床位ID列表
|
|
AND deleted = '0' -- 未删除
|
|
AND status = '0'; -- 当前状态:0-正常入住
|
|
```
|
|
|
|
**说明**:
|
|
- 状态变更:`0`(正常入住) → `1`(退宿)
|
|
- 记录退宿时间 `checkout_time`
|
|
- 只处理当前正常入住的床位
|
|
|
|
#### 3. 更新床位状态表 (`xg_dorm_bed`)
|
|
|
|
```sql
|
|
-- 将床位状态改为闲置
|
|
UPDATE xg_dorm_bed
|
|
SET
|
|
bed_status = '0' -- 床位状态:0-闲置
|
|
WHERE
|
|
id IN (?) -- 床位ID列表
|
|
AND deleted = '0'; -- 未删除
|
|
```
|
|
|
|
**说明**:
|
|
- 床位状态变更为闲置,供其他学生使用
|
|
- 不更新时间字段,只修改状态
|
|
|
|
## 数据状态说明
|
|
|
|
### 床位状态 (`bed_status`)
|
|
- `0`: 闲置 - 可分配给新学生
|
|
- `1`: 已分配 - 已有学生入住
|
|
|
|
### 床位学生分配状态 (`status`)
|
|
- `0`: 正常入住 - 学生正在使用该床位
|
|
- `1`: 退宿 - 学生已退宿,床位释放
|
|
|
|
### 学生状态 (`student_status`)
|
|
- `1`: 在校生 - 正常在校学生
|
|
- `2`: 休学
|
|
- `3`: 退学
|
|
- `4`: 毕业
|
|
|
|
## 事务处理
|
|
|
|
所有退宿操作在一个事务中执行:
|
|
|
|
```java
|
|
@Transactional(rollbackFor = Exception.class)
|
|
public Boolean classTeacherStayawaySelectedBeds(List<Long> bedIds, Long classId)
|
|
```
|
|
|
|
如果任何一步操作失败,整个退宿操作会回滚,确保数据一致性。
|
|
|
|
## 异常处理
|
|
|
|
- 床位ID列表为空时抛出 `IllegalArgumentException`
|
|
- SQL执行异常时抛出 `RuntimeException`
|
|
- 记录详细的日志信息用于问题排查
|
|
|
|
## 适用场景
|
|
|
|
此退宿逻辑适用于以下场景:
|
|
|
|
1. **学生主动退宿申请** - 通过前端界面提交退宿申请,经审批后执行
|
|
2. **学生退学处理** - 学生退学时自动释放床位
|
|
3. **学生毕业处理** - 学生毕业时自动释放床位
|
|
4. **学生休学处理** - 学生休学时释放床位
|
|
|
|
## 后续使用建议
|
|
|
|
在实现学生退学、毕业、休学脚本时,可以参考此退宿逻辑的SQL操作顺序:
|
|
|
|
1. 首先更新 `xg_student_msg` 表清空宿舍信息
|
|
2. 然后更新 `xg_dorm_bed_student` 表标记退宿状态
|
|
3. 最后更新 `xg_dorm_bed` 表释放床位
|
|
|
|
**注意**: 不同场景可能需要根据具体业务逻辑调整条件判断。
|