From 6c22c4842c58ee1b1c96adaf4a430cf80c2e2d06 Mon Sep 17 00:00:00 2001 From: API Changelog Bot Date: Tue, 14 Apr 2026 09:45:04 +0800 Subject: [PATCH] =?UTF-8?q?changelog:=20f3151227=20-=20refactor(product-v2?= =?UTF-8?q?):=20=E5=8C=85=E5=90=8Dcom.hulalv.product=E2=86=92com.hulalv(?= =?UTF-8?q?=E5=8E=BB=E6=8E=89product=E5=AD=90=E5=8C=85)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04-14_0945_f3151227_refactor_product-v2.md | 2343 +++++++++++++++++ 1 file changed, 2343 insertions(+) create mode 100644 changelogs/2026-04/2026-04-14_0945_f3151227_refactor_product-v2.md diff --git a/changelogs/2026-04/2026-04-14_0945_f3151227_refactor_product-v2.md b/changelogs/2026-04/2026-04-14_0945_f3151227_refactor_product-v2.md new file mode 100644 index 0000000..a6484b3 --- /dev/null +++ b/changelogs/2026-04/2026-04-14_0945_f3151227_refactor_product-v2.md @@ -0,0 +1,2343 @@ +# 接口变更记录 — 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>` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `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>` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `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` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `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` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `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` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `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` + +### 📌 `PUT` /admin/product/booking-terms/{termsId}/toggle — 启用/禁用预订条款 + +> 禁用后不再出现在产品设计的可选列表中 + +**参数** + + - `{termsId}` (`Long`) — 路径参数:预订条款ID + - `enabled` (`boolean`) — 查询参数:是否启用 + +**响应** `Result` + +### 🆕 新增: 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` | 规格列表(单一档不传或传1个,多档传多个) | +| `tags` | `List` | 产品标签(亲子/研学/露营/城记/摄影) | +| `coverImageUrl` | `String` | 封面图URL | +| `carouselImages` | `List` | 轮播图URL列表 | +| `seasons` | `List` | 产品季节(字典product_season: spring/summer/autumn/winter) | +| `tierSeq` | `Integer` | 规格序号(1开始递增) | +| `tierName` | `String` | 规格名称 | + +**响应** `Result` + +### 📌 `PUT` /admin/product/item/{id}/itinerary — Step2 行程整体保存 + +> 整体保存行程天+节点+住宿+路线点。支持新增/更新/删除(EntityDiffUtil对比)。 + +**参数** + + - `{id}` (`Long`) — 路径参数 + +**请求体** `ProductItinerarySaveReqVO` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `productId` | `Long` | 产品ID | +| `days` | `List` | 行程天列表 | +| `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` | 照片集 | +| `customFields` | `Object` | 自定义概况 | +| `nodes` | `List` | 活动节点列表 | +| `hotels` | `List` | 住宿列表 | +| `routePoints` | `List` | 途经路线点列表 | +| `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` | 图片列表 | +| `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` + +### 📌 `POST` /admin/product/item/{id}/itinerary/day — Step2 增加一天 + +> 在行程末尾追加一天,自动编号。返回新天的dayId。 + +**参数** + + - `{id}` (`Long`) — 路径参数 + +**响应** `Result` + +### 📌 `DELETE` /admin/product/item/{id}/itinerary/day/{dayNumber} — Step2 删除一天 + +> 删除指定天序号的行程天,级联删除节点+住宿+路线点,后续天序号自动-1。 + +**参数** + + - `{id}` (`Long`) — 路径参数 + - `{dayNumber}` (`Integer`) — 路径参数 + +**响应** `Result` + +### 📌 `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` | 备品列表 | +| `extraCosts` | `List` | 额外成本项列表 | +| `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` + +### 📌 `GET` /admin/product/item/{id}/price-calendar — Step4 查询价格日历 + +> 按月份查询价格日历。 + +**参数** + + - `{id}` (`Long`) — 路径参数 + +**响应** `Result>` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `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>` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `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` + +### 📌 `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` + +### 📌 `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` + +### 📌 `DELETE` /admin/product/item/{id}/schedule/{scheduleId} — Step4 删除班期 + +> 删除班期(已有报名订单不允许删除)。 + +**参数** + + - `{id}` (`Long`) — 路径参数 + - `{scheduleId}` (`Long`) — 路径参数 + +**响应** `Result` + +### 📌 `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` + +### 📌 `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` + +### 📌 `POST` /admin/product/item/{id}/schedule/{scheduleId}/cancel — Step4 取消班期 + +> 取消班期(有报名订单则标记为CANCELLING触发退款,无订单直接CANCELLED)。 + +**参数** + + - `{id}` (`Long`) — 路径参数 + - `{scheduleId}` (`Long`) — 路径参数 + +**响应** `Result` + +### 📌 `GET` /admin/product/item/{id}/schedule/team — 班期团队查询 + +> 查询指定班期的团队成员列表。 + +**参数** + + - `{id}` (`Long`) — 路径参数 + +**响应** `Result>` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `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` | 团队成员列表 | +| `staffId` | `Long` | 员工ID | +| `staffRole` | `String` | 员工角色 | +| `staffName` | `String` | 员工名称 | +| `staffPhone` | `String` | 员工电话 | +| `remark` | `String` | 备注 | +| `sortOrder` | `Integer` | 排序 | + +**响应** `Result` + +### 📌 `GET` /admin/product/item/{id}/suggest-price — 建议售价 + +> 根据出发日期+档位,汇总行程天数内价格日历单价+备品+额外成本,返回成人/儿童建议售价。 + +**参数** + + - `{id}` (`Long`) — 路径参数 + - `departureDate` (`String`) — 查询参数 + - `tierSeq` (`Integer`) — 查询参数 + +**响应** `Result>` + +### 📌 `POST` /admin/product/item/{id}/quote — 报价计算 + +> 根据出发日期+人数+档位计算总价,返回每日明细。 + +**参数** + + - `{id}` (`Long`) — 路径参数 + +**请求体** `QuoteReqVO` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `productId` | `Long` | 产品ID | +| `departureDate` | `LocalDate` | 出发日期 | +| `adultCount` | `Integer` | 成人数 | +| `batchId` | `Long` | 班期ID(小蒙马用) | + +**响应** `Result` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `totalAdultPrice` | `BigDecimal` | 成人总价 | +| `totalChildPrice` | `BigDecimal` | 儿童总价 | +| `grandTotal` | `BigDecimal` | 总价合计 | +| `dailyDetails` | `List` | 每日价格明细 | +| `date` | `String` | 日期 | +| `adultPrice` | `BigDecimal` | 成人日价 | +| `childPrice` | `BigDecimal` | 儿童日价 | + +### 📌 `PUT` /admin/product/item/{id}/supplement — Step5 补充信息保存 + +> 保存费用包含/不含/自定义项+人群优惠+补充配置(退改/车辆/保险/卖点等)。 + +**参数** + + - `{id}` (`Long`) — 路径参数 + +**请求体** `ProductSupplementSaveReqVO` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `productId` | `Long` | 产品ID | +| `includedFees` | `List` | 费用包含列表 | +| `excludedFees` | `List` | 费用不含列表 | +| `customFees` | `List` | 自定义费用列表 | +| `feeIgnoredTypes` | `List` | 费用推导已忽略类型 | +| `childTicket` | `String` | 儿童门票优惠(FREE/HALF_PRICE/FULL_PRICE) | +| `childAccommodation` | `String` | 儿童住宿(BED/NO_BED) | +| `childMeal` | `String` | 儿童餐饮(FULL/HALF) | +| `elderTicket` | `String` | 老人门票优惠 | +| `elderAccommodation` | `String` | 老人住宿 | +| `crowdBenefitTips` | `String` | 人群优惠温馨提示 | +| `vehicleModelIds` | `List` | 展示车型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` | 成长收获 | +| `id` | `Long` | 费用项ID(已有则传) | +| `feeType` | `String` | 费用类型 | +| `source` | `String` | 来源(AUTO/MANUAL) | +| `name` | `String` | 名称 | +| `description` | `String` | 说明 | +| `unitPrice` | `BigDecimal` | 单价(自定义费用) | +| `unit` | `String` | 单位(自定义费用) | +| `sortOrder` | `Integer` | 排序 | + +**响应** `Result` + +### 📌 `GET` /admin/product/item/{id}/calculate-mileage — 计算行程总里程 + +> 根据行程途经点坐标调用高德驾车路线规划API自动计算总驾驶里程(km)。需先保存行程(Step2)。 + +**参数** + + - `{id}` (`Long`) — 路径参数 + +**响应** `Result` + +### 📌 `GET` /admin/product/item/{id}/suggest-price — 计算建议售价 + +> 根据备品成本+额外成本计算建议售价。如有激活的公式组则通过公式引擎计算。返回成人/儿童单价及成本明细。 + +**参数** + + - `{id}` (`Long`) — 路径参数 + +**响应** `Result` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `adultSuggestPrice` | `BigDecimal` | 成人建议售价(单人) | +| `childSuggestPrice` | `BigDecimal` | 儿童建议售价(单人) | +| `adultCost` | `CostBreakdown` | 成人成本明细 | +| `childCost` | `CostBreakdown` | 儿童成本明细 | +| `formulaApplied` | `Boolean` | 是否使用了公式引擎 | +| `suppliesCost` | `BigDecimal` | 备品成本(按人头) | +| `extraCost` | `BigDecimal` | 额外成本 | +| `totalCost` | `BigDecimal` | 成本合计 | +| `suppliesItems` | `List` | 备品明细 | +| `extraItems` | `List` | 额外成本明细 | +| `name` | `String` | 名称 | +| `unitPrice` | `BigDecimal` | 单价 | +| `quantity` | `Integer` | 数量 | +| `subtotal` | `BigDecimal` | 小计 | + +### 📌 `GET` /admin/product/item/{id} — 产品详情 + +> 聚合全部5步数据(主表+基础+行程+路线+价格+补充),用于编辑页回显。 + +**参数** + + - `{id}` (`Long`) — 路径参数 + +**响应** `Result` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `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` | 行程天列表 | +| `routeInfo` | `ProductRouteInfoDO` | 路线信息 | +| `supplies` | `List` | 备品列表 | +| `extraCosts` | `List` | 额外成本项 | +| `schedules` | `List` | 班期列表 | +| `includedFees` | `List` | 费用包含 | +| `excludedFees` | `List` | 费用不含 | +| `customFees` | `List` | 自定义费用 | +| `crowdBenefit` | `ProductCrowdBenefitDO` | 人群优惠 | +| `supplement` | `ProductSupplementDO` | 补充配置 | + +### 📌 `GET` /admin/product/item/list — 产品分页列表 + +> 支持按名称关键词/产品类型/产品线/状态筛选。 + +**响应** `Result>` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `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` | 产品季节(JSON数组,如[\ | +| `tags` | `List` | 产品标签(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` + +### 📌 `GET` /admin/product/item/{id}/operation-logs — 产品操作记录 + +> 查询产品的全部操作记录(按时间倒序),审计保留不随产品删除。 + +**参数** + + - `{id}` (`Long`) — 路径参数 + +**响应** `Result>` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `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` + +### 📌 `POST` /admin/product/item/{id}/copy — 复制产品 + +> 深拷贝产品+全部子表(主表+6张1:1/1:N子表+行程数据),新产品为草稿状态。返回新产品ID。 + +**参数** + + - `{id}` (`Long`) — 路径参数 + +**响应** `Result` + +### 📌 `PUT` /admin/product/item/{id}/transfer — 转让产品 + +> 更换产品创建人(仅超管可操作)。 + +**参数** + + - `{id}` (`Long`) — 路径参数 + +**请求体** `ProductTransferReqVO` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `productId` | `Long` | 产品ID | +| `newCreatorId` | `Long` | 新创建人ID | + +**响应** `Result` + +### 📌 `GET` /admin/product/item/{id}/validate-publish — 上架预检 + +> 5级校验:L1基础字段→L2内容完整→L3定价→L4条款→L5资源。返回问题列表,空=全部通过。 + +**参数** + + - `{id}` (`Long`) — 路径参数 + +**响应** `Result>` + +### 📌 `GET` /admin/product/item/{id}/fee-deduction-preview — 费用推导预览 + +> 根据行程节点类型自动推导费用包含项(景区→门票,酒店→住宿等),排除已忽略类型。 + +**参数** + + - `{id}` (`Long`) — 路径参数 + +**响应** `Result>` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `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` | 适用季节 | +| `tags` | `List` | 标签 | +| `coverImageUrl` | `String` | 封面图 | +| `sortOrder` | `Integer` | 排序 | +| `status` | `String` | 状态(ACTIVE/INACTIVE) | + +**响应** `Result` + +### 📌 `GET` /admin/product/line/{id} — 产品线详情 + +**参数** + + - `{id}` (`Long`) — 路径参数 + +**响应** `Result` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `lineId` | `Long` | 产品线ID | +| `name` | `String` | 产品线名称 | +| `productType` | `String` | 绑定产品类型 | +| `description` | `String` | 描述 | +| `seasons` | `List` | 适用季节 | +| `tags` | `List` | 产品线标签 | +| `coverImageUrl` | `String` | 封面图 | +| `sortOrder` | `Integer` | 排序 | +| `status` | `String` | 状态 | +| `productCount` | `Long` | 产品数量 | +| `createdBy` | `Long` | 创建人ID | +| `createTime` | `LocalDateTime` | 创建时间 | + +### 📌 `GET` /admin/product/line/list — 产品线分页列表 + +**响应** `Result>` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `lineId` | `Long` | 产品线ID | +| `name` | `String` | 产品线名称 | +| `productType` | `String` | 绑定产品类型 | +| `description` | `String` | 描述 | +| `seasons` | `List` | 适用季节 | +| `tags` | `List` | 产品线标签 | +| `coverImageUrl` | `String` | 封面图 | +| `sortOrder` | `Integer` | 排序 | +| `status` | `String` | 状态 | +| `productCount` | `Long` | 产品数量 | +| `createdBy` | `Long` | 创建人ID | +| `createTime` | `LocalDateTime` | 创建时间 | + +### 📌 `DELETE` /admin/product/line/{id} — 删除产品线 + +**参数** + + - `{id}` (`Long`) — 路径参数 + +**响应** `Result` + +### 📌 `GET` /admin/product/line/simple-list — 产品线下拉选项 + +**响应** `Result>` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `lineId` | `Long` | 产品线ID | +| `name` | `String` | 产品线名称 | + +### 🆕 新增: AdminProductTemplate + +### 📌 `GET` /admin/product/safety-template/enabled — 安全保障模板下拉 + +**响应** `Result>` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `templateId` | `Long` | 模板ID | +| `name` | `String` | 模板名称 | +| `items` | `String` | 具体条目(JSON) | + +### 🆕 新增: AdminWarmTips + +### 📌 `GET` /admin/product/warm-tips/list — 温馨提示列表 + +> 返回所有温馨提示(含禁用),按创建时间倒序 + +**响应** `Result>` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `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>` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `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` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `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` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `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` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `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` + +### 📌 `PUT` /admin/product/warm-tips/{tipsId}/toggle — 启用/禁用温馨提示 + +> 禁用后不再出现在产品设计的可选列表中 + +**参数** + + - `{tipsId}` (`Long`) — 路径参数:温馨提示ID + - `enabled` (`boolean`) — 查询参数:是否启用 + +**响应** `Result` + +### 🆕 新增: District + +### 📌 `GET` /admin/product/district/search — 搜索行政区划(城市/区县/镇) + +> 通过高德地图 API 搜索行政区划,用于产品的出发城市和目的地城市选择。 + +**参数** + + - `keywords` (`String`) — 查询参数:搜索关键词 + +### 🆕 新增: Formula + +### 📌 `GET` /admin/product/formula/group/list — 公式组列表 + +> 获取定价公式组列表,可按产品类型筛选。 + +**参数** + + - `productType` (`String`) — 查询参数 + +**响应** `Result>` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `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` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `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` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `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` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `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` + +### 📌 `DELETE` /admin/product/formula/group/{groupId} — 删除公式组 + +> 已激活的公式组不能删除,需先激活其他公式组 + +**参数** + + - `{groupId}` (`Long`) — 路径参数 + +**响应** `Result` + +### 📌 `GET` /admin/product/formula/group/{groupId}/steps — 公式步骤列表 + +> 获取公式组下所有步骤,按执行顺序升序排列 + +**参数** + + - `{groupId}` (`Long`) — 路径参数 + +**响应** `Result>` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `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` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `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` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `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` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `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` + +### 📌 `DELETE` /admin/product/formula/step/{formulaId} — 删除公式步骤 + +**参数** + + - `{formulaId}` (`Long`) — 路径参数 + +**响应** `Result` + +### 📌 `GET` /admin/product/formula/step/{formulaId}/versions — 公式步骤版本历史 + +> 按版本号倒序返回历史版本列表 + +**参数** + + - `{formulaId}` (`Long`) — 路径参数 + +**响应** `Result>` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `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` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `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` | 测试变量(变量名->值) | + +**响应** `Result` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `success` | `Boolean` | 是否成功 | +| `errorMessage` | `String` | 错误信息 | +| `stepResults` | `List` | 各步骤执行结果 | +| `finalVariables` | `Map` | 最终变量表 | +| `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>` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `varId` | `Long` | 变量ID | +| `varName` | `String` | 变量名 | +| `varType` | `String` | 变量类型:DECIMAL/INTEGER/BOOLEAN/STRING | +| `category` | `String` | 变量分类:INPUT/INTERMEDIATE/OUTPUT | +| `description` | `String` | 描述 | +| `defaultValue` | `String` | 默认值 | +| `productTypes` | `List` | 适用产品类型列表 | + +### 📌 `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` | 适用产品类型列表 | + +**响应** `Result` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `varId` | `Long` | 变量ID | +| `varName` | `String` | 变量名 | +| `varType` | `String` | 变量类型:DECIMAL/INTEGER/BOOLEAN/STRING | +| `category` | `String` | 变量分类:INPUT/INTERMEDIATE/OUTPUT | +| `description` | `String` | 描述 | +| `defaultValue` | `String` | 默认值 | +| `productTypes` | `List` | 适用产品类型列表 | + +### 📌 `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` | 适用产品类型列表 | + +**响应** `Result` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `varId` | `Long` | 变量ID | +| `varName` | `String` | 变量名 | +| `varType` | `String` | 变量类型:DECIMAL/INTEGER/BOOLEAN/STRING | +| `category` | `String` | 变量分类:INPUT/INTERMEDIATE/OUTPUT | +| `description` | `String` | 描述 | +| `defaultValue` | `String` | 默认值 | +| `productTypes` | `List` | 适用产品类型列表 | + +### 📌 `DELETE` /admin/product/formula/var/{varId} — 删除公式变量 + +> 如果有公式步骤引用了该变量,删除后步骤执行时会报错 + +**参数** + + - `{varId}` (`Long`) — 路径参数 + +**响应** `Result` + +### 🆕 新增: MpProduct + +### 📌 `GET` /mp/product/{id} — 产品详情 + +**参数** + + - `{id}` (`Long`) — 路径参数 + +**响应** `Result` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `productId` | `Long` | 产品ID | +| `productType` | `String` | 产品类型 | +| `name` | `String` | 产品名称 | +| `subtitle` | `String` | 副标题 | +| `introduction` | `String` | 产品简介 | +| `coverImageUrl` | `String` | 封面图 | +| `carouselImages` | `List` | 轮播图 | +| `tripDays` | `Integer` | 行程天数 | +| `tripNights` | `Integer` | 行程晚数 | +| `itinerary` | `List` | 行程天列表 | +| `includedFees` | `List` | 费用包含 | +| `excludedFees` | `List` | 费用不含 | +| `crowdBenefit` | `CrowdBenefitInfo` | 人群优惠 | +| `routeMapUrl` | `String` | 路线图URL | +| `dayNumber` | `Integer` | 天序号 | +| `dayTitle` | `String` | 标题 | +| `description` | `String` | 描述 | +| `coverImageUrl` | `String` | 封面图 | +| `breakfast` | `String` | 早餐 | +| `lunch` | `String` | 午餐 | +| `dinner` | `String` | 晚餐 | +| `nodes` | `List` | 节点列表 | +| `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` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `days` | `List` | 日历列表 | +| `date` | `String` | 日期(yyyy-MM-dd) | +| `priceType` | `String` | 价格类型 | +| `adultPrice` | `BigDecimal` | 成人售价 | +| `childPrice` | `BigDecimal` | 儿童售价 | +| `isSelectable` | `Boolean` | 是否可选(有库存且未过期) | +| `remainStock` | `Integer` | 剩余库存(NULL=不限量) | + +### 📌 `GET` /mp/product/{id}/schedules — 班期列表 + +**参数** + + - `{id}` (`Long`) — 路径参数 + +**响应** `Result>` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `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` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `totalAdultPrice` | `BigDecimal` | 成人总价 | +| `totalChildPrice` | `BigDecimal` | 儿童总价 | +| `grandTotal` | `BigDecimal` | 总价合计 | +| `dailyDetails` | `List` | 每日价格明细 | +| `date` | `String` | 日期 | +| `adultPrice` | `BigDecimal` | 成人日价 | +| `childPrice` | `BigDecimal` | 儿童日价 | + +### 📌 `GET` /mp/product/compare — 产品对比 + +**参数** + + - `ids` (`String`) — 查询参数 + +**响应** `Result>` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `productId` | `Long` | 产品ID | +| `productType` | `String` | 产品类型 | +| `name` | `String` | 产品名称 | +| `subtitle` | `String` | 副标题 | +| `introduction` | `String` | 产品简介 | +| `coverImageUrl` | `String` | 封面图 | +| `carouselImages` | `List` | 轮播图 | +| `tripDays` | `Integer` | 行程天数 | +| `tripNights` | `Integer` | 行程晚数 | +| `itinerary` | `List` | 行程天列表 | +| `includedFees` | `List` | 费用包含 | +| `excludedFees` | `List` | 费用不含 | +| `crowdBenefit` | `CrowdBenefitInfo` | 人群优惠 | +| `routeMapUrl` | `String` | 路线图URL | +| `dayNumber` | `Integer` | 天序号 | +| `dayTitle` | `String` | 标题 | +| `description` | `String` | 描述 | +| `coverImageUrl` | `String` | 封面图 | +| `breakfast` | `String` | 早餐 | +| `lunch` | `String` | 午餐 | +| `dinner` | `String` | 晚餐 | +| `nodes` | `List` | 节点列表 | +| `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>>` + +### 🆕 新增: MpProductLine + +### 📌 `GET` /mp/product-line/list — 产品线列表 + +**参数** + + - `season` (`String`) — 查询参数 + +**响应** `Result>` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `lineId` | `Long` | 产品线ID | +| `name` | `String` | 产品线名称 | + +### 📌 `GET` /mp/product-line/{lineId}/products — 产品线下产品列表 + +**参数** + + - `{lineId}` (`Long`) — 路径参数 + +**响应** `Result>` + +| 字段 | 类型 | 说明 | +| --- | --- | --- | +| `productId` | `Long` | 产品ID | +| `productType` | `String` | 产品类型(CORE/GROUP/CUSTOM) | +| `name` | `String` | 产品名称 | +| `subtitle` | `String` | 副标题(一句话卖点) | +| `coverImageUrl` | `String` | 封面图URL | +| `tripDays` | `Integer` | 行程天数 | +| `tripNights` | `Integer` | 行程晚数 | +| `lineName` | `String` | 产品线名称(前端叫「主题名」) | +| `tags` | `List` | 产品标签(如[\ | +| `seasons` | `List` | 产品季节(如[\ | +| `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` | 提示名称 | + +
+📁 全部变更文件 (点击展开) + +``` +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 +``` +
\ No newline at end of file