浏览代码

refactor(game-score): 添加加分数据相关API

更新附加成绩字段为领导加分和额外加分

- 将 `AppScoreUploadBo`, `GameScore`, `GameScoreBo` 中的 `extraScore1` 和 `extraScore2` 字段分别更改为 `leaderPoint` 和 `extraPoint`。- 在 `GameScoreController` 中添加了获取、更新和导出加分数据的相关接口。
- 在 `GameScoreServiceImpl` 中实现了获取、更新和导出加分数据的方法。
- 更新了 `GameScoreSummaryExportVo` 和 `GameScoreVo` 中的字段名称和注解。
- 在 `IGameScoreService` 中添加了获取、更新和导出加分数据的方法声明。
- 更新了 `ScoreController` 中的字段设置逻辑,以匹配新的字段名称。
zhou 1 月之前
父节点
当前提交
446af1cefc

+ 53 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/controller/GameScoreController.java

@@ -22,6 +22,10 @@ import org.dromara.system.domain.vo.GameScoreVo;
 import org.dromara.system.domain.bo.GameScoreBo;
 import org.dromara.system.domain.bo.GameScoreBo;
 import org.dromara.system.service.IGameScoreService;
 import org.dromara.system.service.IGameScoreService;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.util.HashMap;
+
 
 
 /**
 /**
  * 成绩
  * 成绩
@@ -161,4 +165,53 @@ public class GameScoreController extends BaseController {
     public void exportScoresSummary(@RequestParam("eventId") Long eventId, HttpServletResponse response) {
     public void exportScoresSummary(@RequestParam("eventId") Long eventId, HttpServletResponse response) {
         gameScoreService.exportScoresSummary(eventId, response);
         gameScoreService.exportScoresSummary(eventId, response);
     }
     }
+
+    /**
+     * 获取加分数据
+     */
+    @SaCheckPermission("system:gameScore:list")
+    @GetMapping("/getBonusData")
+    public R<Map<String, Object>> getBonusData(@RequestParam("eventId") Long eventId) {
+        return R.ok(gameScoreService.getBonusData(eventId));
+    }
+
+    /**
+     * 更新加分数据
+     */
+    @SaCheckPermission("system:gameScore:edit")
+    @Log(title = "更新加分数据", businessType = BusinessType.UPDATE)
+    @PutMapping("/updateBonusData")
+    public R<Void> updateBonusData(@RequestBody Map<String, Object> data) {
+        return toAjax(gameScoreService.updateBonusData(data));
+    }
+
+    /**
+     * 导出加分Excel
+     */
+    @SaCheckPermission("system:gameScore:export")
+    @Log(title = "导出加分Excel", businessType = BusinessType.EXPORT)
+    @PostMapping("/exportBonusExcel")
+    public void exportBonusExcel(
+            @RequestParam("eventId") Long eventId,
+            @RequestParam("data") String dataJson,
+            @RequestParam("projects") String projectsJson,
+            HttpServletResponse response) {
+
+        try {
+            // 解析JSON字符串
+            ObjectMapper objectMapper = new ObjectMapper();
+            List<Map<String, Object>> bonusData = objectMapper.readValue(dataJson,
+                new TypeReference<List<Map<String, Object>>>() {});
+            List<Map<String, Object>> projects = objectMapper.readValue(projectsJson,
+                new TypeReference<List<Map<String, Object>>>() {});
+
+            Map<String, Object> data = new HashMap<>();
+            data.put("data", bonusData);
+            data.put("projects", projects);
+
+            gameScoreService.exportBonusExcel(data, response);
+        } catch (Exception e) {
+            throw new RuntimeException("参数解析失败:" + e.getMessage());
+        }
+    }
 }
 }

+ 2 - 2
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/controller/app/ScoreController.java

