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 c71e66e..8c275db 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 @@ -342,20 +342,33 @@ public class SyncUserService implements ISyncUserService { } if(isAll){ - // 本次下发的教师 id 集合(用于判断「教师已不存在」) - Set teaIdSet = new HashSet<>(teaIds); - // 对账学校范围 = 本次下发组涉及的学校 + 本次教师在库中的历史组学校, - // 后者可覆盖「教师被调离某校、该校本批无其它教师下发」导致的漏清。 - Set auditSchIds = new HashSet<>(schIds); + // ---------- 1) 组级对账:清理本次下发教师的历史脏组 ---------- + // groupMap 已加载本次教师(teaIds)在库中的全部历史组(含 IN/OUT、跨学校)。 + // 其中「仍为 IN、但组 key 已不在本次下发列表」的组即为脏数据(被用户中心移除/调离的组),标记转出。 + List staleGroups = new ArrayList<>(); for (SchTeacherGroup g : groupMap.values()) { - if (g.getSchId() != null) auditSchIds.add(g.getSchId()); + 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) 教师已不存在(teaId 不在本次下发名单)→ 清除其所有组; - // 2) 教师存在但某个组已不存在(组 key 不在本次下发)→ 清除该组。 - // 统一标记为转出(OUT),保留转出记录、可随下次同步逆向恢复(重新 IN)。 - setTransferTeacher(auditSchIds, teaIdSet, incomingGroupKeys); + // ---------- 2) 教师级对账:清理教师已不存在的组 ---------- + // 教师整体已从用户中心删除(teaId 不在本次下发名单)时,其所有组都不在 groupMap 覆盖范围内, + // 需按学校维度查出该校 IN 组中 teaId 不在本次名单的组,一并标记转出。 + 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); // 同步后使受影响学校的教师缓存失效 if (!auditSchIds.isEmpty()) { @@ -365,25 +378,21 @@ public class SyncUserService implements ISyncUserService { } - private void setTransferTeacher( Set schIds, Set teaIds, Set incomingGroupKeys) + private void setTransferTeacher( Set schIds, Set teaIds) { for (Integer schId : schIds) { List currentInGroups = schTeacherGroupRepository.findBySchIdAndTransferStatus(schId, TransferStatus.IN.getId()); List toTransferOut = new ArrayList<>(); for (SchTeacherGroup g : currentInGroups) { - // 教师已不存在:清除该教师在本校的所有组 - boolean teacherMissing = g.getTeaId() == null || !teaIds.contains(g.getTeaId()); - // 教师存在,但该组已不存在(被用户中心移除) - String key = buildTeacherGroupKeyWithSchId(g.getTeaId(), g.getGroupId(), g.getSchId()); - boolean groupMissing = !incomingGroupKeys.contains(key); - if (teacherMissing || groupMissing) { + // 教师已不存在(teaId 不在本次下发名单):清除该教师在本校的所有组 + if (g.getTeaId() == null || !teaIds.contains(g.getTeaId())) { g.setTransferStatus(TransferStatus.OUT.getId()); toTransferOut.add(g); } } if (!toTransferOut.isEmpty()) { schTeacherGroupRepository.saveAll(toTransferOut); - log.info("清理用户中心不存在的教师/组:schId={}, 转出教师分组数={}", schId, toTransferOut.size()); + log.info("清理用户中心不存在的教师组:schId={}, 转出教师分组数={}", schId, toTransferOut.size()); } } }