# 项目详情打标状态轮询前端实施计划

> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking.

**Goal:** 在项目详情页中，当项目状态为“打标中”时自动轮询项目详情接口，并在状态变化后及时刷新页面展示。

**Architecture:** 轮询逻辑收敛到项目详情父组件 `detail.vue`，由父组件统一维护 1 秒轮询定时器、请求节流与销毁清理，子组件继续只消费 `projectInfo.projectStatus`。这样可以保证详情页各子标签页共享同一份最新项目状态，并在状态脱离“打标中”后自动停止轮询。

**Tech Stack:** Vue 2、Element UI、现有 `@/api/ccdiProject` 接口层、Node `assert` 单测脚本

---

### Task 1: 补充失败单测

**Files:**
- Create: `ruoyi-ui/tests/unit/project-detail-tagging-polling.test.js`
- Test: `ruoyi-ui/tests/unit/project-detail-tagging-polling.test.js`

- [ ] **Step 1: 编写失败单测**

校验 `detail.vue` 已具备：
- 轮询定时器状态字段
- 仅在 `projectStatus === "3"` 时启动轮询
- 状态变更后停止轮询
- 组件销毁时清理轮询

- [ ] **Step 2: 运行单测确认失败**

Run: `node ruoyi-ui/tests/unit/project-detail-tagging-polling.test.js`
Expected: FAIL，提示缺少详情页打标状态轮询逻辑

### Task 2: 在详情页实现最短路径轮询

**Files:**
- Modify: `ruoyi-ui/src/views/ccdiProject/detail.vue`

- [ ] **Step 1: 增加轮询状态字段与清理逻辑**

新增页级定时器、轮询间隔、请求中的互斥标记，并在组件销毁前统一关闭定时器。

- [ ] **Step 2: 在项目详情加载后按状态启停轮询**

首次加载和手动刷新项目详情后，根据接口返回的 `projectStatus` 判断：
- 状态为 `3` 时启动轮询
- 状态不是 `3` 时关闭轮询

- [ ] **Step 3: 轮询期间复用项目详情接口更新页面**

轮询调用 `getProject(projectId)`，更新 `projectInfo`、页面标题和状态标签；如果状态已不再是 `3`，则立即停止轮询。

- [ ] **Step 4: 处理路由切换与重复启动**

切换 `projectId`、离开页面或重复进入轮询分支时，确保不会叠加多个定时器，也不会在已有请求未结束时并发重复请求。

### Task 3: 回归验证与记录

**Files:**
- Modify: `docs/reports/implementation/2026-03-19-project-detail-tagging-status-polling-record.md`

- [ ] **Step 1: 运行相关单测**

Run: `node ruoyi-ui/tests/unit/project-detail-tagging-polling.test.js`
Expected: PASS

- [ ] **Step 2: 补充实施记录**

记录本次修改内容、测试命令和验证结论，便于后续追踪。
