# 后端核查回执: 管理端产品页 30+ 死 API 调用清单

> **服务**: 后端核查（非接口变更）
> **PR**: 无（后端审计）
> **Issue**: 无
> **日期**: 2026-05-13
> **影响范围**: hl-ui 管理端 `src/api/pricing.js` + `src/api/core.js` 中调用 product-v2 旧路径的函数
> **致**: @mmg

---

## ⚠️ 关键变化

你列的"前端有、后端完全没有"5 类清单已逐条 grep 核对。**结论：30 个函数确认是死调用（v2 后端无对应路由），可放心删除**；同时有 14 个函数后端 v2 还在用，**别删**。

---

## 一、背景

你前端反馈了 5 类（旧定价 / 旧批次 / 细粒度行程 / 定制师配置 / 废弃 CRUD）函数怀疑后端没有实现。我用 grep 把 `hl-ui` 中每个函数的 axios URL 抓出来，逐条反查 `hl-product-service-v2` 的 Controller @RequestMapping，再核对 gateway 路由是否切到 v2。结果如下。

---

## 二、A 类「前端可删」（30 项，确认无后端 v2 路由）

### pricing.js（20 项 — 旧定价模型完全废弃）

| 函数 | 前端 URL | 后端 v2 状态 |
|------|---------|-------------|
| getProductPricing | `GET /product/item/{id}/pricing` | ❌ 无路由（v2 已换 pricing-calendar 模型） |
| saveProductPricing | `POST /product/item/{id}/pricing` | ❌ 无路由 |
| getProductCostItems | `GET /product/item/{id}/cost-items` | ❌ 无路由 |
| addProductCostItem | `POST /product/item/{id}/cost-item` | ❌ 无路由 |
| updateProductCostItem | `PUT /product/item/{id}/cost-item/{itemId}` | ❌ 无路由 |
| deleteProductCostItem | `DELETE /product/item/{id}/cost-item/{itemId}` | ❌ 无路由 |
| getProductCustomFees | `GET /product/item/{id}/custom-fees` | ❌ 无路由 |
| addProductCustomFee | `POST /product/item/{id}/custom-fee` | ❌ 无路由 |
| updateProductCustomFee | `PUT /product/item/{id}/custom-fee/{feeId}` | ❌ 无路由 |
| deleteProductCustomFee | `DELETE /product/item/{id}/custom-fee/{feeId}` | ❌ 无路由 |
| getProductExtraCosts | `GET /product/item/{id}/extra-costs` | ❌ 无路由（字段嵌入 ProductRouteSaveReqVO，无独立 URL） |
| addProductExtraCost / update / delete | `*/extra-cost*` | ❌ 无路由 |
| getProductSupplies | `GET /product/item/{id}/supplies` | ❌ 无路由（Service 在但 Controller 未暴露） |
| addProductSupply / update / delete | `*/supplies*` | ❌ 无路由 |
| getInsuranceFeePreview | `GET /product/item/{id}/pricing/insurance-fee-preview` | ❌ 无路由 |
| getGroupQuote | `GET /product/item/{id}/group-quote` | ❌ admin 无（v2 仅 `/internal/product/{id}/group-quote` 内部用） |

### core.js（10 项）

| 函数 | 前端 URL | 后端 v2 状态 |
|------|---------|-------------|
| addProduct | `POST /product/item` | ❌ v2 用 `/admin/product/basic` 统一 SaveReqVO |
| updateProduct | `PUT /product/item/{id}` | ❌ 同上 |
| generateShareLink | `POST /product/item/{id}/share-link` | ⚠ v2 有路径但是 `POST /admin/product/{id}/share` — 前端 URL 不对 |
| generateRouteMap | `POST /product/item/{id}/generate-route-map` | ⚠ v2 改 `POST /admin/product/{id}/map/generate-by-amap` |
| getProductLogs | `GET /product/item/{id}/logs` | ⚠ v2 改 `GET /admin/product/{id}/operation-logs` |
| getFolderTree | `GET /product/folder/tree` | ❌ 文件夹模型已废弃 |
| addFolder / update / delete | `/product/folder/*` | ❌ 同上 |
| moveProduct | `PUT /product/item/{id}/move` | ❌ 文件夹移动随之废弃 |