@@ -127,8 +127,8 @@ public class ScoreController {
         gameScoreBo.setScoreRank(bo.getScoreRank());
         gameScoreBo.setScoreRank(bo.getScoreRank());
         gameScoreBo.setScorePoint(bo.getScorePoint());
         gameScoreBo.setScorePoint(bo.getScorePoint());
         gameScoreBo.setAward(bo.getAward());
         gameScoreBo.setAward(bo.getAward());
-        gameScoreBo.setExtraScore1(bo.getExtraScore1());
-        gameScoreBo.setExtraScore2(bo.getExtraScore2());
+        gameScoreBo.setLeaderPoint(bo.getLeaderPoint());
+        gameScoreBo.setExtraPoint(bo.getExtraPoint());
         gameScoreBo.setRemark(bo.getRemark());
         gameScoreBo.setRemark(bo.getRemark());
 
 
         // 设置默认值
         // 设置默认值

+ 4 - 4
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/GameScore.java

@@ -79,14 +79,14 @@ public class GameScore extends TenantEntity {
     private String award;
     private String award;
 
 
     /**
     /**
-     * 附加成绩1
+     * 领导加分
      */
      */
-    private String extraScore1;
+    private Integer leaderPoint;
 
 
     /**
     /**
-     * 附加成绩2
+     * 额外加分
      */
      */
-    private String extraScore2;
+    private Integer extraPoint;
 
 
     /**
     /**
      * 成绩状态(0等待处理1处理完毕)
      * 成绩状态(0等待处理1处理完毕)

+ 2 - 2
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/bo/AppScoreUploadBo.java

@@ -76,12 +76,12 @@ public class AppScoreUploadBo {
     /**
     /**
      * 附加成绩1
      * 附加成绩1
      */
      */
-    private String extraScore1;
+    private Integer leaderPoint;
 
 
     /**
     /**
      * 附加成绩2
      * 附加成绩2
      */
      */
-    private String extraScore2;
+    private Integer extraPoint;
 
 
     /**
     /**
      * 备注
      * 备注

+ 4 - 4
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/bo/GameScoreBo.java

@@ -84,14 +84,14 @@ public class GameScoreBo extends BaseEntity {
     private String award;
     private String award;
 
 
     /**
     /**
-     * 附加成绩1
+     * 领导加分
      */
      */
-    private String extraScore1;
+    private Integer leaderPoint;
 
 
     /**
     /**
-     * 附加成绩2
+     * 额外加分
      */
      */
-    private String extraScore2;
+    private Integer extraPoint;
 
 
     /**
     /**
      * 更新时间
      * 更新时间

+ 9 - 3
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/vo/GameScoreSummaryExportVo.java

@@ -47,10 +47,16 @@ public class GameScoreSummaryExportVo implements Serializable {
     private Integer totalScore;
     private Integer totalScore;
 
 
     /**
     /**
-     * 加分
+     * 领导加分
      */
      */
-    @ExcelProperty(value = "加分", index = 4)
-    private Integer extraScore;
+    @ExcelProperty(value = "领导加分", index = 4)
+    private Integer leaderPoint;
+
+    /**
+     * 额外加分
+     */
+    @ExcelProperty(value = "额外加分", index = 5)
+    private Integer extraPoint;
 
 
     /**
     /**
      * 动态项目积分存储
      * 动态项目积分存储

+ 6 - 6
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/vo/GameScoreVo.java

@@ -94,16 +94,16 @@ public class GameScoreVo implements Serializable {
     private String award;
     private String award;
 
 
     /**
     /**
-     * 附加成绩1
+     * 领导加分
      */
      */
-    @ExcelProperty(value = "附加成绩1")
-    private String extraScore1;
+    @ExcelProperty(value = "领导加分")
+    private Integer leaderPoint;
 
 
     /**
     /**
-     * 附加成绩2
+     * 额外加分
      */
      */
-    @ExcelProperty(value = "附加成绩2")
-    private String extraScore2;
+    @ExcelProperty(value = "额外加分")
+    private Integer extraPoint;
 
 
     /**
     /**
      * 更新时间
      * 更新时间

+ 15 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/IGameScoreService.java

@@ -125,4 +125,19 @@ public interface IGameScoreService {
      * @return
      * @return
      */
      */
     List<AppScoreVo> listAppScore(Long eventId, Long projectId);
     List<AppScoreVo> listAppScore(Long eventId, Long projectId);
+
+    /**
+     * 获取加分数据
+     */
+    Map<String, Object> getBonusData(Long eventId);
+
+    /**
+     * 更新加分数据
+     */
+    Boolean updateBonusData(Map<String, Object> data);
+
+    /**
+     * 导出加分Excel
+     */
+    void exportBonusExcel(Map<String, Object> data, HttpServletResponse response);
 }
 }

