diff --git a/src/main/java/cn/teammodel/controller/admin/service/impl/TeacherServiceImpl.java b/src/main/java/cn/teammodel/controller/admin/service/impl/TeacherServiceImpl.java index 9969405..11cef41 100644 --- a/src/main/java/cn/teammodel/controller/admin/service/impl/TeacherServiceImpl.java +++ b/src/main/java/cn/teammodel/controller/admin/service/impl/TeacherServiceImpl.java @@ -40,6 +40,8 @@ import org.springframework.cache.annotation.Cacheable; import org.springframework.core.env.Environment; import org.springframework.data.domain.Slice; import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.time.*; @@ -86,10 +88,16 @@ public class TeacherServiceImpl implements TeacherService { private static final Logger logger = LoggerFactory.getLogger(TeacherServiceImpl.class); // 引入缓存,需根据实际情况配置大小和过期时间 每次服务重启时 缓存会清空 - public static final Cache PT_TEACHER_CACHE = CacheBuilder.newBuilder() - .maximumSize(500) - .expireAfterWrite(8, TimeUnit.HOURS) - .build(); + // 初始化Guava Cache + private Cache> teacherCache; + + @PostConstruct + public void init() { + teacherCache = CacheBuilder.newBuilder() + .expireAfterWrite(1, TimeUnit.HOURS) // 缓存1小时 + .maximumSize(1000) // 最大缓存数量 + .build(); + } @Cacheable(value = "schoolGroupCache", key = "#code") public List getCachedGroupLists(String code) { @@ -160,12 +168,25 @@ public class TeacherServiceImpl implements TeacherService { @Override public Map getTeacherDetail(TeacherDto teacherDto, HttpServletRequest request) { - Map teachers; - //获取全学校教师名单详情 - String url = env.getProperty("ies.server-url-get-teacher-all"); + Map teachers = new HashMap<>(); + Map teacherInfos; + String cacheKey = "teacher_data_" + teacherDto.getCode(); // 基于学校代码的缓存键 try { - teachers = GroupUtil.getGroupId(teacherDto,new GroupUtil(env), request,url); - List teachersList = convertToGpTeacherVoList(teachers, teacherDto.getCode()); + try { + // 尝试从缓存获取数据,若不存在则加载 + teacherInfos = teacherCache.get(cacheKey, () -> { + String url = env.getProperty("ies.server-url-get-teacher-all"); + return GroupUtil.getGroupId(teacherDto, new GroupUtil(env), request, url); + }); + } catch (ExecutionException e) { + Throwable cause = e.getCause(); + if (cause instanceof ServiceException) { + throw (ServiceException) cause; + } else { + throw new ServiceException(ErrorCode.SYSTEM_ERROR.getCode(), "获取教师数据失败"); + } + } + List teachersList = convertToGpTeacherVoList(teacherInfos, teacherDto.getCode()); //List phones = teachersList.stream().map(GpTeacherVo::getPhone).collect(Collectors.toList()); GpTeacherDto gpTeacherDto = new GpTeacherDto(); //gpTeacherDto.setMobiles(phones); @@ -216,8 +237,8 @@ public class TeacherServiceImpl implements TeacherService { .map(GpTeacherVo::getId) .collect(Collectors.toSet()); - //String code = String.format(PK.PTTEACHER, teacherDto.getCode()); - List ptTeacherInfos = ptTeacherRepository.findAllTeacher(teacherIds, teacherDto.getCode()); + String code = String.format(PK.PTTEACHER, teacherDto.getCode()); + List ptTeacherInfos = ptTeacherRepository.findAllTeacher(teacherIds, teacherDto.getCode(),code); // Map idToPtTeacherInfo = ptTeacherInfos.stream() // .collect(Collectors.toMap(PtTeacherInfo::getId, Function.identity())); // @@ -228,7 +249,6 @@ public class TeacherServiceImpl implements TeacherService { // } // }); teachers.put("info", ptTeacherInfos); - teachers.remove("teachers"); }catch (Exception e) { @@ -251,7 +271,7 @@ public class TeacherServiceImpl implements TeacherService { return teachersList; } - private List convertToGpTeacherList(Map tBase) { + /*private List convertToGpTeacherList(Map tBase) { List gpTeachers = new ArrayList<>(); for (Map.Entry entry : tBase.entrySet()) { if (entry.getKey().equals("teachers")) { @@ -263,10 +283,10 @@ public class TeacherServiceImpl implements TeacherService { } } return gpTeachers; - } + }*/ - private void savePtTeacherInfosBatch(List teachersList) { + /*private void savePtTeacherInfosBatch(List teachersList) { // 预加载版本号 Map versionMap = loadExistingVersions(teachersList); @@ -277,9 +297,9 @@ public class TeacherServiceImpl implements TeacherService { ptTeacherRepository.saveAll(ptTeacherInfos); ptTeacherInfos.forEach(pt -> PT_TEACHER_CACHE.put(pt.getCode(), pt)); - } + }*/ - private Map loadExistingVersions(List teachersList) { + /*private Map loadExistingVersions(List teachersList) { // 收集所有id和code组合 List> idCodePairs = teachersList.stream() .filter(t -> t.getId() != null) @@ -298,10 +318,10 @@ public class TeacherServiceImpl implements TeacherService { PtTeacherInfo::getCode, PtTeacherInfo::getVersion )); - } + }*/ - private PtTeacherInfo convertToPtTeacherInfo(GpTeacherVo teacher, Map versionMap) { + /*private PtTeacherInfo convertToPtTeacherInfo(GpTeacherVo teacher, Map versionMap) { PtTeacherInfo ptTeacherInfo = new PtTeacherInfo(); String code = "PtTeacher-" + teacher.getCode(); ptTeacherInfo.setPk("PtTeacher"); @@ -325,9 +345,9 @@ public class TeacherServiceImpl implements TeacherService { ptTeacherInfo.setVersion(getNextVersion(ptTeacherInfo.getId(), ptTeacherInfo.getCode())); return ptTeacherInfo; - } + }*/ - private Integer getNextVersion(String id,String code) { + /* private Integer getNextVersion(String id,String code) { PtTeacherInfo existingPtTeacherInfo = ptTeacherRepository.findByIdAndCode(id,code); if (existingPtTeacherInfo != null) { return existingPtTeacherInfo.getVersion() + 1; @@ -351,7 +371,7 @@ public class TeacherServiceImpl implements TeacherService { } } return practiceCount; - } + }*/ private GpTeacherVo convertToGpTeacherVo(Map map,String code) { GpTeacherVo teacher = new GpTeacherVo(); @@ -366,7 +386,7 @@ public class TeacherServiceImpl implements TeacherService { teacher.setJob((String) map.get("job")); teacher.setStatus((String) map.get("status")); teacher.setRoles((List) map.get("roles")); - List> groupList = (List>) map.get("groups"); + /*List> groupList = (List>) map.get("groups"); if (groupList != null) { List groups = new ArrayList<>(); @@ -380,7 +400,7 @@ public class TeacherServiceImpl implements TeacherService { groups.add(group); } teacher.setGroups(groups); - } + }*/ teacher.setNote((String) map.get("note")); teacher.setSubjectIds((List) map.get("subjectIds")); teacher.setSubjectNames((List) map.get("subjectNames")); @@ -723,12 +743,12 @@ public class TeacherServiceImpl implements TeacherService { Long count = subjectCount.getOrDefault(name, 0L); subjectCount.put(name, count + 1); } - if(teacher.getGroups() != null) { + /*if(teacher.getGroups() != null) { for (GpTeacherVo.IdNameCode group : teacher.getGroups()) { Long count = GroupCount.getOrDefault(group.getName(), 0L); GroupCount.put(group.getName(), count + 1); } - } + }*/ } } }else if(StringUtils.isEmpty(teacherDto.getGrade()) && StringUtils.isNotEmpty(teacherDto.getSubjectId())) { @@ -755,12 +775,12 @@ public class TeacherServiceImpl implements TeacherService { Long count = subjectCount.getOrDefault(name, 0L); subjectCount.put(name, count + 1); } - if(teacher.getGroups() != null) { + /*if(teacher.getGroups() != null) { for (GpTeacherVo.IdNameCode group : teacher.getGroups()) { Long count = GroupCount.getOrDefault(group.getName(), 0L); GroupCount.put(group.getName(), count + 1); } - } + }*/ } } }else if(StringUtils.isNotEmpty(teacherDto.getGrade()) && StringUtils.isEmpty(teacherDto.getSubjectId())) { @@ -788,12 +808,12 @@ public class TeacherServiceImpl implements TeacherService { subjectCount.put(name, count + 1); } } - if(teacher.getGroups() != null) { + /* if(teacher.getGroups() != null) { for (GpTeacherVo.IdNameCode group : teacher.getGroups()) { Long count = GroupCount.getOrDefault(group.getName(), 0L); GroupCount.put(group.getName(), count + 1); } - } + }*/ } } @@ -822,12 +842,12 @@ public class TeacherServiceImpl implements TeacherService { subjectCount.put(name, count + 1); } } - if(teacher.getGroups() != null) { + /* if(teacher.getGroups() != null) { for (GpTeacherVo.IdNameCode group : teacher.getGroups()) { Long count = GroupCount.getOrDefault(group.getName(), 0L); GroupCount.put(group.getName(), count + 1); } - } + }*/ } } @@ -1432,7 +1452,8 @@ public class TeacherServiceImpl implements TeacherService { @Override public void delete(TeacherDto teacherDto) { try { - List ptTeacherInfo = ptTeacherRepository.findAllTeacher(); + String code = String.format(PK.PTTEACHER, teacherDto.getCode()); + List ptTeacherInfo = ptTeacherRepository.findByCode(code); //删除查询出来的所有数据 for (PtTeacherInfo ptTeacherInfo1 : ptTeacherInfo){ ptTeacherRepository.delete(ptTeacherInfo1); diff --git a/src/main/java/cn/teammodel/model/vo/admin/GpTeacherVo.java b/src/main/java/cn/teammodel/model/vo/admin/GpTeacherVo.java index 83fd9af..0c3b53d 100644 --- a/src/main/java/cn/teammodel/model/vo/admin/GpTeacherVo.java +++ b/src/main/java/cn/teammodel/model/vo/admin/GpTeacherVo.java @@ -17,7 +17,6 @@ public class GpTeacherVo { public List subjectIds ; public List subjectNames ; public List roles; - public List groups; public String note ; public String degree; public String gender ; @@ -30,13 +29,5 @@ public class GpTeacherVo { public List identity; public String title ; public Integer version = 1; - @Data - public static class IdNameCode{ - public String id ; - public String name ; - public String code ; - public String picture ; - public String nickname ; - } } diff --git a/src/main/java/cn/teammodel/repository/PtTeacherRepository.java b/src/main/java/cn/teammodel/repository/PtTeacherRepository.java index 6a028b4..71191cf 100644 --- a/src/main/java/cn/teammodel/repository/PtTeacherRepository.java +++ b/src/main/java/cn/teammodel/repository/PtTeacherRepository.java @@ -16,9 +16,9 @@ public interface PtTeacherRepository extends CosmosRepository findByIdCodePairs(@Param("pairs") List pairs); - @Query(value = "SELECT * FROM c WHERE c.pk = 'PtTeacher' and c.id in (@ids) and c.school = @code") - List findAllTeacher(Collection ids, String code); - @Query(value = "SELECT * FROM c WHERE c.pk = 'PtTeacher' ") - List findAllTeacher(); + @Query(value = "SELECT * FROM c WHERE c.pk = 'PtTeacher' and c.id in (@ids) and c.school = @school and c.code = @code ") + List findAllTeacher(Collection ids, String school,String code); + @Query(value = "SELECT * FROM c WHERE c.pk = 'PtTeacher' and c.code = @code") + List findByCode(String code); } diff --git a/src/main/java/cn/teammodel/test/AsyncTeacherService.java b/src/main/java/cn/teammodel/test/AsyncTeacherService.java index 3fa99f1..f6e99fc 100644 --- a/src/main/java/cn/teammodel/test/AsyncTeacherService.java +++ b/src/main/java/cn/teammodel/test/AsyncTeacherService.java @@ -1,29 +1,21 @@ 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 com.azure.cosmos.implementation.guava25.collect.Lists; -import org.apache.commons.lang3.tuple.Pair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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 org.springframework.transaction.annotation.Transactional; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; 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); @@ -31,14 +23,38 @@ public class AsyncTeacherService { @Autowired private PtTeacherRepository ptTeacherRepository; - public void testLog() { - log.info("【TEST】This is a test log entry."); - } - @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()); + + // 更新停用教师的状态和版本 + 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) @@ -48,7 +64,7 @@ public class AsyncTeacherService { if (!updates.isEmpty()) { ptTeacherRepository.saveAll(updates); - updates.forEach(pt -> PT_TEACHER_CACHE.put(pt.getCode(), pt)); + //updates.forEach(pt -> PT_TEACHER_CACHE.put(pt.getCode(), pt)); } } catch (Exception e) { log.error("Failed to save teacher info asynchronously", e);