fix: 修复床位分配对象展示与卫生检查提交误报校验
恢复房间床位详情完整关联查询以显示学院/班级/学生;修复卫生检查 Web/移动端表单校验误报,并将房间学生 ID 以字符串返回避免精度丢失。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
1 parent
3518ea697e
commit
6a0f1206fa
6 files changed
+193
-131
No files matched your search
+1
-1
@@ -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,
|
||||
|
||||
|
||||
+28
-71
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+47
-17
@@ -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获取该床位的学生信息
|
||||
* 包含学生基本信息、学院、专业、班级等信息
|
||||
|
||||
Reference in new issue
Block a user