package cn.teammodel.test; 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 com.itextpdf.text.log.Logger; import com.itextpdf.text.log.LoggerFactory; import org.apache.commons.lang3.tuple.Pair; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.function.Function; import java.util.stream.Collectors; import static cn.teammodel.controller.admin.service.impl.TeacherServiceImpl.PT_TEACHER_CACHE; @Service public class AsyncTeacherService { private static final Logger log = LoggerFactory.getLogger(AsyncTeacherService.class); @Autowired private PtTeacherRepository ptTeacherRepository; @Async public void asyncSavePtTeacherInfos(List teachersList) { try { Map existingTeachers = loadExistingTeachers(teachersList); 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.getId())) .collect(Collectors.toList()); List existingList = ptTeacherRepository.findByIdCodePairs(idAndCode); return existingList.stream() .collect(Collectors.toMap( PtTeacherInfo::getCode, Function.identity() )); } private PtTeacherInfo convertToPtTeacherInfo(GpTeacherVo teacher, Map existingTeachers) { String code = "PtTeacher-" + teacher.getId(); PtTeacherInfo existing = existingTeachers.get(code); // 如果数据库无记录,直接创建新对象 if (existing == null) { return createNewPtTeacherInfo(teacher, code); } // 检查字段是否有变化 boolean isChanged = !Objects.equals(existing.getName(), teacher.getName()) || !Objects.equals(existing.getPhone(), teacher.getPhone()) || !Objects.equals(existing.getDegree(), teacher.getDegree()) || !Objects.equals(existing.getPracticeTime(), teacher.getPracticeTime()) || !Objects.equals(existing.getGender(), teacher.getGender()) || !Objects.equals(existing.getGrade(), teacher.getGrade()) || !Objects.equals(existing.getPeriodId(), teacher.getPeriodId()); // 无变化则返回null,表示无需更新 if (!isChanged) { return null; } PtTeacherInfo updated = new PtTeacherInfo(); BeanUtils.copyProperties(existing, updated); updated.setName(teacher.getName()); updated.setPhone(teacher.getPhone()); updated.setDegree(teacher.getDegree()); updated.setPracticeTime(teacher.getPracticeTime()); updated.setGender(teacher.getGender()); updated.setGrade(teacher.getGrade()); updated.setPeriodId(teacher.getPeriodId()); 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.setTmdId(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.setIname(teacher.getIname()); ptTeacherInfo.setJob(teacher.getJob()); // 学科与角色信息 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()); ptTeacherInfo.setGroups(teacher.getGroups() != null ? teacher.getGroups() : Collections.emptyList()); // 其他业务字段 ptTeacherInfo.setNote(teacher.getNote()); ptTeacherInfo.setDegree(teacher.getDegree() != null ? teacher.getDegree() : ""); ptTeacherInfo.setPracticeTime(teacher.getPracticeTime() != null ? teacher.getPracticeTime() : 0L); // 默认0 ptTeacherInfo.setGender(teacher.getGender() != null ? teacher.getGender() : "U"); // 未知性别默认值 ptTeacherInfo.setGrade(teacher.getGrade()); ptTeacherInfo.setPeriodId(teacher.getPeriodId()); // 版本号初始化 ptTeacherInfo.setVersion(1); return ptTeacherInfo; } }