package com.simuwang.manage.service.competition; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.map.MapUtil; import com.simuwang.base.config.CompetitionConfig; import com.simuwang.base.mapper.RzFzzq2ResultMapper; import com.simuwang.base.pojo.dto.competition.CompetitionBaseResultDTO; import com.simuwang.base.pojo.dto.competition.FzzqCompetitionResultDTO; import org.springframework.stereotype.Service; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @Service public class FzzqCompetitionResultServiceService extends AbstractCompetitionResultService { private static final Map STRATEGY_ID_NAME_MAP = MapUtil.newHashMap(); static { STRATEGY_ID_NAME_MAP.put(1, "主观多头策略"); STRATEGY_ID_NAME_MAP.put(2, "量化多头策略"); STRATEGY_ID_NAME_MAP.put(3, "相对价值策略"); STRATEGY_ID_NAME_MAP.put(4, "CTA策略"); STRATEGY_ID_NAME_MAP.put(5, "复合策略"); } private final CompetitionConfig competitionConfig; private final RzFzzq2ResultMapper fzzq2ResultMapper; public FzzqCompetitionResultServiceService(CompetitionConfig competitionConfig, RzFzzq2ResultMapper fzzq2ResultMapper) { this.competitionConfig = competitionConfig; this.fzzq2ResultMapper = fzzq2ResultMapper; } @Override public boolean isSupport(Integer competitionId) { return competitionId != null && competitionId == 48; } @Override protected List getCompetitionResult() { Integer competitionId = competitionConfig.getId(); List competitionResultDTOList = fzzq2ResultMapper.getResult(); if (CollUtil.isEmpty(competitionResultDTOList)) { return CollUtil.newArrayList(); } // 策略名称和排名 Map> strategyResultDTOList = competitionResultDTOList.stream().collect(Collectors.groupingBy(FzzqCompetitionResultDTO::getStrategy)); for (Map.Entry> resultEntry : strategyResultDTOList.entrySet()) { Integer strategy = resultEntry.getKey(); String strategyName = STRATEGY_ID_NAME_MAP.get(strategy); List resultDTOList = resultEntry.getValue(); // 按照分数降序排序 resultDTOList.sort(Comparator.comparing(FzzqCompetitionResultDTO::getScore, Comparator.nullsFirst(Comparator.naturalOrder())).reversed()); // 计算排名并设置 int rank = 1; for (int i = 0; i < resultDTOList.size(); i++) { FzzqCompetitionResultDTO dto = resultDTOList.get(i); dto.setStrategyName(strategyName); if (dto.getScore() != null) { dto.setRank(rank); rank = i + 1; } else { // 没有分数的基金排名为:999999 dto.setRank(999999); } } } // 策略分组和排名降序输出 return competitionResultDTOList.stream() .sorted(Comparator.comparing(FzzqCompetitionResultDTO::getStrategyName).reversed().thenComparing(FzzqCompetitionResultDTO::getRank)) .collect(Collectors.toList()); } }