# 接口变更记录 — 2026-04-12 15:38

> **提交** `ff42bed5` · **作者** wx · **时间** 2026-04-12 15:38:39 +0800
>
> feat(product-v2): VO/DTO层（含完整Swagger注解+字典标注）

## 📦 其他数据对象变更

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

### hl-product-service-v2

#### 🆕 BookingTermsVO

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

#### 🆕 FeeDeductionPreviewVO

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

#### 🆕 ItineraryDayDeleteReqVO

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

#### 🆕 MpPriceCalendarReqVO

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

#### 🆕 MpPriceCalendarRespVO

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

#### 🆕 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 |
| `creatorAvatarUrl` | `String` | 创建者头像 |
| `creatorIntro` | `String` | 创建者简介 |
| `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` | 说明 |

#### 🆕 MpProductLineQueryReqVO

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

#### 🆕 MpProductListRespVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `name` | `String` | 产品名称 |
| `subtitle` | `String` | 副标题 |
| `coverImageUrl` | `String` | 封面图 |
| `tripDays` | `Integer` | 行程天数 |
| `productType` | `String` | 产品类型 |

#### 🆕 OperationLogReqVO

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

#### 🆕 PriceCalendarBatchReqVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `version` | `Integer` | 版本号(草稿用version/已上架用priceVersion) |
| `startDate` | `LocalDate` | 开始日期 |
| `endDate` | `LocalDate` | 结束日期 |
| `tierSeq` | `Integer` | 档位序号(默认1) |
| `priceType` | `String` | 价格类型(NORMAL/PEAK/HOLIDAY/SPECIAL) |
| `adultSellPrice` | `BigDecimal` | 成人售价 |
| `childSellPrice` | `BigDecimal` | 儿童售价 |
| `toddlerDiscount` | `BigDecimal` | 小童优惠额(负数) |
| `infantPrice` | `BigDecimal` | 幼童售价(0=免费) |
| `dailyStock` | `Integer` | 每日库存上限(NULL=不限量) |

#### 🆕 PriceCalendarQueryReqVO

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

#### 🆕 ProductActionReqVO

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

#### 🆕 ProductBasicSaveReqVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID（路径参数自动设入，前端不传） |
| `version` | `Integer` | 乐观锁版本号（从详情接口获取，提交时传回做并发校验） |
| `name` | `String` | 产品名称（≤30字） |
| `subtitle` | `String` | 副标题（一句话卖点，≤128字） |
| `introduction` | `String` | 产品简介（富文本HTML） |
| `lineId` | `Long` | 产品线ID（从产品线下拉接口获取，私人定制可空） |
| `tripDays` | `Integer` | 行程天数（≥1，晚数自动=天数-1） |
| `tripNights` | `Integer` | 行程晚数（通常=天数-1，不传自动计算） |
| `tiers` | `List<TierItem>` | 档位列表（JSON数组，如标准/舒适/豪华3档） |
| `seasons` | `List<String>` | 适用季节（字典product_season: spring=春, summer=夏, autumn=秋, winter=冬） |
| `tags` | `List<String>` | 产品标签（字典product_tag，多选） |
| `coverImageUrl` | `String` | 封面图URL |
| `carouselImages` | `List<String>` | 轮播图URL列表（≤10张） |
| `infantAgeMax` | `Integer` | 幼童年龄上限（默认1岁，幼童≤此值免费或特价） |
| `toddlerAgeMax` | `Integer` | 小童年龄上限（默认3岁，幼童<小童<儿童） |
| `childAgeMin` | `Integer` | 儿童年龄下限（默认4岁） |
| `childAgeMax` | `Integer` | 儿童年龄上限（默认12岁，超过按成人算） |
| `infantDefaultPrice` | `BigDecimal` | 幼童默认价（元，0=免费） |
| `isBooking` | `Boolean` | 是否预约产品（true=订金可不填出行人，false=正常下单） |
| `paymentType` | `String` | 支付方式（字典payment_type: FULL=全款支付, DEPOSIT=订金+尾款） |
| `depositRatio` | `Integer` | 订金比例（%，支付方式=DEPOSIT时使用，与固定额二选一） |
| `depositAmount` | `BigDecimal` | 订金固定额（元，支付方式=DEPOSIT时使用，与比例二选一） |
| `balanceDueDays` | `Integer` | 尾款支付期限（天，出发前N天需付清尾款） |
| `defaultDailyStock` | `Integer` | 每日库存默认值（NULL=不限量，用于价格日历预填） |
| `defaultRoomCount` | `Integer` | 默认房间数（小蒙马跟团游用，每个班期的初始房间数） |
| `minGroupSize` | `Integer` | 最低成团人数（0=不限，小蒙马用） |
| `minAdultPerOrder` | `Integer` | 每单最少成人数 |
| `maxAdultPerOrder` | `Integer` | 每单最多成人数 |
| `maxChildPerOrder` | `Integer` | 每单最多儿童数 |
| `showReview` | `Boolean` | 展示用户评价（true=产品详情页显示评价模块） |
| `showChatGroup` | `Boolean` | 展示群聊入口（true=显示加入群聊按钮） |
| `showTripTime` | `Boolean` | 展示行程时间（true=行程天显示起止时间） |
| `showTripDistance` | `Boolean` | 展示行程距离（true=行程天显示里程数） |
| `creatorAvatarUrl` | `String` | 创建者头像URL（产品详情页展示的领队/设计师头像） |
| `creatorIntro` | `String` | 创建者简介（≤512字） |
| `customizerId` | `Long` | 定制师ID（私人定制产品关联的定制师） |
| `customerName` | `String` | 客户姓名（私人定制的客户） |
| `contactPhone` | `String` | 联系电话（加密存储） |
| `departureDate` | `LocalDate` | 出发日期（私人定制的固定出发日期，格式yyyy-MM-dd） |
| `mchId` | `String` | 商户ID（微信支付商户号，多商户时指定） |
| `safetyItems` | `List<Object>` | 安全保障项（JSON数组 [{icon,title,description}]） |
| `photographyItems` | `List<Object>` | 摄影跟拍项（JSON数组 [{name,description}]） |
| `diningHighlights` | `List<Object>` | 餐饮亮点（JSON数组 [{name,description}]） |
| `tierSeq` | `Integer` | 档位序号（1=标准,2=舒适,3=豪华） |
| `tierName` | `String` | 档位名称 |

