# Task P01-006: Print 模块(PDF 生成 + S3 + 过期清理) ## 元信息 | 字段 | 值 | |------|-----| | 状态 | `todo` | | 优先级 | P0 | | 依赖 | P01-001(DB Schema,需要 print_tasks 表) | | 分配给 | Coder AI (Trae CN + GLM-4.6) | ## 输入 **要读的文件**: - `docs/02_系统架构/模块设计.md` — 3.7 Print 模块(PDF 输出) - `docs/02_系统架构/数据模型.md` — 2.11 print_tasks 表 - `docs/02_系统架构/总体架构.md` — 3.3 打印/PDF 输出数据流 - `projects/app/src/db/schema/*.ts` — P01-001 产出的 Drizzle Schema **参考的 ADR**: - 无特殊 ADR **上游依赖产出**: - P01-001: print_tasks 表 Drizzle Schema ## 输出 **要生成/修改的文件**: - `projects/app/src/modules/print/print.module.ts` - `projects/app/src/modules/print/print.controller.ts` - `projects/app/src/modules/print/print.service.ts` **API**: | 方法 | 路径 | 说明 | |------|------|------| | POST | /print/generate | 提交错题 ID 列表 → 生成 PDF → 上传 S3 | | GET | /print/task/:id | 查询生成进度 | | GET | /print/download/:id | 获取下载链接(24h 有效) | **关键逻辑**: - PDF 生成: PDFKit, A4 纸张, 300 DPI - 错题图片嵌入 PDF,每页一道题 - 上传 S3(bucket: errlens-prints) - 24 小时过期: 数据库 expires_at 字段 + 定时任务清理(node-cron) - 下载链接一次性签名 URL ## 验收方法 ```bash # 编译检查 npx tsc --noEmit # 提交生成任务 curl -X POST http://localhost:3000/print/generate \ -H "Authorization: Bearer {token}" \ -H "Content-Type: application/json" \ -d '{"errorItemIds": ["uuid-1", "uuid-2"]}' # 预期: { taskId, status: "processing" } # 查询进度 curl http://localhost:3000/print/task/{taskId} # 预期: { status: "completed", downloadUrl: "..." } ``` ## 约束 - 不碰: `projects/app/tests/`、其他 modules/ 目录 - 技术栈: NestJS + PDFKit + @aws-sdk/client-s3 + node-cron - 遵循: 下载链接 24h 过期,S3 文件同步过期清理 ## 完成报告 > Coder 完成后填写。Commit message 以 `[READY_FOR_TEST]` 结尾。 - [ ] 输出文件已生成 - [ ] 验收命令通过 - [ ] Commit: `{hash}` - [ ] Commit message: `feat(P01-006): Print 模块(PDF+S3+24h过期清理) [READY_FOR_TEST]`