# 项目打标失败状态实施记录

## 修改内容

- 后端新增项目状态 `4-打标失败`，扩展状态统计 `status4` 和状态文案。
- 打标失败后项目状态由原先回退 `0-进行中` 改为写入 `4-打标失败`，任务表仍记录 `FAILED/error_message`。
- 项目详情接口在失败态下返回最近失败任务的 `latestTagTaskErrorMessage` 与 `latestTagTaskEndTime`；项目列表不返回完整错误。
- SQL 初始化和迁移脚本新增 `ccdi_project_status` 字典值 `4-打标失败`，并提供生产数据回填 SQL。
- 前端列表、筛选、计数和详情页支持 `4-打标失败`；详情页提供失败提示和完整错误弹窗。
- `UploadData.vue` 与 `ParamConfig.vue` 将 `4` 按进行中口径处理，允许重新上传、拉取、修改参数和重新分析，不开放报告查看/归档入口。

## 影响范围

- 后端：项目状态模型、打标任务失败流转、项目详情接口、状态统计接口、打标任务 Mapper、SQL 初始化和迁移。
- 前端：项目首页列表与筛选、项目详情头部提示、上传数据页报告入口权限、状态映射。
- 数据：迁移脚本会将未归档、当前状态为 `0/3`、最新打标任务为 `FAILED` 的项目更新为 `4`。

## 验证结果

- 通过：`mvn -pl ccdi-project -am -Dtest=CcdiBankTagServiceImplTest,CcdiBankTagServiceRiskCountRefreshTest,CcdiProjectServiceImplTest,CcdiProjectStatusSqlTest,CcdiBankTagTaskMapperXmlTest -Dsurefire.failIfNoSpecifiedTests=false test`
- 全量后端：`mvn -pl ccdi-project -am test` 未通过，剩余失败为既有问题：
  - 多个测试使用 static mock，但当前 `SubclassByteBuddyMockMaker` 不支持 static mocks。
  - `CcdiProjectOverviewControllerContractTest.shouldExposeOverviewReportExportEndpointContract` 期望摘要为“一键导出结果总览报告”，实际为“导出结果总览报告”。
- 通过：`cd ruoyi-ui && nvm use && node tests/unit/project-tag-failed-status.test.js && node tests/unit/project-detail-tagging-polling.test.js && node tests/unit/project-archive-readonly-guard.test.js && node tests/unit/upload-data-disabled-cards.test.js`
- 通过：`cd ruoyi-ui && nvm use && npm run build:prod`，仅有既有资源体积 warning。
- 真实页面验证：`browser-use` 工具不可用；已使用 Playwright 打开真实业务页面路由，并通过本地 mock 后端构造失败项目数据，验证列表只显示“打标失败”且不泄露完整错误，详情页可查看完整错误，失败状态下上传/拉取入口可见。