+ 268 - 16
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/GameScoreServiceImpl.java

@@ -539,6 +539,8 @@ public class GameScoreServiceImpl implements IGameScoreService {
                 athleteScoreBo.setTeamId(bo.getTeamId());
                 athleteScoreBo.setTeamId(bo.getTeamId());
                 athleteScoreBo.setIndividualPerformance(BigDecimal.ZERO); // 团体项目个人成绩为0
                 athleteScoreBo.setIndividualPerformance(BigDecimal.ZERO); // 团体项目个人成绩为0
                 athleteScoreBo.setTeamPerformance(bo.getTeamPerformance());
                 athleteScoreBo.setTeamPerformance(bo.getTeamPerformance());
+//                athleteScoreBo.setLeaderPoint(bo.getLeaderPoint());
+//                athleteScoreBo.setExtraPoint(bo.getExtraPoint());
                 athleteScoreBo.setScoreType("team");
                 athleteScoreBo.setScoreType("team");
                 athleteScoreBo.setStatusFlag("0");
                 athleteScoreBo.setStatusFlag("0");
                 athleteScoreBo.setStatus("0");
                 athleteScoreBo.setStatus("0");
@@ -645,12 +647,15 @@ public class GameScoreServiceImpl implements IGameScoreService {
             // 升序项目:成绩越小,积分分配越多
             // 升序项目:成绩越小,积分分配越多
             for (int i = 0; i < sortedScores.size(); i++) {
             for (int i = 0; i < sortedScores.size(); i++) {
                 GameScoreVo score = sortedScores.get(i);
                 GameScoreVo score = sortedScores.get(i);
-                int points = i < pointValues.size() ? pointValues.get(i) : 0;
+                int basePoints = i < pointValues.size() ? pointValues.get(i) : 0;
+//                int leaderPoint = score.getLeaderPoint() != null ? score.getLeaderPoint() : 0;
+//                int extraPoint = score.getExtraPoint() != null ? score.getExtraPoint() : 0;
+//                int totalPoints = basePoints + leaderPoint + extraPoint;
 
 
                 // 更新成绩记录
                 // 更新成绩记录
                 GameScoreBo updateBo = new GameScoreBo();
                 GameScoreBo updateBo = new GameScoreBo();
                 updateBo.setScoreId(score.getScoreId());
                 updateBo.setScoreId(score.getScoreId());
-                updateBo.setScorePoint(points);
+                updateBo.setScorePoint(basePoints);
                 updateBo.setEventId(eventId);
                 updateBo.setEventId(eventId);
                 updateBo.setProjectId(projectId);
                 updateBo.setProjectId(projectId);
 
 
@@ -660,12 +665,15 @@ public class GameScoreServiceImpl implements IGameScoreService {
             // 降序项目:成绩越大,积分分配越多
             // 降序项目:成绩越大,积分分配越多
             for (int i = 0; i < sortedScores.size(); i++) {
             for (int i = 0; i < sortedScores.size(); i++) {
                 GameScoreVo score = sortedScores.get(i);
                 GameScoreVo score = sortedScores.get(i);
-                int points = i < pointValues.size() ? pointValues.get(i) : 0;
+                int basePoints = i < pointValues.size() ? pointValues.get(i) : 0;
+//                int leaderPoint = score.getLeaderPoint() != null ? score.getLeaderPoint() : 0;
+//                int extraPoint = score.getExtraPoint() != null ? score.getExtraPoint() : 0;
+//                int totalPoints = basePoints + leaderPoint + extraPoint;
 
 
                 // 更新成绩记录
                 // 更新成绩记录
                 GameScoreBo updateBo = new GameScoreBo();
                 GameScoreBo updateBo = new GameScoreBo();
                 updateBo.setScoreId(score.getScoreId());
                 updateBo.setScoreId(score.getScoreId());
-                updateBo.setScorePoint(points);
+                updateBo.setScorePoint(basePoints);
                 updateBo.setEventId(eventId);
                 updateBo.setEventId(eventId);
                 updateBo.setProjectId(projectId);
                 updateBo.setProjectId(projectId);
 
 
@@ -774,7 +782,10 @@ public class GameScoreServiceImpl implements IGameScoreService {
             Map.Entry<Long, BigDecimal> teamEntry = sortedTeamsByPerformance.get(i);
             Map.Entry<Long, BigDecimal> teamEntry = sortedTeamsByPerformance.get(i);
             Long teamId = teamEntry.getKey();
             Long teamId = teamEntry.getKey();
             BigDecimal currentPerformance = teamEntry.getValue();
             BigDecimal currentPerformance = teamEntry.getValue();
-            int points = i < pointValues.size() ? pointValues.get(i) : 0;
+            int basePoints = i < pointValues.size() ? pointValues.get(i) : 0;
+//            int leaderPoint = score.getLeaderPoint() != null ? score.getLeaderPoint() : 0;
+//            int extraPoint = score.getExtraPoint() != null ? score.getExtraPoint() : 0;
+//            int totalPoints = basePoints + leaderPoint + extraPoint;
 
 
             // 如果不是第一个,检查是否与前一个成绩相同
             // 如果不是第一个,检查是否与前一个成绩相同
             if (i > 0) {
             if (i > 0) {
@@ -784,7 +795,7 @@ public class GameScoreServiceImpl implements IGameScoreService {
                 }
                 }
             }
             }
 
 
-            teamPoints.put(teamId, points);
+            teamPoints.put(teamId, basePoints);
             teamRanks.put(teamId, currentRank);
             teamRanks.put(teamId, currentRank);
         }
         }
 
 
@@ -796,6 +807,8 @@ public class GameScoreServiceImpl implements IGameScoreService {
                 updateBo.setScoreId(score.getScoreId());
                 updateBo.setScoreId(score.getScoreId());
                 updateBo.setScoreRank(teamRanks.get(teamId));
                 updateBo.setScoreRank(teamRanks.get(teamId));
                 updateBo.setScorePoint(teamPoints.get(teamId));
                 updateBo.setScorePoint(teamPoints.get(teamId));
+//                updateBo.setLeaderPoint(score.getLeaderPoint());
+//                updateBo.setExtraPoint(score.getExtraPoint());
                 updateBo.setEventId(eventId);
                 updateBo.setEventId(eventId);
                 updateBo.setProjectId(projectId);
                 updateBo.setProjectId(projectId);
 
 
@@ -866,21 +879,21 @@ public class GameScoreServiceImpl implements IGameScoreService {
                     String key = team.getTeamId() + "_" + project.getProjectId();
                     String key = team.getTeamId() + "_" + project.getProjectId();
                     GameScoreVo score = scoreMap.get(key);
                     GameScoreVo score = scoreMap.get(key);
 
 
-                    int projectScore = 0;
+                    int projectPoint = 0;
                     if (score != null && score.getScorePoint() != null) {
                     if (score != null && score.getScorePoint() != null) {
-                        projectScore = score.getScorePoint();
-                        totalScore += projectScore;
+                        projectPoint = score.getScorePoint();
+                        totalScore += projectPoint;
                     }
                     }
 
 
                     // 使用项目名称设置积分
                     // 使用项目名称设置积分
-                    exportVo.setProjectScore(project.getProjectName(), projectScore);
+                    exportVo.setProjectScore(project.getProjectName(), projectPoint);
                 }
                 }
 
 
                 // 设置总分
                 // 设置总分
                 exportVo.setTotalScore(totalScore);
                 exportVo.setTotalScore(totalScore);
 
 
                 // 设置加分(暂时设为0,后续可根据业务需求调整)
                 // 设置加分(暂时设为0,后续可根据业务需求调整)
-                exportVo.setExtraScore(0);
+                exportVo.setExtraPoint(0);
 
 
                 exportData.add(exportVo);
                 exportData.add(exportVo);
             }
             }
@@ -1021,7 +1034,8 @@ public class GameScoreServiceImpl implements IGameScoreService {
             }
             }
 
 
             // 加分列
             // 加分列
-            rowData.put("加分", exportVo.getExtraScore());
+            rowData.put("领导加分", exportVo.getLeaderPoint());
+            rowData.put("额外加分", exportVo.getExtraPoint());
 
 
             dynamicData.add(rowData);
             dynamicData.add(rowData);
         }
         }
