@@ -108,23 +108,68 @@ public class DormService implements IDormService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Map<String, Object>> pendingStudents(String keyword, String gender) {
|
public List<Map<String, Object>> pendingStudents(String keyword, String gender) {
|
||||||
// 待安排池:dorm_student 中 roomId=0(由「添加学生」手动保存进来的在册学生)
|
// 实时在册 − 已在住:从 bschclass 拉最新全校在册学生,排除已安排进房间(roomId>0)的;
|
||||||
List<DormStudent> raw = studentRepository.findByRoomIdOrderByIdAsc(0);
|
// 已在池(roomId=0)或从未入库的在册生都会出现在此名单。平台不可达时回退到已保存的待安排池。
|
||||||
List<DormStudent> pool = raw.stream()
|
List<DormStudent> all = studentRepository.findAll();
|
||||||
.filter(s -> !StringUtils.hasText(gender) || gender.equals(s.getGender()))
|
Set<Integer> housedIds = new HashSet<>();
|
||||||
.filter(s -> !StringUtils.hasText(keyword)
|
Map<Integer, DormStudent> savedById = new HashMap<>();
|
||||||
|| (s.getStudentName() + s.getClassName() + s.getGuardianName()).contains(keyword))
|
for (DormStudent d : all) {
|
||||||
.collect(Collectors.toList());
|
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<>();
|
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<>();
|
Map<String, Object> m = new LinkedHashMap<>();
|
||||||
m.put("studentId", s.getStudentId());
|
m.put("studentId", s.getStuId());
|
||||||
m.put("studentName", s.getStudentName());
|
m.put("studentName", s.getStuName());
|
||||||
m.put("gender", s.getGender());
|
m.put("gender", g);
|
||||||
m.put("className", s.getClassName());
|
m.put("className", cn);
|
||||||
m.put("guardianName", s.getGuardianName());
|
m.put("guardianName", saved != null ? saved.getGuardianName() : null);
|
||||||
m.put("guardianPhone", s.getGuardianPhone());
|
m.put("guardianPhone", saved != null ? saved.getGuardianPhone() : null);
|
||||||
m.put("sourceDesc", s.getSourceDesc());
|
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);
|
out.add(m);
|
||||||
}
|
}
|
||||||
return out;
|
return out;
|
||||||
@@ -306,9 +351,31 @@ public class DormService implements IDormService {
|
|||||||
public void assignStudent(Integer roomId, List<Integer> studentIds) {
|
public void assignStudent(Integer roomId, List<Integer> studentIds) {
|
||||||
DormRoom room = roomRepository.findByRoomId(roomId)
|
DormRoom room = roomRepository.findByRoomId(roomId)
|
||||||
.orElseThrow(() -> new BizException(ErrorCode.FORBIDDEN, "房间不存在"));
|
.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) {
|
for (Integer sid : studentIds) {
|
||||||
DormStudent s = studentRepository.findByStudentId(sid)
|
DormStudent s = studentRepository.findByStudentId(sid).orElse(null);
|
||||||
.orElseThrow(() -> new BizException(ErrorCode.FORBIDDEN, "学生不存在:" + sid));
|
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) {
|
if (nz(s.getRoomId()) != 0) {
|
||||||
throw new BizException(ErrorCode.FORBIDDEN, s.getStudentName() + " 已安排床位");
|
throw new BizException(ErrorCode.FORBIDDEN, s.getStudentName() + " 已安排床位");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user