From d9604b37987392b2359450c889ad71b4515a02cc Mon Sep 17 00:00:00 2001 From: wanghu Date: Wed, 9 Sep 2026 10:00:51 +0800 Subject: [PATCH] getstutree --- .../oapi/oa/SchGroupController.java | 11 +++ .../controller/oapi/oa/StuInfoController.java | 35 ++++++++ .../service/IComSchTreeService.java | 2 + .../service/impl/com/ComSchTreeService.java | 86 +++++++++++++++++++ 4 files changed, 134 insertions(+) diff --git a/src/main/java/com/yunhai/bschclassmanage/controller/oapi/oa/SchGroupController.java b/src/main/java/com/yunhai/bschclassmanage/controller/oapi/oa/SchGroupController.java index 6d3204c..c3ebb24 100644 --- a/src/main/java/com/yunhai/bschclassmanage/controller/oapi/oa/SchGroupController.java +++ b/src/main/java/com/yunhai/bschclassmanage/controller/oapi/oa/SchGroupController.java @@ -37,6 +37,17 @@ public class SchGroupController { return comSchTreeService.getSchTeaTree(resolvedSchId); } + @GetMapping("GetStuTree") + @Operation(summary = "获取学校学生树:学校→学段→年级→班级→学生(SchSerID 与 schId 二选一)") + public List getStuTree(@RequestParam(value = "SchSerID", required = false) String SchSerID, + @RequestParam(value = "schId", required = false) Integer schId) { + Integer resolvedSchId = resolveSchId(schId, SchSerID); + if (resolvedSchId == null) { + return Collections.emptyList(); + } + return comSchTreeService.getSchStuTree(resolvedSchId); + } + /** * 解析学校ID:支持直接传 schId,或传 SchSerID 反查 schId,二者至少提供一个。 * diff --git a/src/main/java/com/yunhai/bschclassmanage/controller/oapi/oa/StuInfoController.java b/src/main/java/com/yunhai/bschclassmanage/controller/oapi/oa/StuInfoController.java index cf63b8f..72596d0 100644 --- a/src/main/java/com/yunhai/bschclassmanage/controller/oapi/oa/StuInfoController.java +++ b/src/main/java/com/yunhai/bschclassmanage/controller/oapi/oa/StuInfoController.java @@ -20,6 +20,8 @@ public class StuInfoController { @Autowired private SchStudentRepository studentRepository; @Autowired private SchInfoRepository schoolRepository; @Autowired private SchStudentHistoryRepository historyRepository; + @Autowired private SchClassRepository classRepository; + @Autowired private BaseSchsystemGradeRepository baseSchsystemGradeRepository; @GetMapping("GetAllStulist") @Operation(summary = "GetAllStulist") @@ -58,6 +60,39 @@ public class StuInfoController { Set ids = new HashSet<>(OaCompatSupport.ints(stuids)); return ResponseEntity.ok(students(studentRepository.findAll().stream().filter(s -> ids.contains(s.getStuId())).collect(Collectors.toList()), null)); } + + /** 按学校+年级直查学生(CampusNotice 推送范围圈人:免逐班聚合) */ + @GetMapping("GetGradeStulist") + @Operation(summary = "GetGradeStulist", description = "按学校+年级查询在校学生(不含已毕业班级)") + public ResponseEntity>> GetGradeStulist(@RequestParam(required=false) String SchSerID, @RequestParam(required=false) Integer GradeId) { + Integer schId = SchSerID == null ? null : schoolRepository.findBySchSerId(SchSerID).map(SchInfo::getSchId).orElse(null); + if (schId == null) return ResponseEntity.ok(Collections.emptyList()); + Set classIds = activeClassIds(schId, null, GradeId == null ? null : Collections.singleton(GradeId)); + if (classIds.isEmpty()) return ResponseEntity.ok(Collections.emptyList()); + return ResponseEntity.ok(students(studentRepository.findAll().stream().filter(s -> classIds.contains(s.getClassId())).collect(Collectors.toList()), SchSerID)); + } + + /** 按学校+学段(学制)直查学生(CampusNotice「学部」级范围一键展开) */ + @GetMapping("GetSubStulist") + @Operation(summary = "GetSubStulist", description = "按学校+学段查询在校学生(不含已毕业班级)") + public ResponseEntity>> GetSubStulist(@RequestParam(required=false) String SchSerID, @RequestParam(required=false) Integer SchSystemId) { + Integer schId = SchSerID == null ? null : schoolRepository.findBySchSerId(SchSerID).map(SchInfo::getSchId).orElse(null); + if (schId == null || SchSystemId == null) return ResponseEntity.ok(Collections.emptyList()); + Set gradeIds = baseSchsystemGradeRepository.findBySchSystemId(SchSystemId).stream() + .map(BaseSchsystemGrade::getGradeId).filter(Objects::nonNull).collect(Collectors.toSet()); + Set classIds = activeClassIds(schId, gradeIds, null); + if (classIds.isEmpty()) return ResponseEntity.ok(Collections.emptyList()); + return ResponseEntity.ok(students(studentRepository.findAll().stream().filter(s -> classIds.contains(s.getClassId())).collect(Collectors.toList()), SchSerID)); + } + + /** 学校在读班级 class_id 集合:gradeIds 非空按年级集合过滤,单个 gradeId 传 singleton */ + private Set activeClassIds(Integer schId, Set gradeIds, Set singleGrade) { + return classRepository.findAll().stream() + .filter(c -> Objects.equals(c.getSchId(), schId) && !Boolean.TRUE.equals(c.getGraduate())) + .filter(c -> (gradeIds == null || gradeIds.contains(c.getGradeId())) && (singleGrade == null || singleGrade.contains(c.getGradeId()))) + .map(SchClass::getClassId).filter(Objects::nonNull).collect(Collectors.toSet()); + } + @GetMapping("GetEleStuIdslist") @Operation(summary = "GetEleStuIdslist") public ResponseEntity>> GetEleStuIdslist(@RequestParam(required=false) String stuids) { return GetStuIdslist(stuids); } diff --git a/src/main/java/com/yunhai/bschclassmanage/service/IComSchTreeService.java b/src/main/java/com/yunhai/bschclassmanage/service/IComSchTreeService.java index 71bad36..4d15611 100644 --- a/src/main/java/com/yunhai/bschclassmanage/service/IComSchTreeService.java +++ b/src/main/java/com/yunhai/bschclassmanage/service/IComSchTreeService.java @@ -31,6 +31,8 @@ public interface IComSchTreeService { List getSchTeaTree(Integer schId); + List getSchStuTree(Integer schId); + List getSchoolList(); BoaGroup getTeaTree(Integer schId, Boolean withSub); diff --git a/src/main/java/com/yunhai/bschclassmanage/service/impl/com/ComSchTreeService.java b/src/main/java/com/yunhai/bschclassmanage/service/impl/com/ComSchTreeService.java index 4f3c230..fef4a64 100644 --- a/src/main/java/com/yunhai/bschclassmanage/service/impl/com/ComSchTreeService.java +++ b/src/main/java/com/yunhai/bschclassmanage/service/impl/com/ComSchTreeService.java @@ -58,6 +58,10 @@ public class ComSchTreeService implements IComSchTreeService { @Lazy private ISchTeacherService schTeacherService; + @Autowired + @Lazy + private ISchStudentService schStudentService; + @Autowired private SchTeacherGroupRepository schTeacherGroupRepository; @@ -578,6 +582,88 @@ public class ComSchTreeService implements IComSchTreeService { } } + /** + * 学生树(SchGroup/GetStuTree 输出):学校 → 学段 → 年级 → 班级 → 学生。 + * 层级数据链与 getGradeClassTree 一致(学段=base_sch_system、年级=base_sch_system_grade(no=主键 id)、 + * 班级=sch_class(id=group_class_id,名称 cname 优先,no=sort,不含毕业班), + * 学生仅取在读正常状态(复用按班缓存查询,已过滤休学/转出/禁用并按 sort 排序)。 + * 节点契约与 getSchTeaTree 相同:组织节点 type=1、isParent=true;学生叶子 type=2、isParent=false、children=null。 + * 返回单元素列表(学校根节点)。 + */ + public List getSchStuTree(Integer schId) { + TeaTreeVO rootVo = new TeaTreeVO(); + rootVo.setId(schId); + rootVo.setName(getSchoolName(schId)); + rootVo.setPid(0); + rootVo.setNo(0); + rootVo.setType(1); + rootVo.setIsParent(true); + rootVo.setChildren(new ArrayList<>()); + + List systemList = schBinSchsystemService.selectSchBinSchsystem(schId); + if (CollectionUtils.isEmpty(systemList)) { + return Collections.singletonList(rootVo); + } + + for (SelectIntVO system : systemList) { + TeaTreeVO systemVo = newGroupNode(system.getId(), system.getName(), schId, null); + rootVo.getChildren().add(systemVo); + + List gradeList = baseSchsystemGradeService.getSchGradeCacheList(schId, system.getId(), null); + if (CollectionUtils.isEmpty(gradeList)) { + continue; + } + List gradeIds = gradeList.stream() + .map(BaseSchsystemGrade::getGradeId) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + Map> classGroupMap = schClassService.getSchClassCacheFilter(schId, gradeIds, null) + .stream() + .collect(Collectors.groupingBy(SchClass::getGradeId)); + + for (BaseSchsystemGrade grade : gradeList) { + if (grade.getGradeId() == null) { + continue; + } + TeaTreeVO gradeVo = newGroupNode(grade.getGradeId(), grade.getGradeNickname(), system.getId(), grade.getId()); + systemVo.getChildren().add(gradeVo); + + for (SchClass clazz : classGroupMap.getOrDefault(grade.getGradeId(), Collections.emptyList())) { + if (clazz.getClassId() == null) { + continue; + } + TeaTreeVO classVo = newGroupNode(clazz.getClassId(), + StringUtils.isBlank(clazz.getCname()) ? clazz.getName() : clazz.getCname(), + grade.getGradeId(), clazz.getSort()); + gradeVo.getChildren().add(classVo); + + List students = schStudentService.getSchGradeClassStudentCacheList(schId, null, null, clazz.getClassId()); + for (SchStudent student : students) { + if (student.getStuId() == null) { + continue; + } + classVo.getChildren().add(newStudentNode(student, clazz.getClassId())); + } + } + } + } + + sortChildrenByNo(rootVo); + return Collections.singletonList(rootVo); + } + + /** 学生叶子 VO(type=2,isParent=false,no 固定 0,children=null → JSON 省略) */ + private TeaTreeVO newStudentNode(SchStudent student, Integer pid) { + TeaTreeVO vo = new TeaTreeVO(); + vo.setId(student.getStuId()); + vo.setName(student.getName()); + vo.setPid(pid); + vo.setNo(0); + vo.setType(2); + vo.setIsParent(false); + return vo; + } + /** * 递归确保所有节点的 children 不为 null,若为 null 则设置为空列表 [] */