|
@@ -13,19 +13,18 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.dromara.common.redis.utils.RedisUtils;
|
|
|
+import org.dromara.system.domain.GameAthlete;
|
|
|
import org.dromara.system.domain.GameEventProject;
|
|
|
import org.dromara.system.domain.constant.GameEventConstant;
|
|
|
import org.dromara.system.domain.constant.ProjectClassification;
|
|
|
import org.dromara.system.domain.constant.SortType;
|
|
|
-import org.dromara.system.domain.vo.GameAthleteVo;
|
|
|
-import org.dromara.system.domain.vo.GameEventProjectVo;
|
|
|
-import org.dromara.system.domain.vo.GameTeamVo;
|
|
|
+import org.dromara.system.domain.vo.*;
|
|
|
+import org.dromara.system.mapper.GameEventProjectMapper;
|
|
|
import org.dromara.system.service.IGameAthleteService;
|
|
|
import org.dromara.system.service.IGameEventProjectService;
|
|
|
import org.dromara.system.service.IGameTeamService;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.dromara.system.domain.bo.GameScoreBo;
|
|
|
-import org.dromara.system.domain.vo.GameScoreVo;
|
|
|
import org.dromara.system.domain.GameScore;
|
|
|
import org.dromara.system.mapper.GameScoreMapper;
|
|
|
import org.dromara.system.service.IGameScoreService;
|
|
@@ -36,7 +35,6 @@ import java.util.function.Function;
|
|
|
import java.util.stream.Collectors;
|
|
|
import jakarta.servlet.http.HttpServletResponse;
|
|
|
import org.dromara.common.excel.utils.ExcelUtil;
|
|
|
-import org.dromara.system.domain.vo.GameScoreSummaryExportVo;
|
|
|
import org.dromara.system.domain.bo.GameEventProjectBo;
|
|
|
import org.dromara.system.domain.bo.GameTeamBo;
|
|
|
|
|
@@ -60,6 +58,8 @@ public class GameScoreServiceImpl implements IGameScoreService {
|
|
|
private final GameScoreMapper baseMapper;
|
|
|
private final IGameTeamService gameTeamService;
|
|
|
private final IGameAthleteService gameAthleteService;
|
|
|
+
|
|
|
+ private final GameEventProjectMapper projectMapper;
|
|
|
private final IGameEventProjectService gameEventProjectService;
|
|
|
|
|
|
/**
|
|
@@ -885,6 +885,101 @@ public class GameScoreServiceImpl implements IGameScoreService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 用户端查询项目成绩信息
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<AppScoreVo> listAppScore(Long eventId, Long projectId) {
|
|
|
+ // 获取项目详细信息
|
|
|
+ GameEventProjectVo project = gameEventProjectService.queryById(projectId);
|
|
|
+
|
|
|
+ // 查询参与了该项目的运动员
|
|
|
+ List<GameAthleteVo> athletes = gameAthleteService.queryListByEventIdAndProjectId(eventId, projectId, null);
|
|
|
+
|
|
|
+ // 获取所有相关成绩
|
|
|
+ GameScoreBo scoreBo = new GameScoreBo();
|
|
|
+ scoreBo.setEventId(eventId);
|
|
|
+ scoreBo.setProjectId(projectId);
|
|
|
+ List<GameScoreVo> scores = queryList(scoreBo);
|
|
|
+
|
|
|
+ // 创建成绩映射 athleteId -> GameScoreVo
|
|
|
+ Map<Long, GameScoreVo> scoreMap = scores.stream()
|
|
|
+ .collect(Collectors.toMap(GameScoreVo::getAthleteId, Function.identity(), (existing, replacement) -> existing));
|
|
|
+
|
|
|
+ // 队伍id与名称的映射
|
|
|
+ Set<Long> teamIds = athletes.stream().map(GameAthleteVo::getTeamId).collect(Collectors.toSet());
|
|
|
+ Map<Long, String> teamMap = gameTeamService.queryTeamIdAndName(teamIds);
|
|
|
+
|
|
|
+ List<AppScoreVo> result = result = athletes.stream().map(athlete -> {
|
|
|
+ AppScoreVo vo = new AppScoreVo();
|
|
|
+ vo.setProjectId(projectId);
|
|
|
+ vo.setProjectName(project != null ? project.getProjectName() : "");
|
|
|
+ vo.setClassification(project != null ? project.getClassification() : "");
|
|
|
+ vo.setAthleteId(athlete.getAthleteId());
|
|
|
+ vo.setAthleteName(athlete.getName());
|
|
|
+ vo.setTeamId(athlete.getTeamId());
|
|
|
+
|
|
|
+ // 获取队伍信息
|
|
|
+ if (athlete.getTeamId() != null) {
|
|
|
+ String teamName = teamMap.get(athlete.getTeamId());
|
|
|
+ vo.setTeamName(teamName != null ? teamName : "");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取成绩信息
|
|
|
+ GameScoreVo score = scoreMap.get(athlete.getAthleteId());
|
|
|
+ if (score != null) {
|
|
|
+ vo.setIndividualPerformance(convertToBigDecimal(score.getIndividualPerformance()));
|
|
|
+ vo.setTeamPerformance(convertToBigDecimal(score.getTeamPerformance()));
|
|
|
+ vo.setScorePoint(score.getScorePoint());
|
|
|
+ vo.setScoreRank(score.getScoreRank());
|
|
|
+ } else {
|
|
|
+ vo.setIndividualPerformance(BigDecimal.ZERO);
|
|
|
+ vo.setTeamPerformance(BigDecimal.ZERO);
|
|
|
+ vo.setScorePoint(0);
|
|
|
+ vo.setScoreRank(0);
|
|
|
+ }
|
|
|
+
|
|
|
+ return vo;
|
|
|
+ }).toList();
|
|
|
+
|
|
|
+ // 按排名排序
|
|
|
+ return result.stream()
|
|
|
+ .sorted(Comparator.comparing(AppScoreVo::getScoreRank))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 安全地将对象转换为BigDecimal
|
|
|
+ * @param value 待转换的值
|
|
|
+ * @return BigDecimal值
|
|
|
+ */
|
|
|
+ private BigDecimal convertToBigDecimal(Object value) {
|
|
|
+ if (value == null) {
|
|
|
+ return BigDecimal.ZERO;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (value instanceof BigDecimal) {
|
|
|
+ return (BigDecimal) value;
|
|
|
+ } else if (value instanceof Double) {
|
|
|
+ return BigDecimal.valueOf((Double) value);
|
|
|
+ } else if (value instanceof Float) {
|
|
|
+ return BigDecimal.valueOf((Float) value);
|
|
|
+ } else if (value instanceof String) {
|
|
|
+ try {
|
|
|
+ return new BigDecimal((String) value);
|
|
|
+ } catch (NumberFormatException e) {
|
|
|
+ return BigDecimal.ZERO;
|
|
|
+ }
|
|
|
+ } else if (value instanceof Integer) {
|
|
|
+ return BigDecimal.valueOf((Integer) value);
|
|
|
+ } else if (value instanceof Long) {
|
|
|
+ return BigDecimal.valueOf((Long) value);
|
|
|
+ } else {
|
|
|
+ return BigDecimal.ZERO;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* 动态列导出Excel
|
|
|
*/
|