@@ -1068,9 +1082,13 @@ public class GameScoreServiceImpl implements IGameScoreService {
             }
             }
 
 
             // 加分列标题
             // 加分列标题
-            Cell extraCell = headerRow.createCell(colIndex++);
-            extraCell.setCellValue("加分");
-            extraCell.setCellStyle(headerStyle);
+            Cell leaderBonusCell = headerRow.createCell(colIndex++);
+            leaderBonusCell.setCellValue("领导加分");
+            leaderBonusCell.setCellStyle(headerStyle);
+
+            Cell extraBonusCell = headerRow.createCell(colIndex++);
+            extraBonusCell.setCellValue("额外加分");
+            extraBonusCell.setCellStyle(headerStyle);
 
 
             // 填充数据行
             // 填充数据行
             int rowIndex = 1;
             int rowIndex = 1;
@@ -1096,7 +1114,8 @@ public class GameScoreServiceImpl implements IGameScoreService {
                 }
                 }
 
 
                 // 加分列数据
                 // 加分列数据
-                createCellWithStyle(dataRow, colIndex++, (Integer) rowData.get("加分"), currentRowStyle);
+                createCellWithStyle(dataRow, colIndex++, (Integer) rowData.get("领导加分"), currentRowStyle);
+                createCellWithStyle(dataRow, colIndex++, (Integer) rowData.get("额外加分"), currentRowStyle);
             }
             }
 
 
             // 自动调整列宽
             // 自动调整列宽
