# 接口变更记录 — 2026-04-14 09:45

> **提交** `f3151227` · **作者** wx · **时间** 2026-04-14 09:45:04 +0800
>
> refactor(product-v2): 包名com.hulalv.product→com.hulalv(去掉product子包)

## 变更总览

- **hl-product-service-v2**
  - 🆕 AdminBookingTerms (+7 接口)
  - 🆕 AdminProduct (+30 接口)
  - 🆕 AdminProductLine (+5 接口)
  - 🆕 AdminProductTemplate (+1 接口)
  - 🆕 AdminWarmTips (+7 接口)
  - 🆕 District (+1 接口)
  - 🆕 Formula (+19 接口)
  - 🆕 MpProduct (+6 接口)
  - 🆕 MpProductLine (+2 接口)
  - ❌ AdminBookingTerms (-7 接口)
  - ❌ AdminProductLine (-5 接口)
  - ❌ AdminProductTemplate (-1 接口)
  - ❌ AdminWarmTips (-7 接口)
  - ❌ District (-1 接口)
  - ❌ Formula (-19 接口)
  - ❌ MpProduct (-6 接口)
  - ❌ MpProductLine (-2 接口)
  - 🆕 AdminProductLineTest (+0 接口)
  - 🆕 AdminProductTemplateTest (+0 接口)
  - 🆕 MpProductTest (+0 接口)
  - 🆕 MpProductLineTest (+0 接口)
  - ❌ AdminProductLineTest (-0 接口)
  - ❌ AdminProductTemplateTest (-0 接口)
  - ❌ MpProductTest (-0 接口)
  - ❌ MpProductLineTest (-0 接口)

---

## hl-product-service-v2

### 🆕 新增: AdminBookingTerms

### 📌 `GET` /admin/product/booking-terms/list — 预订条款列表

> 返回所有预订条款（含禁用），按创建时间倒序

**响应** `Result<List<BookingTermsRespVO>>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `termsId` | `Long` | 预订条款ID |
| `termsName` | `String` | 条款名称 |
| `content` | `String` | 条款内容（富文本） |
| `enabled` | `Boolean` | 是否启用 |
| `remark` | `String` | 备注 |
| `createdBy` | `Long` | 创建人ID |
| `createdAt` | `LocalDateTime` | 创建时间 |
| `updatedAt` | `LocalDateTime` | 更新时间 |

### 📌 `GET` /admin/product/booking-terms/enabled — 启用的预订条款列表

> 仅返回启用状态的条款，供产品设计时选择

**响应** `Result<List<BookingTermsRespVO>>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `termsId` | `Long` | 预订条款ID |
| `termsName` | `String` | 条款名称 |
| `content` | `String` | 条款内容（富文本） |
| `enabled` | `Boolean` | 是否启用 |
| `remark` | `String` | 备注 |
| `createdBy` | `Long` | 创建人ID |
| `createdAt` | `LocalDateTime` | 创建时间 |
| `updatedAt` | `LocalDateTime` | 更新时间 |

### 📌 `GET` /admin/product/booking-terms/{termsId} — 预订条款详情

**参数**

  - `{termsId}` (`Long`) — 路径参数：预订条款ID

**响应** `Result<BookingTermsRespVO>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `termsId` | `Long` | 预订条款ID |
| `termsName` | `String` | 条款名称 |
| `content` | `String` | 条款内容（富文本） |
| `enabled` | `Boolean` | 是否启用 |
| `remark` | `String` | 备注 |
| `createdBy` | `Long` | 创建人ID |
| `createdAt` | `LocalDateTime` | 创建时间 |
| `updatedAt` | `LocalDateTime` | 更新时间 |

### 📌 `POST` /admin/product/booking-terms — 创建预订条款

> 创建后默认启用

**请求体** `BookingTermsSaveReqVO`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `termsName` | `String` | 条款名称 |
| `content` | `String` | 条款内容（富文本） |
| `remark` | `String` | 备注 |

**响应** `Result<BookingTermsRespVO>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `termsId` | `Long` | 预订条款ID |
| `termsName` | `String` | 条款名称 |
| `content` | `String` | 条款内容（富文本） |
| `enabled` | `Boolean` | 是否启用 |
| `remark` | `String` | 备注 |
| `createdBy` | `Long` | 创建人ID |
| `createdAt` | `LocalDateTime` | 创建时间 |
| `updatedAt` | `LocalDateTime` | 更新时间 |

### 📌 `PUT` /admin/product/booking-terms/{termsId} — 修改预订条款

**参数**

  - `{termsId}` (`Long`) — 路径参数：预订条款ID

**请求体** `BookingTermsSaveReqVO`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `termsName` | `String` | 条款名称 |
| `content` | `String` | 条款内容（富文本） |
| `remark` | `String` | 备注 |

**响应** `Result<BookingTermsRespVO>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `termsId` | `Long` | 预订条款ID |
| `termsName` | `String` | 条款名称 |
| `content` | `String` | 条款内容（富文本） |
| `enabled` | `Boolean` | 是否启用 |
| `remark` | `String` | 备注 |
| `createdBy` | `Long` | 创建人ID |
| `createdAt` | `LocalDateTime` | 创建时间 |
| `updatedAt` | `LocalDateTime` | 更新时间 |

### 📌 `DELETE` /admin/product/booking-terms/{termsId} — 删除预订条款

> 软删除，已绑定的产品不受影响

**参数**

  - `{termsId}` (`Long`) — 路径参数：预订条款ID

**响应** `Result<Void>`

### 📌 `PUT` /admin/product/booking-terms/{termsId}/toggle — 启用/禁用预订条款

> 禁用后不再出现在产品设计的可选列表中

**参数**

  - `{termsId}` (`Long`) — 路径参数：预订条款ID
  - `enabled` (`boolean`) — 查询参数：是否启用

**响应** `Result<Void>`

### 🆕 新增: AdminProduct

### 📌 `POST` /admin/product/item/basic — Step1 基础信息保存

> 创建+更新合一接口。

**请求体** `ProductBasicSaveReqVO`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID（不传=创建，传了=更新） |
| `productType` | `String` | 产品类型（创建时必传，更新时忽略。CORE=核心产品, GROUP=小蒙马, CUSTOM=私人定制） |
| `category` | `String` | 产品分类（字典product_category: family=亲子游, honeymoon=蜜月旅行, photography=摄影之旅, experience=深度体验, driving=自驾越野） |
| `name` | `String` | 产品名称（≤30字） |
| `subtitle` | `String` | 副标题（≤128字） |
| `introduction` | `String` | 产品简介（富文本HTML） |
| `lineId` | `Long` | 产品线ID（主题ID，CORE/GROUP必传，CUSTOM可空） |
| `tripDays` | `Integer` | 行程天数（≥1） |
| `tripNights` | `Integer` | 行程晚数（不传自动=天数-1） |
| `isBooking` | `Boolean` | 是否预约产品（true=订金可不填出行人） |
| `paymentType` | `String` | 支付方式（FULL=全款支付, DEPOSIT=订金+尾款） |
| `depositRatio` | `Integer` | 订金比例(%，与固定额二选一） |
| `depositAmount` | `BigDecimal` | 订金固定额（与比例二选一） |
| `balanceDueDays` | `Integer` | 尾款须在出发前N天付清 |
| `defaultDailyStock` | `Integer` | 每日库存默认值（NULL=不限量，用于价格日历预填） |
| `tiers` | `List<TierItem>` | 规格列表（单一档不传或传1个，多档传多个） |
| `tags` | `List<String>` | 产品标签（亲子/研学/露营/城记/摄影） |
| `coverImageUrl` | `String` | 封面图URL |
| `carouselImages` | `List<String>` | 轮播图URL列表 |
| `seasons` | `List<String>` | 产品季节（字典product_season: spring/summer/autumn/winter） |
| `tierSeq` | `Integer` | 规格序号（1开始递增） |
| `tierName` | `String` | 规格名称 |

**响应** `Result<Long>`

### 📌 `PUT` /admin/product/item/{id}/itinerary — Step2 行程整体保存

> 整体保存行程天+节点+住宿+路线点。支持新增/更新/删除（EntityDiffUtil对比）。

**参数**

  - `{id}` (`Long`) — 路径参数

**请求体** `ProductItinerarySaveReqVO`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `days` | `List<DayItem>` | 行程天列表 |
| `dayId` | `Long` | 行程天ID(已有则传，新增不传) |
| `dayNumber` | `Integer` | 天序号 |
| `dayTitle` | `String` | 当日标题 |
| `quoteText` | `String` | 当日金句 |
| `description` | `String` | 行程描述 |
| `coverImageUrl` | `String` | 当日封面图 |
| `breakfast` | `String` | 早餐(HOTEL/CAMP/SPECIAL/SELF) |
| `lunch` | `String` | 午餐 |
| `dinner` | `String` | 晚餐 |
| `diningRemark` | `String` | 餐饮备注 |
| `dailyMileage` | `BigDecimal` | 当日里程(km) |
| `mileageManualOverride` | `Boolean` | 里程是否手动覆盖 |
| `photoUrls` | `List<String>` | 照片集 |
| `customFields` | `Object` | 自定义概况 |
| `nodes` | `List<NodeItem>` | 活动节点列表 |
| `hotels` | `List<HotelItem>` | 住宿列表 |
| `routePoints` | `List<RoutePointItem>` | 途经路线点列表 |
| `nodeId` | `Long` | 节点ID(已有则传，新增不传) |
| `sortOrder` | `Integer` | 排序 |
| `nodeType` | `String` | 节点类型(SCENIC/ACTIVITY/RESTAURANT/SERVICE/CUSTOM等) |
| `nodeName` | `String` | 节点名称 |
| `resourceType` | `String` | 资源类型 |
| `resourceId` | `Long` | 资源ID |
| `startTime` | `String` | 开始时间(如10:00) |
| `durationMinutes` | `Integer` | 时长(分钟) |
| `description` | `String` | 描述 |
| `images` | `List<String>` | 图片列表 |
| `emojiIcon` | `String` | 图标 |
| `extraData` | `Object` | 扩展数据 |
| `id` | `Long` | 住宿ID(已有则传，新增不传) |
| `tierSeq` | `Integer` | 档位序号(无档位=1) |
| `hotelId` | `Long` | 酒店ID |
| `roomTypeId` | `Long` | 房型ID(私人定制用) |
| `roomCount` | `Integer` | 房间数(私人定制用) |
| `isDefault` | `Boolean` | 是否默认推荐 |
| `sortOrder` | `Integer` | 排序 |
| `resourceId` | `Long` | 资源ID(可空=自定义地点) |
| `name` | `String` | 地点名称 |
| `longitude` | `BigDecimal` | 经度 |
| `latitude` | `BigDecimal` | 纬度 |
| `sortOrder` | `Integer` | 排序 |

**响应** `Result<Void>`

### 📌 `POST` /admin/product/item/{id}/itinerary/day — Step2 增加一天

> 在行程末尾追加一天，自动编号。返回新天的dayId。

**参数**

  - `{id}` (`Long`) — 路径参数

**响应** `Result<Long>`

### 📌 `DELETE` /admin/product/item/{id}/itinerary/day/{dayNumber} — Step2 删除一天

> 删除指定天序号的行程天，级联删除节点+住宿+路线点，后续天序号自动-1。

**参数**

  - `{id}` (`Long`) — 路径参数
  - `{dayNumber}` (`Integer`) — 路径参数

**响应** `Result<Void>`

### 📌 `PUT` /admin/product/item/{id}/route — Step3 路线与备品保存

> 保存路线总览(1:1)+备品清单(1:N)+额外成本项(1:N)。备品和成本项支持增删改。

**参数**

  - `{id}` (`Long`) — 路径参数

**请求体** `ProductRouteSaveReqVO`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `routeMapUrl` | `String` | 路线图URL(手动上传) |
| `totalMileage` | `BigDecimal` | 总里程(km) |
| `routeDescription` | `String` | 线路描述 |
| `supplies` | `List<SuppliesItem>` | 备品列表 |
| `extraCosts` | `List<FeeItem>` | 额外成本项列表 |
| `id` | `Long` | 备品ID(已有则传，新增不传) |
| `suppliesResourceId` | `Long` | 备品资源ID(可空=自定义) |
| `suppliesName` | `String` | 备品名称 |
| `category` | `String` | 分类 |
| `hasCost` | `Boolean` | 是否涉及成本 |
| `billingType` | `String` | 计费方式(PER_PERSON/PER_QUANTITY) |
| `unitPrice` | `BigDecimal` | 单价 |
| `quantity` | `Integer` | 数量 |
| `sortOrder` | `Integer` | 排序 |
| `id` | `Long` | 费用项ID(已有则传，新增不传) |
| `resourceType` | `String` | 资源类型 |
| `resourceId` | `Long` | 资源ID |
| `costItemId` | `Long` | 费用项ID |
| `name` | `String` | 名称 |
| `description` | `String` | 说明 |
| `unitPrice` | `BigDecimal` | 单价 |
| `quantity` | `Integer` | 数量 |
| `daily` | `Boolean` | 是否按天计费 |
| `sortOrder` | `Integer` | 排序 |

**响应** `Result<Void>`

### 📌 `GET` /admin/product/item/{id}/price-calendar — Step4 查询价格日历

> 按月份查询价格日历。

**参数**

  - `{id}` (`Long`) — 路径参数

**响应** `Result<List<ProductPriceCalendarDO>>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `id` | `Long` |  |
| `productId` | `Long` |  |
| `tierSeq` | `Integer` |  |
| `rangeId` | `Long` |  |
| `date` | `LocalDate` |  |
| `priceType` | `String` |  |
| `adultSellPrice` | `BigDecimal` |  |
| `childSellPrice` | `BigDecimal` |  |
| `toddlerDiscount` | `BigDecimal` |  |
| `infantPrice` | `BigDecimal` |  |
| `dailyStock` | `Integer` |  |
| `sold` | `Integer` |  |

