Files
yidaima/RuoYi-Vue/docs/superpowers/plans/2026-07-11-one-click-generation-history-recovery.md

97 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 项目一键生成历史与阶段恢复 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 配置。