# 项目一键生成历史与阶段恢复 Implementation Plan > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** 让用户查看项目历次一键生成,理解失败阶段,并从服务器判定的最近检查点继续生成。 **Architecture:** 使用现有任务、阶段和检查点表计算最近 20 条轻量历史摘要;复用现有任务重试与检查点恢复内核;前端用独立 Drawer 组件承载历史展示与操作。 **Tech Stack:** Java 8、Spring MVC、MyBatis、JUnit 4、Vue 3、Element Plus、Node test runner、Vite。 ## Global Constraints - 不新增数据库表或迁移。 - 不向历史响应暴露请求、结果或检查点 Payload。 - 恢复起点只能由服务器根据可信检查点决定。 - 当前用户必须拥有项目,且不能并发重试同项目的另一个活动一键任务。 - 工作区存在其他改造,本轮不自动提交或回退无关变更。 --- ### Task 1: 轻量任务历史契约 **Files:** - Create: `ruoyi-generator/src/main/java/com/ruoyi/generator/domain/front/dto/AiGenerationTaskHistoryItem.java` - Modify: `ruoyi-generator/src/main/java/com/ruoyi/generator/mapper/front/AiGenerationTaskMapper.java` - Modify: `ruoyi-generator/src/main/resources/mapper/front/AiGenerationTaskMapper.xml` - Modify: `ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/IAiGenerationTaskService.java` - Modify: `ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/AiGenerationTaskServiceImpl.java` - Modify: `ruoyi-admin/src/main/java/com/ruoyi/web/controller/front/FrontProjectController.java` - Test: `ruoyi-generator/src/test/java/com/ruoyi/generator/service/front/AiGenerationTaskServiceImplTest.java` - Test: `ruoyi-admin/src/test/java/com/ruoyi/web/controller/front/FrontProjectControllerRunPreviewTest.java` - [x] 先添加服务和控制器失败测试,固定所有权、20 条限制和轻量字段。 - [x] 添加 History DTO 与显式 MyBatis result map。 - [x] 一次查询任务、最近失败阶段、最近完成阶段和检查点恢复位置。 - [x] 添加 `listOneClickTaskHistory(Long userId, Long projectId)` 和 GET API。 - [x] 运行聚焦后端测试。 ### Task 2: 历史重试并发保护 **Files:** - Modify: `ruoyi-generator/src/main/java/com/ruoyi/generator/service/front/AiGenerationTaskServiceImpl.java` - Test: `ruoyi-generator/src/test/java/com/ruoyi/generator/service/front/AiGenerationTaskServiceImplTest.java` - [x] 添加“另一个同类型任务活动时拒绝旧任务重试”的失败测试。 - [x] 在预留额度前检查 `selectActiveTaskByProjectType`,同一任务除外。 - [x] 重跑任务服务测试,确认现有重试行为不回归。 ### Task 3: 历史 Drawer 组件 **Files:** - Create: `easycode-web/src/components/OneClickGenerationHistoryDrawer.vue` - Create: `easycode-web/src/components/oneClickGenerationHistoryDrawer.test.mjs` - Modify: `easycode-web/src/api/project.js` - [x] 先添加 API 与组件契约失败测试。 - [x] 添加历史 API 客户端。 - [x] 实现加载、刷新、空状态、失败诊断、查看任务和继续事件。 - [x] 历史加载失败保持在 Drawer 内,不污染项目工作台。 - [x] 运行组件契约测试。 ### Task 4: 接入项目列表与生成工作台 **Files:** - Modify: `easycode-web/src/views/ProjectListView.vue` - Modify: `easycode-web/src/views/projectListView.test.mjs` - Modify: `easycode-web/src/views/GenerateView.vue` - Modify: `easycode-web/src/views/generateView.test.mjs` - [x] 项目列表增加生成记录图标并携带 `history=1`。 - [x] 生成工作台挂载 Drawer,处理路由打开与关闭。 - [x] 查看历史任务时复用 `restoreTaskById` 并同步 `taskId`。 - [x] 继续生成前确认恢复阶段,再复用现有 `retryTask`。 - [x] 活动任务期间禁用历史重试,并在完成后刷新 Drawer。 - [x] 运行项目列表与生成工作台契约测试。 ### Task 5: 文档与回归 **Files:** - Modify: `docs/superpowers/specs/2026-07-10-ai-software-factory-roadmap.md` - Modify: `docs/superpowers/specs/2026-07-11-one-click-generation-history-recovery-design.md` - Modify: `docs/superpowers/plans/2026-07-11-one-click-generation-history-recovery.md` - [x] 更新 P1-I 实施记录与验证结果。 - [x] 解析 Mapper XML 并执行后端聚焦测试。 - [x] 执行前端主流程契约测试和生产构建。 - [x] 执行 `ruoyi-admin` 全量测试。 - [x] 检查差异,确认没有数据库迁移和无关配置改动。 ## Verification Record - `AiGenerationTaskServiceImplTest` 与 `AiGenerationTaskHistoryMapperContractTest`:19 项通过。 - `FrontProjectControllerRunPreviewTest`:13 项通过;`ruoyi-admin` 全量:40 项通过。 - EasyCode 历史抽屉、项目列表与生成工作台契约:53 项通过。 - EasyCode 生产构建通过,开发服务 `http://localhost:5174` 返回 HTTP 200。 - `AiGenerationTaskMapper.xml` 已成功解析;本轮未新增数据库迁移,未修改开发凭据与 TLS 配置。