### 📌 `GET` /admin/product/item/{id}/schedule/list — Step4 班期列表

> 查询产品下所有班期。

**参数**

  - `{id}` (`Long`) — 路径参数

**响应** `Result<List<GroupTourBatchDO>>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `batchId` | `Long` |  |
| `productId` | `Long` |  |
| `batchNo` | `String` |  |
| `batchLabel` | `String` |  |
| `batchName` | `String` |  |
| `productStockLimit` | `Integer` |  |
| `adultPrice` | `BigDecimal` |  |
| `childPrice` | `BigDecimal` |  |
| `toddlerDiscount` | `BigDecimal` |  |
| `infantPrice` | `BigDecimal` |  |
| `departureDate` | `LocalDate` |  |
| `endDate` | `LocalDate` |  |
| `enrollmentDeadline` | `LocalDate` |  |
| `maxParticipants` | `Integer` |  |
| `enrolledCount` | `Integer` |  |
| `maxRooms` | `Integer` |  |
| `bookedRooms` | `Integer` |  |
| `batchStatus` | `String` |  |
| `sortOrder` | `Integer` |  |
| `remark` | `String` |  |
| `version` | `Integer` |  |

### 📌 `POST` /admin/product/item/{id}/price-calendar/batch — Step4 价格日历批量设置

> 按日期范围+档位批量设置价格（UPSERT）。已上架产品用priceVersion，草稿用version。

**参数**

  - `{id}` (`Long`) — 路径参数

**请求体** `PriceCalendarBatchReqVO`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `startDate` | `LocalDate` | 开始日期 |
| `endDate` | `LocalDate` | 结束日期 |
| `tierSeq` | `Integer` | 档位序号(默认1) |
| `priceType` | `String` | 价格类型(字典price_type: NORMAL=平日, PEAK=旺季, HOLIDAY=节假日, SPECIAL=特价) |
| `adultSellPrice` | `BigDecimal` | 成人售价 |
| `childSellPrice` | `BigDecimal` | 儿童售价 |
| `toddlerDiscount` | `BigDecimal` | 小童优惠额(负数) |
| `infantPrice` | `BigDecimal` | 幼童售价(0=免费) |
| `dailyStock` | `Integer` | 每日库存上限(NULL=不限量) |

**响应** `Result<Void>`

### 📌 `DELETE` /admin/product/item/{id}/price-calendar — Step4 价格日历删除

> 按日期范围+档位删除价格日历（物理删除）。

**参数**

  - `{id}` (`Long`) — 路径参数

**请求体** `PriceCalendarBatchReqVO`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `startDate` | `LocalDate` | 开始日期 |
| `endDate` | `LocalDate` | 结束日期 |
| `tierSeq` | `Integer` | 档位序号(默认1) |
| `priceType` | `String` | 价格类型(字典price_type: NORMAL=平日, PEAK=旺季, HOLIDAY=节假日, SPECIAL=特价) |
| `adultSellPrice` | `BigDecimal` | 成人售价 |
| `childSellPrice` | `BigDecimal` | 儿童售价 |
| `toddlerDiscount` | `BigDecimal` | 小童优惠额(负数) |
| `infantPrice` | `BigDecimal` | 幼童售价(0=免费) |
| `dailyStock` | `Integer` | 每日库存上限(NULL=不限量) |

**响应** `Result<Void>`

### 📌 `POST` /admin/product/item/{id}/schedule — Step4 创建班期

> 创建新班期，batchId不传。自动生成班期编号、计算结束日期和报名截止日。

**参数**

  - `{id}` (`Long`) — 路径参数

**请求体** `ScheduleSaveReqVO`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `batchId` | `Long` | 班期ID(修改时传) |
| `batchName` | `String` | 班期名称 |
| `departureDate` | `LocalDate` | 出发日期 |
| `enrollmentDeadline` | `LocalDate` | 报名截止日(默认出发前1天) |
| `adultPrice` | `BigDecimal` | 成人价 |
| `childPrice` | `BigDecimal` | 儿童价 |
| `toddlerDiscount` | `BigDecimal` | 小童优惠额(负数) |
| `infantPrice` | `BigDecimal` | 幼童价 |
| `maxParticipants` | `Integer` | 最大参与人数 |
| `maxRooms` | `Integer` | 总房间数(0=不限) |
| `productStockLimit` | `Integer` | 产品库存上限 |
| `remark` | `String` | 备注 |

**响应** `Result<Long>`

### 📌 `DELETE` /admin/product/item/{id}/schedule/{scheduleId} — Step4 删除班期

> 删除班期（已有报名订单不允许删除）。

**参数**

  - `{id}` (`Long`) — 路径参数
  - `{scheduleId}` (`Long`) — 路径参数

**响应** `Result<Void>`

### 📌 `PUT` /admin/product/item/{id}/schedule — Step4 修改班期

> 修改已有班期，batchId在body中传。

**参数**

  - `{id}` (`Long`) — 路径参数

**请求体** `ScheduleSaveReqVO`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `batchId` | `Long` | 班期ID(修改时传) |
| `batchName` | `String` | 班期名称 |
| `departureDate` | `LocalDate` | 出发日期 |
| `enrollmentDeadline` | `LocalDate` | 报名截止日(默认出发前1天) |
| `adultPrice` | `BigDecimal` | 成人价 |
| `childPrice` | `BigDecimal` | 儿童价 |
| `toddlerDiscount` | `BigDecimal` | 小童优惠额(负数) |
| `infantPrice` | `BigDecimal` | 幼童价 |
| `maxParticipants` | `Integer` | 最大参与人数 |
| `maxRooms` | `Integer` | 总房间数(0=不限) |
| `productStockLimit` | `Integer` | 产品库存上限 |
| `remark` | `String` | 备注 |

**响应** `Result<Long>`

### 📌 `POST` /admin/product/item/{id}/schedule/batch-create — Step4 班期批量创建

> 按重复模式批量创建班期（最多52个，跨度≤12个月）。

**参数**

  - `{id}` (`Long`) — 路径参数

**请求体** `ScheduleBatchCreateReqVO`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `startDate` | `LocalDate` | 开始日期 |
| `endDate` | `LocalDate` | 结束日期 |
| `repeatMode` | `String` | 重复模式(WEEKLY/BIWEEKLY/MONTHLY) |
| `dayOfWeek` | `Integer` | 星期几(1=周一...7=周日) |
| `adultPrice` | `BigDecimal` | 成人价 |
| `childPrice` | `BigDecimal` | 儿童价 |
| `maxParticipants` | `Integer` | 最大参与人数 |
| `maxRooms` | `Integer` | 总房间数 |

**响应** `Result<Integer>`

### 📌 `POST` /admin/product/item/{id}/schedule/{scheduleId}/cancel — Step4 取消班期

> 取消班期（有报名订单则标记为CANCELLING触发退款，无订单直接CANCELLED）。

**参数**

  - `{id}` (`Long`) — 路径参数
  - `{scheduleId}` (`Long`) — 路径参数

**响应** `Result<Void>`

### 📌 `GET` /admin/product/item/{id}/schedule/team — 班期团队查询

> 查询指定班期的团队成员列表。

**参数**

  - `{id}` (`Long`) — 路径参数

**响应** `Result<List<GroupBatchStaffDO>>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `id` | `Long` |  |
| `batchId` | `Long` |  |
| `productId` | `Long` |  |
| `staffId` | `Long` |  |
| `staffRole` | `String` |  |
| `staffName` | `String` |  |
| `staffPhone` | `String` |  |
| `remark` | `String` |  |
| `sortOrder` | `Integer` |  |

### 📌 `PUT` /admin/product/item/{id}/schedule/team — 班期团队保存

> 全量保存班期团队成员（全删全插策略，每次传完整列表）。

**参数**

  - `{id}` (`Long`) — 路径参数

**请求体** `ScheduleTeamSaveReqVO`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `staffList` | `List<StaffItem>` | 团队成员列表 |
| `staffId` | `Long` | 员工ID |
| `staffRole` | `String` | 员工角色 |
| `staffName` | `String` | 员工名称 |
| `staffPhone` | `String` | 员工电话 |
| `remark` | `String` | 备注 |
| `sortOrder` | `Integer` | 排序 |

**响应** `Result<Void>`

### 📌 `GET` /admin/product/item/{id}/suggest-price — 建议售价

> 根据出发日期+档位，汇总行程天数内价格日历单价+备品+额外成本，返回成人/儿童建议售价。

**参数**

  - `{id}` (`Long`) — 路径参数
  - `departureDate` (`String`) — 查询参数
  - `tierSeq` (`Integer`) — 查询参数

**响应** `Result<Map<String, Object>>`

### 📌 `POST` /admin/product/item/{id}/quote — 报价计算

> 根据出发日期+人数+档位计算总价，返回每日明细。

**参数**

  - `{id}` (`Long`) — 路径参数

**请求体** `QuoteReqVO`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `departureDate` | `LocalDate` | 出发日期 |
| `adultCount` | `Integer` | 成人数 |
| `batchId` | `Long` | 班期ID(小蒙马用) |

