fix: 修复床位分配对象展示与卫生检查提交误报校验

恢复房间床位详情完整关联查询以显示学院/班级/学生;修复卫生检查 Web/移动端表单校验误报,并将房间学生 ID 以字符串返回避免精度丢失。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
“wuzhen”andCursor committed 2026-08-20 15:17:41 +08:00
1 parent 3518ea697e
commit 6a0f1206fa
6 files changed
+193 -131

No files matched your search

@@ -49,7 +49,7 @@ public interface XgDormBedMapper extends BaseMapperPlus<XgDormBed, XgDormBedVo>
major_dept.dept_name as major_name,
bs.class_id,
class_dept.dept_name as class_name,
COALESCE(c.class_name, class_dept.dept_name) as class_name,
c.class_code,
c.grade,
@@ -32,7 +32,6 @@ import java.util.Collection;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Objects;
import java.time.LocalDateTime;
@@ -163,84 +162,42 @@ public class XgDormBedServiceImpl implements IXgDormBedService {
*/
@Override
public List<XgDormBedDetailVo> queryBedDetailsByRoomId(Long roomId) {
List<XgDormBedDetailVo> result = new ArrayList<>();
// 使用完整 LEFT JOIN:已分学院/班级/学生的床位均能带出分配对象
List<XgDormBedDetailVo> result = baseMapper.selectBedDetailsByRoomId(roomId);
if (result == null || result.isEmpty()) {
return result == null ? new ArrayList<>() : result;
}
List<Map<String, Object>> studentBeds = xgDormBedStudentMapper.selectRoomStudents(roomId);
List<Long> studentIds = studentBeds.stream()
.map(row -> {
Object studentId = row.get("student_id");
if (studentId instanceof Number) {
return ((Number) studentId).longValue();
}
return null;
})
List<Long> studentIds = result.stream()
.map(XgDormBedDetailVo::getStudentId)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
Map<Long, XgStudentLeaveVo> leaveMap = Map.of();
if (!studentIds.isEmpty()) {
leaveMap = xgStudentLeaveService.queryStudentLeavesByCheckDate(
studentIds, LocalDateTime.now());
if (studentIds.isEmpty()) {
return result;
}
Set<Long> occupiedBedIds = new HashSet<>();
for (Map<String, Object> row : studentBeds) {
XgDormBedDetailVo vo = new XgDormBedDetailVo();
Object bedIdObj = row.get("bed_id");
Long bedId = bedIdObj != null ? ((Number) bedIdObj).longValue() : null;
if (bedId != null) {
occupiedBedIds.add(bedId);
Map<Long, XgStudentLeaveVo> leaveMap = xgStudentLeaveService.queryStudentLeavesByCheckDate(
studentIds, LocalDateTime.now());
if (leaveMap == null || leaveMap.isEmpty()) {
return result;
}
for (XgDormBedDetailVo vo : result) {
if (vo.getStudentId() == null) {
continue;
}
vo.setId(bedId);
vo.setBedCode(row.get("bed_code") != null ? row.get("bed_code").toString() : null);
vo.setBedName(row.get("bed_name") != null ? row.get("bed_name").toString() : null);
vo.setRoomId(roomId);
vo.setStudentId(row.get("student_id") != null ? ((Number) row.get("student_id")).longValue() : null);
vo.setStudentNo(row.get("student_no") != null ? row.get("student_no").toString() : null);
vo.setStudentName(row.get("student_name") != null ? row.get("student_name").toString() : null);
vo.setStudentGender(row.get("gender") != null ? row.get("gender").toString() : null);
vo.setClassName(row.get("class_name") != null ? row.get("class_name").toString() : null);
vo.setCollegeName(row.get("college_name") != null ? row.get("college_name").toString() : null);
vo.setMajorName(row.get("major_name") != null ? row.get("major_name").toString() : null);
vo.setAssignmentStatus("0");
vo.setBedStatus("1");
Object studentIdObj = row.get("student_id");
if (studentIdObj instanceof Number) {
Long studentIdValue = ((Number) studentIdObj).longValue();
XgStudentLeaveVo leaveVo = leaveMap.get(studentIdValue);
if (leaveVo != null) {
XgDormBedDetailVo.LeaveInfo leaveInfo = new XgDormBedDetailVo.LeaveInfo();
leaveInfo.setLeaveId(leaveVo.getId());
leaveInfo.setLeaveTypeName(leaveVo.getLeaveTypeName());
leaveInfo.setLeaveStartTime(leaveVo.getStartTime());
leaveInfo.setLeaveEndTime(leaveVo.getEndTime());
vo.setLeaveInfo(leaveInfo);
}
XgStudentLeaveVo leaveVo = leaveMap.get(vo.getStudentId());
if (leaveVo == null) {
continue;
}
result.add(vo);
XgDormBedDetailVo.LeaveInfo leaveInfo = new XgDormBedDetailVo.LeaveInfo();
leaveInfo.setLeaveId(leaveVo.getId());
leaveInfo.setLeaveTypeName(leaveVo.getLeaveTypeName());
leaveInfo.setLeaveStartTime(leaveVo.getStartTime());
leaveInfo.setLeaveEndTime(leaveVo.getEndTime());
vo.setLeaveInfo(leaveInfo);
}
List<XgDormBed> emptyBeds = baseMapper.selectList(
Wrappers.<XgDormBed>lambdaQuery()
.eq(XgDormBed::getRoomId, roomId)
.notIn(!occupiedBedIds.isEmpty(), XgDormBed::getId, occupiedBedIds)
);
for (XgDormBed bed : emptyBeds) {
XgDormBedDetailVo vo = new XgDormBedDetailVo();
vo.setId(bed.getId());
vo.setBedCode(bed.getBedCode());
vo.setBedName(bed.getBedName());
vo.setRoomId(bed.getRoomId());
vo.setBedType(bed.getBedType());
vo.setBedStatus(bed.getBedStatus());
vo.setBedRemark(bed.getRemark());
result.add(vo);
}
return result;
}
@@ -2473,10 +2473,17 @@ public class XgDormBedStudentServiceImpl implements IXgDormBedStudentService {
List<Long> studentIds = studentDetails.stream()
.map(detail -> {
Object studentId = detail.get("student_id");
Object studentId = mapVal(detail, "studentId", "student_id");
if (studentId instanceof Number) {
return ((Number) studentId).longValue();
}
if (studentId != null) {
try {
return Long.valueOf(studentId.toString());
} catch (Exception ignored) {
return null;
}
}
return null;
})
.filter(Objects::nonNull)
@@ -2491,29 +2498,29 @@ public class XgDormBedStudentServiceImpl implements IXgDormBedStudentService {
List<Object> result = new ArrayList<>();
for (Map<String, Object> detailMap : studentDetails) {
// 组装结果数据
// 组装结果数据(兼容 Map 键为下划线或驼峰:map-underscore-to-camel-case=true)
Map<String, Object> studentInfo = new LinkedHashMap<>();
// 学生基本信息
studentInfo.put("studentId", detailMap.get("student_id"));
studentInfo.put("studentName", detailMap.get("student_name"));
studentInfo.put("studentNo", detailMap.get("student_no"));
studentInfo.put("gender", detailMap.get("gender"));
Object studentIdObj = mapVal(detailMap, "studentId", "student_id");
// 学生基本信息(雪花 ID 统一转字符串,避免前端精度丢失)
studentInfo.put("studentId", toIdString(studentIdObj));
studentInfo.put("studentName", mapVal(detailMap, "studentName", "student_name"));
studentInfo.put("studentNo", mapVal(detailMap, "studentNo", "student_no"));
studentInfo.put("gender", mapVal(detailMap, "gender", "gender"));
// 学院、专业、班级信息(含 ID,供卫生检查归属班级等使用)
studentInfo.put("collegeId", detailMap.get("college_id"));
studentInfo.put("collegeName", detailMap.get("college_name"));
studentInfo.put("majorId", detailMap.get("major_id"));
studentInfo.put("majorName", detailMap.get("major_name"));
studentInfo.put("classId", detailMap.get("class_id"));
studentInfo.put("className", detailMap.get("class_name"));
studentInfo.put("collegeId", toIdString(mapVal(detailMap, "collegeId", "college_id")));
studentInfo.put("collegeName", mapVal(detailMap, "collegeName", "college_name"));
studentInfo.put("majorId", toIdString(mapVal(detailMap, "majorId", "major_id")));
studentInfo.put("majorName", mapVal(detailMap, "majorName", "major_name"));
studentInfo.put("classId", toIdString(mapVal(detailMap, "classId", "class_id")));
studentInfo.put("className", mapVal(detailMap, "className", "class_name"));
// 床位信息
studentInfo.put("bedName", detailMap.get("bed_name"));
studentInfo.put("bedCode", detailMap.get("bed_code"));
studentInfo.put("bedId", detailMap.get("bed_id"));
studentInfo.put("bedName", mapVal(detailMap, "bedName", "bed_name"));
studentInfo.put("bedCode", mapVal(detailMap, "bedCode", "bed_code"));
studentInfo.put("bedId", toIdString(mapVal(detailMap, "bedId", "bed_id")));
Object studentIdObj = detailMap.get("student_id");
if (studentIdObj instanceof Number) {
Long studentIdValue = ((Number) studentIdObj).longValue();
XgStudentLeaveVo leaveInfo = leaveMap.get(studentIdValue);
@@ -2525,6 +2532,21 @@ public class XgDormBedStudentServiceImpl implements IXgDormBedStudentService {
leaveInfoMap.put("leaveEndTime", leaveInfo.getEndTime());
studentInfo.put("leaveInfo", leaveInfoMap);
}
} else if (studentIdObj != null) {
try {
Long studentIdValue = Long.valueOf(studentIdObj.toString());
XgStudentLeaveVo leaveInfo = leaveMap.get(studentIdValue);
if (leaveInfo != null) {
Map<String, Object> leaveInfoMap = new LinkedHashMap<>();
leaveInfoMap.put("leaveId", leaveInfo.getId());
leaveInfoMap.put("leaveTypeName", leaveInfo.getLeaveTypeName());
leaveInfoMap.put("leaveStartTime", leaveInfo.getStartTime());
leaveInfoMap.put("leaveEndTime", leaveInfo.getEndTime());
studentInfo.put("leaveInfo", leaveInfoMap);
}
} catch (Exception ignored) {
// ignore invalid student id
}
}
result.add(studentInfo);
@@ -2620,6 +2642,14 @@ public class XgDormBedStudentServiceImpl implements IXgDormBedStudentService {
return val;
}
/** 雪花 ID 等长整型转字符串,避免前端 Number 精度丢失 */
private static String toIdString(Object val) {
if (val == null) {
return null;
}
return val.toString();
}
/**
* 根据床位ID获取该床位的学生信息
* 包含学生基本信息、学院、专业、班级等信息