From 246462d7b04bc4dae53317db453f5bf9cd7a3fa7 Mon Sep 17 00:00:00 2001 From: wanghu Date: Sun, 20 Sep 2026 15:11:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=BF=E8=88=8D=E9=80=BB=E8=BE=91=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dormnotice/service/impl/DormService.java | 101 +++++++++++++++--- 1 file changed, 84 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/yunhai/dormnotice/service/impl/DormService.java b/src/main/java/com/yunhai/dormnotice/service/impl/DormService.java index f72276a..d964a61 100644 --- a/src/main/java/com/yunhai/dormnotice/service/impl/DormService.java +++ b/src/main/java/com/yunhai/dormnotice/service/impl/DormService.java @@ -108,23 +108,68 @@ public class DormService implements IDormService { @Override public List> pendingStudents(String keyword, String gender) { - // 待安排池:dorm_student 中 roomId=0(由「添加学生」手动保存进来的在册学生) - List raw = studentRepository.findByRoomIdOrderByIdAsc(0); - List 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 all = studentRepository.findAll(); + Set housedIds = new HashSet<>(); + Map 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> 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 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 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 studentIds) { DormRoom room = roomRepository.findByRoomId(roomId) .orElseThrow(() -> new BizException(ErrorCode.FORBIDDEN, "房间不存在")); + // 预取在册名单:待安排名单可能含从未入库的在册生,安排时按 roster 补建 dorm_student + Roster roster = fetchRoster(); + Map 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() + " 已安排床位"); }