#### 🆕 ProductDetailRespVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `productNo` | `String` | 产品编号 |
| `productType` | `String` | 产品类型 |
| `status` | `String` | 产品状态 |
| `version` | `Integer` | 乐观锁版本号 |
| `priceVersion` | `Integer` | 调价版本号 |
| `createBy` | `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` | 轮播图 |
| `infantAgeMax` | `Integer` | 幼童年龄上限 |
| `toddlerAgeMax` | `Integer` | 小童年龄上限 |
| `childAgeMin` | `Integer` | 儿童年龄下限 |
| `childAgeMax` | `Integer` | 儿童年龄上限 |
| `isBooking` | `Boolean` | 是否预约产品 |
| `paymentType` | `String` | 支付方式 |
| `depositRatio` | `Integer` | 订金比例 |
| `depositAmount` | `BigDecimal` | 订金固定额 |
| `showReview` | `Boolean` | 展示评价 |
| `creatorAvatarUrl` | `String` | 创建者头像 |
| `creatorIntro` | `String` | 创建者简介 |
| `customizerId` | `Long` | 定制师ID |
| `customerName` | `String` | 客户姓名 |
| `departureDate` | `LocalDate` | 出发日期(定制) |
| `mchId` | `String` | 商户ID |
| `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` | 补充配置 |

#### 🆕 ProductItinerarySaveReqVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `version` | `Integer` | 乐观锁版本号 |
| `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` | 排序 |

#### 🆕 ProductLineDropdownVO

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

#### 🆕 ProductLinePageReqVO

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

#### 🆕 ProductLineRespVO

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

#### 🆕 ProductLineSaveReqVO

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

#### 🆕 ProductListRespVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `productNo` | `String` | 产品编号 |
| `productType` | `String` | 产品类型 |
| `name` | `String` | 产品名称 |
| `coverImageUrl` | `String` | 封面图 |
| `tripDays` | `Integer` | 行程天数 |
| `status` | `String` | 产品状态 |
| `version` | `Integer` | 版本号 |
| `createBy` | `Long` | 创建人ID |
| `publishedAt` | `LocalDateTime` | 上架时间 |
| `createTime` | `LocalDateTime` | 创建时间 |
| `updateTime` | `LocalDateTime` | 更新时间 |

#### 🆕 ProductOperationLogRespVO

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

#### 🆕 ProductPageReqVO

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

#### 🆕 ProductRouteSaveReqVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `version` | `Integer` | 乐观锁版本号 |
| `routeName` | `String` | 路线名称 |
| `routeMapUrl` | `String` | 路线图URL(手动上传) |
| `totalMileage` | `BigDecimal` | 总里程(km) |
| `routeDescription` | `String` | 线路描述 |
| `vehicleModelId` | `Long` | 实际用车车型ID |
| `staffCostIds` | `List<Long>` | 服务人员成本ID列表 |
| `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` | 排序 |

#### 🆕 ProductSaveReqVO

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

#### 🆕 ProductSupplementSaveReqVO

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `productId` | `Long` | 产品ID |
| `version` | `Integer` | 乐观锁版本号 |
| `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` | 排序 |

#### 🆕 ProductTransferReqVO

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

#### 🆕 QuoteReqVO

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

#### 🆕 QuoteResultVO

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

#### 🆕 SafetyTemplateVO

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

#### 🆕 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` | 总房间数 |

#### 🆕 ScheduleOperateReqVO

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

#### 🆕 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` | 备注 |

#### 🆕 ScheduleTeamQueryReqVO

#### 🆕 ScheduleTeamSaveReqVO

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

#### 🆕 WarmTipsVO

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

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

```
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/BookingTermsVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/FeeDeductionPreviewVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ItineraryDayDeleteReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/OperationLogReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/PriceCalendarBatchReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/PriceCalendarQueryReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductActionReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductBasicSaveReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductDetailRespVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductItinerarySaveReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductLineDropdownVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductLinePageReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductLineRespVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductLineSaveReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductListRespVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductOperationLogRespVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductPageReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductRouteSaveReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductSaveReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductSupplementSaveReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductTransferReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/QuoteReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/QuoteResultVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/SafetyTemplateVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ScheduleBatchCreateReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ScheduleOperateReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ScheduleSaveReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ScheduleTeamQueryReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ScheduleTeamSaveReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/WarmTipsVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/mp/MpPriceCalendarReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/mp/MpPriceCalendarRespVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/mp/MpProductDetailRespVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/mp/MpProductLineQueryReqVO.java
A	hl-product-service-v2/src/main/java/com/hulalv/product/vo/mp/MpProductListRespVO.java
```
</details>