changelog: ff42bed5 - feat(product-v2): VO/DTO层(含完整Swagger注解+字典标注)

这个提交包含在:
API Changelog Bot 2026-04-12 15:38:39 +08:00
父节点 3c11dcf60a
当前提交 5fe3b39daa

查看文件

@ -0,0 +1,602 @@
# 接口变更记录 — 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>