状态修改
This commit is contained in:
@@ -10,6 +10,8 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
|
||||
@@ -22,11 +24,11 @@ public class SyncGroupService implements ISyncGroupService {
|
||||
|
||||
public void syncAddOrUpdate(SyncGroupDTO group) {
|
||||
|
||||
//学校组 年级组 班级组
|
||||
if(group.getType().equals(NodeType.SCHOOL.getId())){
|
||||
//学校组-年级组-班级组
|
||||
if(Objects.equals(group.getType(),NodeType.SCHOOL.getId())){
|
||||
addOrUpdateSchool(group);
|
||||
}
|
||||
if(group.getType().equals(NodeType.CLASS.getId())){
|
||||
if(Objects.equals(group.getType(),NodeType.CLASS.getId())){
|
||||
|
||||
|
||||
//添加班级组 202406
|
||||
@@ -57,6 +59,11 @@ public class SyncGroupService implements ISyncGroupService {
|
||||
}
|
||||
}
|
||||
|
||||
public void DeleteGroup(List<Integer> Ids)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -177,6 +177,8 @@ public class SyncUserService implements ISyncUserService {
|
||||
List<SchStudent> saveList = new ArrayList<>();
|
||||
// 受影响班级缓存键 (schId -> classId 集合),用于同步后失效
|
||||
Map<Integer, Set<Integer>> classKeys = new HashMap<>();
|
||||
// 本次同步下发的学生分组键(stuId_classId),用于回收对账
|
||||
Set<String> incomingStudentKeys = new HashSet<>();
|
||||
|
||||
for (SyncUserDTO user : studentUsers) {
|
||||
if (user.getGroups() == null) continue;
|
||||
@@ -195,16 +197,52 @@ public class SyncUserService implements ISyncUserService {
|
||||
}
|
||||
saveList.add(student);
|
||||
classKeys.computeIfAbsent(schId, k -> new HashSet<>()).add(groupId);
|
||||
incomingStudentKeys.add(key);
|
||||
}
|
||||
}
|
||||
|
||||
if (!saveList.isEmpty()) {
|
||||
schStudentRepository.saveAll(saveList);
|
||||
// 同步后使受影响班级的学生缓存失效,避免读到旧数据
|
||||
}
|
||||
|
||||
// 清理用户中心不存在的学生(与教师相同逻辑:标记转出,可逆向恢复)
|
||||
Set<Integer> schIds = classKeys.keySet();
|
||||
setTransferStudent(schIds, classKeys, incomingStudentKeys);
|
||||
|
||||
// 同步后使受影响班级的学生缓存失效,避免读到旧数据
|
||||
if (!classKeys.isEmpty()) {
|
||||
classKeys.forEach((schId, classIds) -> schStudentCacheService.clearClassStudentCaches(schId, classIds));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 清理用户中心不存在的学生:学校/班级已存在、但用户中心(incomingStudentKeys)已不存在的学生,
|
||||
* 标记为转出(OUT),从活跃名单中清理;同时保留转出记录,可随下次同步逆向恢复(重新 IN)。
|
||||
* 仅针对本次同步覆盖的学校/班级,避免误删未参与本批次的其他班级学生。
|
||||
*/
|
||||
private void setTransferStudent(Set<Integer> schIds, Map<Integer, Set<Integer>> classKeys, Set<String> incomingStudentKeys) {
|
||||
for (Integer schId : schIds) {
|
||||
Set<Integer> classIds = classKeys.get(schId);
|
||||
if (classIds == null) continue;
|
||||
for (Integer classId : classIds) {
|
||||
if (classId == null) continue;
|
||||
List<SchStudent> currentIn = schStudentRepository.findBySchIdAndClassIdAndTransferStatus(schId, classId, TransferStatus.IN.getId());
|
||||
List<SchStudent> toTransferOut = new ArrayList<>();
|
||||
for (SchStudent s : currentIn) {
|
||||
String key = buildStudentKey(s.getStuId(), s.getClassId());
|
||||
if (!incomingStudentKeys.contains(key)) {
|
||||
s.setTransferStatus(TransferStatus.OUT.getId());
|
||||
toTransferOut.add(s);
|
||||
}
|
||||
}
|
||||
if (!toTransferOut.isEmpty()) {
|
||||
schStudentRepository.saveAll(toTransferOut);
|
||||
log.info("清理用户中心不存在的学生:schId={}, classId={}, 转出学生数={}", schId, classId, toTransferOut.size());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void updateStudent(SchStudent student, SyncUserDTO user, SyncUserGroupDTO group, Date now) {
|
||||
student.setAccount(user.getAccount());
|
||||
student.setName(user.getName());
|
||||
@@ -240,6 +278,7 @@ public class SyncUserService implements ISyncUserService {
|
||||
// ==================== 教师同步 ====================
|
||||
|
||||
private void syncTeachers(List<SyncUserDTO> teacherUsers, Date now) {
|
||||
|
||||
List<Integer> teaIds = teacherUsers.stream().map(SyncUserDTO::getId).distinct().collect(Collectors.toList());
|
||||
|
||||
// 教师主体(唯一)
|
||||
@@ -257,6 +296,8 @@ public class SyncUserService implements ISyncUserService {
|
||||
List<SchTeacherGroup> saveGroupList = new ArrayList<>();
|
||||
// 受影响学校缓存键,用于同步后失效
|
||||
Set<Integer> schIds = new HashSet<>();
|
||||
// 本次同步下发的教师分组键(teaId_groupId_schId),用于回收对账
|
||||
Set<String> incomingGroupKeys = new HashSet<>();
|
||||
|
||||
for (SyncUserDTO user : teacherUsers) {
|
||||
// 教师主体(只存一条)
|
||||
@@ -285,6 +326,7 @@ public class SyncUserService implements ISyncUserService {
|
||||
}
|
||||
saveGroupList.add(tg);
|
||||
schIds.add(schId);
|
||||
incomingGroupKeys.add(key);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -294,12 +336,40 @@ public class SyncUserService implements ISyncUserService {
|
||||
if (!saveGroupList.isEmpty()) {
|
||||
schTeacherGroupRepository.saveAll(saveGroupList);
|
||||
}
|
||||
|
||||
// 清理用户中心不存在的教师:
|
||||
// 学校已存在、但用户中心(teacherUsers)已不存在的教师,需从活跃名单中清理。
|
||||
// 对本次同步涉及的每所学校,将「当前为转入状态、但不在本次下发分组列表」的教师分组标记为转出(OUT)。
|
||||
// 这样既把已从用户中心移除/调离的教师清理出活跃名单,又保留转出记录、可随下次同步逆向恢复(重新 IN)。
|
||||
// 仅针对本次同步覆盖的学校,避免误删未参与本批次的其他学校教师。
|
||||
setTransferTeacher(schIds,incomingGroupKeys);
|
||||
|
||||
// 同步后使受影响学校的教师缓存失效
|
||||
if (!schIds.isEmpty()) {
|
||||
schTeacherCacheService.clearTeacherCaches(schIds);
|
||||
}
|
||||
}
|
||||
|
||||
private void setTransferTeacher( Set<Integer> schIds,Set<String> incomingGroupKeys)
|
||||
{
|
||||
for (Integer schId : schIds) {
|
||||
List<SchTeacherGroup> currentInGroups = schTeacherGroupRepository.findBySchIdAndTransferStatus(schId, TransferStatus.IN.getId());
|
||||
List<SchTeacherGroup> toTransferOut = new ArrayList<>();
|
||||
for (SchTeacherGroup g : currentInGroups) {
|
||||
String key = buildTeacherGroupKeyWithSchId(g.getTeaId(), g.getGroupId(), g.getSchId());
|
||||
if (!incomingGroupKeys.contains(key)) {
|
||||
g.setTransferStatus(TransferStatus.OUT.getId());
|
||||
toTransferOut.add(g);
|
||||
}
|
||||
}
|
||||
if (!toTransferOut.isEmpty()) {
|
||||
schTeacherGroupRepository.saveAll(toTransferOut);
|
||||
log.info("清理用户中心不存在的教师:schId={}, 转出教师分组数={}", schId, toTransferOut.size());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void updateTeacher(SchTeacher teacher, SyncUserDTO user, Date now) {
|
||||
teacher.setAccount(user.getAccount());
|
||||
teacher.setName(user.getName());
|
||||
|
||||
Reference in New Issue
Block a user