### batch.js 整文件（旧批次模型）

| 范围 | 后端 v2 状态 |
|------|-------------|
| `/batch/*` 路由全部 | ❌ 整批迁移到 `/admin/product/{id}/schedules` （新 schedule 模型） |
| 关联面板 `BatchManagementPanel.vue` | 可同步删 |

### itinerary.js 部分函数（细粒度行程）

| 函数 | 前端 URL | 状态 |
|------|---------|------|
| 节点级 CRUD（addNode/updateNode/deleteNode） | `/itinerary/node/*` | ❌ v2 无独立节点 CRUD |
| 酒店级 CRUD | `/itinerary/hotel/*` | ❌ v2 无独立 CRUD |
| 餐饮级 CRUD | `/itinerary/dining/*` | ❌ v2 无独立 CRUD |

注：admin v2 只保留 `saveItinerary` 整树保存 + `addItineraryDay` / `deleteItineraryDay`。

### custom.js 整文件（定制师配置）

| 范围 | 状态 |
|------|------|
| family / staff-config 全部接口 | ❌ VO 还在数据模型但无 Controller 端点 |

---

## 三、B 类「前端别删」（14 项，v2 还在用）

| 函数 | 后端 v2 路径 |
|------|-------------|
| getProductPage / getProductDetail | `GET /admin/product/page` / `/admin/product/{id}` |
| deleteProduct / copyProduct | `DELETE /admin/product/{id}` / `POST /admin/product/{id}/copy` |
| validatePublish / togglePublish | `POST /admin/product/{id}/validate-publish` / `/publish-toggle` |
| completeDesign | `POST /admin/product/{id}/complete-design` |
| saveBasicInfo | `POST /admin/product/basic` |
| saveItinerary / addItineraryDay / deleteItineraryDay | `PUT /admin/product/{id}/itinerary` 等 |
| saveRoute | `PUT /admin/product/{id}/route` |
| saveSupplement | `PUT /admin/product/{id}/supplement` |
| getFeeDeductionPreview | v2 有保留 |

---

## 四、特别说明

- **`generateShareLink` / `generateRouteMap` / `getProductLogs`** 是 ⚠ 类（路径变了但功能在）。建议前端把这三个函数的 URL 改成新路径（见上表），保留函数。
- **文件夹 + 移动产品**功能 v2 整体废弃。但你前端 UI（`FolderPanel.vue` + 列表页"移动产品"按钮）还在用。**建议前端连同 UI 一起删掉**，因为 v2 的产品组织改用 schedule 维度，不再需要文件夹。
- **batch.js 整文件**直接删（已被 schedule 替代）。`BatchManagementPanel.vue` 一并删。

---

## 五、为什么后端不补回来这些 API

- pricing 旧模型：v2 已重构为 pricing-calendar（按日期+档位定价），旧的"成本项/自定义费/额外费/物资"独立 CRUD 模式已废弃，统一进 schedule 保存
- 文件夹：v2 产品组织维度变了（主题/版本/档位/schedule），文件夹这个老组织维度无意义
- 细粒度行程：编辑体验改为整树保存（一次 PUT 全部行程），节点级 CRUD 让数据一致性变难

如果你前端在做产品列表的"文件夹分组展示"或"批次管理面板"且必须保留 UI，先告诉我，我评估能不能在 v2 加路由；否则按上面清单删即可。

---

**附：PR #2166 已部署测试服**（commit d49d6013，10:57:45 完成）。改动是 32 处 `Result<Map>` 改具体 VO + 字典段修正 + 部分 Map 入参改 ReqVO。**字段名跟原 Map 一致，前端契约不变**，等你日常联调中如果 mp wiki/review/wish/transport 4 个接口有反序列化异常立刻反馈我。
