diff --git a/src/main/java/com/yunhai/bschclassmanage/service/impl/sync/SyncUserService.java b/src/main/java/com/yunhai/bschclassmanage/service/impl/sync/SyncUserService.java index 8c275db..5eb0d24 100644 --- a/src/main/java/com/yunhai/bschclassmanage/service/impl/sync/SyncUserService.java +++ b/src/main/java/com/yunhai/bschclassmanage/service/impl/sync/SyncUserService.java @@ -341,39 +341,47 @@ public class SyncUserService implements ISyncUserService { schTeacherGroupRepository.saveAll(saveGroupList); } - if(isAll){ - // ---------- 1) 组级对账:清理本次下发教师的历史脏组 ---------- - // groupMap 已加载本次教师(teaIds)在库中的全部历史组(含 IN/OUT、跨学校)。 - // 其中「仍为 IN、但组 key 已不在本次下发列表」的组即为脏数据(被用户中心移除/调离的组),标记转出。 - List staleGroups = new ArrayList<>(); - for (SchTeacherGroup g : groupMap.values()) { - if (g == null || g.getTransferStatus() == null || g.getTransferStatus().intValue() != TransferStatus.IN.getId()) continue; - String key = buildTeacherGroupKeyWithSchId(g.getTeaId(), g.getGroupId(), g.getSchId()); - if (!incomingGroupKeys.contains(key)) { - g.setTransferStatus(TransferStatus.OUT.getId()); - staleGroups.add(g); - } - } - if (!staleGroups.isEmpty()) { - schTeacherGroupRepository.saveAll(staleGroups); - log.info("清理教师历史脏组(已不在用户中心下发):数量={}", staleGroups.size()); + // ---------- 1) 组级对账:清理本次下发教师的历史脏组(增量/全量均执行) ---------- + // groupMap 已加载本次教师(teaIds)在库中的全部历史组(含 IN/OUT、跨学校)。 + // 每次下发的教师 groups 都是该教师的完整组快照,因此增量同步同样可安全对账。 + // 「仍为 IN、但组 key 已不在本次下发列表」的组即为脏数据(被用户中心移除/调离的组),标记转出。 + List staleGroups = new ArrayList<>(); + for (SchTeacherGroup g : groupMap.values()) { + if (g == null || g.getTransferStatus() == null || g.getTransferStatus().intValue() != TransferStatus.IN.getId()) continue; + String key = buildTeacherGroupKeyWithSchId(g.getTeaId(), g.getGroupId(), g.getSchId()); + if (!incomingGroupKeys.contains(key)) { + g.setTransferStatus(TransferStatus.OUT.getId()); + staleGroups.add(g); } + } + if (!staleGroups.isEmpty()) { + schTeacherGroupRepository.saveAll(staleGroups); + log.info("清理教师历史脏组(已不在用户中心下发):数量={}", staleGroups.size()); + } - // ---------- 2) 教师级对账:清理教师已不存在的组 ---------- + // 受影响学校(缓存失效用):本次下发组学校 + 脏组学校 + Set affectedSchIds = new HashSet<>(schIds); + for (SchTeacherGroup g : staleGroups) { + if (g.getSchId() != null) affectedSchIds.add(g.getSchId()); + } + + if(isAll){ + // ---------- 2) 教师级对账:清理教师已不存在的组(仅全量) ---------- // 教师整体已从用户中心删除(teaId 不在本次下发名单)时,其所有组都不在 groupMap 覆盖范围内, // 需按学校维度查出该校 IN 组中 teaId 不在本次名单的组,一并标记转出。 + // 增量(AddUser/UpdateUser)只下发部分教师,无法区分「教师不存在」与「教师未在本批」,故仅全量执行。 Set teaIdSet = new HashSet<>(teaIds); - // 受影响学校 = 本次下发组学校 + 本次教师历史组学校(覆盖调离/删除后该校无其它下发的漏清) Set auditSchIds = new HashSet<>(schIds); for (SchTeacherGroup g : groupMap.values()) { if (g != null && g.getSchId() != null) auditSchIds.add(g.getSchId()); } setTransferTeacher(auditSchIds, teaIdSet); + affectedSchIds.addAll(auditSchIds); + } - // 同步后使受影响学校的教师缓存失效 - if (!auditSchIds.isEmpty()) { - schTeacherCacheService.clearTeacherCaches(auditSchIds); - } + // 同步后使受影响学校的教师缓存失效 + if (!affectedSchIds.isEmpty()) { + schTeacherCacheService.clearTeacherCaches(affectedSchIds); } }