# 导出打印功能 - 详细任务清单
**优先级:** P1(重要)
**预计工时:** 3天
**负责人:** 待分配
---
## 📋 技术选型
- **Excel导出:** EasyExcel(阿里开源,性能优秀)
- **PDF生成:** iText 或 FreeMarker + Flying Saucer
- **模板引擎:** FreeMarker
### Maven 依赖
```xml
com.alibaba
easyexcel
3.3.2
com.itextpdf
itext7-core
7.2.5
org.freemarker
freemarker
2.3.32
```
---
## ✅ 任务列表
### 任务 3.1:成绩单Excel导出 🔴
**工时:** 1天
#### 需求描述
- 导出项目成绩单
- 包含:排名、姓名、单位、各裁判评分、最终得分、奖牌
- 支持筛选和排序
#### 实现要点
```java
// MartialResultServiceImpl.java
public void exportScoreSheet(Long projectId, HttpServletResponse response) {
// 1. 查询数据
List results = this.list(
new QueryWrapper()
.eq("project_id", projectId)
.orderByAsc("ranking")
);
// 2. 构建导出数据
List exportData = results.stream()
.map(this::buildExportVO)
.collect(Collectors.toList());
// 3. 使用EasyExcel导出
try {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode("成绩单", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
EasyExcel.write(response.getOutputStream(), ScoreExportVO.class)
.sheet("成绩单")
.doWrite(exportData);
} catch (IOException e) {
throw new ServiceException("导出失败");
}
}
```
#### VO 定义
```java
@Data
public class ScoreExportVO {
@ExcelProperty("排名")
private Integer ranking;
@ExcelProperty("姓名")
private String playerName;
@ExcelProperty("单位")
private String teamName;
@ExcelProperty("裁判1")
private BigDecimal judge1Score;
@ExcelProperty("裁判2")
private BigDecimal judge2Score;
@ExcelProperty("最高分")
private BigDecimal maxScore;
@ExcelProperty("最低分")
private BigDecimal minScore;
@ExcelProperty("平均分")
private BigDecimal totalScore;
@ExcelProperty("难度系数")
private BigDecimal coefficient;
@ExcelProperty("最终得分")
private BigDecimal finalScore;
@ExcelProperty("奖牌")
private String medal;
}
```
---
### 任务 3.2:赛程表Excel导出 🔴
**工时:** 0.5天
#### 需求描述
- 导出完整赛程表
- 按日期、时间段分组
- 包含场地、项目、运动员信息
---
### 任务 3.3:证书PDF生成 🔴
**工时:** 1天
#### 需求描述
- 使用模板生成获奖证书
- 包含:姓名、项目、名次、日期
- 支持批量生成
#### 实现思路
```java
public void generateCertificate(Long resultId) {
// 1. 查询成绩
MartialResult result = this.getById(resultId);
// 2. 准备数据
Map data = new HashMap<>();
data.put("playerName", result.getPlayerName());
data.put("projectName", "项目名称");
data.put("ranking", result.getRanking());
data.put("medal", getMedalName(result.getMedal()));
// 3. 使用FreeMarker渲染模板
String html = freeMarkerService.process("certificate.ftl", data);
// 4. HTML转PDF
ByteArrayOutputStream pdfStream = htmlToPdf(html);
// 5. 保存或返回
savePdf(pdfStream, "certificate_" + resultId + ".pdf");
}
```
---
### 任务 3.4:排行榜打印模板 🔴
**工时:** 0.5天
#### 需求描述
- 提供打印友好的排行榜页面
- 支持分页打印
- 包含比赛信息、日期、主办方
---
## 🎯 Controller 接口
```java
@RestController
@RequestMapping("/martial/export")
public class MartialExportController {
@GetMapping("/score-sheet")
@Operation(summary = "导出成绩单")
public void exportScoreSheet(
@RequestParam Long projectId,
HttpServletResponse response
) {
resultService.exportScoreSheet(projectId, response);
}
@GetMapping("/schedule")
@Operation(summary = "导出赛程表")
public void exportSchedule(
@RequestParam Long competitionId,
HttpServletResponse response
) {
scheduleService.exportSchedule(competitionId, response);
}
@GetMapping("/certificate/{resultId}")
@Operation(summary = "生成证书")
public void generateCertificate(
@PathVariable Long resultId,
HttpServletResponse response
) {
resultService.generateCertificate(resultId, response);
}
}
```
---
## ✅ 验收标准
- [ ] Excel导出格式正确,数据完整
- [ ] PDF证书美观,信息准确
- [ ] 支持批量导出
- [ ] 大数据量导出性能良好(1000+记录)
---