@@ -1204,4 +1223,237 @@ public class GameScoreServiceImpl implements IGameScoreService {
 
 
         cell.setCellStyle(style);
         cell.setCellStyle(style);
     }
     }
+
+    /**
+     * 获取加分数据
+     */
+    @Override
+    public Map<String, Object> getBonusData(Long eventId) {
+        try {
+            // 获取所有项目
+            GameEventProjectBo projectQuery = new GameEventProjectBo();
+            projectQuery.setEventId(eventId);
+            List<GameEventProjectVo> projects = gameEventProjectService.queryList(projectQuery);
+
+            // 获取所有队伍
+            GameTeamBo teamQuery = new GameTeamBo();
+            teamQuery.setEventId(eventId);
+            List<GameTeamVo> teams = gameTeamService.queryList(teamQuery);
+
+            // 批量查询所有队伍在所有项目中的成绩
+            List<GameScoreVo> allScores = baseMapper.selectVoList(
+                Wrappers.lambdaQuery(GameScore.class)
+                    .eq(GameScore::getEventId, eventId)
+            );
+
+            // 按队伍ID和项目ID分组成绩数据
+            Map<String, GameScoreVo> scoreMap = new HashMap<>();
+            for (GameScoreVo score : allScores) {
+                if (score.getTeamId() != null && score.getProjectId() != null) {
+                    String key = score.getTeamId() + "_" + score.getProjectId();
+                    scoreMap.put(key, score);
+                }
+            }
+
+            // 构建加分数据
+            List<Map<String, Object>> bonusData = new ArrayList<>();
+
+            for (int i = 0; i < teams.size(); i++) {
+                GameTeamVo team = teams.get(i);
+                Map<String, Object> teamData = new HashMap<>();
+
+                // 设置基本信息
+                teamData.put("teamId", team.getTeamId());
+                teamData.put("teamName", team.getTeamName());
+                teamData.put("rank", i + 1);
+
+                // 计算该队伍在各项目中的积分
+                int totalScore = 0;
+                Map<String, Integer> projectScores = new HashMap<>();
+                int leaderPoint = 0;
+                int extraPoint = 0;
+
+                // 设置各项目积分
+                for (GameEventProjectVo project : projects) {
+                    String key = team.getTeamId() + "_" + project.getProjectId();
+                    GameScoreVo score = scoreMap.get(key);
+
+                    int projectScore = 0;
+                    if (score != null && score.getScorePoint() != null) {
+                        projectScore = score.getScorePoint();
+                        totalScore += projectScore;
+
+                        // 获取加分数据
+                        if (score.getLeaderPoint() != null) {
+                            leaderPoint = score.getLeaderPoint();
+                        }
+                        if (score.getExtraPoint() != null) {
+                            extraPoint = score.getExtraPoint();
+                        }
+                    }
+
+                    projectScores.put(project.getProjectName(), projectScore);
+                }
+
+                teamData.put("projectScores", projectScores);
+                teamData.put("totalScore", totalScore);
+                teamData.put("leaderPoint", leaderPoint);
+                teamData.put("extraPoint", extraPoint);
+
+                bonusData.add(teamData);
+            }
+
+            // 按总分排序,生成排名
+            bonusData.sort((a, b) -> Integer.compare((Integer) b.get("totalScore"), (Integer) a.get("totalScore")));
+            for (int i = 0; i < bonusData.size(); i++) {
+                bonusData.get(i).put("rank", i + 1);
+            }
+
+            Map<String, Object> result = new HashMap<>();
+            result.put("rows", bonusData);
+            result.put("projects", projects);
+
+            return result;
+
+        } catch (Exception e) {
+            log.error("获取加分数据失败", e);
+            throw new RuntimeException("获取加分数据失败:" + e.getMessage());
+        }
+    }
+
+    /**
+     * 更新加分数据
+     */
+    @Override
+    public Boolean updateBonusData(Map<String, Object> data) {
+        try {
+            Long eventId = Long.valueOf(data.get("eventId").toString());
+            List<Map<String, Object>> updateData = (List<Map<String, Object>>) data.get("data");
+
+            for (Map<String, Object> teamData : updateData) {
+                Long teamId = Long.valueOf(teamData.get("teamId").toString());
+                Integer leaderPoint = Integer.valueOf(teamData.get("leaderPoint").toString());
+                Integer extraPoint = Integer.valueOf(teamData.get("extraPoint").toString());
+
+                // 更新该队伍在所有项目中的加分数据
+                List<GameScoreVo> teamScores = baseMapper.selectVoList(
+                    Wrappers.lambdaQuery(GameScore.class)
+                        .eq(GameScore::getEventId, eventId)
+                        .eq(GameScore::getTeamId, teamId)
+                );
+
+                for (GameScoreVo score : teamScores) {
+                    GameScoreBo updateBo = new GameScoreBo();
+                    updateBo.setScoreId(score.getScoreId());
+                    updateBo.setLeaderPoint(leaderPoint);
+                    updateBo.setExtraPoint(extraPoint);
+
+                    // 重新计算积分
+                    int basePoints = score.getScorePoint() != null ? score.getScorePoint() : 0;
+//                    int totalPoints = basePoints + leaderPoint + extraPoint;
+                    updateBo.setScorePoint(basePoints);
+
+                    updateByBo(updateBo);
+                }
+            }
+
+            return true;
+
+        } catch (Exception e) {
+            log.error("更新加分数据失败", e);
+            throw new RuntimeException("更新加分数据失败:" + e.getMessage());
+        }
+    }
+
+    /**
+     * 导出加分Excel
+     */
+    @Override
+    public void exportBonusExcel(Map<String, Object> data, HttpServletResponse response) {
+        try {
+            List<Map<String, Object>> bonusData = (List<Map<String, Object>>) data.get("data");
+            List<Map<String, Object>> projects = (List<Map<String, Object>>) data.get("projects");
+
+            // 使用Apache POI导出Excel
+            try (Workbook workbook = new XSSFWorkbook()) {
+                Sheet sheet = workbook.createSheet("加分数据表");
+
+                // 创建标题行样式
+                CellStyle headerStyle = createHeaderStyle(workbook);
+                CellStyle dataStyle = createDataStyle(workbook, IndexedColors.WHITE);
+
+                // 创建标题行
+                Row headerRow = sheet.createRow(0);
+                int colIndex = 0;
+
+                // 基础列标题
+                String[] baseHeaders = {"序号", "代表队名称", "排名", "总分"};
+                for (String header : baseHeaders) {
+                    Cell cell = headerRow.createCell(colIndex++);
+                    cell.setCellValue(header);
+                    cell.setCellStyle(headerStyle);
+                }
+
+                // 动态项目列标题
+                for (Map<String, Object> project : projects) {
+                    String projectName = (String) project.get("projectName");
+                    Cell cell = headerRow.createCell(colIndex++);
+                    cell.setCellValue(projectName);
+                    cell.setCellStyle(headerStyle);
+                }
+
+                // 加分列标题
+                Cell leaderCell = headerRow.createCell(colIndex++);
+                leaderCell.setCellValue("领导加分");
+                leaderCell.setCellStyle(headerStyle);
+
+                Cell extraCell = headerRow.createCell(colIndex++);
+                extraCell.setCellValue("额外加分");
+                extraCell.setCellStyle(headerStyle);
+
+                // 填充数据行
+                int rowIndex = 1;
+                for (Map<String, Object> teamData : bonusData) {
+                    Row dataRow = sheet.createRow(rowIndex++);
+                    colIndex = 0;
+
+                    // 基础列数据
+                    createCellWithStyle(dataRow, colIndex++, rowIndex - 1, dataStyle);
+                    createCellWithStyle(dataRow, colIndex++, teamData.get("teamName"), dataStyle);
+                    createCellWithStyle(dataRow, colIndex++, teamData.get("rank"), dataStyle);
+                    createCellWithStyle(dataRow, colIndex++, teamData.get("totalScore"), dataStyle);
+
+                    // 动态项目列数据
+                    Map<String, Integer> projectScores = (Map<String, Integer>) teamData.get("projectScores");
+                    for (Map<String, Object> project : projects) {
+                        String projectName = (String) project.get("projectName");
+                        Integer score = projectScores != null ? projectScores.get(projectName) : 0;
+                        createCellWithStyle(dataRow, colIndex++, score != null ? score : 0, dataStyle);
+                    }
+
+                    // 加分列数据
+                    createCellWithStyle(dataRow, colIndex++, teamData.get("leaderPoint"), dataStyle);
+                    createCellWithStyle(dataRow, colIndex++, teamData.get("extraPoint"), dataStyle);
+                }
+
+                // 自动调整列宽
+                for (int i = 0; i < colIndex; i++) {
+                    sheet.autoSizeColumn(i);
+                }
+
+                // 设置响应头
+                response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+                response.setCharacterEncoding("utf-8");
+                String fileName = "加分数据表_" + System.currentTimeMillis() + ".xlsx";
+                response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
+
+                // 写入响应
+                workbook.write(response.getOutputStream());
+            }
+
+        } catch (Exception e) {
+            log.error("导出加分Excel失败", e);
+            throw new RuntimeException("导出失败:" + e.getMessage());
+        }
+    }
 }
 }