package cn.teammodel.test; import cn.teammodel.common.PK; import cn.teammodel.model.dto.admin.teacher.IdCodePair; import cn.teammodel.model.entity.teacher.PtTeacherInfo; import cn.teammodel.model.vo.admin.GpTeacherVo; import cn.teammodel.repository.PtTeacherRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @Service public class AsyncTeacherService { private static final Logger log = LoggerFactory.getLogger(AsyncTeacherService.class); @Autowired private PtTeacherRepository ptTeacherRepository; @Transactional(rollbackFor = Exception.class) public void asyncSavePtTeacherInfos(List teachersList) { try { String schoolCode = teachersList.get(0).getCode(); Map existingTeachers = loadExistingTeachers(teachersList); // 查询该学校的所有现有教师 String code = String.format(PK.PTTEACHER, schoolCode); List allExistingInSchool = ptTeacherRepository.findByCode(code); // 收集传入列表中的教师ID Set incomingIds = teachersList.stream() .map(GpTeacherVo::getId) .filter(Objects::nonNull) .collect(Collectors.toSet()); // 找出需要停用的教师(存在于数据库但不在传入列表中) List toDeactivate = allExistingInSchool.stream() .filter(pt -> pt.getId() != null && !incomingIds.contains(pt.getId())) .collect(Collectors.toList()); // 更新停用教师的状态和版本 根据属性source等于pt 无需改变状态和版本 toDeactivate.removeIf(pt -> pt.getSource().equals("pt")); toDeactivate.forEach(pt -> { { pt.setState(2); pt.setVersion(pt.getVersion() + 1); } }); // 保存停用教师到数据库并更新缓存 if (!toDeactivate.isEmpty()) { ptTeacherRepository.saveAll(toDeactivate); //toDeactivate.forEach(pt -> PT_TEACHER_CACHE.put(pt.getCode(), pt)); } List updates = teachersList.stream() .filter(t -> t.getId() != null) .map(t -> convertToPtTeacherInfo(t, existingTeachers)) .filter(Objects::nonNull) // 过滤掉未变更的记录 .collect(Collectors.toList()); if (!updates.isEmpty()) { ptTeacherRepository.saveAll(updates); //updates.forEach(pt -> PT_TEACHER_CACHE.put(pt.getCode(), pt)); } } catch (Exception e) { log.error("Failed to save teacher info asynchronously", e); } } private Map loadExistingTeachers(List teachersList) { List idAndCode = teachersList.stream() .filter(t -> t.getId() != null) .map(t -> new IdCodePair(t.getId(), "PtTeacher-" + t.getCode())) .collect(Collectors.toList()); List existingList = ptTeacherRepository.findByIdCodePairs(idAndCode); return existingList.stream() .collect(Collectors.toMap( PtTeacherInfo::getId, Function.identity() )); } private PtTeacherInfo convertToPtTeacherInfo(GpTeacherVo teacher, Map existingTeachers) { String code = "PtTeacher-" + teacher.getCode(); PtTeacherInfo existing = existingTeachers.get(teacher.getId()); // 如果数据库无记录,直接创建新对象 if (existing == null) { return createNewPtTeacherInfo(teacher, code); } // 检查字段是否有变化 // boolean isChanged = !Objects.equals(existing.getName(), teacher.getName()) // || !Objects.equals(existing.getPicture(), teacher.getPicture()) || // !Objects.equals(existing.getEmail(), teacher.getEmail()) || // !Objects.equals(existing.getPhone(), teacher.getPhone()) || // !Objects.equals(existing.getSubjectIds(), teacher.getSubjectIds()) || // !Objects.equals(existing.getRoles(), teacher.getRoles()) || // !Objects.equals(existing.getStatus(), teacher.getStatus()) || // !Objects.equals(existing.getJob(), teacher.getJob()) || // !Objects.equals(existing.getPeriodId(), teacher.getPeriodId()) // ; boolean isChanged = false; // 无变化则返回null,表示无需更新 if (!isChanged) { return null; } PtTeacherInfo updated = new PtTeacherInfo(); BeanUtils.copyProperties(existing, updated); updated.setName(teacher.getName()); updated.setPhone(teacher.getPhone()); updated.setPicture(teacher.getPicture()); updated.setEmail(teacher.getEmail()); updated.setPeriodId(teacher.getPeriodId()); updated.setSubjectIds(teacher.getSubjectIds()); updated.setRoles(teacher.getRoles()); updated.setStatus(teacher.getStatus()); updated.setJob(teacher.getJob()); updated.setVersion(getNextVersion(updated.getId(), updated.getCode())); return updated; } private Integer getNextVersion(String id,String code) { PtTeacherInfo existingPtTeacherInfo = ptTeacherRepository.findByIdAndCode(id,code); if (existingPtTeacherInfo != null) { return existingPtTeacherInfo.getVersion() + 1; } return 1; } private PtTeacherInfo createNewPtTeacherInfo(GpTeacherVo teacher, String code) { PtTeacherInfo ptTeacherInfo = new PtTeacherInfo(); // 固定值 ptTeacherInfo.setPk("PtTeacher"); ptTeacherInfo.setTtl(-1); // 基础信息映射 ptTeacherInfo.setId(teacher.getId()); ptTeacherInfo.setCode(code); ptTeacherInfo.setName(teacher.getName()); ptTeacherInfo.setPhone(teacher.getPhone() != null ? teacher.getPhone() : ""); // 空值处理 ptTeacherInfo.setEmail(teacher.getEmail() != null ? teacher.getEmail() : ""); ptTeacherInfo.setPicture(teacher.getPicture()); ptTeacherInfo.setJob(teacher.getJob()); ptTeacherInfo.setSchool(teacher.getCode()); ptTeacherInfo.setJoinTime(0L); ptTeacherInfo.setState(1); ptTeacherInfo.setVersion(1); ptTeacherInfo.setAge(teacher.getAge() != null ? teacher.getAge() : 0); ptTeacherInfo.setTeachingAge(teacher.getTeachingAge() != null ? teacher.getTeachingAge() : 0); ptTeacherInfo.setStatus(teacher.getStatus() != null ? teacher.getStatus() : ""); // 学科与角色信息 ptTeacherInfo.setSubjectIds(teacher.getSubjectIds() != null ? teacher.getSubjectIds() : Collections.emptyList()); ptTeacherInfo.setSubjectNames(teacher.getSubjectNames() != null ? teacher.getSubjectNames() : Collections.emptyList()); ptTeacherInfo.setRoles(teacher.getRoles() != null ? teacher.getRoles() : Collections.emptyList()); //只是针对管理员权限的内容 if (teacher.getRoles() != null && teacher.getRoles().contains("admin")) { ptTeacherInfo.setIdentity(Collections.singletonList("admin")); } else { ptTeacherInfo.setIdentity(Collections.singletonList("teacher")); } // 其他业务字段 ptTeacherInfo.setDegree(teacher.getDegree() != null ? teacher.getDegree() : ""); ptTeacherInfo.setGender(teacher.getGender() != null ? teacher.getGender() : "U"); // 未知性别默认值 ptTeacherInfo.setGrade(teacher.getGrade() != null ? teacher.getGrade() : Collections.emptyList()); ptTeacherInfo.setPeriodId(teacher.getPeriodId() != null ? teacher.getPeriodId() : ""); ptTeacherInfo.setTitle(teacher.getTitle() != null ? teacher.getTitle() : ""); ptTeacherInfo.setSource("ies"); // 版本号初始化 ptTeacherInfo.setVersion(1); return ptTeacherInfo; } }