# refactor(material): 拆除素材审核遗留功能（reviewStatus 字段 + 字典 + DTO 全删）

> **仓库**: HL (后端 hl-resource-service + hl-user-service)
> **关联 PR/Issue**: PR #2795, Closes #2789
> **日期**: 2026-05-21
> **影响范围**: 管理后台「素材库」批量审核/批量驳回功能整体废弃
> **接收方**: mmg (前端)
> **前端**: **需要改动 — 拆按钮 + 删 API**

---

## 🚨 关键变化

「素材审核」功能业务上已不需要，本次全部拆除：

- 后端 `Material.reviewStatus` 字段删除
- DB `material.review_status` 列 DROP
- DB 字典 `material_review_status` DELETE
- `MaterialReviewRequest` DTO 删除

**正式环境之前批量审核接口 `PUT /admin/material/review` 触发的「参数类型错误: materialId='review'（需要 Long 类型）」报错根因就是这两条**：前端调了 `/admin/material/review` 但后端从未实现该接口，Spring 把 `review` 当成 `{materialId}` 路径变量去解析 Long，报错。

---

## 一、API 影响

### 不再存在的接口（后端从未实现）

```
PUT  /admin/material/review     ← 不再支持（前端有死调用）
PUT  /admin/material/reject     ← 不再支持（前端有死调用）
```

### 字段移除

| 接口 | 字段 | 改前 | 改后 |
|------|------|------|------|
| `GET /admin/material/list` | `reviewStatus` | 不返回（VO 本就没此字段） | 不返回（一致） |
| `GET /admin/material/{id}` | `reviewStatus` | 不返回（VO 本就没此字段） | 不返回（一致） |

> 实际 VO 层本来就没有 `reviewStatus` 字段，只是 Entity 层和 DB 列还在，本次一并清理。响应字段对前端无任何观测变化。

---

## 🚨 前端需要做的事

### 1. 删除批量审核/批量驳回 API

文件：`hl-ui/src/api/material.js` 第 335-353 行

```js
// 整段删掉
// ========== 素材审核 ==========

/**
 * 批量审核通过
 */
export function reviewMaterials(materialIds) {
  return http.put('/material/review', { materialIds })
}

/**
 * 批量驳回素材(删除)
 */
export function rejectMaterials(materialIds) {
  return http.put('/material/reject', { materialIds })
}
```

### 2. 拆 UI 按钮 + 弹窗

文件：`hl-ui/src/views/material/index.vue`

- 删除「批量审核」按钮、「批量驳回」按钮
- 删除「批量审核确认」弹窗及相关逻辑
- 列表/详情若有 `reviewStatus` 列或字段显示，一并删（实际 API 本就不返回）

### 3. 自查

请 mmg 全前端 grep 一遍：

```bash
grep -rE "reviewMaterials|rejectMaterials|material.*review|批量审核|审核通过|审核状态" hl-ui/src
```

如有残留请一并清理。

---

## 二、DB 改动（Flyway 已自动跑）

- `hl-resource-service` `V20260521_001__drop_material_review_status.sql` — `ALTER TABLE material DROP COLUMN review_status`（MySQL 8.0 兼容写法，列不存在时跳过）
- `hl-user-service` `V20260521_006__drop_material_review_status_dict.sql` — `DELETE` `sys_dict_type` + `sys_dict_data` 中 `material_review_status` 全部行

> dev 上的 user-service Flyway 文件名是 `V20260521_002`，dev-v3 上为避免 out-of-order 改名为 `V20260521_006`。两个分支文件名不同但 SQL 内容完全一致。

---

## 三、兼容性 / 风险

- ✅ VO 层本就无 `reviewStatus` 字段，前端列表/详情响应字段零变化
- ✅ Flyway 用 `information_schema` 防御，多环境部署安全（本地无此列也能跑过）
- ✅ DB 历史 `review_status` 值（如 PENDING/REJECTED）随列 DROP 丢失语义，业务已确认不需要
- ⚠️ 前端 `PUT /admin/material/review` `/admin/material/reject` 调用 100% 报错（路径变量 Long 解析失败），mmg 改前端前用户使用「批量审核」按钮会持续报错

---

## 四、测试服验证记录

部署到测试服 (`https://web.test.1814.love:9443`) 后已 round-trip 验证（2026-05-21 14:01）：

```
✓ GET /admin/material/list?page=1&pageSize=1
  → 响应 item keys 中无 reviewStatus

✓ GET /admin/dict/data/material_review_status
  → code=200, data=[] (字典已清空)
```

Flyway 自动执行：
- hl-resource-service 启动时跑 `V20260521_001__drop_material_review_status.sql` → `material.review_status` 列已 DROP
- hl-user-service 启动时跑 `V20260521_006__drop_material_review_status_dict.sql` → 字典 `material_review_status` 已 DELETE

## 五、正式部署记录（2026-05-21 14:49）

main 已合并 (`66c462c87f34`)，通过 `dep.test.1814.love:9443/prod` API 部署 hl-resource-service + hl-user-service 到正式 K3s (`hl-prod` ns)。

⚠️ 部署过程踩坑（已根治）：

1. **Flyway out-of-order 阻塞 hl-resource-service rollout 5 分钟**
   - 根因：正式 `hl_resource_service.flyway_schema_history` 里有一条孤儿 marker `99999999.001 flyway pilot marker`（2026-05-15 引入 Flyway pilot 时遗留）
   - 来源：`/opt/hl/build-repo/hl-resource-service/target/classes/db/migration/V99999999_001__flyway_pilot_marker.sql` 是 src 早已删除的孤儿文件，但 `deploy-prod.sh` 只跑 `mvn package` 不带 `mvn clean`，target/classes 增量保留把它打进了每一个 jar
   - 修复：SQL 删 history marker + rm Node1 build-repo target 孤儿文件 + `kubectl rollout restart`
   - 后续：建议在 `deploy-prod.sh` 加 `mvn clean` 或 `git clean -fxd $SERVICE` 防再次发生

2. **首次部署因 .m2 并发竞争失败**（之前测试服踩过，与本次无关），已串行化

### 正式 RDS 验证（直连 RDS 实测）

```sql
-- hl_resource_service
✓ SHOW COLUMNS FROM material LIKE 'review_status' → 0 rows (列已 DROP)
✓ flyway_schema_history top 1 = 20260521.001 drop material review status (success=1)

-- hl_user_service
✓ SELECT * FROM sys_dict_data WHERE dict_type='material_review_status' → 0 rows
✓ SELECT * FROM sys_dict_type WHERE dict_type='material_review_status' → 0 rows
✓ flyway_schema_history top 2 = 20260521.002 drop material review status dict / 20260521.001 init meal option dict (success=1)

-- material 表数据完好 5153 行
```

---

## 五、联系人

后端：wx（呼籁旅行）
前端：mmg

如有疑问可在 [#2789](https://git.1814.love:8443/wx/HL/issues/2789) 评论区留言。
