From 2d0e21146d7480dfc08972daa8da688e960e2cd7 Mon Sep 17 00:00:00 2001 From: whkj_liliangliang <2879561544@qq.com> Date: Wed, 28 May 2025 09:39:10 +0800 Subject: [PATCH] add --- pro-admin/pom.xml | 7 + .../controller/system/ScoreController.java | 151 +++++++++++------- 2 files changed, 99 insertions(+), 59 deletions(-) diff --git a/pro-admin/pom.xml b/pro-admin/pom.xml index 9c57e54..c27513b 100644 --- a/pro-admin/pom.xml +++ b/pro-admin/pom.xml @@ -90,6 +90,13 @@ spring-boot-starter-actuator + + cn.hutool + hutool-all + 5.8.38 + + + diff --git a/pro-admin/src/main/java/com/ruoyi/web/controller/system/ScoreController.java b/pro-admin/src/main/java/com/ruoyi/web/controller/system/ScoreController.java index eece96a..aa7ac8b 100644 --- a/pro-admin/src/main/java/com/ruoyi/web/controller/system/ScoreController.java +++ b/pro-admin/src/main/java/com/ruoyi/web/controller/system/ScoreController.java @@ -1,6 +1,8 @@ package com.ruoyi.web.controller.system; +import cn.hutool.core.util.ObjUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.github.xiaoymin.knife4j.core.util.StrUtil; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.JudgeBody; @@ -14,11 +16,13 @@ import com.ruoyi.system.domain.Projectinfo.ScoreDto; import com.ruoyi.system.mapper.*; import com.ruoyi.system.service.ISrootService; import io.swagger.annotations.ApiOperation; +import org.apache.commons.lang3.ObjectUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; @RestController @@ -155,67 +159,96 @@ public class ScoreController { } @ApiOperation("导出评分表") @PostMapping("/export") - public void export(HttpServletResponse response, Session session ) - { -// 创建查询结果存储列表 - List listp = new ArrayList<>(); - List listS = new ArrayList<>(); -// 查询 Judge 数据,按 session ID 过滤 - List jlist = judgeMapper.selectList(new QueryWrapper().eq("srole", session.getId())); - if (jlist.isEmpty()) { - // 如果 jlist 为空,直接返回空结果 - return; - } -// 查询 Sroot 数据 - Sroot sroot = iSrootService.selectSrootById((long) session.getRoot()); -// 查询 Project 数据,按 sessionid 过滤并按 score 降序排列 - List plist = projectMapper.selectList( - new QueryWrapper().eq("sessionid", session.getId()).orderByDesc("score") - ); -// 获取所有评分数据并按项目 ID 和用户 ID 分组 - Map> scoreMap = scoreMapper.selectList(new QueryWrapper<>()) - .stream() - .collect(Collectors.groupingBy( - score -> (long) score.getPid(), // 将 Integer 转换为 Long - Collectors.toMap( - score -> (long) score.getUid(), // 将 Integer 转换为 Long - score -> score - ) - )); -// 遍历项目列表并构建 exScore 和 exProject 列表 - for (Project project : plist) { - exProject exProject = new exProject(project, session.getSession(), sroot.getTask()); - listp.add(exProject); - - // 遍历 Judge 列表并构建 exScore 对象 - for (Judge judge : jlist) { - Score score = scoreMap.getOrDefault(project.getId(), Collections.emptyMap()).get(judge.getUserid()); - - // 构建 exScore 对象并设置评分信息 - exScore exScore = new exScore(exProject); - if (score != null) { - exScore.setPscore(score.getScore()); - exScore.setMes(score.getMes()); - } - exScore.setPname(judge.getName()); - listS.add(exScore); - } - } -// 批量计算评分总数和平均值 - Map> scoresByPid = scoreMap.values().stream() - .flatMap(map -> map.values().stream()) - .collect(Collectors.groupingBy(score -> (long) score.getPid())); // 将 Integer 转为 Long + public void export(HttpServletResponse response, Session session) { + // 获取当前会话的评委列表 + List judges = judgeMapper.selectList( + new QueryWrapper().eq("srole", session.getId()) + ); + if (judges.isEmpty()) { + return; + } - for (exScore exScore : listS) { - List slist = scoresByPid.getOrDefault(exScore.getId(), Collections.emptyList()); - int count = slist.size(); + // 获取关联的Sroot信息 + Sroot sroot = iSrootService.selectSrootById((long) session.getRoot()); - exScore.setSconum(count); - exScore.setScore(count > 0 ? (int) slist.stream().mapToInt(Score::getScore).average().orElse(0) : 0); - } - ExcelUtil util = new ExcelUtil<>(exScore.class); - util.exportExcel(response, listS, "分数汇总"); - } + // 获取当前会话的项目列表并按分数降序排列 + List projects = projectMapper.selectList( + new QueryWrapper() + .eq("sessionid", session.getId()) + .orderByDesc("score") + ); + if (projects.isEmpty()) { + return; + } + + // 收集项目ID以优化Score查询 + List projectIds = projects.stream() + .map(Project::getId) + .collect(Collectors.toList()); + + // 仅查询相关项目的评分记录(关键修复1:添加类型转换) + List scores = scoreMapper.selectList( + new QueryWrapper().in("pid", projectIds) + ); + + // 构建评分映射: pid -> (uid -> Score)(关键修复2:保持Integer类型) + Map> scoreMap = scores.stream() + .collect(Collectors.groupingBy( + Score::getPid, + Collectors.toMap(Score::getUid, Function.identity()) + )); + + // 预计算每个项目的评分统计(关键修复3:统一使用Integer类型) + Map scoreCounts = new HashMap<>(); + Map averageScores = new HashMap<>(); + scoreMap.forEach((pid, uidMap) -> { + List projectScores = new ArrayList<>(uidMap.values()); + int count = projectScores.size(); + double average = projectScores.stream() + .mapToInt(Score::getScore) + .average() + .orElse(0.0); + System.out.println("评分人数:---------pid-------"+pid+"-----count----"+count); + scoreCounts.put(pid, count); + averageScores.put(pid, average); + }); + + // 构建导出数据列表 + List exportData = new ArrayList<>(); + for (Project project : projects) { + exProject exProj = new exProject(project, session.getSession(), sroot.getTask()); + int projectId = project.getId(); + System.out.println("分数信息:---------pid-------"+projectId+"-----count----"); + // 获取当前项目的统计信息(关键修复4:直接使用Integer类型) + int count = ObjUtil.isNotNull(scoreCounts.get(projectId))?scoreCounts.get(projectId):0; + double average = ObjUtil.isNotNull(averageScores.get(projectId))?averageScores.get(projectId):0; + + + for (Judge judge : judges) { + exScore exSc = new exScore(exProj); + exSc.setPname(judge.getName()); + + // 获取对应评分(空值安全处理) + Score score = Optional.ofNullable(scoreMap.get(projectId)) + .map(uidMap -> uidMap.get(judge.getUserid())) + .orElse(null); + + if (score != null) { + exSc.setPscore(score.getScore()); + exSc.setMes(score.getMes()); + } + + // 设置统计信息(添加四舍五入处理) + exSc.setSconum(count); + exSc.setScore((int) Math.round(average)); + exportData.add(exSc); + } + } + + // 导出Excel + new ExcelUtil(exScore.class) + .exportExcel(response, exportData, "分数汇总"); + } public void init(){ List lists=sessionMapper.selectList(null); for(Session session:lists){