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