# 资源服务接口契约审计修复（下一梯队 P1中/P2：更多状态校验 + 季节引用替换 + 错误码）— 修改接口 — 管理后台

> 变更类型：⚠️ 行为收紧（更多端点非法状态拒绝）+ 数据一致性修复，无破坏性删除
> 端类型：管理后台（景区/活动/酒店/餐厅/服务/人员/车型/费用/攻略/素材）
> 日期：2026-06-18
> 服务：hl-resource-service
> PR：https://git.1814.love:8443/wx/HL/pulls/3957
> 承接：高置信 P0/P1 批次 PR #3948（见 17_3948_*.md）

---

## ⚠️ 关键说明

接口契约审计的**下一梯队**(P2-high/medium + P1-medium，145 条原始发现)对抗复核后修复，承接 #3948。已合并 dev-v3、部署测试服双实例(totalCodes=249)、本地全量 1630 单测零新增回归。对抗复核正确丢弃 46 项假阳性/已修项。

下面只列与前端对接相关的增量(在 #3948 基础上)。

---

## 1. 更多状态端点收紧：非法状态值被拒绝(承接 #3948 第 1 节，覆盖更多端点)

价格日历批量改状态 / 标签等端点补齐状态字典白名单校验，传字典外值返业务错误码而非静默落库：

| 域 | 端点 | 字典 |
|---|---|---|
| 活动 | `/admin/activity/.../prices/batch-status` | 价格日历 AVAILABLE/SOLD_OUT/CLOSED |
| 酒店房型 | `/admin/hotel/room-type/.../prices/batch-status` | 同上 |
| 人员/车型/服务 | 各 `.../prices/batch-status` | 同上 |
| 价格日历日期 | 各价格日历端点 | 日期格式 yyyy-MM-dd 非法拒绝 |

---

## 2. 季节素材引用「替换」语义修复(数据一致性)

`DELETE/保存景区季节`(`saveSeason` 编辑场景)此前只新增引用、不清旧引用 → 被移除的素材 `material_ref` 残留、`ref_count` 虚高。本次改为**先按 biz 解绑旧引用再按本次入参重绑**，引用集合如实反映保存后状态。

---

## 3. 新增错误码(前端按 Result.code 处理，承接 #3948 共 26 个)

本批新增 11 个(resource 段 3xxxxx)：

| 场景 | 错误码 |
|---|---|
| 价格日历状态非法 | 320501/310410/350304/360304 等 |
| 价格日历日期格式非法 | 320502/310411 |
| 住宿/标签不存在 | 310407/310409/320303/360305/370706 |
| 住宿被产品引用无法删除 | 310408 |
| 批量酒店ID为空 | 310412 |
| 费用变更原因必填 | 390903 |
| 车型价格日历状态非法 | 340404 |

---

## 4. 其它(前端基本无感)

- adhoc 标签并发建重名兜底(唯一键)；多写补事务；内部裸异常 → IErrorCode；删除被引用守卫
- *Name/关联字段回填、Map→VO、列表过滤补全(承接 #3948 第 2/3 节)

---

## 备注

- P3 + low 置信发现暂未处理；待产品确认项见 #3948 PR body（InternalHotel status 类型、Material 权限 no-op、MpScenic seasons、GROUP 车型等）。
