From afbd19522e17c61853cd30dfa05558406f8f4488 Mon Sep 17 00:00:00 2001 From: wanghu Date: Fri, 28 Aug 2026 10:20:17 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=84=E6=87=92=E5=8A=A0=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repository/SchClassRepository.java | 11 ++++ .../service/impl/com/ComSchTreeService.java | 60 +++++++++++-------- .../impl/student/SchStudentLogService.java | 4 +- .../student/SchStudentTransferService.java | 2 +- 4 files changed, 48 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/yunhai/bschclassmanage/Repository/SchClassRepository.java b/src/main/java/com/yunhai/bschclassmanage/Repository/SchClassRepository.java index 93e0b7b..c16fff4 100644 --- a/src/main/java/com/yunhai/bschclassmanage/Repository/SchClassRepository.java +++ b/src/main/java/com/yunhai/bschclassmanage/Repository/SchClassRepository.java @@ -42,6 +42,8 @@ public interface SchClassRepository extends JpaRepository, Jp @Param("keyword") String keyword, Pageable pageable); + + boolean existsBySchIdAndGroupIdAndName(Integer schId, Integer groupId, String name); boolean existsBySchIdAndGroupIdAndNameAndIdNot(Integer schId, Integer groupId, String name, Integer id); @@ -56,6 +58,15 @@ public interface SchClassRepository extends JpaRepository, Jp List findBySchIdAndEnrollYear(Integer schId, Integer enrollYear); + /** + * 根据学校ID和班级组ID列表查询班级 + * @param schId 学校ID + * @param classIds 班级组ID列表(group_class_id,即 SchClass.classId) + * @return 匹配的班级列表(与入参顺序无关,按库内顺序返回) + */ + @Query("SELECT c FROM SchClass c WHERE c.schId = :schId AND c.classId IN :classIds") + List findBySchIdAndClassIds(@Param("schId") Integer schId, @Param("classIds") List classIds); + boolean existsBySchIdAndClassId(Integer schId, Integer classId); @Query("SELECT COUNT(c) FROM SchClass c WHERE (c.firstTeacherId IN (:ids) OR c.secondTeacherId IN (:ids)) AND c.schId = :schId AND c.graduate = 0") 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 ffc4a09..1ac40ea 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 @@ -23,6 +23,7 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; @Service @@ -77,7 +78,7 @@ public class ComSchTreeService implements IComSchTreeService { synchronized (lock) { baseSchsystemMap = null; } - idToNameCache = null; + idToNameCacheBySchId.clear(); } /** @@ -316,38 +317,25 @@ public class ComSchTreeService implements IComSchTreeService { public String getTeaGroupName(Integer schId, Integer id) { - BoaGroup tree = getTeaTree(schId,true); - if (tree == null) return null; - // 懒加载缓存(若树结构不变) - if (idToNameCache == null) { - idToNameCache = new HashMap<>(); - buildCache(tree); - } - return idToNameCache.get(id); + if (id == null) return null; + return getTeaNameCache(schId).get(id); } public List getTeaGroupNameList(Integer schId, List ids) { - // 1. 构建缓存(如果尚未构建) - if (idToNameCache == null) { - BoaGroup tree = getTeaTree(schId,true); - if (tree == null) { - return Collections.emptyList(); - } - idToNameCache = new HashMap<>(); - buildCache(tree); - } + // 1. 获取当前学校的组名缓存(按 schId 懒加载,不跨学校串用) + Map cache = getTeaNameCache(schId); // 2. 如果缓存为空,直接返回空 - if (idToNameCache.isEmpty()) { + if (cache.isEmpty()) { return Collections.emptyList(); } // 3. 处理 ids 参数 List targetIds; if (ids == null) { - // 如果 ids 为 null,返回全部(从缓存中取出所有 key) - targetIds = new ArrayList<>(idToNameCache.keySet()); + // 如果 ids 为 null,返回全部(从当前学校缓存中取出所有 key) + targetIds = new ArrayList<>(cache.keySet()); } else { // 过滤掉 null 的 ID,并去重(可选) targetIds = ids.stream() @@ -362,7 +350,7 @@ public class ComSchTreeService implements IComSchTreeService { // 4. 根据 targetIds 构建结果列表 List result = new ArrayList<>(); for (Integer id : targetIds) { - String name = idToNameCache.get(id); + String name = cache.get(id); if (name != null) { SelectIntVO vo = new SelectIntVO(); vo.setId(id); @@ -933,14 +921,34 @@ public class ComSchTreeService implements IComSchTreeService { } } - private Map idToNameCache; + /** + * 教师组树 id->name 缓存,按学校分桶,避免跨学校串数据 + * 组树变更后需调用 clearCache() 清空(同一学校内部结构变化也会失效) + */ + private final Map> idToNameCacheBySchId = new ConcurrentHashMap<>(); - private void buildCache(BoaGroup node) { + /** + * 获取指定学校的组名缓存(懒加载:首次按 schId 构建;树为 null 时不落缓存,下次重试) + */ + private Map getTeaNameCache(Integer schId) { + Map cache = idToNameCacheBySchId.get(schId); + if (cache == null) { + BoaGroup tree = getTeaTree(schId, true); + cache = new HashMap<>(); + if (tree != null) { + buildCache(tree, cache); + idToNameCacheBySchId.put(schId, cache); + } + } + return cache; + } + + private void buildCache(BoaGroup node, Map cache) { if (node == null) return; - idToNameCache.put(node.getId(), node.getName()); + cache.put(node.getId(), node.getName()); if (node.getChildren() != null) { for (BoaGroup child : node.getChildren()) { - buildCache(child); + buildCache(child, cache); } } } diff --git a/src/main/java/com/yunhai/bschclassmanage/service/impl/student/SchStudentLogService.java b/src/main/java/com/yunhai/bschclassmanage/service/impl/student/SchStudentLogService.java index 96b8d79..e3b753f 100644 --- a/src/main/java/com/yunhai/bschclassmanage/service/impl/student/SchStudentLogService.java +++ b/src/main/java/com/yunhai/bschclassmanage/service/impl/student/SchStudentLogService.java @@ -250,7 +250,7 @@ public class SchStudentLogService { try { LocalDateTime now = LocalDateTime.now(); // 1. 批量查询班级名称 - List classList = schClassRepository.findAllById(affectedClassIds); + List classList = schClassRepository.findBySchIdAndClassIds(user.getSchId(),affectedClassIds.stream().collect(Collectors.toList())); Map classMap = classList.stream() .collect(Collectors.toMap(SchClass::getClassId, Function.identity())); Map gradeNameMap = baseSchsystemGradeService.getGradeNameMap(user.getSchId(), null, null); @@ -330,7 +330,7 @@ public class SchStudentLogService { // 查询原班级名称(可能跨校) String originalClassName = "未知班级"; if (originalSchId != null && originalClassId != null) { - SchClass originalClass = schClassRepository.findByIdAndSchId(originalClassId, originalSchId).orElse(null); + SchClass originalClass = schClassRepository.findByClassIdAndSchId(originalClassId, originalSchId).orElse(null); if (originalClass != null) { originalClassName = gradeMap.get(originalClass.getGradeId()) + originalClass.getName(); } diff --git a/src/main/java/com/yunhai/bschclassmanage/service/impl/student/SchStudentTransferService.java b/src/main/java/com/yunhai/bschclassmanage/service/impl/student/SchStudentTransferService.java index 011cf4a..e5e283a 100644 --- a/src/main/java/com/yunhai/bschclassmanage/service/impl/student/SchStudentTransferService.java +++ b/src/main/java/com/yunhai/bschclassmanage/service/impl/student/SchStudentTransferService.java @@ -139,7 +139,7 @@ public class SchStudentTransferService { throw new DException("以下学生不存在或不属于该校: " + missing); } - List syncStuIds=students.stream().map(s->s.getStuId()).collect(Collectors.toList()); + // List syncStuIds=students.stream().map(s->s.getStuId()).collect(Collectors.toList()); // 收集受影响的班级ID Set classIds = students.stream()