update 加入缓存

develop
hhb@hotmail.com 7 days ago
parent afab1c74c3
commit 28c746c662

@ -22,6 +22,8 @@ import com.azure.cosmos.CosmosException;
import com.azure.spring.data.cosmos.core.query.CosmosPageRequest; import com.azure.spring.data.cosmos.core.query.CosmosPageRequest;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -36,9 +38,7 @@ import javax.servlet.http.HttpServletRequest;
import java.time.*; import java.time.*;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.*;
import java.util.concurrent.ExecutionException; import java.util.concurrent.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static cn.teammodel.utils.SchoolDateUtil.calculateWeekNum; import static cn.teammodel.utils.SchoolDateUtil.calculateWeekNum;
@ -749,6 +749,8 @@ public class TeacherServiceImpl implements TeacherService {
final int SLICE_SIZE = 1000; final int SLICE_SIZE = 1000;
List<SugVo> sugVoList = getSugVos(teacherDto, request); List<SugVo> sugVoList = getSugVos(teacherDto, request);
//获取教师年级分配情况 //获取教师年级分配情况
long startTimeOnline = System.currentTimeMillis(); // 记录开始时间
Map<String, Object> Map = getTeacherGradeCount(teacherDto, request); Map<String, Object> Map = getTeacherGradeCount(teacherDto, request);
User loginUser = SecurityUtil.getLoginUser(); User loginUser = SecurityUtil.getLoginUser();
String loginId = loginUser.getId(); String loginId = loginUser.getId();
@ -937,6 +939,10 @@ public class TeacherServiceImpl implements TeacherService {
mapTeach.put("Lessons",records.size()); mapTeach.put("Lessons",records.size());
//资源数量:试卷数量 //资源数量:试卷数量
mapTeach.put("paperCount",count); mapTeach.put("paperCount",count);
long endTime = System.currentTimeMillis(); // 记录结束时间
long duration = endTime - startTimeOnline; // 计算耗时
System.out.println("research 方法耗时: " + duration + " ms");
return mapTeach; return mapTeach;
} }
} }
@ -1264,55 +1270,79 @@ public class TeacherServiceImpl implements TeacherService {
return result; return result;
} }
private @NotNull List<SugVo> getSugVos(TeacherDto teacherDto, HttpServletRequest request) { private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// 引入缓存,需根据实际情况配置大小和过期时间
private static final Cache<String, Map<String, Object>> REQUEST_CACHE = CacheBuilder.newBuilder()
.maximumSize(500)
.expireAfterWrite(8, TimeUnit.HOURS)
.build();
@NotNull
private List<SugVo> getSugVos(TeacherDto teacherDto, HttpServletRequest request) {
String url = env.getProperty("ies.server-url-get-channel-data"); String url = env.getProperty("ies.server-url-get-channel-data");
Map<String, Object> overView; Map<String, Object> overView;
List<SugVo> sugVoList = new ArrayList<SugVo>(); List<SugVo> sugVoList = new ArrayList<>();
try { try {
Instant instantSTime = Instant.ofEpochMilli(teacherDto.getStartTime()); // 处理时间参数
Instant instantETime = Instant.ofEpochMilli(teacherDto.getEndTime()); Instant startInstant = Instant.ofEpochMilli(teacherDto.getStartTime());
Instant endInstant = Instant.ofEpochMilli(teacherDto.getEndTime());
ZoneId zoneId = ZoneId.of("Asia/Shanghai"); ZoneId zoneId = ZoneId.of("Asia/Shanghai");
LocalDate localDateSTime = instantSTime.atZone(zoneId).toLocalDate(); String sTime = startInstant.atZone(zoneId).toLocalDate().format(DATE_FORMATTER);
LocalDate localDateETime = instantETime.atZone(zoneId).toLocalDate(); String eTime = endInstant.atZone(zoneId).toLocalDate().format(DATE_FORMATTER);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); teacherDto.duration.addAll(Arrays.asList(sTime, eTime));
String sTime = localDateSTime.format(formatter);
String eTime = localDateETime.format(formatter);
teacherDto.duration.add(sTime);
teacherDto.duration.add(eTime);
teacherDto.school_shortcode.add(teacherDto.getCode()); teacherDto.school_shortcode.add(teacherDto.getCode());
overView = GroupUtil.getGroupId(teacherDto,new GroupUtil(env), request,url);
for(Map.Entry<String, Object> entry : overView.entrySet()) { // 生成缓存键,根据实际参数组合
if (entry.getKey().equals("data")) { String cacheKey = generateCacheKey(teacherDto);
List<Map<String, Object>> dataList = (List<Map<String, Object>>) entry.getValue(); overView = REQUEST_CACHE.get(cacheKey, () -> {
for (Map<String, Object> dataMap : dataList) { // 缓存未命中时调用第三方接口
if(dataMap.containsKey("statistics")) { return GroupUtil.getGroupId(teacherDto, new GroupUtil(env), request, url);
List<Map<String, Object>> statisticsList = (List<Map<String, Object>>) dataMap.get("statistics"); });
for (Map<String, Object> statisticsMap : statisticsList) {
SugVo sugVo = convertToSugVo(statisticsMap); // 处理返回数据
sugVoList.add(sugVo); if (overView.containsKey("data")) {
} List<Map<String, Object>> dataList = (List<Map<String, Object>>) overView.get("data");
} // 使用并行流处理独立的dataMap确保线程安全
if (dataMap.containsKey("member_list")) { dataList.parallelStream().forEach(dataMap -> {
List<Map<String, Object>> memberList = (List<Map<String, Object>>) dataMap.get("member_list"); List<Map<String, Object>> statisticsList = (List<Map<String, Object>>) dataMap.getOrDefault("statistics", Collections.emptyList());
for (Map<String, Object> memberMap : memberList) { List<Map<String, Object>> memberList = (List<Map<String, Object>>) dataMap.getOrDefault("member_list", Collections.emptyList());
for (SugVo sugVo : sugVoList) {
if (memberMap.get("habook").equals(sugVo.getHabook())) { // 构建habook到SugVo的映射
sugVo.setStar_level(Integer.parseInt(memberMap.get("star_level").toString())); Map<String, SugVo> habookToSugVo = new ConcurrentHashMap<>();
} List<SugVo> localSugVos = statisticsList.stream()
} .map(this::convertToSugVo)
} .collect(Collectors.toList());
localSugVos.forEach(sug -> habookToSugVo.put(sug.getHabook(), sug));
// 更新star_level
memberList.forEach(member -> {
String habook = (String) member.get("habook");
SugVo sug = habookToSugVo.get(habook);
if (sug != null) {
sug.setStar_level(Integer.parseInt(member.get("star_level").toString()));
} }
});
// 将本地结果合并到主列表(需同步避免并发问题)
synchronized (sugVoList) {
sugVoList.addAll(localSugVos);
} }
} });
} }
}catch (Exception e) { } catch (Exception e) {
throw new ServiceException(ErrorCode.SYSTEM_ERROR.getCode(), "数据转换错误"); throw new ServiceException(ErrorCode.SYSTEM_ERROR.getCode(), "数据转换错误");
} }
return sugVoList; return sugVoList;
} }
// 生成缓存键
private String generateCacheKey(TeacherDto dto) {
return String.join(":",
dto.getCode(),
String.valueOf(dto.getStartTime()),
String.valueOf(dto.getEndTime()));
}
private SugVo convertToSugVo(Map<String, Object> dataMap) { private SugVo convertToSugVo(Map<String, Object> dataMap) {
SugVo sugVo = new SugVo(); SugVo sugVo = new SugVo();
sugVo.setDate(dataMap.get("date").toString()); sugVo.setDate(dataMap.get("date").toString());

Loading…
Cancel
Save