统计时间修改
build / build-push (push) Successful in 54s

This commit is contained in:
wanghu
2026-09-20 16:37:21 +08:00
parent 246462d7b0
commit 69e628fc28
4 changed files with 16 additions and 145 deletions
@@ -106,41 +106,6 @@ public class DormController {
dormService.setMonitor(roomId, studentId); dormService.setMonitor(roomId, studentId);
} }
/** 可添加学生名单:bschclass 在册学生,排除已保存到 dorm_student 的(供前端勾选)。 */
@GetMapping("AvailableStudents")
public List<Map<String, Object>> availableStudents(@RequestParam(required = false) String keyword) {
return dormService.availableStudents(keyword);
}
/** 保存前端勾选的学生到待安排池(roomId=0),返回新增人数。 */
@PostMapping("SaveStudents")
public Map<String, Object> saveStudents(@RequestParam String studentIds) {
Map<String, Object> r = new java.util.LinkedHashMap<>();
r.put("added", dormService.saveStudents(parseIds(studentIds)));
return r;
}
/** 手动删除已保存的学生(在住者重排该房床位),返回删除人数。 */
@PostMapping("DeleteStudents")
public Map<String, Object> deleteStudents(@RequestParam String studentIds) {
Map<String, Object> r = new java.util.LinkedHashMap<>();
r.put("removed", dormService.deleteStudents(parseIds(studentIds)));
return r;
}
private static List<Integer> parseIds(String csv) {
List<Integer> ids = new java.util.ArrayList<>();
if (csv != null) {
for (String s : csv.split(",")) {
String t = s.trim();
if (!t.isEmpty()) {
ids.add(Integer.parseInt(t));
}
}
}
return ids;
}
private static Map<String, Object> toObj(Map<String, String> src) { private static Map<String, Object> toObj(Map<String, String> src) {
return src.entrySet().stream().collect(java.util.stream.Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); return src.entrySet().stream().collect(java.util.stream.Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
} }
@@ -40,16 +40,4 @@ public interface IDormService {
/** 楼栋→楼层→房间树(ztree,供发布选房间;对应 base/GetDormTree)。 */ /** 楼栋→楼层→房间树(ztree,供发布选房间;对应 base/GetDormTree)。 */
List<Map<String, Object>> dormTree(); List<Map<String, Object>> dormTree();
/**
* 可添加学生名单:从 bschclass 学籍拉取本校在册学生,排除已保存到 dorm_student 的,供前端勾选。
* 返回项:{studentId, studentName, className}。
*/
List<Map<String, Object>> availableStudents(String keyword);
/** 保存前端勾选的学生到 dorm_student(roomId=0 待安排池),已存在的跳过;返回新增人数。 */
int saveStudents(List<Integer> studentIds);
/** 手动删除 dorm_student 中的学生(在住者删除后重排该房床位);返回删除人数。 */
int deleteStudents(List<Integer> studentIds);
} }
@@ -434,7 +434,7 @@ public class DormService implements IDormService {
} }
} }
// ============================ bschclass 学籍(前端选择保存) ============================ // ============================ bschclass 学籍(在册名单) ============================
private static final class Roster { private static final class Roster {
final List<SchStudentDto> students; final List<SchStudentDto> students;
@@ -471,101 +471,6 @@ public class DormService implements IDormService {
return new Roster(stus, classNames); return new Roster(stus, classNames);
} }
@Override
public List<Map<String, Object>> availableStudents(String keyword) {
List<Map<String, Object>> out = new ArrayList<>();
Roster roster = fetchRoster();
if (roster == null) {
return out;
}
Set<Integer> savedIds = studentRepository.findAll().stream()
.map(DormStudent::getStudentId).filter(Objects::nonNull).collect(Collectors.toSet());
String kw = keyword == null ? "" : keyword.trim();
for (SchStudentDto s : roster.students) {
if (s.getStuId() == null || savedIds.contains(s.getStuId())) {
continue; // 排除已保存到 dorm_student 的
}
if (!kw.isEmpty() && !String.valueOf(s.getStuName()).contains(kw)) {
continue;
}
Map<String, Object> m = new LinkedHashMap<>();
m.put("studentId", s.getStuId());
m.put("studentName", s.getStuName());
m.put("className", roster.classNames.get(s.getClassId()));
out.add(m);
}
return out;
}
@Override
@Transactional
public int saveStudents(List<Integer> studentIds) {
if (studentIds == null || studentIds.isEmpty()) {
return 0;
}
Integer schId = UserContext.getSchId();
// 用最新在册名单补全姓名/班级(拿不到也不阻断,按 id 落库)
Map<Integer, SchStudentDto> rosterById = new HashMap<>();
Map<Integer, String> classNames = new HashMap<>();
Roster roster = fetchRoster();
if (roster != null) {
for (SchStudentDto s : roster.students) {
if (s.getStuId() != null) {
rosterById.put(s.getStuId(), s);
}
}
classNames = roster.classNames;
}
int added = 0;
for (Integer id : studentIds) {
if (id == null || studentRepository.findByStudentId(id).isPresent()) {
continue; // 已存在跳过,幂等
}
SchStudentDto s = rosterById.get(id);
DormStudent d = new DormStudent();
d.setStudentId(id);
d.setStudentName(s != null ? s.getStuName() : null);
d.setClassName(s != null ? classNames.get(s.getClassId()) : null);
d.setRoomId(0);
d.setIsMonitor(false);
d.setSourceDesc("学籍在册未分配床位");
d.setSchId(schId);
studentRepository.save(d);
added++;
}
log.info("[saveStudents] schId={} 勾选 {} 人,新增保存 {} 人", schId, studentIds.size(), added);
return added;
}
@Override
@Transactional
public int deleteStudents(List<Integer> studentIds) {
if (studentIds == null || studentIds.isEmpty()) {
return 0;
}
int removed = 0;
Set<Integer> roomsToRenumber = new HashSet<>();
for (Integer id : studentIds) {
if (id == null) {
continue;
}
Optional<DormStudent> opt = studentRepository.findByStudentId(id);
if (opt.isPresent()) {
Integer rid = opt.get().getRoomId();
studentRepository.delete(opt.get());
if (rid != null && rid > 0) {
roomsToRenumber.add(rid);
}
removed++;
}
}
for (Integer rid : roomsToRenumber) {
renumberBeds(rid);
}
log.info("[deleteStudents] 手动删除 {} 人", removed);
return removed;
}
// ============================ 辅助 ============================ // ============================ 辅助 ============================
private List<DormBuilding> buildingsOfSch() { private List<DormBuilding> buildingsOfSch() {
@@ -15,6 +15,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -409,7 +410,7 @@ public class NoticeService implements INoticeService {
@Override @Override
public Map<String, Object> statis(String startTime, String endTime) { public Map<String, Object> statis(String startTime, String endTime) {
List<Notice> list = noticeRepository.findAll(); List<Notice> list = noticeRepository.findAll();
LocalDateTime st = parseDt(startTime), et = parseDt(endTime); LocalDateTime st = parseDt(startTime), et = parseDateEnd(endTime);
if (st != null) list = list.stream().filter(n -> !nz(n.getCreateTime()).isBefore(st)).collect(Collectors.toList()); if (st != null) list = list.stream().filter(n -> !nz(n.getCreateTime()).isBefore(st)).collect(Collectors.toList());
if (et != null) list = list.stream().filter(n -> !nz(n.getCreateTime()).isAfter(et)).collect(Collectors.toList()); if (et != null) list = list.stream().filter(n -> !nz(n.getCreateTime()).isAfter(et)).collect(Collectors.toList());
@@ -1108,7 +1109,7 @@ public class NoticeService implements INoticeService {
if (StringUtils.hasText(ns) && !"all".equals(ns)) { if (StringUtils.hasText(ns) && !"all".equals(ns)) {
out = out.stream().filter(n -> ns.equals(n.getNoticeStatus())).collect(Collectors.toList()); out = out.stream().filter(n -> ns.equals(n.getNoticeStatus())).collect(Collectors.toList());
} }
LocalDateTime st = parseDt(q.get("startTime")), et = parseDt(q.get("endTime")); LocalDateTime st = parseDt(q.get("startTime")), et = parseDateEnd(q.get("endTime"));
if (st != null) out = out.stream().filter(n -> !nz(n.getEffectiveTime() == null ? n.getCreateTime() : n.getEffectiveTime()).isBefore(st)).collect(Collectors.toList()); if (st != null) out = out.stream().filter(n -> !nz(n.getEffectiveTime() == null ? n.getCreateTime() : n.getEffectiveTime()).isBefore(st)).collect(Collectors.toList());
if (et != null) out = out.stream().filter(n -> !nz(n.getEffectiveTime() == null ? n.getCreateTime() : n.getEffectiveTime()).isAfter(et)).collect(Collectors.toList()); if (et != null) out = out.stream().filter(n -> !nz(n.getEffectiveTime() == null ? n.getCreateTime() : n.getEffectiveTime()).isAfter(et)).collect(Collectors.toList());
int rt = intg(q.get("readType"), 0); int rt = intg(q.get("readType"), 0);
@@ -1194,6 +1195,18 @@ public class NoticeService implements INoticeService {
} }
} }
/**
* 解析查询区间的结束时间:纯日期(yyyy-MM-dd)时取当天末尾 23:59:59.999999999,使区间包含当天
*/
private LocalDateTime parseDateEnd(Object o) {
LocalDateTime t = parseDt(o);
if (t == null || o == null) {
return t;
}
String s = String.valueOf(o).trim();
return s.length() == 10 ? t.toLocalDate().atTime(LocalTime.MAX) : t;
}
private Map<String, Object> parseFill(Object o) { private Map<String, Object> parseFill(Object o) {
if (o == null) { if (o == null) {
return null; return null;