宿舍逻辑修改
build / build-push (push) Successful in 57s

This commit is contained in:
wanghu
2026-09-20 15:11:08 +08:00
parent 40bc49a46e
commit 246462d7b0
@@ -108,23 +108,68 @@ public class DormService implements IDormService {
@Override
public List<Map<String, Object>> pendingStudents(String keyword, String gender) {
// 待安排池:dorm_student 中 roomId=0(由「添加学生」手动保存进来的在册学生)
List<DormStudent> raw = studentRepository.findByRoomIdOrderByIdAsc(0);
List<DormStudent> pool = raw.stream()
.filter(s -> !StringUtils.hasText(gender) || gender.equals(s.getGender()))
.filter(s -> !StringUtils.hasText(keyword)
|| (s.getStudentName() + s.getClassName() + s.getGuardianName()).contains(keyword))
.collect(Collectors.toList());
// 实时在册 − 已在住:从 bschclass 拉最新全校在册学生,排除已安排进房间(roomId>0)的;
// 已在池(roomId=0)或从未入库的在册生都会出现在此名单。平台不可达时回退到已保存的待安排池。
List<DormStudent> all = studentRepository.findAll();
Set<Integer> housedIds = new HashSet<>();
Map<Integer, DormStudent> savedById = new HashMap<>();
for (DormStudent d : all) {
if (d.getStudentId() == null) {
continue;
}
savedById.put(d.getStudentId(), d);
if (nz(d.getRoomId()) > 0) {
housedIds.add(d.getStudentId());
}
}
String kw = keyword == null ? "" : keyword.trim();
List<Map<String, Object>> out = new ArrayList<>();
for (DormStudent s : pool) {
Roster roster = fetchRoster();
if (roster != null) {
for (SchStudentDto s : roster.students) {
if (s.getStuId() == null || housedIds.contains(s.getStuId())) {
continue; // 排除已在住
}
DormStudent saved = savedById.get(s.getStuId());
String g = saved != null ? saved.getGender() : null;
if (StringUtils.hasText(gender) && !gender.equals(g)) {
continue;
}
String cn = roster.classNames.get(s.getClassId());
if (!kw.isEmpty() && !(String.valueOf(s.getStuName()) + cn + (saved != null ? saved.getGuardianName() : "")).contains(kw)) {
continue;
}
Map<String, Object> m = new LinkedHashMap<>();
m.put("studentId", s.getStuId());
m.put("studentName", s.getStuName());
m.put("gender", g);
m.put("className", cn);
m.put("guardianName", saved != null ? saved.getGuardianName() : null);
m.put("guardianPhone", saved != null ? saved.getGuardianPhone() : null);
m.put("sourceDesc", saved != null && saved.getSourceDesc() != null ? saved.getSourceDesc() : "学籍在册未分配床位");
out.add(m);
}
return out;
}
// 平台不可达:回退到已保存的待安排池(roomId=0)
for (DormStudent d : all) {
if (nz(d.getRoomId()) != 0) {
continue;
}
if (StringUtils.hasText(gender) && !gender.equals(d.getGender())) {
continue;
}
if (!kw.isEmpty() && !(String.valueOf(d.getStudentName()) + d.getClassName() + d.getGuardianName()).contains(kw)) {
continue;
}
Map<String, Object> m = new LinkedHashMap<>();
m.put("studentId", s.getStudentId());
m.put("studentName", s.getStudentName());
m.put("gender", s.getGender());
m.put("className", s.getClassName());
m.put("guardianName", s.getGuardianName());
m.put("guardianPhone", s.getGuardianPhone());
m.put("sourceDesc", s.getSourceDesc());
m.put("studentId", d.getStudentId());
m.put("studentName", d.getStudentName());
m.put("gender", d.getGender());
m.put("className", d.getClassName());
m.put("guardianName", d.getGuardianName());
m.put("guardianPhone", d.getGuardianPhone());
m.put("sourceDesc", d.getSourceDesc());
out.add(m);
}
return out;
@@ -306,9 +351,31 @@ public class DormService implements IDormService {
public void assignStudent(Integer roomId, List<Integer> studentIds) {
DormRoom room = roomRepository.findByRoomId(roomId)
.orElseThrow(() -> new BizException(ErrorCode.FORBIDDEN, "房间不存在"));
// 预取在册名单:待安排名单可能含从未入库的在册生,安排时按 roster 补建 dorm_student
Roster roster = fetchRoster();
Map<Integer, SchStudentDto> rosterById = new HashMap<>();
if (roster != null) {
for (SchStudentDto s : roster.students) {
if (s.getStuId() != null) {
rosterById.put(s.getStuId(), s);
}
}
}
for (Integer sid : studentIds) {
DormStudent s = studentRepository.findByStudentId(sid)
.orElseThrow(() -> new BizException(ErrorCode.FORBIDDEN, "学生不存在:" + sid));
DormStudent s = studentRepository.findByStudentId(sid).orElse(null);
if (s == null) {
SchStudentDto dto = rosterById.get(sid);
if (dto == null) {
throw new BizException(ErrorCode.FORBIDDEN, "学生不存在或不在册:" + sid);
}
s = new DormStudent();
s.setStudentId(sid);
s.setStudentName(dto.getStuName());
s.setClassName(roster.classNames.get(dto.getClassId()));
s.setRoomId(0);
s.setIsMonitor(false);
s.setSchId(UserContext.getSchId());
}
if (nz(s.getRoomId()) != 0) {
throw new BizException(ErrorCode.FORBIDDEN, s.getStudentName() + " 已安排床位");
}