@@ -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.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", 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", 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() + " 已安排床位");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user