**响应** `Result<QuoteResultVO>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `totalAdultPrice` | `BigDecimal` | 成人总价 |
| `totalChildPrice` | `BigDecimal` | 儿童总价 |
| `grandTotal` | `BigDecimal` | 总价合计 |
| `dailyDetails` | `List<DailyDetail>` | 每日价格明细 |
| `date` | `String` | 日期 |
| `adultPrice` | `BigDecimal` | 成人日价 |
| `childPrice` | `BigDecimal` | 儿童日价 |

### 📌 `PUT` /admin/product/item/{id}/supplement — Step5 补充信息保存

> 保存费用包含/不含/自定义项+人群优惠+补充配置（退改/车辆/保险/卖点等）。

**参数**

  - `{id}` (`Long`) — 路径参数

**请求体** `ProductSupplementSaveReqVO`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `includedFees` | `List<FeeItem>` | 费用包含列表 |
| `excludedFees` | `List<FeeItem>` | 费用不含列表 |
| `customFees` | `List<FeeItem>` | 自定义费用列表 |
| `feeIgnoredTypes` | `List<String>` | 费用推导已忽略类型 |
| `childTicket` | `String` | 儿童门票优惠(FREE/HALF_PRICE/FULL_PRICE) |
| `childAccommodation` | `String` | 儿童住宿(BED/NO_BED) |
| `childMeal` | `String` | 儿童餐饮(FULL/HALF) |
| `elderTicket` | `String` | 老人门票优惠 |
| `elderAccommodation` | `String` | 老人住宿 |
| `crowdBenefitTips` | `String` | 人群优惠温馨提示 |
| `vehicleModelIds` | `List<Long>` | 展示车型ID列表 |
| `vehicleRuleText` | `String` | 用车规则说明 |
| `refundPolicyIds` | `Object` | 退改政策映射 |
| `bookingTermsId` | `Long` | 预订条款ID |
| `warmTipsId` | `Long` | 温馨提示ID |
| `equipmentAdvice` | `String` | 装备建议(富文本) |
| `insuranceNotice` | `String` | 保险告知(INCLUDED/EXCLUDED/OPTIONAL) |
| `insuranceSchemeId` | `Long` | 保险方案ID |
| `contractSchemeId` | `Long` | 合同方案ID |
| `quickUnderstand` | `Object` | 快速理解 |
| `childExperience` | `Object` | 孩子经历 |
| `growthGains` | `List<Object>` | 成长收获 |
| `id` | `Long` | 费用项ID(已有则传) |
| `feeType` | `String` | 费用类型 |
| `source` | `String` | 来源(AUTO/MANUAL) |
| `name` | `String` | 名称 |
| `description` | `String` | 说明 |
| `unitPrice` | `BigDecimal` | 单价(自定义费用) |
| `unit` | `String` | 单位(自定义费用) |
| `sortOrder` | `Integer` | 排序 |

**响应** `Result<Void>`

### 📌 `GET` /admin/product/item/{id}/calculate-mileage — 计算行程总里程

> 根据行程途经点坐标调用高德驾车路线规划API自动计算总驾驶里程(km)。需先保存行程(Step2)。

**参数**

  - `{id}` (`Long`) — 路径参数

**响应** `Result<BigDecimal>`

### 📌 `GET` /admin/product/item/{id}/suggest-price — 计算建议售价

> 根据备品成本+额外成本计算建议售价。如有激活的公式组则通过公式引擎计算。返回成人/儿童单价及成本明细。

**参数**

  - `{id}` (`Long`) — 路径参数

**响应** `Result<SuggestPriceRespVO>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `adultSuggestPrice` | `BigDecimal` | 成人建议售价(单人) |
| `childSuggestPrice` | `BigDecimal` | 儿童建议售价(单人) |
| `adultCost` | `CostBreakdown` | 成人成本明细 |
| `childCost` | `CostBreakdown` | 儿童成本明细 |
| `formulaApplied` | `Boolean` | 是否使用了公式引擎 |
| `suppliesCost` | `BigDecimal` | 备品成本(按人头) |
| `extraCost` | `BigDecimal` | 额外成本 |
| `totalCost` | `BigDecimal` | 成本合计 |
| `suppliesItems` | `List<CostItem>` | 备品明细 |
| `extraItems` | `List<CostItem>` | 额外成本明细 |
| `name` | `String` | 名称 |
| `unitPrice` | `BigDecimal` | 单价 |
| `quantity` | `Integer` | 数量 |
| `subtotal` | `BigDecimal` | 小计 |

### 📌 `GET` /admin/product/item/{id} — 产品详情

> 聚合全部5步数据（主表+基础+行程+路线+价格+补充），用于编辑页回显。

**参数**

  - `{id}` (`Long`) — 路径参数

