Files
tupingr 6992f59cd2 refactor(arch): 信息架构升级 — 三层四角色控制面板 + 跨平台 task 交接协议
核心变化:
- dashboard.md 替代 DASHBOARD + ROADMAP,人类+Arch AI 唯一入口
- DECISIONS.md 人类决策入口,≤3 条待决策
- .ai/tasks/ 14 个独立 task 文件(Coder 8 + Tester 6),弱模型自包含可独立执行
- 旧 today/queue 归档,每个角色启动 ≤2 个文件
- ADR-012 跨平台「高模型指挥小模型」协作架构落地
- 知识库补全:L-002~005、P-004~005、ADR-011~012
- Arch AI 上下文资源管理硬约束写入 principles.md

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-26 15:17:06 +08:00

2.2 KiB
Raw Permalink Blame History

Task P01-006: Print 模块(PDF 生成 + S3 + 过期清理)

元信息

字段
状态 todo
优先级 P0
依赖 P01-001DB 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,每页一道题
  • 上传 S3bucket: errlens-prints
  • 24 小时过期: 数据库 expires_at 字段 + 定时任务清理(node-cron
  • 下载链接一次性签名 URL

验收方法

# 编译检查
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]