# 项目归档后端实施记录

## 本次改动概述

本次后端实施围绕“项目归档”和“归档后禁止继续写入”两条主线展开：

1. 在项目管理控制器中新增归档接口
2. 在项目服务中新增归档动作与归档态校验
3. 将“已归档不可写”保护下沉到上传数据与参数保存服务入口

## 改动文件

- `ccdi-project/src/main/java/com/ruoyi/ccdi/project/controller/CcdiProjectController.java`
- `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/ICcdiProjectService.java`
- `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectServiceImpl.java`
- `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImpl.java`
- `ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/CcdiModelParamServiceImpl.java`
- `ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectControllerTest.java`
- `ccdi-project/src/test/java/com/ruoyi/ccdi/project/controller/CcdiProjectControllerContractTest.java`
- `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiProjectServiceImplTest.java`
- `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiFileUploadServiceImplTest.java`
- `ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/CcdiModelParamServiceImplTest.java`

## 实现说明

### 1. 新增项目归档接口

新增接口：

- `POST /ccdi/project/{projectId}/archive`

控制器仅负责：

- 读取 `projectId`
- 获取当前登录用户名
- 调用项目服务归档动作
- 返回“项目归档成功”

### 2. 项目服务新增归档动作

在 `CcdiProjectServiceImpl` 中新增：

- `archiveProject(Long projectId, String operator)`
- `ensureProjectNotArchived(Long projectId, String message)`

归档动作规则：

- 仅允许 `status = 1` 的已完成项目归档
- 若项目已归档，直接拒绝重复归档
- 归档成功后写入：
  - `status = 2`
  - `isArchived = 1`
  - `updateBy`
  - `updateTime`

### 3. 补齐归档态后端写保护

本次不仅做了前端入口限制，还把后端入口一起封住，避免通过绕过页面直接调用接口继续写入。

新增归档校验已接入：

- `CcdiFileUploadServiceImpl`
  - 拉取本行信息
  - 批量上传文件
- `CcdiModelParamServiceImpl`
  - 保存单模型参数
  - 保存全部参数

拦截文案分别为：

- `已归档项目暂不允许上传或拉取数据`
- `已归档项目暂不允许修改参数`

## 为什么这样实现

### 为什么新增专用归档接口

归档是独立业务动作，不适合混入“更新项目”接口，否则前端和后端都会失去明确语义，后续状态校验也会分散。

### 为什么把归档保护放到服务层

这次用户要求的是“归档后上传数据和参数配置不可操作”。如果只锁页面页签，依然可能通过接口直调写入数据，因此必须在服务层统一加一层归档态校验，前后端限制才真正一致。

## 结果

本次后端实施后，项目归档链路已经具备完整闭环：

- 列表页可真实归档
- 非法状态无法归档
- 已归档项目无法再上传或拉取数据
- 已归档项目无法再修改参数