**响应** `Result<ProductDetailRespVO>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `productNo` | `String` | 产品编号 |
| `productType` | `String` | 产品类型 |
| `category` | `String` | 产品分类(字典product_category) |
| `status` | `String` | 产品状态 |
| `currentStep` | `Integer` | 当前步骤进度（1=基础信息, 2=行程编排, 3=路线与备品, 4=定价管理, 5=补充信息） |
| `createdBy` | `Long` | 创建人ID |
| `publishedAt` | `LocalDateTime` | 上架时间 |
| `createTime` | `LocalDateTime` | 创建时间 |
| `name` | `String` | 产品名称 |
| `subtitle` | `String` | 副标题 |
| `introduction` | `String` | 产品简介 |
| `lineId` | `Long` | 产品线ID |
| `tripDays` | `Integer` | 行程天数 |
| `tripNights` | `Integer` | 行程晚数 |
| `coverImageUrl` | `String` | 封面图 |
| `tiers` | `Object` | 档位列表 |
| `seasons` | `Object` | 产品季节 |
| `tags` | `Object` | 产品标签 |
| `carouselImages` | `Object` | 轮播图 |
| `isBooking` | `Boolean` | 是否预约产品 |
| `paymentType` | `String` | 支付方式 |
| `depositRatio` | `Integer` | 订金比例 |
| `depositAmount` | `BigDecimal` | 订金固定额 |
| `balanceDueDays` | `Integer` | 尾款截止天数 |
| `defaultDailyStock` | `Integer` | 每日库存默认值 |
| `defaultRoomCount` | `Integer` | 默认房间数 |
| `itinerary` | `List<Object>` | 行程天列表 |
| `routeInfo` | `ProductRouteInfoDO` | 路线信息 |
| `supplies` | `List<ProductSuppliesDO>` | 备品列表 |
| `extraCosts` | `List<ProductFeeItemDO>` | 额外成本项 |
| `schedules` | `List<GroupTourBatchDO>` | 班期列表 |
| `includedFees` | `List<ProductFeeItemDO>` | 费用包含 |
| `excludedFees` | `List<ProductFeeItemDO>` | 费用不含 |
| `customFees` | `List<ProductFeeItemDO>` | 自定义费用 |
| `crowdBenefit` | `ProductCrowdBenefitDO` | 人群优惠 |
| `supplement` | `ProductSupplementDO` | 补充配置 |

### 📌 `GET` /admin/product/item/list — 产品分页列表

> 支持按名称关键词/产品类型/产品线/状态筛选。

**响应** `Result<PageResult<ProductListRespVO>>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `productNo` | `String` | 产品编号(如C260409001) |
| `productType` | `String` | 产品类型(字典product_type: CORE=核心产品, GROUP=小蒙马, CUSTOM=私人定制) |
| `category` | `String` | 产品分类(字典product_category) |
| `name` | `String` | 产品名称 |
| `subtitle` | `String` | 副标题 |
| `coverImageUrl` | `String` | 封面图URL |
| `tripDays` | `Integer` | 行程天数 |
| `tripNights` | `Integer` | 行程晚数 |
| `lineId` | `Long` | 产品线ID（前端叫「主题」） |
| `lineName` | `String` | 产品线名称（前端叫「主题名」，从产品线表关联查出） |
| `status` | `String` | 产品状态(字典product_status) |
| `seasons` | `List<String>` | 产品季节(JSON数组，如[\ |
| `tags` | `List<String>` | 产品标签(JSON数组，如[\ |
| `tierCount` | `Integer` | 档位数量（前端叫「规格数」，单一=1，多档=N，未配置=0） |
| `startPrice` | `BigDecimal` | 起步价(已上架产品的最低成人售价，草稿为null) |
| `sortOrder` | `Integer` | 排序号 |
| `createdBy` | `Long` | 创建人ID |
| `createdByName` | `String` | 创建人名称 |
| `publishedAt` | `LocalDateTime` | 上架时间 |
| `createTime` | `LocalDateTime` | 创建时间 |
| `updateTime` | `LocalDateTime` | 更新时间 |

### 📌 `DELETE` /admin/product/item/{id} — 删除产品

> 级联删除产品+全部子表。仅草稿/已驳回/已下架/已完成状态可删，已上架/待审核需先下架。

**参数**

  - `{id}` (`Long`) — 路径参数

**响应** `Result<Void>`

### 📌 `GET` /admin/product/item/{id}/operation-logs — 产品操作记录

> 查询产品的全部操作记录（按时间倒序），审计保留不随产品删除。

**参数**

  - `{id}` (`Long`) — 路径参数

**响应** `Result<List<ProductOperationLogRespVO>>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `id` | `Long` | 记录ID |
| `action` | `String` | 操作类型 |
| `detail` | `String` | 详情/驳回原因 |
| `step` | `String` | 步骤号 |
| `operatorId` | `Long` | 操作人ID |
| `operatorName` | `String` | 操作人名称 |
| `createTime` | `LocalDateTime` | 操作时间 |

### 📌 `POST` /admin/product/item/{id}/action — 产品状态变更

> 通过COLA状态机驱动状态流转。

**参数**

  - `{id}` (`Long`) — 路径参数

**请求体** `ProductActionReqVO`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `action` | `String` | 操作动作(SUBMIT_PUBLISH/WITHDRAW/DIRECT_PUBLISH/UNPUBLISH/FORCE_UNPUBLISH/COMPLETE) |
| `remark` | `String` | 备注/驳回原因(可选) |

**响应** `Result<Void>`

### 📌 `POST` /admin/product/item/{id}/copy — 复制产品

> 深拷贝产品+全部子表（主表+6张1:1/1:N子表+行程数据），新产品为草稿状态。返回新产品ID。

**参数**

  - `{id}` (`Long`) — 路径参数

**响应** `Result<Long>`

### 📌 `PUT` /admin/product/item/{id}/transfer — 转让产品

> 更换产品创建人（仅超管可操作）。

**参数**

  - `{id}` (`Long`) — 路径参数

**请求体** `ProductTransferReqVO`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `newCreatorId` | `Long` | 新创建人ID |

**响应** `Result<Void>`

### 📌 `GET` /admin/product/item/{id}/validate-publish — 上架预检

> 5级校验：L1基础字段→L2内容完整→L3定价→L4条款→L5资源。返回问题列表，空=全部通过。

**参数**

  - `{id}` (`Long`) — 路径参数

**响应** `Result<List<String>>`

### 📌 `GET` /admin/product/item/{id}/fee-deduction-preview — 费用推导预览

> 根据行程节点类型自动推导费用包含项（景区→门票，酒店→住宿等），排除已忽略类型。

**参数**

  - `{id}` (`Long`) — 路径参数

**响应** `Result<List<FeeDeductionPreviewVO>>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `feeType` | `String` | 费用类型标签 |
| `name` | `String` | 费用名称 |
| `source` | `String` | 来源（AUTO=自动推导） |
| `sourceNodeName` | `String` | 来源节点名称 |

### 🆕 新增: AdminProductLine

### 📌 `POST` /admin/product/line — 创建/修改产品线

**请求体** `ProductLineSaveReqVO`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `lineId` | `Long` | 产品线ID(修改时传) |
| `name` | `String` | 名称 |
| `productType` | `String` | 绑定产品类型 |
| `description` | `String` | 描述 |
| `seasons` | `List<String>` | 适用季节 |
| `tags` | `List<String>` | 标签 |
| `coverImageUrl` | `String` | 封面图 |
| `sortOrder` | `Integer` | 排序 |
| `status` | `String` | 状态(ACTIVE/INACTIVE) |

**响应** `Result<Long>`

### 📌 `GET` /admin/product/line/{id} — 产品线详情

**参数**

  - `{id}` (`Long`) — 路径参数

**响应** `Result<ProductLineRespVO>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `lineId` | `Long` | 产品线ID |
| `name` | `String` | 产品线名称 |
| `productType` | `String` | 绑定产品类型 |
| `description` | `String` | 描述 |
| `seasons` | `List<String>` | 适用季节 |
| `tags` | `List<String>` | 产品线标签 |
| `coverImageUrl` | `String` | 封面图 |
| `sortOrder` | `Integer` | 排序 |
| `status` | `String` | 状态 |
| `productCount` | `Long` | 产品数量 |
| `createdBy` | `Long` | 创建人ID |
| `createTime` | `LocalDateTime` | 创建时间 |

### 📌 `GET` /admin/product/line/list — 产品线分页列表

**响应** `Result<PageResult<ProductLineRespVO>>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `lineId` | `Long` | 产品线ID |
| `name` | `String` | 产品线名称 |
| `productType` | `String` | 绑定产品类型 |
| `description` | `String` | 描述 |
| `seasons` | `List<String>` | 适用季节 |
| `tags` | `List<String>` | 产品线标签 |
| `coverImageUrl` | `String` | 封面图 |
| `sortOrder` | `Integer` | 排序 |
| `status` | `String` | 状态 |
| `productCount` | `Long` | 产品数量 |
| `createdBy` | `Long` | 创建人ID |
| `createTime` | `LocalDateTime` | 创建时间 |

### 📌 `DELETE` /admin/product/line/{id} — 删除产品线

**参数**

  - `{id}` (`Long`) — 路径参数

**响应** `Result<Void>`

### 📌 `GET` /admin/product/line/simple-list — 产品线下拉选项

**响应** `Result<List<ProductLineDropdownVO>>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `lineId` | `Long` | 产品线ID |
| `name` | `String` | 产品线名称 |

### 🆕 新增: AdminProductTemplate

### 📌 `GET` /admin/product/safety-template/enabled — 安全保障模板下拉

**响应** `Result<List<SafetyTemplateVO>>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `templateId` | `Long` | 模板ID |
| `name` | `String` | 模板名称 |
| `items` | `String` | 具体条目（JSON） |

### 🆕 新增: AdminWarmTips

### 📌 `GET` /admin/product/warm-tips/list — 温馨提示列表

> 返回所有温馨提示（含禁用），按创建时间倒序

**响应** `Result<List<WarmTipsRespVO>>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `tipsId` | `Long` | 温馨提示ID |
| `tipsName` | `String` | 提示名称 |
| `content` | `String` | 提示内容（富文本） |
| `enabled` | `Boolean` | 是否启用 |
| `remark` | `String` | 备注 |
| `createdBy` | `Long` | 创建人ID |
| `createdAt` | `LocalDateTime` | 创建时间 |
| `updatedAt` | `LocalDateTime` | 更新时间 |

### 📌 `GET` /admin/product/warm-tips/enabled — 启用的温馨提示列表

> 仅返回启用状态的提示，供产品设计时选择

**响应** `Result<List<WarmTipsRespVO>>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `tipsId` | `Long` | 温馨提示ID |
| `tipsName` | `String` | 提示名称 |
| `content` | `String` | 提示内容（富文本） |
| `enabled` | `Boolean` | 是否启用 |
| `remark` | `String` | 备注 |
| `createdBy` | `Long` | 创建人ID |
| `createdAt` | `LocalDateTime` | 创建时间 |
| `updatedAt` | `LocalDateTime` | 更新时间 |

### 📌 `GET` /admin/product/warm-tips/{tipsId} — 温馨提示详情

**参数**

  - `{tipsId}` (`Long`) — 路径参数：温馨提示ID

**响应** `Result<WarmTipsRespVO>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `tipsId` | `Long` | 温馨提示ID |
| `tipsName` | `String` | 提示名称 |
| `content` | `String` | 提示内容（富文本） |
| `enabled` | `Boolean` | 是否启用 |
| `remark` | `String` | 备注 |
| `createdBy` | `Long` | 创建人ID |
| `createdAt` | `LocalDateTime` | 创建时间 |
| `updatedAt` | `LocalDateTime` | 更新时间 |

### 📌 `POST` /admin/product/warm-tips — 创建温馨提示

> 创建后默认启用

**请求体** `WarmTipsSaveReqVO`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `tipsName` | `String` | 提示名称 |
| `content` | `String` | 提示内容（富文本） |
| `remark` | `String` | 备注 |

**响应** `Result<WarmTipsRespVO>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `tipsId` | `Long` | 温馨提示ID |
| `tipsName` | `String` | 提示名称 |
| `content` | `String` | 提示内容（富文本） |
| `enabled` | `Boolean` | 是否启用 |
| `remark` | `String` | 备注 |
| `createdBy` | `Long` | 创建人ID |
| `createdAt` | `LocalDateTime` | 创建时间 |
| `updatedAt` | `LocalDateTime` | 更新时间 |

### 📌 `PUT` /admin/product/warm-tips/{tipsId} — 修改温馨提示

**参数**

  - `{tipsId}` (`Long`) — 路径参数：温馨提示ID

**请求体** `WarmTipsSaveReqVO`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `tipsName` | `String` | 提示名称 |
| `content` | `String` | 提示内容（富文本） |
| `remark` | `String` | 备注 |

**响应** `Result<WarmTipsRespVO>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `tipsId` | `Long` | 温馨提示ID |
| `tipsName` | `String` | 提示名称 |
| `content` | `String` | 提示内容（富文本） |
| `enabled` | `Boolean` | 是否启用 |
| `remark` | `String` | 备注 |
| `createdBy` | `Long` | 创建人ID |
| `createdAt` | `LocalDateTime` | 创建时间 |
| `updatedAt` | `LocalDateTime` | 更新时间 |

### 📌 `DELETE` /admin/product/warm-tips/{tipsId} — 删除温馨提示

> 软删除，已绑定的产品不受影响

**参数**

  - `{tipsId}` (`Long`) — 路径参数：温馨提示ID

**响应** `Result<Void>`

### 📌 `PUT` /admin/product/warm-tips/{tipsId}/toggle — 启用/禁用温馨提示

> 禁用后不再出现在产品设计的可选列表中

**参数**

  - `{tipsId}` (`Long`) — 路径参数：温馨提示ID
  - `enabled` (`boolean`) — 查询参数：是否启用

**响应** `Result<Void>`

### 🆕 新增: District

### 📌 `GET` /admin/product/district/search — 搜索行政区划（城市/区县/镇）

> 通过高德地图 API 搜索行政区划，用于产品的出发城市和目的地城市选择。

**参数**

  - `keywords` (`String`) — 查询参数：搜索关键词

### 🆕 新增: Formula

### 📌 `GET` /admin/product/formula/group/list — 公式组列表

> 获取定价公式组列表，可按产品类型筛选。

**参数**

  - `productType` (`String`) — 查询参数

**响应** `Result<List<FormulaGroupRespVO>>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `groupId` | `Long` | 公式组ID |
| `groupCode` | `String` | 公式组编码 |
| `groupName` | `String` | 公式组名称 |
| `productType` | `String` | 适用产品类型 |
| `description` | `String` | 描述 |
| `isActive` | `Boolean` | 是否激活 |
| `version` | `Integer` | 版本号 |
| `createTime` | `LocalDateTime` | 创建时间 |
| `stepCount` | `Integer` | 步骤数量 |

### 📌 `GET` /admin/product/formula/group/{groupId} — 公式组详情

**参数**

  - `{groupId}` (`Long`) — 路径参数

**响应** `Result<FormulaGroupRespVO>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `groupId` | `Long` | 公式组ID |
| `groupCode` | `String` | 公式组编码 |
| `groupName` | `String` | 公式组名称 |
| `productType` | `String` | 适用产品类型 |
| `description` | `String` | 描述 |
| `isActive` | `Boolean` | 是否激活 |
| `version` | `Integer` | 版本号 |
| `createTime` | `LocalDateTime` | 创建时间 |
| `stepCount` | `Integer` | 步骤数量 |

### 📌 `POST` /admin/product/formula/group — 创建公式组

**请求体** `FormulaGroupSaveReqVO`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `groupCode` | `String` | 公式组编码 |
| `groupName` | `String` | 公式组名称 |
| `productType` | `String` | 适用产品类型(字典product_type: CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品) |
| `description` | `String` | 描述 |

**响应** `Result<FormulaGroupRespVO>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `groupId` | `Long` | 公式组ID |
| `groupCode` | `String` | 公式组编码 |
| `groupName` | `String` | 公式组名称 |
| `productType` | `String` | 适用产品类型 |
| `description` | `String` | 描述 |
| `isActive` | `Boolean` | 是否激活 |
| `version` | `Integer` | 版本号 |
| `createTime` | `LocalDateTime` | 创建时间 |
| `stepCount` | `Integer` | 步骤数量 |

### 📌 `PUT` /admin/product/formula/group/{groupId} — 更新公式组

**参数**

  - `{groupId}` (`Long`) — 路径参数

**请求体** `FormulaGroupSaveReqVO`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `groupCode` | `String` | 公式组编码 |
| `groupName` | `String` | 公式组名称 |
| `productType` | `String` | 适用产品类型(字典product_type: CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品) |
| `description` | `String` | 描述 |

**响应** `Result<FormulaGroupRespVO>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `groupId` | `Long` | 公式组ID |
| `groupCode` | `String` | 公式组编码 |
| `groupName` | `String` | 公式组名称 |
| `productType` | `String` | 适用产品类型 |
| `description` | `String` | 描述 |
| `isActive` | `Boolean` | 是否激活 |
| `version` | `Integer` | 版本号 |
| `createTime` | `LocalDateTime` | 创建时间 |
| `stepCount` | `Integer` | 步骤数量 |

### 📌 `PUT` /admin/product/formula/group/{groupId}/activate — 激活公式组

> 激活指定公式组，同时自动停用同产品类型下的其他公式组

**参数**

  - `{groupId}` (`Long`) — 路径参数

**响应** `Result<Void>`

### 📌 `DELETE` /admin/product/formula/group/{groupId} — 删除公式组

> 已激活的公式组不能删除，需先激活其他公式组

**参数**

  - `{groupId}` (`Long`) — 路径参数

**响应** `Result<Void>`

### 📌 `GET` /admin/product/formula/group/{groupId}/steps — 公式步骤列表

> 获取公式组下所有步骤，按执行顺序升序排列

**参数**

  - `{groupId}` (`Long`) — 路径参数

**响应** `Result<List<FormulaStepRespVO>>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `formulaId` | `Long` | 公式ID |
| `groupId` | `Long` | 公式组ID |
| `stepCode` | `String` | 步骤编码 |
| `stepName` | `String` | 步骤名称 |
| `executionOrder` | `Integer` | 执行顺序 |
| `expression` | `String` | 表达式 |
| `outputVar` | `String` | 输出变量名 |
| `inputVars` | `String` | 输入变量(逗号分隔) |
| `description` | `String` | 描述 |
| `isEnabled` | `Boolean` | 是否启用 |
| `createTime` | `LocalDateTime` | 创建时间 |
| `updateTime` | `LocalDateTime` | 更新时间 |

### 📌 `GET` /admin/product/formula/step/{formulaId} — 公式步骤详情

**参数**

  - `{formulaId}` (`Long`) — 路径参数

**响应** `Result<FormulaStepRespVO>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `formulaId` | `Long` | 公式ID |
| `groupId` | `Long` | 公式组ID |
| `stepCode` | `String` | 步骤编码 |
| `stepName` | `String` | 步骤名称 |
| `executionOrder` | `Integer` | 执行顺序 |
| `expression` | `String` | 表达式 |
| `outputVar` | `String` | 输出变量名 |
| `inputVars` | `String` | 输入变量(逗号分隔) |
| `description` | `String` | 描述 |
| `isEnabled` | `Boolean` | 是否启用 |
| `createTime` | `LocalDateTime` | 创建时间 |
| `updateTime` | `LocalDateTime` | 更新时间 |

### 📌 `POST` /admin/product/formula/step — 创建公式步骤

**请求体** `FormulaStepSaveReqVO`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `groupId` | `Long` | 公式组ID |
| `stepCode` | `String` | 步骤编码 |
| `stepName` | `String` | 步骤名称 |
| `executionOrder` | `Integer` | 执行顺序 |
| `expression` | `String` | Aviator表达式（支持数学运算、条件判断、内置函数；可引用前置步骤的输出变量和公式变量表中的变量） |
| `outputVar` | `String` | 输出变量名 |
| `inputVars` | `String` | 输入变量(逗号分隔) |
| `description` | `String` | 描述 |
| `changeNote` | `String` | 变更说明 |

**响应** `Result<FormulaStepRespVO>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `formulaId` | `Long` | 公式ID |
| `groupId` | `Long` | 公式组ID |
| `stepCode` | `String` | 步骤编码 |
| `stepName` | `String` | 步骤名称 |
| `executionOrder` | `Integer` | 执行顺序 |
| `expression` | `String` | 表达式 |
| `outputVar` | `String` | 输出变量名 |
| `inputVars` | `String` | 输入变量(逗号分隔) |
| `description` | `String` | 描述 |
| `isEnabled` | `Boolean` | 是否启用 |
| `createTime` | `LocalDateTime` | 创建时间 |
| `updateTime` | `LocalDateTime` | 更新时间 |

### 📌 `PUT` /admin/product/formula/step/{formulaId} — 更新公式步骤

> 更新时自动保存版本快照，可通过版本历史接口查看和回滚

**参数**

  - `{formulaId}` (`Long`) — 路径参数

**请求体** `FormulaStepSaveReqVO`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `groupId` | `Long` | 公式组ID |
| `stepCode` | `String` | 步骤编码 |
| `stepName` | `String` | 步骤名称 |
| `executionOrder` | `Integer` | 执行顺序 |
| `expression` | `String` | Aviator表达式（支持数学运算、条件判断、内置函数；可引用前置步骤的输出变量和公式变量表中的变量） |
| `outputVar` | `String` | 输出变量名 |
| `inputVars` | `String` | 输入变量(逗号分隔) |
| `description` | `String` | 描述 |
| `changeNote` | `String` | 变更说明 |

**响应** `Result<FormulaStepRespVO>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `formulaId` | `Long` | 公式ID |
| `groupId` | `Long` | 公式组ID |
| `stepCode` | `String` | 步骤编码 |
| `stepName` | `String` | 步骤名称 |
| `executionOrder` | `Integer` | 执行顺序 |
| `expression` | `String` | 表达式 |
| `outputVar` | `String` | 输出变量名 |
| `inputVars` | `String` | 输入变量(逗号分隔) |
| `description` | `String` | 描述 |
| `isEnabled` | `Boolean` | 是否启用 |
| `createTime` | `LocalDateTime` | 创建时间 |
| `updateTime` | `LocalDateTime` | 更新时间 |

### 📌 `PUT` /admin/product/formula/step/{formulaId}/toggle — 启用/禁用公式步骤

**参数**

  - `{formulaId}` (`Long`) — 路径参数

**响应** `Result<Void>`

### 📌 `DELETE` /admin/product/formula/step/{formulaId} — 删除公式步骤

**参数**

  - `{formulaId}` (`Long`) — 路径参数

**响应** `Result<Void>`

### 📌 `GET` /admin/product/formula/step/{formulaId}/versions — 公式步骤版本历史

> 按版本号倒序返回历史版本列表

**参数**

  - `{formulaId}` (`Long`) — 路径参数

**响应** `Result<List<FormulaVersionRespVO>>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `versionId` | `Long` | 版本ID |
| `formulaId` | `Long` | 公式ID |
| `versionNum` | `Integer` | 版本号 |
| `expression` | `String` | 表达式 |
| `changeNote` | `String` | 变更说明 |
| `changedBy` | `Long` | 变更人ID |
| `createTime` | `LocalDateTime` | 创建时间 |

### 📌 `PUT` /admin/product/formula/step/{formulaId}/rollback/{versionNum} — 回滚公式步骤到指定版本

> 回滚前自动备份当前表达式

**参数**

  - `{formulaId}` (`Long`) — 路径参数
  - `{versionNum}` (`Integer`) — 路径参数

**响应** `Result<FormulaStepRespVO>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `formulaId` | `Long` | 公式ID |
| `groupId` | `Long` | 公式组ID |
| `stepCode` | `String` | 步骤编码 |
| `stepName` | `String` | 步骤名称 |
| `executionOrder` | `Integer` | 执行顺序 |
| `expression` | `String` | 表达式 |
| `outputVar` | `String` | 输出变量名 |
| `inputVars` | `String` | 输入变量(逗号分隔) |
| `description` | `String` | 描述 |
| `isEnabled` | `Boolean` | 是否启用 |
| `createTime` | `LocalDateTime` | 创建时间 |
| `updateTime` | `LocalDateTime` | 更新时间 |

### 📌 `POST` /admin/product/formula/test — 测试公式执行

> 使用自定义变量值测试公式组的执行结果，不影响业务数据

**请求体** `FormulaTestReqVO`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `groupId` | `Long` | 公式组ID |
| `variables` | `Map<String, Object>` | 测试变量(变量名->值) |

**响应** `Result<FormulaTestResultVO>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `success` | `Boolean` | 是否成功 |
| `errorMessage` | `String` | 错误信息 |
| `stepResults` | `List<StepResult>` | 各步骤执行结果 |
| `finalVariables` | `Map<String, Object>` | 最终变量表 |
| `totalTimeMs` | `Long` | 总耗时(毫秒) |
| `stepCode` | `String` | 步骤编码 |
| `stepName` | `String` | 步骤名称 |
| `outputVar` | `String` | 输出变量名 |
| `outputValue` | `Object` | 输出值 |
| `expression` | `String` | 表达式 |
| `executionTimeMs` | `Long` | 执行耗时(毫秒) |
| `success` | `Boolean` | 是否成功 |
| `errorMessage` | `String` | 错误信息 |

### 📌 `GET` /admin/product/formula/var/list — 公式变量列表

> 获取公式变量列表，可按变量分类筛选（INPUT/INTERMEDIATE/OUTPUT）

**参数**

  - `category` (`String`) — 查询参数

**响应** `Result<List<FormulaVarRespVO>>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `varId` | `Long` | 变量ID |
| `varName` | `String` | 变量名 |
| `varType` | `String` | 变量类型：DECIMAL/INTEGER/BOOLEAN/STRING |
| `category` | `String` | 变量分类：INPUT/INTERMEDIATE/OUTPUT |
| `description` | `String` | 描述 |
| `defaultValue` | `String` | 默认值 |
| `productTypes` | `List<String>` | 适用产品类型列表 |

### 📌 `POST` /admin/product/formula/var — 创建公式变量

**请求体** `FormulaVarSaveReqVO`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `varName` | `String` | 变量名 |
| `varType` | `String` | 变量类型：DECIMAL/INTEGER/BOOLEAN/STRING |
| `category` | `String` | 变量分类：INPUT/INTERMEDIATE/OUTPUT |
| `description` | `String` | 描述 |
| `defaultValue` | `String` | 默认值 |
| `productTypes` | `List<String>` | 适用产品类型列表 |

**响应** `Result<FormulaVarRespVO>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `varId` | `Long` | 变量ID |
| `varName` | `String` | 变量名 |
| `varType` | `String` | 变量类型：DECIMAL/INTEGER/BOOLEAN/STRING |
| `category` | `String` | 变量分类：INPUT/INTERMEDIATE/OUTPUT |
| `description` | `String` | 描述 |
| `defaultValue` | `String` | 默认值 |
| `productTypes` | `List<String>` | 适用产品类型列表 |

### 📌 `PUT` /admin/product/formula/var/{varId} — 更新公式变量

**参数**

  - `{varId}` (`Long`) — 路径参数

**请求体** `FormulaVarSaveReqVO`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `varName` | `String` | 变量名 |
| `varType` | `String` | 变量类型：DECIMAL/INTEGER/BOOLEAN/STRING |
| `category` | `String` | 变量分类：INPUT/INTERMEDIATE/OUTPUT |
| `description` | `String` | 描述 |
| `defaultValue` | `String` | 默认值 |
| `productTypes` | `List<String>` | 适用产品类型列表 |

**响应** `Result<FormulaVarRespVO>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `varId` | `Long` | 变量ID |
| `varName` | `String` | 变量名 |
| `varType` | `String` | 变量类型：DECIMAL/INTEGER/BOOLEAN/STRING |
| `category` | `String` | 变量分类：INPUT/INTERMEDIATE/OUTPUT |
| `description` | `String` | 描述 |
| `defaultValue` | `String` | 默认值 |
| `productTypes` | `List<String>` | 适用产品类型列表 |

### 📌 `DELETE` /admin/product/formula/var/{varId} — 删除公式变量

> 如果有公式步骤引用了该变量，删除后步骤执行时会报错

**参数**

  - `{varId}` (`Long`) — 路径参数

**响应** `Result<Void>`

### 🆕 新增: MpProduct

### 📌 `GET` /mp/product/{id} — 产品详情

**参数**

  - `{id}` (`Long`) — 路径参数

**响应** `Result<MpProductDetailRespVO>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `productType` | `String` | 产品类型 |
| `name` | `String` | 产品名称 |
| `subtitle` | `String` | 副标题 |
| `introduction` | `String` | 产品简介 |
| `coverImageUrl` | `String` | 封面图 |
| `carouselImages` | `List<String>` | 轮播图 |
| `tripDays` | `Integer` | 行程天数 |
| `tripNights` | `Integer` | 行程晚数 |
| `itinerary` | `List<DayInfo>` | 行程天列表 |
| `includedFees` | `List<FeeInfo>` | 费用包含 |
| `excludedFees` | `List<FeeInfo>` | 费用不含 |
| `crowdBenefit` | `CrowdBenefitInfo` | 人群优惠 |
| `routeMapUrl` | `String` | 路线图URL |
| `dayNumber` | `Integer` | 天序号 |
| `dayTitle` | `String` | 标题 |
| `description` | `String` | 描述 |
| `coverImageUrl` | `String` | 封面图 |
| `breakfast` | `String` | 早餐 |
| `lunch` | `String` | 午餐 |
| `dinner` | `String` | 晚餐 |
| `nodes` | `List<NodeInfo>` | 节点列表 |
| `nodeType` | `String` | 节点类型 |
| `nodeName` | `String` | 节点名称 |
| `startTime` | `String` | 开始时间 |
| `durationMinutes` | `Integer` | 时长(分钟) |
| `description` | `String` | 描述 |
| `childTicket` | `String` | 儿童门票 |
| `childAccommodation` | `String` | 儿童住宿 |
| `childMeal` | `String` | 儿童餐饮 |
| `elderTicket` | `String` | 老人门票 |
| `tips` | `String` | 温馨提示 |
| `name` | `String` | 名称 |
| `description` | `String` | 说明 |

### 📌 `GET` /mp/product/{id}/price-calendar — 价格日历

**参数**

  - `{id}` (`Long`) — 路径参数

**响应** `Result<MpPriceCalendarRespVO>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `days` | `List<CalendarDay>` | 日历列表 |
| `date` | `String` | 日期(yyyy-MM-dd) |
| `priceType` | `String` | 价格类型 |
| `adultPrice` | `BigDecimal` | 成人售价 |
| `childPrice` | `BigDecimal` | 儿童售价 |
| `isSelectable` | `Boolean` | 是否可选(有库存且未过期) |
| `remainStock` | `Integer` | 剩余库存(NULL=不限量) |

### 📌 `GET` /mp/product/{id}/schedules — 班期列表

**参数**

  - `{id}` (`Long`) — 路径参数

**响应** `Result<List<GroupTourBatchDO>>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `batchId` | `Long` |  |
| `productId` | `Long` |  |
| `batchNo` | `String` |  |
| `batchLabel` | `String` |  |
| `batchName` | `String` |  |
| `productStockLimit` | `Integer` |  |
| `adultPrice` | `BigDecimal` |  |
| `childPrice` | `BigDecimal` |  |
| `toddlerDiscount` | `BigDecimal` |  |
| `infantPrice` | `BigDecimal` |  |
| `departureDate` | `LocalDate` |  |
| `endDate` | `LocalDate` |  |
| `enrollmentDeadline` | `LocalDate` |  |
| `maxParticipants` | `Integer` |  |
| `enrolledCount` | `Integer` |  |
| `maxRooms` | `Integer` |  |
| `bookedRooms` | `Integer` |  |
| `batchStatus` | `String` |  |
| `sortOrder` | `Integer` |  |
| `remark` | `String` |  |
| `version` | `Integer` |  |

### 📌 `POST` /mp/product/{id}/quote — C端报价

**参数**

  - `{id}` (`Long`) — 路径参数

**请求体** `QuoteReqVO`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `departureDate` | `LocalDate` | 出发日期 |
| `adultCount` | `Integer` | 成人数 |
| `batchId` | `Long` | 班期ID(小蒙马用) |

**响应** `Result<QuoteResultVO>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `totalAdultPrice` | `BigDecimal` | 成人总价 |
| `totalChildPrice` | `BigDecimal` | 儿童总价 |
| `grandTotal` | `BigDecimal` | 总价合计 |
| `dailyDetails` | `List<DailyDetail>` | 每日价格明细 |
| `date` | `String` | 日期 |
| `adultPrice` | `BigDecimal` | 成人日价 |
| `childPrice` | `BigDecimal` | 儿童日价 |

### 📌 `GET` /mp/product/compare — 产品对比

**参数**

  - `ids` (`String`) — 查询参数

**响应** `Result<List<MpProductDetailRespVO>>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `productType` | `String` | 产品类型 |
| `name` | `String` | 产品名称 |
| `subtitle` | `String` | 副标题 |
| `introduction` | `String` | 产品简介 |
| `coverImageUrl` | `String` | 封面图 |
| `carouselImages` | `List<String>` | 轮播图 |
| `tripDays` | `Integer` | 行程天数 |
| `tripNights` | `Integer` | 行程晚数 |
| `itinerary` | `List<DayInfo>` | 行程天列表 |
| `includedFees` | `List<FeeInfo>` | 费用包含 |
| `excludedFees` | `List<FeeInfo>` | 费用不含 |
| `crowdBenefit` | `CrowdBenefitInfo` | 人群优惠 |
| `routeMapUrl` | `String` | 路线图URL |
| `dayNumber` | `Integer` | 天序号 |
| `dayTitle` | `String` | 标题 |
| `description` | `String` | 描述 |
| `coverImageUrl` | `String` | 封面图 |
| `breakfast` | `String` | 早餐 |
| `lunch` | `String` | 午餐 |
| `dinner` | `String` | 晚餐 |
| `nodes` | `List<NodeInfo>` | 节点列表 |
| `nodeType` | `String` | 节点类型 |
| `nodeName` | `String` | 节点名称 |
| `startTime` | `String` | 开始时间 |
| `durationMinutes` | `Integer` | 时长(分钟) |
| `description` | `String` | 描述 |
| `childTicket` | `String` | 儿童门票 |
| `childAccommodation` | `String` | 儿童住宿 |
| `childMeal` | `String` | 儿童餐饮 |
| `elderTicket` | `String` | 老人门票 |
| `tips` | `String` | 温馨提示 |
| `name` | `String` | 名称 |
| `description` | `String` | 说明 |

### 📌 `GET` /mp/product/{id}/tier-compare — 档位对比

**参数**

  - `{id}` (`Long`) — 路径参数

**响应** `Result<Map<Integer, List<ProductDayHotelDO>>>`

### 🆕 新增: MpProductLine

### 📌 `GET` /mp/product-line/list — 产品线列表

**参数**

  - `season` (`String`) — 查询参数

**响应** `Result<List<ProductLineDropdownVO>>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `lineId` | `Long` | 产品线ID |
| `name` | `String` | 产品线名称 |

### 📌 `GET` /mp/product-line/{lineId}/products — 产品线下产品列表

**参数**

  - `{lineId}` (`Long`) — 路径参数

**响应** `Result<List<MpProductListRespVO>>`

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `productType` | `String` | 产品类型(CORE/GROUP/CUSTOM) |
| `name` | `String` | 产品名称 |
| `subtitle` | `String` | 副标题（一句话卖点） |
| `coverImageUrl` | `String` | 封面图URL |
| `tripDays` | `Integer` | 行程天数 |
| `tripNights` | `Integer` | 行程晚数 |
| `lineName` | `String` | 产品线名称（前端叫「主题名」） |
| `tags` | `List<String>` | 产品标签(如[\ |
| `seasons` | `List<String>` | 产品季节(如[\ |
| `startPrice` | `BigDecimal` | 起步价(¥X起，最低成人售价) |
| `startPriceLabel` | `String` | 起步价展示文案(如\ |
| `paymentType` | `String` | 支付方式(FULL=全款, DEPOSIT=订金) |
| `tierCount` | `Integer` | 规格数量（前端叫「规格数」，单一=1，多档=N） |
| `sortOrder` | `Integer` | 排序号 |

### ❌ 删除: AdminBookingTerms

| 方法 | 路径 | 接口名称 |
| --- | --- | --- |
| ~~`GET`~~ | ~~`/admin/product/booking-terms/list`~~ | ~~预订条款列表~~ |
| ~~`GET`~~ | ~~`/admin/product/booking-terms/enabled`~~ | ~~启用的预订条款列表~~ |
| ~~`GET`~~ | ~~`/admin/product/booking-terms/{termsId}`~~ | ~~预订条款详情~~ |
| ~~`POST`~~ | ~~`/admin/product/booking-terms`~~ | ~~创建预订条款~~ |
| ~~`PUT`~~ | ~~`/admin/product/booking-terms/{termsId}`~~ | ~~修改预订条款~~ |
| ~~`DELETE`~~ | ~~`/admin/product/booking-terms/{termsId}`~~ | ~~删除预订条款~~ |
| ~~`PUT`~~ | ~~`/admin/product/booking-terms/{termsId}/toggle`~~ | ~~启用/禁用预订条款~~ |

### ❌ 删除: AdminProductLine

| 方法 | 路径 | 接口名称 |
| --- | --- | --- |
| ~~`POST`~~ | ~~`/admin/product/line`~~ | ~~创建/修改产品线~~ |
| ~~`GET`~~ | ~~`/admin/product/line/{id}`~~ | ~~产品线详情~~ |
| ~~`GET`~~ | ~~`/admin/product/line/list`~~ | ~~产品线分页列表~~ |
| ~~`DELETE`~~ | ~~`/admin/product/line/{id}`~~ | ~~删除产品线~~ |
| ~~`GET`~~ | ~~`/admin/product/line/simple-list`~~ | ~~产品线下拉选项~~ |

### ❌ 删除: AdminProductTemplate

| 方法 | 路径 | 接口名称 |
| --- | --- | --- |
| ~~`GET`~~ | ~~`/admin/product/safety-template/enabled`~~ | ~~安全保障模板下拉~~ |

### ❌ 删除: AdminWarmTips

| 方法 | 路径 | 接口名称 |
| --- | --- | --- |
| ~~`GET`~~ | ~~`/admin/product/warm-tips/list`~~ | ~~温馨提示列表~~ |
| ~~`GET`~~ | ~~`/admin/product/warm-tips/enabled`~~ | ~~启用的温馨提示列表~~ |
| ~~`GET`~~ | ~~`/admin/product/warm-tips/{tipsId}`~~ | ~~温馨提示详情~~ |
| ~~`POST`~~ | ~~`/admin/product/warm-tips`~~ | ~~创建温馨提示~~ |
| ~~`PUT`~~ | ~~`/admin/product/warm-tips/{tipsId}`~~ | ~~修改温馨提示~~ |
| ~~`DELETE`~~ | ~~`/admin/product/warm-tips/{tipsId}`~~ | ~~删除温馨提示~~ |
| ~~`PUT`~~ | ~~`/admin/product/warm-tips/{tipsId}/toggle`~~ | ~~启用/禁用温馨提示~~ |

### ❌ 删除: District

| 方法 | 路径 | 接口名称 |
| --- | --- | --- |
| ~~`GET`~~ | ~~`/admin/product/district/search`~~ | ~~搜索行政区划（城市/区县/镇）~~ |

### ❌ 删除: Formula

| 方法 | 路径 | 接口名称 |
| --- | --- | --- |
| ~~`GET`~~ | ~~`/admin/product/formula/group/list`~~ | ~~公式组列表~~ |
| ~~`GET`~~ | ~~`/admin/product/formula/group/{groupId}`~~ | ~~公式组详情~~ |
| ~~`POST`~~ | ~~`/admin/product/formula/group`~~ | ~~创建公式组~~ |
| ~~`PUT`~~ | ~~`/admin/product/formula/group/{groupId}`~~ | ~~更新公式组~~ |
| ~~`PUT`~~ | ~~`/admin/product/formula/group/{groupId}/activate`~~ | ~~激活公式组~~ |
| ~~`DELETE`~~ | ~~`/admin/product/formula/group/{groupId}`~~ | ~~删除公式组~~ |
| ~~`GET`~~ | ~~`/admin/product/formula/group/{groupId}/steps`~~ | ~~公式步骤列表~~ |
| ~~`GET`~~ | ~~`/admin/product/formula/step/{formulaId}`~~ | ~~公式步骤详情~~ |
| ~~`POST`~~ | ~~`/admin/product/formula/step`~~ | ~~创建公式步骤~~ |
| ~~`PUT`~~ | ~~`/admin/product/formula/step/{formulaId}`~~ | ~~更新公式步骤~~ |
| ~~`PUT`~~ | ~~`/admin/product/formula/step/{formulaId}/toggle`~~ | ~~启用/禁用公式步骤~~ |
| ~~`DELETE`~~ | ~~`/admin/product/formula/step/{formulaId}`~~ | ~~删除公式步骤~~ |
| ~~`GET`~~ | ~~`/admin/product/formula/step/{formulaId}/versions`~~ | ~~公式步骤版本历史~~ |
| ~~`PUT`~~ | ~~`/admin/product/formula/step/{formulaId}/rollback/{versionNum}`~~ | ~~回滚公式步骤到指定版本~~ |
| ~~`POST`~~ | ~~`/admin/product/formula/test`~~ | ~~测试公式执行~~ |
| ~~`GET`~~ | ~~`/admin/product/formula/var/list`~~ | ~~公式变量列表~~ |
| ~~`POST`~~ | ~~`/admin/product/formula/var`~~ | ~~创建公式变量~~ |
| ~~`PUT`~~ | ~~`/admin/product/formula/var/{varId}`~~ | ~~更新公式变量~~ |
| ~~`DELETE`~~ | ~~`/admin/product/formula/var/{varId}`~~ | ~~删除公式变量~~ |

### ❌ 删除: MpProduct

| 方法 | 路径 | 接口名称 |
| --- | --- | --- |
| ~~`GET`~~ | ~~`/mp/product/{id}`~~ | ~~产品详情~~ |
| ~~`GET`~~ | ~~`/mp/product/{id}/price-calendar`~~ | ~~价格日历~~ |
| ~~`GET`~~ | ~~`/mp/product/{id}/schedules`~~ | ~~班期列表~~ |
| ~~`POST`~~ | ~~`/mp/product/{id}/quote`~~ | ~~C端报价~~ |
| ~~`GET`~~ | ~~`/mp/product/compare`~~ | ~~产品对比~~ |
| ~~`GET`~~ | ~~`/mp/product/{id}/tier-compare`~~ | ~~档位对比~~ |

### ❌ 删除: MpProductLine

| 方法 | 路径 | 接口名称 |
| --- | --- | --- |
| ~~`GET`~~ | ~~`/mp/product-line/list`~~ | ~~产品线列表~~ |
| ~~`GET`~~ | ~~`/mp/product-line/{lineId}/products`~~ | ~~产品线下产品列表~~ |

---

## 📦 其他数据对象变更

> 以下变更未直接关联到本次接口变更，但可能影响现有接口的请求/响应

### hl-product-service-v2

#### 🆕 BookingTermsVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `termsId` | `Long` | 条款ID |
| `termsName` | `String` | 条款名称 |

#### 🆕 ItineraryDayDeleteReqVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `dayNumber` | `Integer` | 天序号 |

#### 🆕 MpPriceCalendarReqVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `month` | `String` | 月份(yyyy-MM) |

#### 🆕 MpProductLineQueryReqVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `lineId` | `Long` | 产品线ID |
| `tag` | `String` | 标签筛选(可选) |

#### 🆕 OperationLogReqVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `actionCode` | `String` | 操作动作编码 |
| `detail` | `String` | 操作详情 |
| `step` | `String` | 步骤编码 |

#### 🆕 PriceCalendarQueryReqVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `month` | `String` | 月份(yyyy-MM) |
| `tierSeq` | `Integer` | 档位序号(默认1) |

#### 🆕 ProductLinePageReqVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `keyword` | `String` | 关键词 |
| `status` | `String` | 状态(ACTIVE/INACTIVE) |

#### 🆕 ProductPageReqVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `keyword` | `String` | 关键词(名称/编号) |
| `productType` | `String` | 产品类型(CORE/GROUP/CUSTOM) |
| `lineId` | `Long` | 产品线ID |
| `status` | `String` | 产品状态 |

#### 🆕 ProductSaveReqVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `name` | `String` | 产品名称（≤30字） |
| `productType` | `String` | 产品类型（字典product_type: CORE=核心产品, GROUP=小蒙马跟团游, CUSTOM=私人定制） |
| `lineId` | `Long` | 产品线ID（从 /admin/product/line/simple-list 下拉获取，私人定制可空） |
| `tripDays` | `Integer` | 行程天数（可选，创建后可在Step1修改） |

#### 🆕 ScheduleOperateReqVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `batchId` | `Long` | 班期ID |

#### 🆕 ScheduleTeamQueryReqVO

#### 🆕 WarmTipsVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `tipsId` | `Long` | 提示ID |
| `tipsName` | `String` | 提示名称 |

<details>
<summary>📁 全部变更文件 (点击展开)</summary>

```
A	hl-product-service-v2/src/main/java/com/hulalv/ProductServiceV2Application.java
A	hl-product-service-v2/src/main/java/com/hulalv/config/Knife4jConfig.java
A	hl-product-service-v2/src/main/java/com/hulalv/config/WebMvcConfig.java
A	hl-product-service-v2/src/main/java/com/hulalv/constant/ProductConstants.java
A	hl-product-service-v2/src/main/java/com/hulalv/controller/admin/AdminBookingTermsController.java
A	hl-product-service-v2/src/main/java/com/hulalv/controller/admin/AdminProductController.java
A	hl-product-service-v2/src/main/java/com/hulalv/controller/admin/AdminProductLineController.java
A	hl-product-service-v2/src/main/java/com/hulalv/controller/admin/AdminProductTemplateController.java
A	hl-product-service-v2/src/main/java/com/hulalv/controller/admin/AdminWarmTipsController.java
A	hl-product-service-v2/src/main/java/com/hulalv/controller/admin/DistrictController.java
A	hl-product-service-v2/src/main/java/com/hulalv/controller/admin/FormulaController.java
A	hl-product-service-v2/src/main/java/com/hulalv/controller/mp/MpProductController.java
A	hl-product-service-v2/src/main/java/com/hulalv/controller/mp/MpProductLineController.java
A	hl-product-service-v2/src/main/java/com/hulalv/engine/AviatorCeil10Function.java
A	hl-product-service-v2/src/main/java/com/hulalv/engine/AviatorMaxFunction.java
A	hl-product-service-v2/src/main/java/com/hulalv/engine/AviatorSafeFunction.java
A	hl-product-service-v2/src/main/java/com/hulalv/engine/AviatorSellPriceFunction.java
A	hl-product-service-v2/src/main/java/com/hulalv/engine/FormulaEngine.java
A	hl-product-service-v2/src/main/java/com/hulalv/engine/FormulaEngineConfig.java
A	hl-product-service-v2/src/main/java/com/hulalv/engine/PricingContext.java
A	hl-product-service-v2/src/main/java/com/hulalv/entity/BookingTermsDO.java
A	hl-product-service-v2/src/main/java/com/hulalv/entity/GroupBatchStaffDO.java
A	hl-product-service-v2/src/main/java/com/hulalv/entity/GroupTourBatchDO.java
A	hl-product-service-v2/src/main/java/com/hulalv/entity/PricingFormulaDO.java
A	hl-product-service-v2/src/main/java/com/hulalv/entity/PricingFormulaGroupDO.java
A	hl-product-service-v2/src/main/java/com/hulalv/entity/PricingFormulaVarDO.java
A	hl-product-service-v2/src/main/java/com/hulalv/entity/PricingFormulaVersionDO.java
A	hl-product-service-v2/src/main/java/com/hulalv/entity/ProductBasicDO.java
A	hl-product-service-v2/src/main/java/com/hulalv/entity/ProductCrowdBenefitDO.java
A	hl-product-service-v2/src/main/java/com/hulalv/entity/ProductDO.java
A	hl-product-service-v2/src/main/java/com/hulalv/entity/ProductDayHotelDO.java
A	hl-product-service-v2/src/main/java/com/hulalv/entity/ProductFeeItemDO.java
A	hl-product-service-v2/src/main/java/com/hulalv/entity/ProductItineraryDayDO.java
A	hl-product-service-v2/src/main/java/com/hulalv/entity/ProductItineraryNodeDO.java
A	hl-product-service-v2/src/main/java/com/hulalv/entity/ProductLineDO.java
A	hl-product-service-v2/src/main/java/com/hulalv/entity/ProductOperationLogDO.java
A	hl-product-service-v2/src/main/java/com/hulalv/entity/ProductPriceCalendarDO.java
A	hl-product-service-v2/src/main/java/com/hulalv/entity/ProductRouteInfoDO.java
A	hl-product-service-v2/src/main/java/com/hulalv/entity/ProductRoutePointDO.java
A	hl-product-service-v2/src/main/java/com/hulalv/entity/ProductSupplementDO.java
A	hl-product-service-v2/src/main/java/com/hulalv/entity/ProductSuppliesDO.java
A	hl-product-service-v2/src/main/java/com/hulalv/entity/SafetyTemplateDO.java
A	hl-product-service-v2/src/main/java/com/hulalv/entity/WarmTipsDO.java
A	hl-product-service-v2/src/main/java/com/hulalv/enums/BatchStatusEnum.java
A	hl-product-service-v2/src/main/java/com/hulalv/enums/FeeCategoryEnum.java
A	hl-product-service-v2/src/main/java/com/hulalv/enums/LineStatusEnum.java
A	hl-product-service-v2/src/main/java/com/hulalv/enums/NodeTypeEnum.java
A	hl-product-service-v2/src/main/java/com/hulalv/enums/PriceTypeEnum.java
A	hl-product-service-v2/src/main/java/com/hulalv/enums/ProductActionEnum.java
A	hl-product-service-v2/src/main/java/com/hulalv/enums/ProductStatusEnum.java
A	hl-product-service-v2/src/main/java/com/hulalv/enums/ProductTypeEnum.java
A	hl-product-service-v2/src/main/java/com/hulalv/enums/RepeatModeEnum.java
A	hl-product-service-v2/src/main/java/com/hulalv/enums/StepEnum.java
A	hl-product-service-v2/src/main/java/com/hulalv/feign/ResourceHotelFeignClient.java
A	hl-product-service-v2/src/main/java/com/hulalv/feign/ResourcePriceFeignClient.java
A	hl-product-service-v2/src/main/java/com/hulalv/interceptor/AdminAuthInterceptor.java
A	hl-product-service-v2/src/main/java/com/hulalv/mapper/BookingTermsMapper.java
A	hl-product-service-v2/src/main/java/com/hulalv/mapper/GroupBatchStaffMapper.java
A	hl-product-service-v2/src/main/java/com/hulalv/mapper/GroupTourBatchMapper.java
A	hl-product-service-v2/src/main/java/com/hulalv/mapper/PricingFormulaGroupMapper.java
A	hl-product-service-v2/src/main/java/com/hulalv/mapper/PricingFormulaMapper.java
A	hl-product-service-v2/src/main/java/com/hulalv/mapper/PricingFormulaVarMapper.java
A	hl-product-service-v2/src/main/java/com/hulalv/mapper/PricingFormulaVersionMapper.java
A	hl-product-service-v2/src/main/java/com/hulalv/mapper/ProductBasicMapper.java
A	hl-product-service-v2/src/main/java/com/hulalv/mapper/ProductCrowdBenefitMapper.java
A	hl-product-service-v2/src/main/java/com/hulalv/mapper/ProductDayHotelMapper.java
A	hl-product-service-v2/src/main/java/com/hulalv/mapper/ProductFeeItemMapper.java
A	hl-product-service-v2/src/main/java/com/hulalv/mapper/ProductItineraryDayMapper.java
A	hl-product-service-v2/src/main/java/com/hulalv/mapper/ProductItineraryNodeMapper.java
A	hl-product-service-v2/src/main/java/com/hulalv/mapper/ProductLineMapper.java
A	hl-product-service-v2/src/main/java/com/hulalv/mapper/ProductMapper.java
A	hl-product-service-v2/src/main/java/com/hulalv/mapper/ProductOperationLogMapper.java
A	hl-product-service-v2/src/main/java/com/hulalv/mapper/ProductPriceCalendarMapper.java
A	hl-product-service-v2/src/main/java/com/hulalv/mapper/ProductRouteInfoMapper.java
A	hl-product-service-v2/src/main/java/com/hulalv/mapper/ProductRoutePointMapper.java
A	hl-product-service-v2/src/main/java/com/hulalv/mapper/ProductSupplementMapper.java
A	hl-product-service-v2/src/main/java/com/hulalv/mapper/ProductSuppliesMapper.java
A	hl-product-service-v2/src/main/java/com/hulalv/mapper/SafetyTemplateMapper.java
A	hl-product-service-v2/src/main/java/com/hulalv/mapper/WarmTipsMapper.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/ProductServiceV2Application.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/config/Knife4jConfig.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/config/WebMvcConfig.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/constant/ProductConstants.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/controller/admin/AdminBookingTermsController.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/controller/admin/AdminProductLineController.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/controller/admin/AdminProductTemplateController.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/controller/admin/AdminWarmTipsController.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/controller/admin/DistrictController.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/controller/admin/FormulaController.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/controller/mp/MpProductController.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/controller/mp/MpProductLineController.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/engine/AviatorCeil10Function.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/engine/AviatorMaxFunction.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/engine/AviatorSafeFunction.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/engine/AviatorSellPriceFunction.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/engine/FormulaEngine.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/engine/FormulaEngineConfig.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/engine/PricingContext.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/entity/BookingTermsDO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/entity/GroupBatchStaffDO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/entity/GroupTourBatchDO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/entity/PricingFormulaDO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/entity/PricingFormulaGroupDO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/entity/PricingFormulaVarDO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/entity/PricingFormulaVersionDO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/entity/ProductBasicDO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/entity/ProductCrowdBenefitDO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/entity/ProductDO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/entity/ProductDayHotelDO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/entity/ProductFeeItemDO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/entity/ProductItineraryDayDO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/entity/ProductItineraryNodeDO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/entity/ProductLineDO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/entity/ProductOperationLogDO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/entity/ProductPriceCalendarDO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/entity/ProductRouteInfoDO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/entity/ProductRoutePointDO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/entity/ProductSupplementDO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/entity/ProductSuppliesDO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/entity/SafetyTemplateDO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/entity/WarmTipsDO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/enums/BatchStatusEnum.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/enums/FeeCategoryEnum.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/enums/LineStatusEnum.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/enums/NodeTypeEnum.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/enums/PriceTypeEnum.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/enums/ProductActionEnum.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/enums/ProductStatusEnum.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/enums/ProductTypeEnum.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/enums/RepeatModeEnum.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/enums/StepEnum.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/feign/ResourceHotelFeignClient.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/interceptor/AdminAuthInterceptor.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/mapper/BookingTermsMapper.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/mapper/GroupBatchStaffMapper.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/mapper/GroupTourBatchMapper.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/mapper/PricingFormulaGroupMapper.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/mapper/PricingFormulaMapper.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/mapper/PricingFormulaVarMapper.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/mapper/PricingFormulaVersionMapper.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/mapper/ProductBasicMapper.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/mapper/ProductCrowdBenefitMapper.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/mapper/ProductDayHotelMapper.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/mapper/ProductFeeItemMapper.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/mapper/ProductItineraryDayMapper.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/mapper/ProductItineraryNodeMapper.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/mapper/ProductLineMapper.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/mapper/ProductMapper.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/mapper/ProductOperationLogMapper.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/mapper/ProductPriceCalendarMapper.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/mapper/ProductRouteInfoMapper.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/mapper/ProductRoutePointMapper.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/mapper/ProductSupplementMapper.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/mapper/ProductSuppliesMapper.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/mapper/SafetyTemplateMapper.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/mapper/WarmTipsMapper.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/AmapDistrictService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/AmapDrivingService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/BookingTermsService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/FormulaGroupService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/FormulaStepService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/FormulaTestService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/FormulaVarService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/GroupBatchStaffService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/GroupTourBatchService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/ProductBasicService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/ProductCopyService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/ProductCrowdBenefitService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/ProductDayHotelService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/ProductDeleteService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/ProductFeeItemService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/ProductHelperService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/ProductItineraryDayService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/ProductItineraryNodeService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/ProductItineraryService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/ProductLineService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/ProductOperationLogService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/ProductPriceCalendarService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/ProductQueryService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/ProductRouteInfoService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/ProductRoutePointService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/ProductRouteService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/ProductStatusService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/ProductSupplementDataService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/ProductSupplementService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/ProductSuppliesService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/ProductTemplateService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/ProductValidationService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/SuggestPriceService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/WarmTipsService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/service/mp/MpProductService.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/statemachine/ProductStateMachineConfig.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/statemachine/ProductStatusContext.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/util/AdminContextUtil.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/util/EntityDiffUtil.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/util/ProductNoGenerator.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/BookingTermsRespVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/BookingTermsSaveReqVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/BookingTermsVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/FeeDeductionPreviewVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ItineraryDayDeleteReqVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/OperationLogReqVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/PriceCalendarBatchReqVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/PriceCalendarQueryReqVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductActionReqVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductBasicSaveReqVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductDetailRespVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductItinerarySaveReqVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductLineDropdownVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductLinePageReqVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductLineRespVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductLineSaveReqVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductListRespVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductOperationLogRespVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductPageReqVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductRouteSaveReqVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductSaveReqVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductSupplementSaveReqVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductTransferReqVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/QuoteReqVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/QuoteResultVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/SafetyTemplateVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ScheduleBatchCreateReqVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ScheduleOperateReqVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ScheduleSaveReqVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ScheduleTeamQueryReqVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ScheduleTeamSaveReqVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/SuggestPriceRespVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/WarmTipsRespVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/WarmTipsSaveReqVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/WarmTipsVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/formula/FormulaGroupRespVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/formula/FormulaGroupSaveReqVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/formula/FormulaStepRespVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/formula/FormulaStepSaveReqVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/formula/FormulaTestReqVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/formula/FormulaTestResultVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/formula/FormulaVarRespVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/formula/FormulaVarSaveReqVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/formula/FormulaVersionRespVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/mp/MpPriceCalendarReqVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/mp/MpPriceCalendarRespVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/mp/MpProductDetailRespVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/mp/MpProductLineQueryReqVO.java
D	hl-product-service-v2/src/main/java/com/hulalv/product/vo/mp/MpProductListRespVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/AmapDistrictService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/AmapDrivingService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/BookingTermsService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/FormulaGroupService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/FormulaStepService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/FormulaTestService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/FormulaVarService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/GroupBatchStaffService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/GroupTourBatchService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/ProductBasicService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/ProductCopyService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/ProductCrowdBenefitService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/ProductDayHotelService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/ProductDeleteService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/ProductFeeItemService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/ProductHelperService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/ProductItineraryDayService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/ProductItineraryNodeService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/ProductItineraryService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/ProductLineService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/ProductOperationLogService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/ProductPriceCalendarService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/ProductPricingService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/ProductQueryService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/ProductRouteInfoService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/ProductRoutePointService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/ProductRouteService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/ProductStatusService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/ProductSupplementDataService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/ProductSupplementService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/ProductSuppliesService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/ProductTemplateService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/ProductValidationService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/SuggestPriceService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/admin/WarmTipsService.java
A	hl-product-service-v2/src/main/java/com/hulalv/service/mp/MpProductService.java
A	hl-product-service-v2/src/main/java/com/hulalv/statemachine/ProductStateMachineConfig.java
A	hl-product-service-v2/src/main/java/com/hulalv/statemachine/ProductStatusContext.java
A	hl-product-service-v2/src/main/java/com/hulalv/util/AdminContextUtil.java
A	hl-product-service-v2/src/main/java/com/hulalv/util/EntityDiffUtil.java
A	hl-product-service-v2/src/main/java/com/hulalv/util/ProductNoGenerator.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/BookingTermsRespVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/BookingTermsSaveReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/BookingTermsVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/FeeDeductionPreviewVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/ItineraryDayDeleteReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/OperationLogReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/PriceCalendarBatchReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/PriceCalendarQueryReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/ProductActionReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/ProductBasicSaveReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/ProductDetailRespVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/ProductItinerarySaveReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/ProductLineDropdownVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/ProductLinePageReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/ProductLineRespVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/ProductLineSaveReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/ProductListRespVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/ProductOperationLogRespVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/ProductPageReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/ProductRouteSaveReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/ProductSaveReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/ProductSupplementSaveReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/ProductTransferReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/QuoteReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/QuoteResultVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/SafetyTemplateVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/ScheduleBatchCreateReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/ScheduleOperateReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/ScheduleSaveReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/ScheduleTeamQueryReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/ScheduleTeamSaveReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/SuggestPriceRespVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/WarmTipsRespVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/WarmTipsSaveReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/WarmTipsVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/formula/FormulaGroupRespVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/formula/FormulaGroupSaveReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/formula/FormulaStepRespVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/formula/FormulaStepSaveReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/formula/FormulaTestReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/formula/FormulaTestResultVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/formula/FormulaVarRespVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/formula/FormulaVarSaveReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/admin/formula/FormulaVersionRespVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/mp/MpPriceCalendarReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/mp/MpPriceCalendarRespVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/mp/MpProductDetailRespVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/mp/MpProductLineQueryReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/vo/mp/MpProductListRespVO.java
M	hl-product-service-v2/src/main/resources/mapper/ProductMapper.xml
M	hl-product-service-v2/src/main/resources/mapper/ProductPriceCalendarMapper.xml
A	hl-product-service-v2/src/test/java/com/hulalv/ProductServiceV2ApplicationTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/controller/admin/AdminProductLineControllerTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/controller/admin/AdminProductTemplateControllerTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/controller/mp/MpProductControllerTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/controller/mp/MpProductLineControllerTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/engine/FormulaEngineTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/entity/EntityCoverageTest3.java
A	hl-product-service-v2/src/test/java/com/hulalv/enums/EnumCoverageTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/enums/ProductStatusEnumTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/enums/ProductTypeEnumTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/interceptor/AdminAuthInterceptorTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/ProductServiceV2ApplicationTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/controller/admin/AdminProductLineControllerTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/controller/admin/AdminProductTemplateControllerTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/controller/mp/MpProductControllerTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/controller/mp/MpProductLineControllerTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/engine/FormulaEngineTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/entity/EntityCoverageTest3.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/enums/EnumCoverageTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/enums/ProductStatusEnumTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/enums/ProductTypeEnumTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/interceptor/AdminAuthInterceptorTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/service/admin/AmapDrivingServiceTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/service/admin/BookingTermsServiceTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/service/admin/DataServiceCoverageTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/service/admin/FormulaGroupServiceTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/service/admin/FormulaStepServiceTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/service/admin/FormulaTestServiceTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/service/admin/FormulaVarServiceTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/service/admin/GroupBatchStaffServiceTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/service/admin/ProductBasicServiceTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/service/admin/ProductCopyServiceTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/service/admin/ProductDeleteServiceTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/service/admin/ProductHelperServiceTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/service/admin/ProductItineraryServiceTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/service/admin/ProductLineServiceTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/service/admin/ProductOperationLogServiceTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/service/admin/ProductQueryServiceTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/service/admin/ProductRouteServiceTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/service/admin/ProductStatusServiceTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/service/admin/ProductSupplementServiceTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/service/admin/ProductTemplateServiceTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/service/admin/ProductValidationServiceTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/service/admin/WarmTipsServiceTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/service/mp/MpProductServiceTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/util/AdminContextUtilTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/util/EntityDiffUtilTest.java
D	hl-product-service-v2/src/test/java/com/hulalv/product/util/ProductNoGeneratorTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/service/admin/AmapDrivingServiceTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/service/admin/BookingTermsServiceTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/service/admin/DataServiceCoverageTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/service/admin/FormulaGroupServiceTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/service/admin/FormulaStepServiceTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/service/admin/FormulaTestServiceTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/service/admin/FormulaVarServiceTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/service/admin/GroupBatchStaffServiceTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/service/admin/ProductBasicServiceTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/service/admin/ProductCopyServiceTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/service/admin/ProductDeleteServiceTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/service/admin/ProductHelperServiceTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/service/admin/ProductItineraryServiceTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/service/admin/ProductLineServiceTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/service/admin/ProductOperationLogServiceTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/service/admin/ProductPricingServiceTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/service/admin/ProductQueryServiceTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/service/admin/ProductRouteServiceTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/service/admin/ProductStatusServiceTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/service/admin/ProductSupplementServiceTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/service/admin/ProductTemplateServiceTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/service/admin/ProductValidationServiceTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/service/admin/WarmTipsServiceTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/service/mp/MpProductServiceTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/util/AdminContextUtilTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/util/EntityDiffUtilTest.java
A	hl-product-service-v2/src/test/java/com/hulalv/util/ProductNoGeneratorTest.java
```
</details>