# 导出打印功能 - 详细任务清单

**优先级：** P1（重要）
**预计工时：** 3天
**负责人：** 待分配

---

## 📋 技术选型

- **Excel导出：** EasyExcel（阿里开源，性能优秀）
- **PDF生成：** iText 或 FreeMarker + Flying Saucer
- **模板引擎：** FreeMarker

### Maven 依赖

```xml
<!-- EasyExcel -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.3.2</version>
</dependency>

<!-- iText PDF -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext7-core</artifactId>
    <version>7.2.5</version>
</dependency>

<!-- FreeMarker -->
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.32</version>
</dependency>
```

---

## ✅ 任务列表

### 任务 3.1：成绩单Excel导出 🔴

**工时：** 1天

#### 需求描述
- 导出项目成绩单
- 包含：排名、姓名、单位、各裁判评分、最终得分、奖牌
- 支持筛选和排序

#### 实现要点
```java
// MartialResultServiceImpl.java
public void exportScoreSheet(Long projectId, HttpServletResponse response) {
    // 1. 查询数据
    List<MartialResult> results = this.list(
        new QueryWrapper<MartialResult>()
            .eq("project_id", projectId)
            .orderByAsc("ranking")
    );

    // 2. 构建导出数据
    List<ScoreExportVO> 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<String, Object> 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+记录）

---
