update 调整teacherDetail接口

develop
hhb@hotmail.com 2 days ago
parent a7be435dc6
commit 46f11ff824

@ -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<String, PtTeacherInfo> PT_TEACHER_CACHE = CacheBuilder.newBuilder()
.maximumSize(500)
.expireAfterWrite(8, TimeUnit.HOURS)
// 初始化Guava Cache
private Cache<String, Map<String, Object>> teacherCache;
@PostConstruct
public void init() {
teacherCache = CacheBuilder.newBuilder()
.expireAfterWrite(1, TimeUnit.HOURS) // 缓存1小时
.maximumSize(1000) // 最大缓存数量
.build();
}
@Cacheable(value = "schoolGroupCache", key = "#code")
public List<GroupList> getCachedGroupLists(String code) {
@ -160,12 +168,25 @@ public class TeacherServiceImpl implements TeacherService {
@Override
public Map<String, Object> getTeacherDetail(TeacherDto teacherDto, HttpServletRequest request) {
Map<String, Object> teachers;
//获取全学校教师名单详情
String url = env.getProperty("ies.server-url-get-teacher-all");
Map<String, Object> teachers = new HashMap<>();
Map<String, Object> teacherInfos;
String cacheKey = "teacher_data_" + teacherDto.getCode(); // 基于学校代码的缓存键
try {
teachers = GroupUtil.getGroupId(teacherDto,new GroupUtil(env), request,url);
List<GpTeacherVo> 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<GpTeacherVo> teachersList = convertToGpTeacherVoList(teacherInfos, teacherDto.getCode());
//List<String> 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<PtTeacherInfo> ptTeacherInfos = ptTeacherRepository.findAllTeacher(teacherIds, teacherDto.getCode());
String code = String.format(PK.PTTEACHER, teacherDto.getCode());
List<PtTeacherInfo> ptTeacherInfos = ptTeacherRepository.findAllTeacher(teacherIds, teacherDto.getCode(),code);
// Map<String, PtTeacherInfo> 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<GpTeacher> convertToGpTeacherList(Map<String, Object> tBase) {
/*private List<GpTeacher> convertToGpTeacherList(Map<String, Object> tBase) {
List<GpTeacher> gpTeachers = new ArrayList<>();
for (Map.Entry<String, Object> entry : tBase.entrySet()) {
if (entry.getKey().equals("teachers")) {
@ -263,10 +283,10 @@ public class TeacherServiceImpl implements TeacherService {
}
}
return gpTeachers;
}
}*/
private void savePtTeacherInfosBatch(List<GpTeacherVo> teachersList) {
/*private void savePtTeacherInfosBatch(List<GpTeacherVo> teachersList) {
// 预加载版本号
Map<String, Integer> 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<String, Integer> loadExistingVersions(List<GpTeacherVo> teachersList) {
/*private Map<String, Integer> loadExistingVersions(List<GpTeacherVo> teachersList) {
// 收集所有id和code组合
List<Pair<String, String>> 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<String, Integer> versionMap) {
/*private PtTeacherInfo convertToPtTeacherInfo(GpTeacherVo teacher, Map<String, Integer> 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<String, Object> 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<String>) map.get("roles"));
List<Map<String, Object>> groupList = (List<Map<String, Object>>) map.get("groups");
/*List<Map<String, Object>> groupList = (List<Map<String, Object>>) map.get("groups");
if (groupList != null) {
List<GpTeacherVo.IdNameCode> 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<String>) map.get("subjectIds"));
teacher.setSubjectNames((List<String>) 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> ptTeacherInfo = ptTeacherRepository.findAllTeacher();
String code = String.format(PK.PTTEACHER, teacherDto.getCode());
List<PtTeacherInfo> ptTeacherInfo = ptTeacherRepository.findByCode(code);
//删除查询出来的所有数据
for (PtTeacherInfo ptTeacherInfo1 : ptTeacherInfo){
ptTeacherRepository.delete(ptTeacherInfo1);

@ -17,7 +17,6 @@ public class GpTeacherVo {
public List<String> subjectIds ;
public List<String> subjectNames ;
public List<String> roles;
public List<IdNameCode> groups;
public String note ;
public String degree;
public String gender ;
@ -30,13 +29,5 @@ public class GpTeacherVo {
public List<String> 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 ;
}
}

@ -16,9 +16,9 @@ public interface PtTeacherRepository extends CosmosRepository<PtTeacherInfo, Str
@Query(value = "SELECT * FROM c WHERE ARRAY_CONTAINS(@pairs, {id: c.id, code: c.code}, true) and c.pk = 'PtTeacher'")
List<PtTeacherInfo> findByIdCodePairs(@Param("pairs") List<IdCodePair> pairs);
@Query(value = "SELECT * FROM c WHERE c.pk = 'PtTeacher' and c.id in (@ids) and c.school = @code")
List<PtTeacherInfo> findAllTeacher(Collection<String> ids, String code);
@Query(value = "SELECT * FROM c WHERE c.pk = 'PtTeacher' ")
List<PtTeacherInfo> findAllTeacher();
@Query(value = "SELECT * FROM c WHERE c.pk = 'PtTeacher' and c.id in (@ids) and c.school = @school and c.code = @code ")
List<PtTeacherInfo> findAllTeacher(Collection<String> ids, String school,String code);
@Query(value = "SELECT * FROM c WHERE c.pk = 'PtTeacher' and c.code = @code")
List<PtTeacherInfo> findByCode(String code);
}

@ -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<GpTeacherVo> teachersList) {
try {
String schoolCode = teachersList.get(0).getCode();
Map<String, PtTeacherInfo> existingTeachers = loadExistingTeachers(teachersList);
// 查询该学校的所有现有教师
String code = String.format(PK.PTTEACHER, schoolCode);
List<PtTeacherInfo> allExistingInSchool = ptTeacherRepository.findByCode(code);
// 收集传入列表中的教师ID
Set<String> incomingIds = teachersList.stream()
.map(GpTeacherVo::getId)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
// 找出需要停用的教师(存在于数据库但不在传入列表中)
List<PtTeacherInfo> 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<PtTeacherInfo> 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);

Loading…
Cancel
Save