# 产品服务 API 文档 **服务**: `hl-product-service` **接口总数**: 106 ## 目录 - **产品文件夹管理** (4 个接口) - **产品管理** (10 个接口) - **产品线管理** (6 个接口) - **定价与费用管理** (20 个接口) - **定价公式管理** (19 个接口) - **家庭分组管理** (4 个接口) - **小程序-产品** (3 个接口) - **报价计算** (2 个接口) - **拼团批次管理** (12 个接口) - **行政区划搜索** (1 个接口) - **行程管理** (25 个接口) --- ## 产品文件夹管理 ### `POST` /admin/product/folder **创建文件夹** 创建产品文件夹,用于组织管理产品。支持多级目录结构。 文件夹归属于创建人,普通管理员只能看到自己的文件夹。 **请求体** `创建文件夹请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `name` | `string` | 是 | 文件夹名称 | | `parentId` | `string` | | 父文件夹ID,为空则为根文件夹 | | `sortOrder` | `int` | | 排序序号 | **响应** `统一响应结果«产品文件夹VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品文件夹VO` | | 响应数据 | |   `children` | `产品文件夹VO[]` | | 子文件夹列表 | |     `children` | `产品文件夹VO[]` | | 子文件夹列表 | |     `createTime` | `string` | | 创建时间 | |     `folderId` | `string` | | 文件夹ID | |     `name` | `string` | | 文件夹名称 | |     `ownerId` | `string` | | 拥有者ID | |     `ownerName` | `string` | | 拥有者姓名 | |     `parentId` | `string` | | 父文件夹ID | |     `productCount` | `int` | | 文件夹内产品数量 | |     `sortOrder` | `int` | | 排序序号 | |     `updateTime` | `string` | | 更新时间 | |   `createTime` | `string` | | 创建时间 | |   `folderId` | `string` | | 文件夹ID | |   `name` | `string` | | 文件夹名称 | |   `ownerId` | `string` | | 拥有者ID | |   `ownerName` | `string` | | 拥有者姓名 | |   `parentId` | `string` | | 父文件夹ID | |   `productCount` | `int` | | 文件夹内产品数量 | |   `sortOrder` | `int` | | 排序序号 | |   `updateTime` | `string` | | 更新时间 | | `message` | `string` | | 响应消息 | --- ### `GET` /admin/product/folder/tree **获取文件夹树** 获取当前用户可见的文件夹树形结构。 普通管理员只能看到自己创建的文件夹,SUPER_ADMIN 可看到所有文件夹。 返回结构为嵌套的树形列表,包含每个文件夹的子文件夹。 **响应** `统一响应结果«List«产品文件夹VO»»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品文件夹VO[]` | | 响应数据 | |   `children` | `产品文件夹VO[]` | | 子文件夹列表 | |     `children` | `产品文件夹VO[]` | | 子文件夹列表 | |     `createTime` | `string` | | 创建时间 | |     `folderId` | `string` | | 文件夹ID | |     `name` | `string` | | 文件夹名称 | |     `ownerId` | `string` | | 拥有者ID | |     `ownerName` | `string` | | 拥有者姓名 | |     `parentId` | `string` | | 父文件夹ID | |     `productCount` | `int` | | 文件夹内产品数量 | |     `sortOrder` | `int` | | 排序序号 | |     `updateTime` | `string` | | 更新时间 | |   `createTime` | `string` | | 创建时间 | |   `folderId` | `string` | | 文件夹ID | |   `name` | `string` | | 文件夹名称 | |   `ownerId` | `string` | | 拥有者ID | |   `ownerName` | `string` | | 拥有者姓名 | |   `parentId` | `string` | | 父文件夹ID | |   `productCount` | `int` | | 文件夹内产品数量 | |   `sortOrder` | `int` | | 排序序号 | |   `updateTime` | `string` | | 更新时间 | | `message` | `string` | | 响应消息 | --- ### `PUT` /admin/product/folder/{folderId} **更新文件夹** 更新文件夹名称等信息。 **权限说明**:普通管理员只能更新自己创建的文件夹,SUPER_ADMIN 可更新任何文件夹。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `folderId` | `integer` | | 文件夹ID | **请求体** `更新文件夹请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `name` | `string` | | 文件夹名称 | | `sortOrder` | `int` | | 排序序号 | **响应** `统一响应结果«产品文件夹VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品文件夹VO` | | 响应数据 | |   `children` | `产品文件夹VO[]` | | 子文件夹列表 | |     `children` | `产品文件夹VO[]` | | 子文件夹列表 | |     `createTime` | `string` | | 创建时间 | |     `folderId` | `string` | | 文件夹ID | |     `name` | `string` | | 文件夹名称 | |     `ownerId` | `string` | | 拥有者ID | |     `ownerName` | `string` | | 拥有者姓名 | |     `parentId` | `string` | | 父文件夹ID | |     `productCount` | `int` | | 文件夹内产品数量 | |     `sortOrder` | `int` | | 排序序号 | |     `updateTime` | `string` | | 更新时间 | |   `createTime` | `string` | | 创建时间 | |   `folderId` | `string` | | 文件夹ID | |   `name` | `string` | | 文件夹名称 | |   `ownerId` | `string` | | 拥有者ID | |   `ownerName` | `string` | | 拥有者姓名 | |   `parentId` | `string` | | 父文件夹ID | |   `productCount` | `int` | | 文件夹内产品数量 | |   `sortOrder` | `int` | | 排序序号 | |   `updateTime` | `string` | | 更新时间 | | `message` | `string` | | 响应消息 | --- ### `DELETE` /admin/product/folder/{folderId} **删除文件夹** 删除文件夹。如果文件夹下有产品,产品会自动移到根目录(folderId 置空)。 普通管理员只能删除自己的文件夹,SUPER_ADMIN 可删除任何文件夹。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `folderId` | `integer` | | 文件夹ID | **响应** `统一响应结果«Void»` --- ## 产品管理 ### `POST` /admin/product/item **创建产品(草稿)** 创建一个新产品,初始状态为 DRAFT(草稿)。 **产品类型说明**: - CORE:核心产品,标准旅游产品,支持上架/下架审批流程 - GROUP:小蒙马拼团,需配合团期批次管理,按人头计价 - CUSTOM:定制产品,由定制师为客户量身定制,按单计价 - ROUTE:线路产品,预设线路模板,按单计价 **注意事项**: - 创建后需依次完善行程、定价、价格日历等信息 - CUSTOM/ROUTE 产品的价格日历存储的是整单总价,不按人头乘算 - GROUP 产品需额外创建团期批次才能报名 **关联字典**: - product_type(产品类型):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品 - product_category(产品分类):family=亲子游, honeymoon=蜜月游, photography=旅拍, experience=体验, driving=自驾 **请求体** `创建产品请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `adultCount` | `int` | | 成人人数 | | `babyCount` | `int` | | 婴儿人数 | | `bookingNotice` | `string` | | 预定须知 | | `cancelPolicy` | `string` | | 退改政策 | | `carouselImages` | `string[]` | | 轮播图列表 | | `carouselVideoUrl` | `string` | | 轮播视频URL | | `childCount` | `int` | | 儿童人数 | | `creatorAvatarUrl` | `string` | | 定制师头像URL | | `creatorIntro` | `string` | | 创作者寄语 | | `customizerId` | `string` | | 定制师ID | | `departureCity` | `string` | | 出发城市 | | `destinationCity` | `string` | | 目的地城市 | | `folderId` | `string` | | 所属文件夹ID | | `groupChatQrUrl` | `string` | | 群聊二维码URL | | `groupRoomId` | `string` | | 企微群聊ID(用于会话存档展示群消息) | | `isBooking` | `boolean` | | 是否预约产品 | | `lineId` | `string` | | 产品线ID | | `maxAdultPerOrder` | `int` | | 每单最大成人数(不填则不限制) | | `maxChildPerOrder` | `int` | | 每单最大儿童数(不填则不限制) | | `mchId` | `string` | | 商户号:shanhe/wenlu | | `minAdultPerOrder` | `int` | | 每单最少成人数(不填默认1) | | `name` | `string` | 是 | 产品名称 | | `productType` | `string` | 是 | 产品类型:CORE=核心产品 ROUTE=线路产品 CUSTOM=定制产品 GROUP=小蒙马拼团 | | `seasons` | `string[]` | | 适用季节列表 | | `showChatGroup` | `boolean` | | 是否显示群聊入口 | | `showReview` | `boolean` | | 是否显示评价 | | `showTripDistance` | `boolean` | | 是否显示行程距离 | | `showTripTime` | `boolean` | | 是否显示行程时间 | | `subtitle` | `string` | | 副标题 | | `tags` | `string[]` | | 产品标签列表 | | `tripDays` | `int` | | 行程天数 | | `warmTips` | `string` | | 温馨提示 | | `youngChildCount` | `int` | | 小童人数 | **响应** `统一响应结果«产品详情VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品详情VO` | | 响应数据 | |   `adultCount` | `int` | | 成人人数 | |   `babyCount` | `int` | | 婴儿人数 | |   `benefitsDescription` | `权益分组[]` | | 权益说明(静态,所有产品相同) | |     `items` | `权益项[]` | | 权益项列表 | |     `title` | `string` | | 分组标题,如:儿童权益 (1.2m以下) | |   `bookingNotice` | `string` | | 预定须知 | |   `cancelPolicy` | `string` | | 退改政策 | |   `carouselImages` | `string[]` | | 轮播图列表 | |   `carouselVideoUrl` | `string` | | 轮播视频URL | |   `chatMessages` | `群聊消息VO[]` | | 群聊消息列表 | |     `avatar` | `string` | | 用户头像URL(type=user时有效) | |     `text` | `string` | | 消息内容 | |     `type` | `string` | | 消息类型: user/creator | |   `childCount` | `int` | | 儿童人数 | |   `costItems` | `产品成本项VO[]` | | 成本项列表 | |     `category` | `string` | | 成本项类别:HOTEL/SCENIC/VEHICLE/ACTIVITY/SERVICE/DINING/OTHER | |     `description` | `string` | | 成本项描述 | |     `id` | `string` | | 成本项ID | |     `sortOrder` | `int` | | 排序序号 | |     `title` | `string` | | 成本项标题 | |     `type` | `string` | | 成本项类型:INCLUDED=费用包含 EXCLUDED=费用不含 SELF_PAY=自理费用 | |   `coverImageUrl` | `string` | | 封面图URL | |   `createBy` | `string` | | 创建人ID | |   `createTime` | `string` | | 创建时间 | |   `creatorAvatarUrl` | `string` | | 定制师头像URL | |   `creatorIntro` | `string` | | 创作者寄语 | |   `customFees` | `产品自定义费用项VO[]` | | 自定义费用项列表 | |     `description` | `string` | | 费用说明 | |     `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |     `feeAmount` | `number` | | 费用金额 | |     `feeName` | `string` | | 费用项名称 | |     `feeUnit` | `string` | | 费用单位 | |     `id` | `string` | | 费用项ID | |     `sortOrder` | `int` | | 排序序号 | |   `customizerId` | `string` | | 定制师ID | |   `departureCity` | `string` | | 出发城市 | |   `destinationCities` | `string[]` | | 途经城市列表(从行程节点资源去重提取) | |   `destinationCity` | `string` | | 目的地城市 | |   `families` | `家庭分组VO[]` | | 家庭分组列表(定制产品) | |     `adultCount` | `int` | | 成人数 | |     `babyCount` | `int` | | 幼童数 | |     `childCount` | `int` | | 儿童数 | |     `familyId` | `string` | | 家庭ID | |     `familyName` | `string` | | 家庭名称 | |     `sortOrder` | `int` | | 排序序号 | |     `youngChildCount` | `int` | | 小童数 | |   `folderId` | `string` | | 所属文件夹ID | |   `groupChatQrUrl` | `string` | | 群聊二维码URL | |   `groupRoomId` | `string` | | 企微群聊ID(用于会话存档展示群消息) | |   `isBooking` | `boolean` | | 是否预约产品 | |   `itineraryDays` | `行程天VO[]` | | 行程天列表 | |     `dayId` | `string` | | 行程天ID | |     `dayNumber` | `int` | | 天数编号 | |     `dayTitle` | `string` | | 天标题 | |     `hotels` | `每日酒店VO[]` | | 当日酒店列表 | |     `nodes` | `行程节点VO[]` | | 行程节点列表 | |     `restaurants` | `用餐选项VO[]` | | 当日用餐列表 | |     `routeSummary` | `string` | | 路线概览 | |   `lineId` | `string` | | 产品线ID | |   `lineName` | `string` | | 产品线名称 | |   `lineSubtitle` | `string` | | 产品线副标题 | |   `maxAdultPerOrder` | `int` | | 每单最大成人数(null=不限) | |   `maxChildPerOrder` | `int` | | 每单最大儿童数(null=不限) | |   `mchId` | `string` | | 商户号 | |   `minAdultPerOrder` | `int` | | 每单最少成人数(null=默认1) | |   `name` | `string` | | 产品名称 | |   `paymentMode` | `string` | | 支付模式:FULL=全款 DEPOSIT=定金+尾款 | |   `pricing` | `产品定价配置VO` | | 定价配置 | |     `adultExtraBed` | `number` | | 成人加床费 | |     `babyPrice` | `number` | | 婴儿价 | |     `balanceDueDays` | `int` | | 尾款支付截止天数(出发前N天) | |     `childDiscountPercent` | `number` | | 儿童折扣百分比 | |     `childNoBed` | `number` | | 儿童不占床价 | |     `childWithBed` | `number` | | 儿童占床价 | |     `companionPrice` | `number` | | 陪同人员价格 | |     `customTotalPrice` | `number` | | 定制产品总价(CUSTOM模式下使用) | |     `depositAmount` | `number` | | 定金金额 | |     `depositRatio` | `int` | | 定金比例(百分比) | |     `extraCostPerPerson` | `number` | | 每人额外成本 | |     `insuranceFee` | `number` | | 保险费用 | |     `markupPercent` | `number` | | 加价百分比(PERCENT模式下使用) | |     `maxGroupSize` | `int` | | 最大成团人数 | |     `mealBudget` | `number` | | 餐费预算 | |     `minGroupSize` | `int` | | 最小成团人数 | |     `paymentType` | `string` | | 支付方式:FULL=全款 DEPOSIT=定金+尾款 | |     `pricingId` | `string` | | 定价配置ID | |     `pricingMode` | `string` | | 定价模式:AUTO=自动计算 MANUAL=手动定价 CUSTOM=定制定价 | |     `productId` | `string` | | 产品ID | |     `profitAmount` | `number` | | 利润金额(FIXED模式下使用) | |     `profitMode` | `string` | | 利润模式:FIXED=固定金额 PERCENT=百分比 | |     `singleRoomDiff` | `number` | | 单房差 | |     `vehicleModelIds` | `string[]` | | 车型ID列表 | |     `vehicleWarning` | `string` | | 车辆绑定警告信息(为空表示绑定成功) | |   `productId` | `string` | | 产品ID | |   `productNo` | `string` | | 产品编号 | |   `productType` | `string` | | 产品类型:CORE=核心产品 ROUTE=线路产品 CUSTOM=定制产品 GROUP=小蒙马拼团 | |   `publishedAt` | `string` | | 发布时间 | |   `routeMapUrl` | `string` | | 路径图URL(后端自动生成) | |   `seasons` | `string[]` | | 适用季节列表 | |   `showChatGroup` | `boolean` | | 是否显示群聊入口 | |   `showReview` | `boolean` | | 是否显示评价 | |   `showTripDistance` | `boolean` | | 是否显示行程距离 | |   `showTripTime` | `boolean` | | 是否显示行程时间 | |   `sortOrder` | `int` | | 排序序号 | |   `staffConfigs` | `产品人员配置VO[]` | | 人员配置列表(定制产品) | |     `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |     `id` | `string` | | 记录ID | |     `quantity` | `int` | | 数量 | |     `sortOrder` | `int` | | 排序序号 | |     `staffType` | `string` | | 人员类型:GUIDE/GUIDE_ASSISTANT/PHOTOGRAPHER/LEADER/OTHER | |     `staffTypeName` | `string` | | 人员类型名称 | |   `startPrice` | `number` | | 起步价:未来一年价格日历中最低成人售价 | |   `status` | `string` | | 产品状态:DRAFT/PENDING_REVIEW/REVIEWED/REJECTED/PUBLISHED/UNPUBLISHED/COMPLETED | |   `subtitle` | `string` | | 副标题 | |   `suppliesList` | `产品物资VO[]` | | 物资列表 | |     `billingType` | `string` | | 计费方式:BY_PERSON=按人头 BY_COUNT=按次/按件 | |     `costPerPerson` | `number` | | 每人成本 | |     `coverUrl` | `string` | | 封面图URL | |     `dayNumber` | `int` | | 天数编号(scope=DAY时生效) | |     `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |     `id` | `string` | | 记录ID | |     `quantity` | `int` | | 数量 | |     `scope` | `string` | | 适用范围:ALL=整个行程 DAY=指定天 | |     `sortOrder` | `int` | | 排序序号 | |     `suppliesId` | `string` | | 物资ID | |     `suppliesName` | `string` | | 物资名称 | |   `tags` | `string[]` | | 产品标签列表 | |   `teamExperienceYears` | `int` | | 团队经验年数 | |   `tripDays` | `int` | | 行程天数 | |   `tripNights` | `int` | | 行程晚数 | |   `updateBy` | `string` | | 更新人ID | |   `updateTime` | `string` | | 更新时间 | |   `warmTips` | `string` | | 温馨提示 | |   `youngChildCount` | `int` | | 小童人数 | | `message` | `string` | | 响应消息 | --- ### `GET` /admin/product/item/list **产品列表** 分页查询产品列表,支持多维度筛选和排序。 **权限说明**: - 普通管理员只能看到自己创建的产品 - SUPER_ADMIN 可看到所有产品 **筛选条件**:关键词(名称/副标题模糊匹配)、产品类型、状态、文件夹、产品线、季节、行程天数。 支持多状态筛选(statuses 字段,逗号分隔)。 **关联字典**: - product_type(产品类型,筛选条件):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品 - product_status(产品状态,筛选条件+返回字段):DRAFT=草稿, PENDING_REVIEW=待审核, REVIEWED=已审核, REJECTED=已驳回, PUBLISHED=已上架, UNPUBLISHED=已下架, COMPLETED=已完成, ORDERED=已下单 **查询参数** | 参数 | 类型 | 必填 | 说明 | 示例 | | --- | --- | --- | --- | --- | | `folderId` | `string` | | 文件夹ID | 1893012345678901234 | | `keyword` | `string` | | 搜索关键词 | 丽江 | | `lineId` | `string` | | 产品线ID | 1893012345678901234 | | `page` | `integer(int32)` | | 页码 | 1 | | `pageSize` | `integer(int32)` | | 每页条数 | 20 | | `productType` | `string` | | 产品类型:CORE=核心产品 ROUTE=线路产品 CUSTOM=定制产品 GROUP=小蒙马拼团 | CORE | | `season` | `string` | | 季节筛选 | spring | | `sortBy` | `string` | | 排序字段:name/tripDays/createTime/updateTime | createTime | | `sortDir` | `string` | | 排序方向:asc/desc | desc | | `status` | `string` | | 产品状态:DRAFT/PENDING_REVIEW/REVIEWED/REJECTED/PUBLISHED/UNPUBLISHED/COMPLETED | PUBLISHED | | `statuses` | `string` | | 多状态筛选(逗号分隔) | PUBLISHED,COMPLETED | | `tripDays` | `integer(int32)` | | 行程天数 | 5 | **响应** `统一响应结果«分页结果«产品列表VO»»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `分页结果«产品列表VO»` | | 响应数据 | |   `page` | `int` | | 当前页码 | |   `pageSize` | `int` | | 每页条数 | |   `records` | `产品列表VO[]` | | 数据列表 | |     `adultCount` | `int` | | 成人数(私人定制/路书) | |     `approvalNo` | `string` | | 审批编号 | |     `babyCount` | `int` | | 幼童数(私人定制/路书) | |     `childCount` | `int` | | 儿童数(私人定制/路书) | |     `coverImageUrl` | `string` | | 封面图URL | |     `createBy` | `string` | | 创建人ID | |     `createTime` | `string` | | 创建时间 | |     `departureCity` | `string` | | 出发城市 | |     `destinationCity` | `string` | | 目的地城市 | |     `folderId` | `string` | | 所属文件夹ID | |     `groupRoomId` | `string` | | 企微群聊ID(用于会话存档展示群消息) | |     `isBooking` | `boolean` | | 是否预约产品 | |     `lineId` | `string` | | 产品线ID | |     `lineName` | `string` | | 产品线名称 | |     `maxAdultPerOrder` | `int` | | 每单最大成人数(null=不限) | |     `maxChildPerOrder` | `int` | | 每单最大儿童数(null=不限) | |     `mchId` | `string` | | 商户号 | |     `minAdultPerOrder` | `int` | | 每单最少成人数(null=默认1) | |     `name` | `string` | | 产品名称 | |     `pendingStatus` | `string` | | 待审批目标状态 | |     `productId` | `string` | | 产品ID | |     `productNo` | `string` | | 产品编号 | |     `productType` | `string` | | 产品类型:CORE=核心产品 ROUTE=线路产品 CUSTOM=定制产品 GROUP=小蒙马拼团 | |     `seasons` | `string[]` | | 适用季节列表 | |     `sortOrder` | `int` | | 排序序号 | |     `status` | `string` | | 产品状态:DRAFT/PENDING_REVIEW/REVIEWED/REJECTED/PUBLISHED/UNPUBLISHED/COMPLETED | |     `subtitle` | `string` | | 副标题 | |     `tripDays` | `int` | | 行程天数 | |     `tripNights` | `int` | | 行程晚数 | |     `updateTime` | `string` | | 更新时间 | |     `youngChildCount` | `int` | | 小童数(私人定制/路书) | |   `total` | `int` | | 总记录数 | | `message` | `string` | | 响应消息 | --- ### `GET` /admin/product/item/{productId} **获取产品详情** 获取产品完整信息,包括基本信息、行程天列表、定价配置、费用项等。 返回数据包含关联的行程节点资源详情,适用于产品编辑页面。 不过滤产品状态,所有状态的产品都可查看。 **关联字典**: - product_type(产品类型):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品 - product_status(产品状态):DRAFT=草稿, PENDING_REVIEW=待审核, REVIEWED=已审核, REJECTED=已驳回, PUBLISHED=已上架, UNPUBLISHED=已下架, COMPLETED=已完成, ORDERED=已下单 - product_category(产品分类):family=亲子游, honeymoon=蜜月游, photography=旅拍, experience=体验, driving=自驾 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **响应** `统一响应结果«产品详情VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品详情VO` | | 响应数据 | |   `adultCount` | `int` | | 成人人数 | |   `babyCount` | `int` | | 婴儿人数 | |   `benefitsDescription` | `权益分组[]` | | 权益说明(静态,所有产品相同) | |     `items` | `权益项[]` | | 权益项列表 | |     `title` | `string` | | 分组标题,如:儿童权益 (1.2m以下) | |   `bookingNotice` | `string` | | 预定须知 | |   `cancelPolicy` | `string` | | 退改政策 | |   `carouselImages` | `string[]` | | 轮播图列表 | |   `carouselVideoUrl` | `string` | | 轮播视频URL | |   `chatMessages` | `群聊消息VO[]` | | 群聊消息列表 | |     `avatar` | `string` | | 用户头像URL(type=user时有效) | |     `text` | `string` | | 消息内容 | |     `type` | `string` | | 消息类型: user/creator | |   `childCount` | `int` | | 儿童人数 | |   `costItems` | `产品成本项VO[]` | | 成本项列表 | |     `category` | `string` | | 成本项类别:HOTEL/SCENIC/VEHICLE/ACTIVITY/SERVICE/DINING/OTHER | |     `description` | `string` | | 成本项描述 | |     `id` | `string` | | 成本项ID | |     `sortOrder` | `int` | | 排序序号 | |     `title` | `string` | | 成本项标题 | |     `type` | `string` | | 成本项类型:INCLUDED=费用包含 EXCLUDED=费用不含 SELF_PAY=自理费用 | |   `coverImageUrl` | `string` | | 封面图URL | |   `createBy` | `string` | | 创建人ID | |   `createTime` | `string` | | 创建时间 | |   `creatorAvatarUrl` | `string` | | 定制师头像URL | |   `creatorIntro` | `string` | | 创作者寄语 | |   `customFees` | `产品自定义费用项VO[]` | | 自定义费用项列表 | |     `description` | `string` | | 费用说明 | |     `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |     `feeAmount` | `number` | | 费用金额 | |     `feeName` | `string` | | 费用项名称 | |     `feeUnit` | `string` | | 费用单位 | |     `id` | `string` | | 费用项ID | |     `sortOrder` | `int` | | 排序序号 | |   `customizerId` | `string` | | 定制师ID | |   `departureCity` | `string` | | 出发城市 | |   `destinationCities` | `string[]` | | 途经城市列表(从行程节点资源去重提取) | |   `destinationCity` | `string` | | 目的地城市 | |   `families` | `家庭分组VO[]` | | 家庭分组列表(定制产品) | |     `adultCount` | `int` | | 成人数 | |     `babyCount` | `int` | | 幼童数 | |     `childCount` | `int` | | 儿童数 | |     `familyId` | `string` | | 家庭ID | |     `familyName` | `string` | | 家庭名称 | |     `sortOrder` | `int` | | 排序序号 | |     `youngChildCount` | `int` | | 小童数 | |   `folderId` | `string` | | 所属文件夹ID | |   `groupChatQrUrl` | `string` | | 群聊二维码URL | |   `groupRoomId` | `string` | | 企微群聊ID(用于会话存档展示群消息) | |   `isBooking` | `boolean` | | 是否预约产品 | |   `itineraryDays` | `行程天VO[]` | | 行程天列表 | |     `dayId` | `string` | | 行程天ID | |     `dayNumber` | `int` | | 天数编号 | |     `dayTitle` | `string` | | 天标题 | |     `hotels` | `每日酒店VO[]` | | 当日酒店列表 | |     `nodes` | `行程节点VO[]` | | 行程节点列表 | |     `restaurants` | `用餐选项VO[]` | | 当日用餐列表 | |     `routeSummary` | `string` | | 路线概览 | |   `lineId` | `string` | | 产品线ID | |   `lineName` | `string` | | 产品线名称 | |   `lineSubtitle` | `string` | | 产品线副标题 | |   `maxAdultPerOrder` | `int` | | 每单最大成人数(null=不限) | |   `maxChildPerOrder` | `int` | | 每单最大儿童数(null=不限) | |   `mchId` | `string` | | 商户号 | |   `minAdultPerOrder` | `int` | | 每单最少成人数(null=默认1) | |   `name` | `string` | | 产品名称 | |   `paymentMode` | `string` | | 支付模式:FULL=全款 DEPOSIT=定金+尾款 | |   `pricing` | `产品定价配置VO` | | 定价配置 | |     `adultExtraBed` | `number` | | 成人加床费 | |     `babyPrice` | `number` | | 婴儿价 | |     `balanceDueDays` | `int` | | 尾款支付截止天数(出发前N天) | |     `childDiscountPercent` | `number` | | 儿童折扣百分比 | |     `childNoBed` | `number` | | 儿童不占床价 | |     `childWithBed` | `number` | | 儿童占床价 | |     `companionPrice` | `number` | | 陪同人员价格 | |     `customTotalPrice` | `number` | | 定制产品总价(CUSTOM模式下使用) | |     `depositAmount` | `number` | | 定金金额 | |     `depositRatio` | `int` | | 定金比例(百分比) | |     `extraCostPerPerson` | `number` | | 每人额外成本 | |     `insuranceFee` | `number` | | 保险费用 | |     `markupPercent` | `number` | | 加价百分比(PERCENT模式下使用) | |     `maxGroupSize` | `int` | | 最大成团人数 | |     `mealBudget` | `number` | | 餐费预算 | |     `minGroupSize` | `int` | | 最小成团人数 | |     `paymentType` | `string` | | 支付方式:FULL=全款 DEPOSIT=定金+尾款 | |     `pricingId` | `string` | | 定价配置ID | |     `pricingMode` | `string` | | 定价模式:AUTO=自动计算 MANUAL=手动定价 CUSTOM=定制定价 | |     `productId` | `string` | | 产品ID | |     `profitAmount` | `number` | | 利润金额(FIXED模式下使用) | |     `profitMode` | `string` | | 利润模式:FIXED=固定金额 PERCENT=百分比 | |     `singleRoomDiff` | `number` | | 单房差 | |     `vehicleModelIds` | `string[]` | | 车型ID列表 | |     `vehicleWarning` | `string` | | 车辆绑定警告信息(为空表示绑定成功) | |   `productId` | `string` | | 产品ID | |   `productNo` | `string` | | 产品编号 | |   `productType` | `string` | | 产品类型:CORE=核心产品 ROUTE=线路产品 CUSTOM=定制产品 GROUP=小蒙马拼团 | |   `publishedAt` | `string` | | 发布时间 | |   `routeMapUrl` | `string` | | 路径图URL(后端自动生成) | |   `seasons` | `string[]` | | 适用季节列表 | |   `showChatGroup` | `boolean` | | 是否显示群聊入口 | |   `showReview` | `boolean` | | 是否显示评价 | |   `showTripDistance` | `boolean` | | 是否显示行程距离 | |   `showTripTime` | `boolean` | | 是否显示行程时间 | |   `sortOrder` | `int` | | 排序序号 | |   `staffConfigs` | `产品人员配置VO[]` | | 人员配置列表(定制产品) | |     `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |     `id` | `string` | | 记录ID | |     `quantity` | `int` | | 数量 | |     `sortOrder` | `int` | | 排序序号 | |     `staffType` | `string` | | 人员类型:GUIDE/GUIDE_ASSISTANT/PHOTOGRAPHER/LEADER/OTHER | |     `staffTypeName` | `string` | | 人员类型名称 | |   `startPrice` | `number` | | 起步价:未来一年价格日历中最低成人售价 | |   `status` | `string` | | 产品状态:DRAFT/PENDING_REVIEW/REVIEWED/REJECTED/PUBLISHED/UNPUBLISHED/COMPLETED | |   `subtitle` | `string` | | 副标题 | |   `suppliesList` | `产品物资VO[]` | | 物资列表 | |     `billingType` | `string` | | 计费方式:BY_PERSON=按人头 BY_COUNT=按次/按件 | |     `costPerPerson` | `number` | | 每人成本 | |     `coverUrl` | `string` | | 封面图URL | |     `dayNumber` | `int` | | 天数编号(scope=DAY时生效) | |     `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |     `id` | `string` | | 记录ID | |     `quantity` | `int` | | 数量 | |     `scope` | `string` | | 适用范围:ALL=整个行程 DAY=指定天 | |     `sortOrder` | `int` | | 排序序号 | |     `suppliesId` | `string` | | 物资ID | |     `suppliesName` | `string` | | 物资名称 | |   `tags` | `string[]` | | 产品标签列表 | |   `teamExperienceYears` | `int` | | 团队经验年数 | |   `tripDays` | `int` | | 行程天数 | |   `tripNights` | `int` | | 行程晚数 | |   `updateBy` | `string` | | 更新人ID | |   `updateTime` | `string` | | 更新时间 | |   `warmTips` | `string` | | 温馨提示 | |   `youngChildCount` | `int` | | 小童人数 | | `message` | `string` | | 响应消息 | --- ### `PUT` /admin/product/item/{productId} **更新产品** 更新产品基本信息,仅传入需要修改的字段,未传字段不会被覆盖。 **权限说明**: - 普通管理员只能编辑自己创建的产品 - SUPER_ADMIN 可编辑所有产品 **注意**:行程、定价、价格日历等通过各自独立的接口管理,不在此接口中处理。 **关联字典**: - product_type(产品类型):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品 - product_category(产品分类):family=亲子游, honeymoon=蜜月游, photography=旅拍, experience=体验, driving=自驾 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **请求体** `更新产品请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `adultCount` | `int` | | 成人人数 | | `babyCount` | `int` | | 婴儿人数 | | `bookingNotice` | `string` | | 预定须知 | | `cancelPolicy` | `string` | | 退改政策 | | `carouselImages` | `string[]` | | 轮播图列表 | | `carouselVideoUrl` | `string` | | 轮播视频URL | | `chatMessages` | `群聊消息VO[]` | | 群聊消息列表 | |   `avatar` | `string` | | 用户头像URL(type=user时有效) | |   `text` | `string` | | 消息内容 | |   `type` | `string` | | 消息类型: user/creator | | `childCount` | `int` | | 儿童人数 | | `creatorAvatarUrl` | `string` | | 定制师头像URL | | `creatorIntro` | `string` | | 创作者寄语 | | `customizerId` | `string` | | 定制师ID | | `departureCity` | `string` | | 出发城市 | | `destinationCity` | `string` | | 目的地城市 | | `folderId` | `string` | | 所属文件夹ID | | `groupChatQrUrl` | `string` | | 群聊二维码URL | | `groupRoomId` | `string` | | 企微群聊ID(用于会话存档展示群消息) | | `isBooking` | `boolean` | | 是否预约产品 | | `lineId` | `string` | | 产品线ID | | `lineSubtitle` | `string` | | 产品线副标题 | | `maxAdultPerOrder` | `int` | | 每单最大成人数(不填则不限制) | | `maxChildPerOrder` | `int` | | 每单最大儿童数(不填则不限制) | | `mchId` | `string` | | 商户号:shanhe/wenlu | | `minAdultPerOrder` | `int` | | 每单最少成人数(不填默认1) | | `name` | `string` | | 产品名称 | | `seasons` | `string[]` | | 适用季节列表 | | `showChatGroup` | `boolean` | | 是否显示群聊入口 | | `showReview` | `boolean` | | 是否显示评价 | | `showTripDistance` | `boolean` | | 是否显示行程距离 | | `showTripTime` | `boolean` | | 是否显示行程时间 | | `sortOrder` | `int` | | 排序序号 | | `subtitle` | `string` | | 副标题 | | `tags` | `string[]` | | 产品标签列表 | | `teamExperienceYears` | `int` | | 团队经验年数 | | `tripDays` | `int` | | 行程天数 | | `warmTips` | `string` | | 温馨提示 | | `youngChildCount` | `int` | | 小童人数 | **响应** `统一响应结果«产品详情VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品详情VO` | | 响应数据 | |   `adultCount` | `int` | | 成人人数 | |   `babyCount` | `int` | | 婴儿人数 | |   `benefitsDescription` | `权益分组[]` | | 权益说明(静态,所有产品相同) | |     `items` | `权益项[]` | | 权益项列表 | |     `title` | `string` | | 分组标题,如:儿童权益 (1.2m以下) | |   `bookingNotice` | `string` | | 预定须知 | |   `cancelPolicy` | `string` | | 退改政策 | |   `carouselImages` | `string[]` | | 轮播图列表 | |   `carouselVideoUrl` | `string` | | 轮播视频URL | |   `chatMessages` | `群聊消息VO[]` | | 群聊消息列表 | |     `avatar` | `string` | | 用户头像URL(type=user时有效) | |     `text` | `string` | | 消息内容 | |     `type` | `string` | | 消息类型: user/creator | |   `childCount` | `int` | | 儿童人数 | |   `costItems` | `产品成本项VO[]` | | 成本项列表 | |     `category` | `string` | | 成本项类别:HOTEL/SCENIC/VEHICLE/ACTIVITY/SERVICE/DINING/OTHER | |     `description` | `string` | | 成本项描述 | |     `id` | `string` | | 成本项ID | |     `sortOrder` | `int` | | 排序序号 | |     `title` | `string` | | 成本项标题 | |     `type` | `string` | | 成本项类型:INCLUDED=费用包含 EXCLUDED=费用不含 SELF_PAY=自理费用 | |   `coverImageUrl` | `string` | | 封面图URL | |   `createBy` | `string` | | 创建人ID | |   `createTime` | `string` | | 创建时间 | |   `creatorAvatarUrl` | `string` | | 定制师头像URL | |   `creatorIntro` | `string` | | 创作者寄语 | |   `customFees` | `产品自定义费用项VO[]` | | 自定义费用项列表 | |     `description` | `string` | | 费用说明 | |     `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |     `feeAmount` | `number` | | 费用金额 | |     `feeName` | `string` | | 费用项名称 | |     `feeUnit` | `string` | | 费用单位 | |     `id` | `string` | | 费用项ID | |     `sortOrder` | `int` | | 排序序号 | |   `customizerId` | `string` | | 定制师ID | |   `departureCity` | `string` | | 出发城市 | |   `destinationCities` | `string[]` | | 途经城市列表(从行程节点资源去重提取) | |   `destinationCity` | `string` | | 目的地城市 | |   `families` | `家庭分组VO[]` | | 家庭分组列表(定制产品) | |     `adultCount` | `int` | | 成人数 | |     `babyCount` | `int` | | 幼童数 | |     `childCount` | `int` | | 儿童数 | |     `familyId` | `string` | | 家庭ID | |     `familyName` | `string` | | 家庭名称 | |     `sortOrder` | `int` | | 排序序号 | |     `youngChildCount` | `int` | | 小童数 | |   `folderId` | `string` | | 所属文件夹ID | |   `groupChatQrUrl` | `string` | | 群聊二维码URL | |   `groupRoomId` | `string` | | 企微群聊ID(用于会话存档展示群消息) | |   `isBooking` | `boolean` | | 是否预约产品 | |   `itineraryDays` | `行程天VO[]` | | 行程天列表 | |     `dayId` | `string` | | 行程天ID | |     `dayNumber` | `int` | | 天数编号 | |     `dayTitle` | `string` | | 天标题 | |     `hotels` | `每日酒店VO[]` | | 当日酒店列表 | |     `nodes` | `行程节点VO[]` | | 行程节点列表 | |     `restaurants` | `用餐选项VO[]` | | 当日用餐列表 | |     `routeSummary` | `string` | | 路线概览 | |   `lineId` | `string` | | 产品线ID | |   `lineName` | `string` | | 产品线名称 | |   `lineSubtitle` | `string` | | 产品线副标题 | |   `maxAdultPerOrder` | `int` | | 每单最大成人数(null=不限) | |   `maxChildPerOrder` | `int` | | 每单最大儿童数(null=不限) | |   `mchId` | `string` | | 商户号 | |   `minAdultPerOrder` | `int` | | 每单最少成人数(null=默认1) | |   `name` | `string` | | 产品名称 | |   `paymentMode` | `string` | | 支付模式:FULL=全款 DEPOSIT=定金+尾款 | |   `pricing` | `产品定价配置VO` | | 定价配置 | |     `adultExtraBed` | `number` | | 成人加床费 | |     `babyPrice` | `number` | | 婴儿价 | |     `balanceDueDays` | `int` | | 尾款支付截止天数(出发前N天) | |     `childDiscountPercent` | `number` | | 儿童折扣百分比 | |     `childNoBed` | `number` | | 儿童不占床价 | |     `childWithBed` | `number` | | 儿童占床价 | |     `companionPrice` | `number` | | 陪同人员价格 | |     `customTotalPrice` | `number` | | 定制产品总价(CUSTOM模式下使用) | |     `depositAmount` | `number` | | 定金金额 | |     `depositRatio` | `int` | | 定金比例(百分比) | |     `extraCostPerPerson` | `number` | | 每人额外成本 | |     `insuranceFee` | `number` | | 保险费用 | |     `markupPercent` | `number` | | 加价百分比(PERCENT模式下使用) | |     `maxGroupSize` | `int` | | 最大成团人数 | |     `mealBudget` | `number` | | 餐费预算 | |     `minGroupSize` | `int` | | 最小成团人数 | |     `paymentType` | `string` | | 支付方式:FULL=全款 DEPOSIT=定金+尾款 | |     `pricingId` | `string` | | 定价配置ID | |     `pricingMode` | `string` | | 定价模式:AUTO=自动计算 MANUAL=手动定价 CUSTOM=定制定价 | |     `productId` | `string` | | 产品ID | |     `profitAmount` | `number` | | 利润金额(FIXED模式下使用) | |     `profitMode` | `string` | | 利润模式:FIXED=固定金额 PERCENT=百分比 | |     `singleRoomDiff` | `number` | | 单房差 | |     `vehicleModelIds` | `string[]` | | 车型ID列表 | |     `vehicleWarning` | `string` | | 车辆绑定警告信息(为空表示绑定成功) | |   `productId` | `string` | | 产品ID | |   `productNo` | `string` | | 产品编号 | |   `productType` | `string` | | 产品类型:CORE=核心产品 ROUTE=线路产品 CUSTOM=定制产品 GROUP=小蒙马拼团 | |   `publishedAt` | `string` | | 发布时间 | |   `routeMapUrl` | `string` | | 路径图URL(后端自动生成) | |   `seasons` | `string[]` | | 适用季节列表 | |   `showChatGroup` | `boolean` | | 是否显示群聊入口 | |   `showReview` | `boolean` | | 是否显示评价 | |   `showTripDistance` | `boolean` | | 是否显示行程距离 | |   `showTripTime` | `boolean` | | 是否显示行程时间 | |   `sortOrder` | `int` | | 排序序号 | |   `staffConfigs` | `产品人员配置VO[]` | | 人员配置列表(定制产品) | |     `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |     `id` | `string` | | 记录ID | |     `quantity` | `int` | | 数量 | |     `sortOrder` | `int` | | 排序序号 | |     `staffType` | `string` | | 人员类型:GUIDE/GUIDE_ASSISTANT/PHOTOGRAPHER/LEADER/OTHER | |     `staffTypeName` | `string` | | 人员类型名称 | |   `startPrice` | `number` | | 起步价:未来一年价格日历中最低成人售价 | |   `status` | `string` | | 产品状态:DRAFT/PENDING_REVIEW/REVIEWED/REJECTED/PUBLISHED/UNPUBLISHED/COMPLETED | |   `subtitle` | `string` | | 副标题 | |   `suppliesList` | `产品物资VO[]` | | 物资列表 | |     `billingType` | `string` | | 计费方式:BY_PERSON=按人头 BY_COUNT=按次/按件 | |     `costPerPerson` | `number` | | 每人成本 | |     `coverUrl` | `string` | | 封面图URL | |     `dayNumber` | `int` | | 天数编号(scope=DAY时生效) | |     `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |     `id` | `string` | | 记录ID | |     `quantity` | `int` | | 数量 | |     `scope` | `string` | | 适用范围:ALL=整个行程 DAY=指定天 | |     `sortOrder` | `int` | | 排序序号 | |     `suppliesId` | `string` | | 物资ID | |     `suppliesName` | `string` | | 物资名称 | |   `tags` | `string[]` | | 产品标签列表 | |   `teamExperienceYears` | `int` | | 团队经验年数 | |   `tripDays` | `int` | | 行程天数 | |   `tripNights` | `int` | | 行程晚数 | |   `updateBy` | `string` | | 更新人ID | |   `updateTime` | `string` | | 更新时间 | |   `warmTips` | `string` | | 温馨提示 | |   `youngChildCount` | `int` | | 小童人数 | | `message` | `string` | | 响应消息 | --- ### `DELETE` /admin/product/item/{productId} **删除产品** 软删除产品(设置 deleted_at 字段)。 **权限说明**:普通管理员只能删除自己创建的产品,SUPER_ADMIN 可删除所有产品。 **限制**:已上架(PUBLISHED)的产品不能直接删除,需先下架。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **响应** `统一响应结果«Void»` --- ### `POST` /admin/product/item/{productId}/copy **复制产品** 深度复制产品,包括行程天、行程节点、定价配置、住宿、餐饮、物资、人员配置等所有关联数据。 复制后的产品状态为 DRAFT,名称自动添加"(副本)"后缀。 适用场景:基于已有产品快速创建新产品。 **关联字典**: - product_type(产品类型,返回字段):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品 - product_status(产品状态,复制后固定为 DRAFT) **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **响应** `统一响应结果«产品详情VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品详情VO` | | 响应数据 | |   `adultCount` | `int` | | 成人人数 | |   `babyCount` | `int` | | 婴儿人数 | |   `benefitsDescription` | `权益分组[]` | | 权益说明(静态,所有产品相同) | |     `items` | `权益项[]` | | 权益项列表 | |     `title` | `string` | | 分组标题,如:儿童权益 (1.2m以下) | |   `bookingNotice` | `string` | | 预定须知 | |   `cancelPolicy` | `string` | | 退改政策 | |   `carouselImages` | `string[]` | | 轮播图列表 | |   `carouselVideoUrl` | `string` | | 轮播视频URL | |   `chatMessages` | `群聊消息VO[]` | | 群聊消息列表 | |     `avatar` | `string` | | 用户头像URL(type=user时有效) | |     `text` | `string` | | 消息内容 | |     `type` | `string` | | 消息类型: user/creator | |   `childCount` | `int` | | 儿童人数 | |   `costItems` | `产品成本项VO[]` | | 成本项列表 | |     `category` | `string` | | 成本项类别:HOTEL/SCENIC/VEHICLE/ACTIVITY/SERVICE/DINING/OTHER | |     `description` | `string` | | 成本项描述 | |     `id` | `string` | | 成本项ID | |     `sortOrder` | `int` | | 排序序号 | |     `title` | `string` | | 成本项标题 | |     `type` | `string` | | 成本项类型:INCLUDED=费用包含 EXCLUDED=费用不含 SELF_PAY=自理费用 | |   `coverImageUrl` | `string` | | 封面图URL | |   `createBy` | `string` | | 创建人ID | |   `createTime` | `string` | | 创建时间 | |   `creatorAvatarUrl` | `string` | | 定制师头像URL | |   `creatorIntro` | `string` | | 创作者寄语 | |   `customFees` | `产品自定义费用项VO[]` | | 自定义费用项列表 | |     `description` | `string` | | 费用说明 | |     `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |     `feeAmount` | `number` | | 费用金额 | |     `feeName` | `string` | | 费用项名称 | |     `feeUnit` | `string` | | 费用单位 | |     `id` | `string` | | 费用项ID | |     `sortOrder` | `int` | | 排序序号 | |   `customizerId` | `string` | | 定制师ID | |   `departureCity` | `string` | | 出发城市 | |   `destinationCities` | `string[]` | | 途经城市列表(从行程节点资源去重提取) | |   `destinationCity` | `string` | | 目的地城市 | |   `families` | `家庭分组VO[]` | | 家庭分组列表(定制产品) | |     `adultCount` | `int` | | 成人数 | |     `babyCount` | `int` | | 幼童数 | |     `childCount` | `int` | | 儿童数 | |     `familyId` | `string` | | 家庭ID | |     `familyName` | `string` | | 家庭名称 | |     `sortOrder` | `int` | | 排序序号 | |     `youngChildCount` | `int` | | 小童数 | |   `folderId` | `string` | | 所属文件夹ID | |   `groupChatQrUrl` | `string` | | 群聊二维码URL | |   `groupRoomId` | `string` | | 企微群聊ID(用于会话存档展示群消息) | |   `isBooking` | `boolean` | | 是否预约产品 | |   `itineraryDays` | `行程天VO[]` | | 行程天列表 | |     `dayId` | `string` | | 行程天ID | |     `dayNumber` | `int` | | 天数编号 | |     `dayTitle` | `string` | | 天标题 | |     `hotels` | `每日酒店VO[]` | | 当日酒店列表 | |     `nodes` | `行程节点VO[]` | | 行程节点列表 | |     `restaurants` | `用餐选项VO[]` | | 当日用餐列表 | |     `routeSummary` | `string` | | 路线概览 | |   `lineId` | `string` | | 产品线ID | |   `lineName` | `string` | | 产品线名称 | |   `lineSubtitle` | `string` | | 产品线副标题 | |   `maxAdultPerOrder` | `int` | | 每单最大成人数(null=不限) | |   `maxChildPerOrder` | `int` | | 每单最大儿童数(null=不限) | |   `mchId` | `string` | | 商户号 | |   `minAdultPerOrder` | `int` | | 每单最少成人数(null=默认1) | |   `name` | `string` | | 产品名称 | |   `paymentMode` | `string` | | 支付模式:FULL=全款 DEPOSIT=定金+尾款 | |   `pricing` | `产品定价配置VO` | | 定价配置 | |     `adultExtraBed` | `number` | | 成人加床费 | |     `babyPrice` | `number` | | 婴儿价 | |     `balanceDueDays` | `int` | | 尾款支付截止天数(出发前N天) | |     `childDiscountPercent` | `number` | | 儿童折扣百分比 | |     `childNoBed` | `number` | | 儿童不占床价 | |     `childWithBed` | `number` | | 儿童占床价 | |     `companionPrice` | `number` | | 陪同人员价格 | |     `customTotalPrice` | `number` | | 定制产品总价(CUSTOM模式下使用) | |     `depositAmount` | `number` | | 定金金额 | |     `depositRatio` | `int` | | 定金比例(百分比) | |     `extraCostPerPerson` | `number` | | 每人额外成本 | |     `insuranceFee` | `number` | | 保险费用 | |     `markupPercent` | `number` | | 加价百分比(PERCENT模式下使用) | |     `maxGroupSize` | `int` | | 最大成团人数 | |     `mealBudget` | `number` | | 餐费预算 | |     `minGroupSize` | `int` | | 最小成团人数 | |     `paymentType` | `string` | | 支付方式:FULL=全款 DEPOSIT=定金+尾款 | |     `pricingId` | `string` | | 定价配置ID | |     `pricingMode` | `string` | | 定价模式:AUTO=自动计算 MANUAL=手动定价 CUSTOM=定制定价 | |     `productId` | `string` | | 产品ID | |     `profitAmount` | `number` | | 利润金额(FIXED模式下使用) | |     `profitMode` | `string` | | 利润模式:FIXED=固定金额 PERCENT=百分比 | |     `singleRoomDiff` | `number` | | 单房差 | |     `vehicleModelIds` | `string[]` | | 车型ID列表 | |     `vehicleWarning` | `string` | | 车辆绑定警告信息(为空表示绑定成功) | |   `productId` | `string` | | 产品ID | |   `productNo` | `string` | | 产品编号 | |   `productType` | `string` | | 产品类型:CORE=核心产品 ROUTE=线路产品 CUSTOM=定制产品 GROUP=小蒙马拼团 | |   `publishedAt` | `string` | | 发布时间 | |   `routeMapUrl` | `string` | | 路径图URL(后端自动生成) | |   `seasons` | `string[]` | | 适用季节列表 | |   `showChatGroup` | `boolean` | | 是否显示群聊入口 | |   `showReview` | `boolean` | | 是否显示评价 | |   `showTripDistance` | `boolean` | | 是否显示行程距离 | |   `showTripTime` | `boolean` | | 是否显示行程时间 | |   `sortOrder` | `int` | | 排序序号 | |   `staffConfigs` | `产品人员配置VO[]` | | 人员配置列表(定制产品) | |     `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |     `id` | `string` | | 记录ID | |     `quantity` | `int` | | 数量 | |     `sortOrder` | `int` | | 排序序号 | |     `staffType` | `string` | | 人员类型:GUIDE/GUIDE_ASSISTANT/PHOTOGRAPHER/LEADER/OTHER | |     `staffTypeName` | `string` | | 人员类型名称 | |   `startPrice` | `number` | | 起步价:未来一年价格日历中最低成人售价 | |   `status` | `string` | | 产品状态:DRAFT/PENDING_REVIEW/REVIEWED/REJECTED/PUBLISHED/UNPUBLISHED/COMPLETED | |   `subtitle` | `string` | | 副标题 | |   `suppliesList` | `产品物资VO[]` | | 物资列表 | |     `billingType` | `string` | | 计费方式:BY_PERSON=按人头 BY_COUNT=按次/按件 | |     `costPerPerson` | `number` | | 每人成本 | |     `coverUrl` | `string` | | 封面图URL | |     `dayNumber` | `int` | | 天数编号(scope=DAY时生效) | |     `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |     `id` | `string` | | 记录ID | |     `quantity` | `int` | | 数量 | |     `scope` | `string` | | 适用范围:ALL=整个行程 DAY=指定天 | |     `sortOrder` | `int` | | 排序序号 | |     `suppliesId` | `string` | | 物资ID | |     `suppliesName` | `string` | | 物资名称 | |   `tags` | `string[]` | | 产品标签列表 | |   `teamExperienceYears` | `int` | | 团队经验年数 | |   `tripDays` | `int` | | 行程天数 | |   `tripNights` | `int` | | 行程晚数 | |   `updateBy` | `string` | | 更新人ID | |   `updateTime` | `string` | | 更新时间 | |   `warmTips` | `string` | | 温馨提示 | |   `youngChildCount` | `int` | | 小童人数 | | `message` | `string` | | 响应消息 | --- ### `POST` /admin/product/item/{productId}/generate-route-map **手动生成路径图** 根据产品行程节点的经纬度信息,调用地图API生成行程路径图。 通常在行程编辑完成后手动触发,生成结果为 OSS 图片 URL。 如果行程节点没有经纬度信息,则无法生成路径图。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **响应** `统一响应结果«string»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `string` | | 响应数据 | | `message` | `string` | | 响应消息 | --- ### `PUT` /admin/product/item/{productId}/move **移动产品到文件夹** 将产品移动到指定文件夹,或移出文件夹(folderId 传空字符串或 null)。 文件夹用于组织管理产品,不影响产品的业务逻辑。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **请求体** `产品移动请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `folderId` | `string` | | 目标文件夹ID,为空则移动到根目录 | **响应** `统一响应结果«Void»` --- ### `POST` /admin/product/item/{productId}/share-link **生成定制产品分享链接** 为 CUSTOM(定制)产品生成小程序分享链接,用于定制师发送给客户查看方案。 **限制**:仅 CUSTOM 类型且状态为 COMPLETED 的产品可生成。 **权限**:普通管理员只能为自己创建的产品生成链接,SUPER_ADMIN 不受限制。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **响应** `统一响应结果«分享链接响应»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `分享链接响应` | | 响应数据 | |   `expireTime` | `object` | | 链接过期时间(Unix时间戳) | |   `productId` | `long` | | 产品ID | |   `productName` | `string` | | 产品名称 | |   `urlLink` | `string` | | 微信URL Link | | `message` | `string` | | 响应消息 | --- ### `PUT` /admin/product/item/{productId}/status **产品状态变更(上架/下架/完成)** 根据产品类型,状态流转规则不同: **核心产品(CORE) / 小蒙马(GROUP)**:支持上架/下架,需企微审批 - DRAFT → PENDING_REVIEW → REVIEWED → PUBLISHED(上架) - PUBLISHED → UNPUBLISHED(下架) - UNPUBLISHED → PUBLISHED(重新上架) - REJECTED → DRAFT(驳回后重新编辑) **定制产品(CUSTOM)**:仅支持完成,无上架/下架概念 - DRAFT → COMPLETED(定制师完成设计) - COMPLETED → ORDERED(客户下单,系统自动变更) - ORDERED → COMPLETED(订单取消/退款后回退) **关联字典**: - product_type(产品类型,影响状态流转规则):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品 - product_status(产品状态,请求+返回字段):DRAFT=草稿, PENDING_REVIEW=待审核, REVIEWED=已审核, REJECTED=已驳回, PUBLISHED=已上架, UNPUBLISHED=已下架, COMPLETED=已完成, ORDERED=已下单 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **请求体** `产品状态变更请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `reason` | `string` | | 状态变更原因(驳回时必填;上架/下架审批时可填) | | `status` | `string` | 是 | 目标状态。核心/小蒙马:DRAFT/PENDING_REVIEW/REVIEWED/REJECTED/PUBLISHED/UNPUBLISHED;定制产品:COMPLETED | **响应** `统一响应结果«Void»` --- ## 产品线管理 ### `POST` /admin/product/line **创建产品线** 创建产品线,用于对产品进行业务分类(如:亲子游、蜜月游、探险游等)。 产品线在小程序端可作为筛选条件,帮助用户快速找到感兴趣的产品类别。 **请求体** `创建产品线请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `coverImageUrl` | `string` | | 封面图URL | | `description` | `string` | | 产品线描述 | | `name` | `string` | 是 | 产品线名称 | | `sortOrder` | `int` | | 排序序号 | **响应** `统一响应结果«产品线VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品线VO` | | 响应数据 | |   `coverImageUrl` | `string` | | 封面图URL | |   `createBy` | `string` | | 创建人ID | |   `createTime` | `string` | | 创建时间 | |   `description` | `string` | | 产品线描述 | |   `lineId` | `string` | | 产品线ID | |   `name` | `string` | | 产品线名称 | |   `productCount` | `int` | | 关联产品数量 | |   `sortOrder` | `int` | | 排序序号 | |   `status` | `string` | | 状态:ACTIVE=启用 INACTIVE=停用 | |   `updateTime` | `string` | | 更新时间 | | `message` | `string` | | 响应消息 | --- ### `GET` /admin/product/line/active **所有启用的产品线** 获取所有启用状态的产品线,不分页。 适用于产品编辑时的产品线下拉选择,以及小程序端的筛选项。 **响应** `统一响应结果«List«产品线VO»»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品线VO[]` | | 响应数据 | |   `coverImageUrl` | `string` | | 封面图URL | |   `createBy` | `string` | | 创建人ID | |   `createTime` | `string` | | 创建时间 | |   `description` | `string` | | 产品线描述 | |   `lineId` | `string` | | 产品线ID | |   `name` | `string` | | 产品线名称 | |   `productCount` | `int` | | 关联产品数量 | |   `sortOrder` | `int` | | 排序序号 | |   `status` | `string` | | 状态:ACTIVE=启用 INACTIVE=停用 | |   `updateTime` | `string` | | 更新时间 | | `message` | `string` | | 响应消息 | --- ### `GET` /admin/product/line/list **产品线列表(分页)** 分页查询产品线列表,支持按名称关键词筛选。 **查询参数** | 参数 | 类型 | 必填 | 说明 | 示例 | | --- | --- | --- | --- | --- | | `keyword` | `string` | | 搜索关键词 | 丽江 | | `page` | `integer(int32)` | | 页码 | 1 | | `pageSize` | `integer(int32)` | | 每页条数 | 20 | | `status` | `string` | | 产品线状态:ACTIVE=启用 INACTIVE=停用 | ACTIVE | **响应** `统一响应结果«分页结果«产品线VO»»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `分页结果«产品线VO»` | | 响应数据 | |   `page` | `int` | | 当前页码 | |   `pageSize` | `int` | | 每页条数 | |   `records` | `产品线VO[]` | | 数据列表 | |     `coverImageUrl` | `string` | | 封面图URL | |     `createBy` | `string` | | 创建人ID | |     `createTime` | `string` | | 创建时间 | |     `description` | `string` | | 产品线描述 | |     `lineId` | `string` | | 产品线ID | |     `name` | `string` | | 产品线名称 | |     `productCount` | `int` | | 关联产品数量 | |     `sortOrder` | `int` | | 排序序号 | |     `status` | `string` | | 状态:ACTIVE=启用 INACTIVE=停用 | |     `updateTime` | `string` | | 更新时间 | |   `total` | `int` | | 总记录数 | | `message` | `string` | | 响应消息 | --- ### `GET` /admin/product/line/{lineId} **产品线详情** 获取指定产品线的完整信息。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `lineId` | `integer` | | 产品线ID | **响应** `统一响应结果«产品线VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品线VO` | | 响应数据 | |   `coverImageUrl` | `string` | | 封面图URL | |   `createBy` | `string` | | 创建人ID | |   `createTime` | `string` | | 创建时间 | |   `description` | `string` | | 产品线描述 | |   `lineId` | `string` | | 产品线ID | |   `name` | `string` | | 产品线名称 | |   `productCount` | `int` | | 关联产品数量 | |   `sortOrder` | `int` | | 排序序号 | |   `status` | `string` | | 状态:ACTIVE=启用 INACTIVE=停用 | |   `updateTime` | `string` | | 更新时间 | | `message` | `string` | | 响应消息 | --- ### `PUT` /admin/product/line/{lineId} **更新产品线** 更新产品线名称、描述、状态等信息。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `lineId` | `integer` | | 产品线ID | **请求体** `更新产品线请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `coverImageUrl` | `string` | | 封面图URL | | `description` | `string` | | 产品线描述 | | `name` | `string` | | 产品线名称 | | `sortOrder` | `int` | | 排序序号 | | `status` | `string` | | 产品线状态:ACTIVE=启用 INACTIVE=停用 | **响应** `统一响应结果«产品线VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品线VO` | | 响应数据 | |   `coverImageUrl` | `string` | | 封面图URL | |   `createBy` | `string` | | 创建人ID | |   `createTime` | `string` | | 创建时间 | |   `description` | `string` | | 产品线描述 | |   `lineId` | `string` | | 产品线ID | |   `name` | `string` | | 产品线名称 | |   `productCount` | `int` | | 关联产品数量 | |   `sortOrder` | `int` | | 排序序号 | |   `status` | `string` | | 状态:ACTIVE=启用 INACTIVE=停用 | |   `updateTime` | `string` | | 更新时间 | | `message` | `string` | | 响应消息 | --- ### `DELETE` /admin/product/line/{lineId} **删除产品线** 删除产品线(软删除)。已关联产品的产品线仍可删除,但关联产品的产品线字段不会被清空。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `lineId` | `integer` | | 产品线ID | **响应** `统一响应结果«Void»` --- ## 定价与费用管理 ### `POST` /admin/product/item/{productId}/cost-item **添加费用项** 添加产品的费用包含/不包含说明项。 用于在产品详情页展示"费用包含"和"费用不包含"信息。 仅用于前端展示,不参与报价计算。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **请求体** `成本项请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `category` | `string` | 是 | 成本项类别:HOTEL/SCENIC/VEHICLE/ACTIVITY/SERVICE/DINING/OTHER | | `description` | `string` | | 成本项描述 | | `sortOrder` | `int` | | 排序序号 | | `title` | `string` | 是 | 成本项标题 | | `type` | `string` | 是 | 成本项类型:INCLUDED=费用包含 EXCLUDED=费用不含 SELF_PAY=自理费用 | **响应** `统一响应结果«产品成本项VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品成本项VO` | | 响应数据 | |   `category` | `string` | | 成本项类别:HOTEL/SCENIC/VEHICLE/ACTIVITY/SERVICE/DINING/OTHER | |   `description` | `string` | | 成本项描述 | |   `id` | `string` | | 成本项ID | |   `sortOrder` | `int` | | 排序序号 | |   `title` | `string` | | 成本项标题 | |   `type` | `string` | | 成本项类型:INCLUDED=费用包含 EXCLUDED=费用不含 SELF_PAY=自理费用 | | `message` | `string` | | 响应消息 | --- ### `PUT` /admin/product/item/{productId}/cost-item/{itemId} **更新费用项** 更新费用包含/不包含说明项的内容。仅用于前端展示,不参与报价计算。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `itemId` | `integer` | | 费用项ID | | `productId` | `integer` | | 产品ID | **请求体** `成本项请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `category` | `string` | 是 | 成本项类别:HOTEL/SCENIC/VEHICLE/ACTIVITY/SERVICE/DINING/OTHER | | `description` | `string` | | 成本项描述 | | `sortOrder` | `int` | | 排序序号 | | `title` | `string` | 是 | 成本项标题 | | `type` | `string` | 是 | 成本项类型:INCLUDED=费用包含 EXCLUDED=费用不含 SELF_PAY=自理费用 | **响应** `统一响应结果«产品成本项VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品成本项VO` | | 响应数据 | |   `category` | `string` | | 成本项类别:HOTEL/SCENIC/VEHICLE/ACTIVITY/SERVICE/DINING/OTHER | |   `description` | `string` | | 成本项描述 | |   `id` | `string` | | 成本项ID | |   `sortOrder` | `int` | | 排序序号 | |   `title` | `string` | | 成本项标题 | |   `type` | `string` | | 成本项类型:INCLUDED=费用包含 EXCLUDED=费用不含 SELF_PAY=自理费用 | | `message` | `string` | | 响应消息 | --- ### `DELETE` /admin/product/item/{productId}/cost-item/{itemId} **删除费用项** 删除费用包含/不包含说明项。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `itemId` | `integer` | | 费用项ID | | `productId` | `integer` | | 产品ID | **响应** `统一响应结果«Void»` --- ### `GET` /admin/product/item/{productId}/cost-items **获取费用项列表** 获取产品的所有费用包含/不包含说明项列表。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **响应** `统一响应结果«List«产品成本项VO»»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品成本项VO[]` | | 响应数据 | |   `category` | `string` | | 成本项类别:HOTEL/SCENIC/VEHICLE/ACTIVITY/SERVICE/DINING/OTHER | |   `description` | `string` | | 成本项描述 | |   `id` | `string` | | 成本项ID | |   `sortOrder` | `int` | | 排序序号 | |   `title` | `string` | | 成本项标题 | |   `type` | `string` | | 成本项类型:INCLUDED=费用包含 EXCLUDED=费用不含 SELF_PAY=自理费用 | | `message` | `string` | | 响应消息 | --- ### `POST` /admin/product/item/{productId}/custom-fee **添加自定义费用** 添加产品级别的自定义费用项,直接设置金额,参与成本自动计算。 与额外成本关联不同,自定义费用不关联资源服务的费用项,而是直接指定费用名称和金额。 适用于临时性或一次性的费用。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **请求体** `自定义费用项请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `description` | `string` | | 费用说明 | | `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | | `feeAmount` | `number` | | 费用金额 | | `feeName` | `string` | 是 | 费用项名称 | | `feeUnit` | `string` | | 费用单位 | | `sortOrder` | `int` | | 排序序号 | **响应** `统一响应结果«产品自定义费用项VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品自定义费用项VO` | | 响应数据 | |   `description` | `string` | | 费用说明 | |   `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |   `feeAmount` | `number` | | 费用金额 | |   `feeName` | `string` | | 费用项名称 | |   `feeUnit` | `string` | | 费用单位 | |   `id` | `string` | | 费用项ID | |   `sortOrder` | `int` | | 排序序号 | | `message` | `string` | | 响应消息 | --- ### `PUT` /admin/product/item/{productId}/custom-fee/{feeId} **更新自定义费用** 更新自定义费用项的名称、金额等信息。修改后会影响成本自动计算结果。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `feeId` | `integer` | | 自定义费用ID | | `productId` | `integer` | | 产品ID | **请求体** `自定义费用项请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `description` | `string` | | 费用说明 | | `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | | `feeAmount` | `number` | | 费用金额 | | `feeName` | `string` | 是 | 费用项名称 | | `feeUnit` | `string` | | 费用单位 | | `sortOrder` | `int` | | 排序序号 | **响应** `统一响应结果«产品自定义费用项VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品自定义费用项VO` | | 响应数据 | |   `description` | `string` | | 费用说明 | |   `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |   `feeAmount` | `number` | | 费用金额 | |   `feeName` | `string` | | 费用项名称 | |   `feeUnit` | `string` | | 费用单位 | |   `id` | `string` | | 费用项ID | |   `sortOrder` | `int` | | 排序序号 | | `message` | `string` | | 响应消息 | --- ### `DELETE` /admin/product/item/{productId}/custom-fee/{feeId} **删除自定义费用** 删除自定义费用项。删除后该费用不再计入成本自动计算。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `feeId` | `integer` | | 自定义费用ID | | `productId` | `integer` | | 产品ID | **响应** `统一响应结果«Void»` --- ### `GET` /admin/product/item/{productId}/custom-fees **获取自定义费用列表** 获取产品的所有自定义费用项列表。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **响应** `统一响应结果«List«产品自定义费用项VO»»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品自定义费用项VO[]` | | 响应数据 | |   `description` | `string` | | 费用说明 | |   `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |   `feeAmount` | `number` | | 费用金额 | |   `feeName` | `string` | | 费用项名称 | |   `feeUnit` | `string` | | 费用单位 | |   `id` | `string` | | 费用项ID | |   `sortOrder` | `int` | | 排序序号 | | `message` | `string` | | 响应消息 | --- ### `POST` /admin/product/item/{productId}/extra-cost **添加额外成本关联** 关联资源服务中的费用项(cost_item)到产品,参与成本自动计算。 额外成本是指不包含在行程节点中、但需要计入总成本的费用。 例如:导游服务费、保险费、通讯费等固定运营开支。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **请求体** `额外成本请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `costItemId` | `long` | 是 | 额外成本项ID(关联费用项资源) | | `daily` | `boolean` | | 是否按天计算:true=按天计算(乘以天数) false=整个行程一次 | | `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | | `quantity` | `int` | | 数量 | | `sortOrder` | `int` | | 排序序号 | **响应** `统一响应结果«产品额外成本VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品额外成本VO` | | 响应数据 | |   `applyRole` | `string` | | 适用角色 | |   `categoryCode` | `string` | | 费用类别编码 | |   `costItemId` | `string` | | 费用项ID | |   `costItemName` | `string` | | 费用项名称 | |   `daily` | `boolean` | | 是否按天计算:true=按天计算(乘以天数) false=整个行程一次 | |   `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |   `id` | `string` | | 记录ID | |   `quantity` | `int` | | 数量 | |   `sortOrder` | `int` | | 排序序号 | |   `unit` | `string` | | 单位 | |   `unitPrice` | `number` | | 单价 | | `message` | `string` | | 响应消息 | --- ### `PUT` /admin/product/item/{productId}/extra-cost/{ecId} **更新额外成本关联** 更新额外成本关联的费用项、数量等信息。修改后会影响成本自动计算结果。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `ecId` | `integer` | | 额外成本ID | | `productId` | `integer` | | 产品ID | **请求体** `额外成本请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `costItemId` | `long` | 是 | 额外成本项ID(关联费用项资源) | | `daily` | `boolean` | | 是否按天计算:true=按天计算(乘以天数) false=整个行程一次 | | `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | | `quantity` | `int` | | 数量 | | `sortOrder` | `int` | | 排序序号 | **响应** `统一响应结果«产品额外成本VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品额外成本VO` | | 响应数据 | |   `applyRole` | `string` | | 适用角色 | |   `categoryCode` | `string` | | 费用类别编码 | |   `costItemId` | `string` | | 费用项ID | |   `costItemName` | `string` | | 费用项名称 | |   `daily` | `boolean` | | 是否按天计算:true=按天计算(乘以天数) false=整个行程一次 | |   `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |   `id` | `string` | | 记录ID | |   `quantity` | `int` | | 数量 | |   `sortOrder` | `int` | | 排序序号 | |   `unit` | `string` | | 单位 | |   `unitPrice` | `number` | | 单价 | | `message` | `string` | | 响应消息 | --- ### `DELETE` /admin/product/item/{productId}/extra-cost/{ecId} **删除额外成本关联** 删除额外成本关联记录。删除后该费用项不再计入成本自动计算。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `ecId` | `integer` | | 额外成本ID | | `productId` | `integer` | | 产品ID | **响应** `统一响应结果«Void»` --- ### `GET` /admin/product/item/{productId}/extra-costs **获取额外成本关联列表** 获取产品关联的所有额外成本项列表,包含费用项名称、金额等信息。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **响应** `统一响应结果«List«产品额外成本VO»»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品额外成本VO[]` | | 响应数据 | |   `applyRole` | `string` | | 适用角色 | |   `categoryCode` | `string` | | 费用类别编码 | |   `costItemId` | `string` | | 费用项ID | |   `costItemName` | `string` | | 费用项名称 | |   `daily` | `boolean` | | 是否按天计算:true=按天计算(乘以天数) false=整个行程一次 | |   `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |   `id` | `string` | | 记录ID | |   `quantity` | `int` | | 数量 | |   `sortOrder` | `int` | | 排序序号 | |   `unit` | `string` | | 单位 | |   `unitPrice` | `number` | | 单价 | | `message` | `string` | | 响应消息 | --- ### `GET` /admin/product/item/{productId}/price-calendar **获取月度价格日历** 获取指定月份的价格日历数据列表。 每条数据包含:日期、成人售价/成本价、儿童售价/成本价、库存、状态(OPEN/CLOSED)等。 **CORE/GROUP 产品**:价格为单人价格,按人头 × 价格计算总价。 **CUSTOM/ROUTE 产品**:价格为整单总价,不乘以人头数。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **查询参数** | 参数 | 类型 | 必填 | 说明 | 示例 | | --- | --- | --- | --- | --- | | `month` | `integer(int32)` | | 月份 | | | `year` | `integer(int32)` | | 年份 | | **响应** `统一响应结果«List«产品价格日历VO»»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品价格日历VO[]` | | 响应数据 | |   `adultCostPrice` | `number` | | 成人成本价 | |   `adultProfit` | `number` | | 成人利润 | |   `adultSellPrice` | `number` | | 成人售价 | |   `childCostPrice` | `number` | | 儿童成本价 | |   `childProfit` | `number` | | 儿童利润 | |   `childSellPrice` | `number` | | 儿童售价 | |   `costAutoCalc` | `boolean` | | 是否自动计算成本 | |   `date` | `string` | | 日期 | |   `id` | `string` | | 价格日历ID | |   `profitRate` | `number` | | 利润率(百分比) | |   `remark` | `string` | | 备注 | |   `sold` | `int` | | 已售数量 | |   `status` | `string` | | 状态:OPEN=开放 CLOSED=关闭 | |   `stock` | `int` | | 库存数量 | | `message` | `string` | | 响应消息 | --- ### `POST` /admin/product/item/{productId}/price-calendar **设置单日价格** 设置或更新指定日期的价格和库存。如果该日期已有记录则更新,否则新建。 可设置成人售价/成本价、儿童售价/成本价、库存数量、状态(OPEN/CLOSED)。 状态为 CLOSED 的日期不会出现在小程序端的可选日期中。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **请求体** `价格日历请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `adultCostPrice` | `number` | | 成人成本价 | | `adultCount` | `int` | | 成人人数(GROUP产品自动测算用) | | `adultSellPrice` | `number` | | 成人售价 | | `childCostPrice` | `number` | | 儿童成本价 | | `childSellPrice` | `number` | | 儿童售价 | | `costAutoCalc` | `boolean` | | 是否自动计算成本(true时重新测算会自动更新此日期的价格) | | `date` | `string` | 是 | 日期 | | `remark` | `string` | | 备注 | | `status` | `string` | | 状态:OPEN=开放预订 CLOSED=关闭(不可预订) | | `stock` | `int` | | 库存数量(CORE/GROUP按人头扣减,CUSTOM/ROUTE按单扣减) | **响应** `统一响应结果«产品价格日历VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品价格日历VO` | | 响应数据 | |   `adultCostPrice` | `number` | | 成人成本价 | |   `adultProfit` | `number` | | 成人利润 | |   `adultSellPrice` | `number` | | 成人售价 | |   `childCostPrice` | `number` | | 儿童成本价 | |   `childProfit` | `number` | | 儿童利润 | |   `childSellPrice` | `number` | | 儿童售价 | |   `costAutoCalc` | `boolean` | | 是否自动计算成本 | |   `date` | `string` | | 日期 | |   `id` | `string` | | 价格日历ID | |   `profitRate` | `number` | | 利润率(百分比) | |   `remark` | `string` | | 备注 | |   `sold` | `int` | | 已售数量 | |   `status` | `string` | | 状态:OPEN=开放 CLOSED=关闭 | |   `stock` | `int` | | 库存数量 | | `message` | `string` | | 响应消息 | --- ### `POST` /admin/product/item/{productId}/price-calendar/auto-calc **自动计算成本并同步到价格日历** 根据出发日期和人数,自动计算成本并将结果写入价格日历。 与测算预览不同,此接口会实际更新价格日历数据。 计算逻辑:查询各资源的价格日历 → 汇总成本 → 应用公式和利润规则 → 写入结果。 **关联字典**: - vehicle_type(车型):车辆费用成本计算 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **请求体** `报价请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `adultCount` | `int` | 是 | 成人人数 | | `babyCount` | `int` | | 婴儿人数(按固定 babyPrice 计算) | | `childCount` | `int` | | 儿童人数(占床,按儿童价计算) | | `childNeedBed` | `boolean` | | 儿童是否加床(true 时额外加收 childWithBed 费用) | | `departureDate` | `string` | 是 | 出发日期 | | `youngChildCount` | `int` | | 小童人数(不占床,按儿童价 × childDiscountPercent 折扣比例计算) | **响应** `统一响应结果«报价结果VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `报价结果VO` | | 响应数据 | |   `customFeeCost` | `number` | | 自定义费用合计(定制产品) | |   `dayCosts` | `每日成本明细[]` | | 每日成本明细列表 | |     `activityCost` | `number` | | 活动成本 | |     `dayCostTotal` | `number` | | 当日成本合计 | |     `dayNumber` | `int` | | 天数编号 | |     `diningCost` | `number` | | 餐饮成本 | |     `extraCost` | `number` | | 额外成本 | |     `hotelCost` | `number` | | 酒店成本 | |     `scenicCost` | `number` | | 景区成本 | |     `serviceCost` | `number` | | 服务成本 | |     `staffCost` | `number` | | 人员成本 | |     `vehicleCost` | `number` | | 车辆成本 | |   `extraCostItems` | `额外成本明细项[]` | | 额外成本明细列表 | |     `costItemName` | `string` | | 成本项名称 | |     `daily` | `boolean` | | 是否按天计算 | |     `days` | `int` | | 天数(按天计算时) | |     `quantity` | `int` | | 数量 | |     `subtotal` | `number` | | 小计金额 | |     `unitPrice` | `number` | | 单价 | |   `extraCostPerPerson` | `number` | | 每人额外成本 | |   `extraCostTotal` | `number` | | 额外成本合计 | |   `familyCosts` | `家庭成本明细[]` | | 家庭分组成本明细(定制产品,有分组时返回) | |     `activityCost` | `number` | | 活动成本 | |     `adultCount` | `int` | | 成人数 | |     `babyCost` | `number` | | 婴儿固定成本 | |     `babyCount` | `int` | | 幼童数 | |     `childCount` | `int` | | 儿童数 | |     `costPerPerson` | `number` | | 人均成本(家庭成本/付费人头) | |     `customFeeCost` | `number` | | 自定义费用成本 | |     `extraCost` | `number` | | 额外成本 | |     `familyId` | `string` | | 家庭ID | |     `familyName` | `string` | | 家庭名称 | |     `headcount` | `int` | | 人头数 | |     `hotelCost` | `number` | | 酒店成本 | |     `insuranceCost` | `number` | | 保险成本 | |     `payingHeadcount` | `int` | | 付费人头数(不含幼童) | |     `personCosts` | `每人成本明细[]` | | 每人分项成本列表 | |     `scenicCost` | `number` | | 景区成本 | |     `sellPricePerPerson` | `number` | | 人均售价(家庭售价/付费人头) | |     `serviceCost` | `number` | | 服务成本 | |     `staffCost` | `number` | | 人员成本 | |     `suppliesCost` | `number` | | 物资成本 | |     `totalCost` | `number` | | 家庭成本合计 | |     `totalProfit` | `number` | | 家庭利润合计 | |     `totalSellPrice` | `number` | | 家庭售价合计 | |     `vehicleCost` | `number` | | 车辆成本 | |     `youngChildCount` | `int` | | 小童数 | |   `grandTotalCost` | `number` | | 总成本合计 | |   `grandTotalProfit` | `number` | | 总利润合计 | |   `grandTotalSellPrice` | `number` | | 总售价合计 | |   `insuranceFee` | `number` | | 保险费用 | |   `profitRate` | `number` | | 利润率(百分比) | |   `staffCost` | `number` | | 人员成本 | |   `suppliesCost` | `number` | | 物资成本 | |   `totalAdultCost` | `number` | | 成人总成本 | |   `totalAdultProfit` | `number` | | 成人总利润 | |   `totalAdultSellPrice` | `number` | | 成人总售价 | |   `totalBabyCost` | `number` | | 婴儿总成本 | |   `totalBabySellPrice` | `number` | | 婴儿总售价 | |   `totalChildCost` | `number` | | 儿童总成本 | |   `totalChildSellPrice` | `number` | | 儿童总售价 | |   `totalYoungChildCost` | `number` | | 小童总成本 | |   `totalYoungChildSellPrice` | `number` | | 小童总售价 | |   `warnings` | `string[]` | | 警告信息列表 | | `message` | `string` | | 响应消息 | --- ### `POST` /admin/product/item/{productId}/price-calendar/batch **批量设置价格** 批量设置日期范围内的价格和库存,支持按星期筛选。 指定 startDate 和 endDate 日期范围,可选 selectedWeekdays 过滤星期几。 示例:设置5月1日-5月31日的工作日(周一到周五=[1,2,3,4,5])价格。 selectedWeekdays 为空时,范围内所有日期都会被设置。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **请求体** `批量设置价格日历请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `adultCostPrice` | `number` | | 成人成本价 | | `adultSellPrice` | `number` | | 成人售价 | | `childCostPrice` | `number` | | 儿童成本价 | | `childSellPrice` | `number` | | 儿童售价 | | `costAutoCalc` | `boolean` | | 是否自动计算成本 | | `endDate` | `string` | 是 | 结束日期 | | `remark` | `string` | | 备注 | | `selectedWeekdays` | `int[]` | | 选中的星期(1=周一...7=周日),为空或包含全部则不过滤 | | `startDate` | `string` | 是 | 开始日期 | | `status` | `string` | | 状态:OPEN=开放 CLOSED=关闭 | | `stock` | `int` | | 库存数量 | **响应** `统一响应结果«List«产品价格日历VO»»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品价格日历VO[]` | | 响应数据 | |   `adultCostPrice` | `number` | | 成人成本价 | |   `adultProfit` | `number` | | 成人利润 | |   `adultSellPrice` | `number` | | 成人售价 | |   `childCostPrice` | `number` | | 儿童成本价 | |   `childProfit` | `number` | | 儿童利润 | |   `childSellPrice` | `number` | | 儿童售价 | |   `costAutoCalc` | `boolean` | | 是否自动计算成本 | |   `date` | `string` | | 日期 | |   `id` | `string` | | 价格日历ID | |   `profitRate` | `number` | | 利润率(百分比) | |   `remark` | `string` | | 备注 | |   `sold` | `int` | | 已售数量 | |   `status` | `string` | | 状态:OPEN=开放 CLOSED=关闭 | |   `stock` | `int` | | 库存数量 | | `message` | `string` | | 响应消息 | --- ### `POST` /admin/product/item/{productId}/price-calendar/calc-preview **测算预览(不写入数据库)** 根据行程中的资源价格日历,自动计算指定日期的成本价和售价,仅预览不保存。 用于在设置价格日历前预览自动计算的结果。 计算逻辑:汇总当天所有行程节点关联资源的价格 → 应用公式引擎 → 加上利润。 GROUP 产品需要传 adultCount 参数(影响均摊计算)。 **关联字典**: - vehicle_type(车型):车辆费用成本测算 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **请求体** `成本预览请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `adultCount` | `int` | | 成人人数(GROUP产品用) | | `date` | `string` | 是 | 日期 | **响应** `统一响应结果«成本预览VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `成本预览VO` | | 响应数据 | |   `adultCostPrice` | `number` | | 成人成本价 | |   `adultSellPrice` | `number` | | 成人售价 | |   `childCostPrice` | `number` | | 儿童成本价 | |   `childSellPrice` | `number` | | 儿童售价 | |   `warnings` | `string[]` | | 警告信息列表 | | `message` | `string` | | 响应消息 | --- ### `POST` /admin/product/item/{productId}/price-calendar/recalculate **重新测算所有自动测算日期的价格** 重新计算价格日历中所有 costAutoCalc=true 的日期的成本价和售价。 适用场景:资源价格调整后,批量刷新所有自动计算的价格日历。 返回更新的日期数量和详情。手动设置的价格(costAutoCalc=false)不受影响。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **响应** `统一响应结果«Map«string,object»»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `object` | | 响应数据 | | `message` | `string` | | 响应消息 | --- ### `GET` /admin/product/item/{productId}/pricing **获取定价规则** 获取产品的定价配置,包括定价模式、利润设置、儿童/婴儿价格、支付方式等。 如果产品尚未设置定价规则,返回 null。 **关联字典**: - vehicle_type(车型):费用配置中车辆相关成本显示 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **响应** `统一响应结果«产品定价配置VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品定价配置VO` | | 响应数据 | |   `adultExtraBed` | `number` | | 成人加床费 | |   `babyPrice` | `number` | | 婴儿价 | |   `balanceDueDays` | `int` | | 尾款支付截止天数(出发前N天) | |   `childDiscountPercent` | `number` | | 儿童折扣百分比 | |   `childNoBed` | `number` | | 儿童不占床价 | |   `childWithBed` | `number` | | 儿童占床价 | |   `companionPrice` | `number` | | 陪同人员价格 | |   `customTotalPrice` | `number` | | 定制产品总价(CUSTOM模式下使用) | |   `depositAmount` | `number` | | 定金金额 | |   `depositRatio` | `int` | | 定金比例(百分比) | |   `extraCostPerPerson` | `number` | | 每人额外成本 | |   `insuranceFee` | `number` | | 保险费用 | |   `markupPercent` | `number` | | 加价百分比(PERCENT模式下使用) | |   `maxGroupSize` | `int` | | 最大成团人数 | |   `mealBudget` | `number` | | 餐费预算 | |   `minGroupSize` | `int` | | 最小成团人数 | |   `paymentType` | `string` | | 支付方式:FULL=全款 DEPOSIT=定金+尾款 | |   `pricingId` | `string` | | 定价配置ID | |   `pricingMode` | `string` | | 定价模式:AUTO=自动计算 MANUAL=手动定价 CUSTOM=定制定价 | |   `productId` | `string` | | 产品ID | |   `profitAmount` | `number` | | 利润金额(FIXED模式下使用) | |   `profitMode` | `string` | | 利润模式:FIXED=固定金额 PERCENT=百分比 | |   `singleRoomDiff` | `number` | | 单房差 | |   `vehicleModelIds` | `string[]` | | 车型ID列表 | |   `vehicleWarning` | `string` | | 车辆绑定警告信息(为空表示绑定成功) | | `message` | `string` | | 响应消息 | --- ### `POST` /admin/product/item/{productId}/pricing **保存定价规则** 保存或更新产品的定价配置(一个产品仅一条定价记录,重复调用为覆盖更新)。 **定价模式**: - AUTO:自动计算,通过公式引擎根据行程资源价格自动测算成本和售价 - MANUAL:手动定价,直接在价格日历中手动设置每日价格 - CUSTOM:定制定价,设置整单总价(customTotalPrice),不按人头 **利润模式**(AUTO 模式下生效): - FIXED:固定金额加价,售价 = 成本 + profitAmount - PERCENT:百分比加价,售价 = 成本 × (1 + markupPercent/100) **支付方式**:FULL=全款支付,DEPOSIT=定金+尾款(需设置 depositRatio 或 depositAmount) **关联字典**: - vehicle_type(车型):费用配置中车辆相关成本计算 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **请求体** `定价配置请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `adultExtraBed` | `number` | | 成人加床费 | | `babyPrice` | `number` | | 婴儿固定价格(不随日期变化) | | `balanceDueDays` | `int` | | 尾款支付截止天数(出发前N天必须支付尾款,超时可能取消订单) | | `childDiscountPercent` | `number` | | 小童折扣百分比(小童价=儿童价×此百分比/100,如70表示打7折) | | `childNoBed` | `number` | | 儿童不占床价(暂未使用,预留字段) | | `childWithBed` | `number` | | 儿童加床费(childNeedBed=true时额外加收的费用) | | `companionPrice` | `number` | | 陪同人员价格 | | `customTotalPrice` | `number` | | 定制产品总价(CUSTOM定价模式下使用,代表整单总价) | | `depositAmount` | `number` | | 定金金额(固定金额,与depositRatio二选一) | | `depositRatio` | `int` | | 定金比例(百分比,如30代表30%。与depositAmount二选一,优先使用比例) | | `extraCostPerPerson` | `number` | | 每人额外成本 | | `insuranceFee` | `number` | | 保险费用 | | `markupPercent` | `number` | | 加价百分比(PERCENT模式下使用) | | `maxGroupSize` | `int` | | 最大成团人数(CORE/GROUP产品用) | | `mealBudget` | `number` | | 餐费预算 | | `minGroupSize` | `int` | | 最小成团人数(CORE/GROUP产品用,影响均摊成本计算) | | `paymentType` | `string` | | 支付方式:FULL=全款支付 DEPOSIT=定金+尾款分期支付 | | `pricingMode` | `string` | | 定价模式:AUTO=根据行程资源价格自动计算 MANUAL=手动在价格日历设置每日价格 CUSTOM=定制产品整单定价 | | `profitAmount` | `number` | | 利润金额(FIXED模式下使用) | | `profitMode` | `string` | | 利润模式(AUTO模式下生效):FIXED=在成本基础上加固定金额 PERCENT=在成本基础上按百分比加价 | | `singleRoomDiff` | `number` | | 单房差 | | `vehicleModelIds` | `long[]` | | 车型ID列表 | **响应** `统一响应结果«产品定价配置VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品定价配置VO` | | 响应数据 | |   `adultExtraBed` | `number` | | 成人加床费 | |   `babyPrice` | `number` | | 婴儿价 | |   `balanceDueDays` | `int` | | 尾款支付截止天数(出发前N天) | |   `childDiscountPercent` | `number` | | 儿童折扣百分比 | |   `childNoBed` | `number` | | 儿童不占床价 | |   `childWithBed` | `number` | | 儿童占床价 | |   `companionPrice` | `number` | | 陪同人员价格 | |   `customTotalPrice` | `number` | | 定制产品总价(CUSTOM模式下使用) | |   `depositAmount` | `number` | | 定金金额 | |   `depositRatio` | `int` | | 定金比例(百分比) | |   `extraCostPerPerson` | `number` | | 每人额外成本 | |   `insuranceFee` | `number` | | 保险费用 | |   `markupPercent` | `number` | | 加价百分比(PERCENT模式下使用) | |   `maxGroupSize` | `int` | | 最大成团人数 | |   `mealBudget` | `number` | | 餐费预算 | |   `minGroupSize` | `int` | | 最小成团人数 | |   `paymentType` | `string` | | 支付方式:FULL=全款 DEPOSIT=定金+尾款 | |   `pricingId` | `string` | | 定价配置ID | |   `pricingMode` | `string` | | 定价模式:AUTO=自动计算 MANUAL=手动定价 CUSTOM=定制定价 | |   `productId` | `string` | | 产品ID | |   `profitAmount` | `number` | | 利润金额(FIXED模式下使用) | |   `profitMode` | `string` | | 利润模式:FIXED=固定金额 PERCENT=百分比 | |   `singleRoomDiff` | `number` | | 单房差 | |   `vehicleModelIds` | `string[]` | | 车型ID列表 | |   `vehicleWarning` | `string` | | 车辆绑定警告信息(为空表示绑定成功) | | `message` | `string` | | 响应消息 | --- ## 定价公式管理 ### `POST` /admin/product/formula/group **创建公式组** 创建一个新的定价公式组。创建后默认为未激活状态。 公式组编码(groupCode)在同一产品类型下必须唯一。 建议命名规范:{产品类型}_PRICING_V{版本号},如 CORE_PRICING_V2。 **关联字典**: - product_type(产品类型,公式组所属类型):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品 **请求体** `公式组请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `description` | `string` | | 描述 | | `groupCode` | `string` | 是 | 公式组编码 | | `groupName` | `string` | 是 | 公式组名称 | | `productType` | `string` | 是 | 适用产品类型:CORE/ROUTE/CUSTOM/GROUP | **响应** `统一响应结果«公式组VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `公式组VO` | | 响应数据 | |   `createTime` | `string` | | 创建时间 | |   `description` | `string` | | 描述 | |   `groupCode` | `string` | | 公式组编码 | |   `groupId` | `string` | | 公式组ID | |   `groupName` | `string` | | 公式组名称 | |   `isActive` | `boolean` | | 是否激活 | |   `productType` | `string` | | 适用产品类型 | |   `stepCount` | `int` | | 步骤数量 | |   `version` | `int` | | 版本号 | | `message` | `string` | | 响应消息 | --- ### `GET` /admin/product/formula/group/list **公式组列表** 获取定价公式组列表,可按产品类型筛选。 **公式引擎说明**:定价公式用于自动计算产品的成本价和售价。 每种产品类型可以有多个公式组,但同一时间只能有一个激活的公式组。 公式组包含多个步骤,按顺序执行,每步计算一个中间变量或最终结果。 **关联字典**: - product_type(产品类型,筛选条件):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品 **查询参数** | 参数 | 类型 | 必填 | 说明 | 示例 | | --- | --- | --- | --- | --- | | `productType` | `string` | | productType | | **响应** `统一响应结果«List«公式组VO»»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `公式组VO[]` | | 响应数据 | |   `createTime` | `string` | | 创建时间 | |   `description` | `string` | | 描述 | |   `groupCode` | `string` | | 公式组编码 | |   `groupId` | `string` | | 公式组ID | |   `groupName` | `string` | | 公式组名称 | |   `isActive` | `boolean` | | 是否激活 | |   `productType` | `string` | | 适用产品类型 | |   `stepCount` | `int` | | 步骤数量 | |   `version` | `int` | | 版本号 | | `message` | `string` | | 响应消息 | --- ### `GET` /admin/product/formula/group/{groupId} **公式组详情** 获取公式组完整信息。 **关联字典**: - product_type(产品类型):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `groupId` | `integer` | 是 | groupId | **响应** `统一响应结果«公式组VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `公式组VO` | | 响应数据 | |   `createTime` | `string` | | 创建时间 | |   `description` | `string` | | 描述 | |   `groupCode` | `string` | | 公式组编码 | |   `groupId` | `string` | | 公式组ID | |   `groupName` | `string` | | 公式组名称 | |   `isActive` | `boolean` | | 是否激活 | |   `productType` | `string` | | 适用产品类型 | |   `stepCount` | `int` | | 步骤数量 | |   `version` | `int` | | 版本号 | | `message` | `string` | | 响应消息 | --- ### `PUT` /admin/product/formula/group/{groupId} **更新公式组** 更新公式组信息。 **关联字典**: - product_type(产品类型):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `groupId` | `integer` | 是 | groupId | **请求体** `公式组请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `description` | `string` | | 描述 | | `groupCode` | `string` | 是 | 公式组编码 | | `groupName` | `string` | 是 | 公式组名称 | | `productType` | `string` | 是 | 适用产品类型:CORE/ROUTE/CUSTOM/GROUP | **响应** `统一响应结果«公式组VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `公式组VO` | | 响应数据 | |   `createTime` | `string` | | 创建时间 | |   `description` | `string` | | 描述 | |   `groupCode` | `string` | | 公式组编码 | |   `groupId` | `string` | | 公式组ID | |   `groupName` | `string` | | 公式组名称 | |   `isActive` | `boolean` | | 是否激活 | |   `productType` | `string` | | 适用产品类型 | |   `stepCount` | `int` | | 步骤数量 | |   `version` | `int` | | 版本号 | | `message` | `string` | | 响应消息 | --- ### `DELETE` /admin/product/formula/group/{groupId} **删除公式组** 删除公式组及其下所有步骤。 **限制**:已激活的公式组不能删除,需先激活其他公式组。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `groupId` | `integer` | 是 | groupId | **响应** `统一响应结果«Void»` --- ### `PUT` /admin/product/formula/group/{groupId}/activate **激活公式组** 激活指定公式组,同时自动停用同产品类型下的其他公式组。 同一产品类型下只能有一个激活的公式组,激活操作具有排他性。 激活后,该产品类型的自动成本计算将使用此公式组。 **关联字典**: - product_type(产品类型,同类型排他激活):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `groupId` | `integer` | 是 | groupId | **响应** `统一响应结果«Void»` --- ### `GET` /admin/product/formula/group/{groupId}/steps **公式步骤列表** 获取公式组下所有步骤,按执行顺序(executionOrder)升序排列。 步骤按顺序依次执行,前一步的输出变量可作为后续步骤的输入。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `groupId` | `integer` | 是 | groupId | **响应** `统一响应结果«List«公式步骤VO»»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `公式步骤VO[]` | | 响应数据 | |   `createTime` | `string` | | 创建时间 | |   `description` | `string` | | 描述 | |   `executionOrder` | `int` | | 执行顺序 | |   `expression` | `string` | | 表达式 | |   `formulaId` | `string` | | 公式ID | |   `groupId` | `string` | | 公式组ID | |   `inputVars` | `string` | | 输入变量(逗号分隔) | |   `isEnabled` | `boolean` | | 是否启用 | |   `outputVar` | `string` | | 输出变量名 | |   `stepCode` | `string` | | 步骤编码 | |   `stepName` | `string` | | 步骤名称 | |   `updateTime` | `string` | | 更新时间 | | `message` | `string` | | 响应消息 | --- ### `POST` /admin/product/formula/step **创建公式步骤** 在公式组中创建一个计算步骤。 **表达式语法**:使用 Aviator 表达式引擎,支持数学运算、条件判断、内置函数等。 示例:`baseCost = adultCount * adultUnitCost + childCount * childUnitCost` **输入变量**:可引用公式变量表中定义的变量,或前置步骤的输出变量。 **输出变量**:每个步骤必须指定一个输出变量名,供后续步骤引用。 **请求体** `公式步骤请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `changeNote` | `string` | | 变更说明 | | `description` | `string` | | 描述 | | `executionOrder` | `int` | | 执行顺序 | | `expression` | `string` | 是 | Aviator表达式(支持数学运算、条件判断、内置函数;可引用前置步骤的输出变量和公式变量表中的变量) | | `groupId` | `long` | 是 | 公式组ID | | `inputVars` | `string` | | 输入变量(逗号分隔) | | `outputVar` | `string` | 是 | 输出变量名 | | `stepCode` | `string` | 是 | 步骤编码 | | `stepName` | `string` | 是 | 步骤名称 | **响应** `统一响应结果«公式步骤VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `公式步骤VO` | | 响应数据 | |   `createTime` | `string` | | 创建时间 | |   `description` | `string` | | 描述 | |   `executionOrder` | `int` | | 执行顺序 | |   `expression` | `string` | | 表达式 | |   `formulaId` | `string` | | 公式ID | |   `groupId` | `string` | | 公式组ID | |   `inputVars` | `string` | | 输入变量(逗号分隔) | |   `isEnabled` | `boolean` | | 是否启用 | |   `outputVar` | `string` | | 输出变量名 | |   `stepCode` | `string` | | 步骤编码 | |   `stepName` | `string` | | 步骤名称 | |   `updateTime` | `string` | | 更新时间 | | `message` | `string` | | 响应消息 | --- ### `GET` /admin/product/formula/step/{formulaId} **公式步骤详情** 获取单个公式步骤的完整信息,包含表达式、输入/输出变量、执行顺序等。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `formulaId` | `integer` | 是 | formulaId | **响应** `统一响应结果«公式步骤VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `公式步骤VO` | | 响应数据 | |   `createTime` | `string` | | 创建时间 | |   `description` | `string` | | 描述 | |   `executionOrder` | `int` | | 执行顺序 | |   `expression` | `string` | | 表达式 | |   `formulaId` | `string` | | 公式ID | |   `groupId` | `string` | | 公式组ID | |   `inputVars` | `string` | | 输入变量(逗号分隔) | |   `isEnabled` | `boolean` | | 是否启用 | |   `outputVar` | `string` | | 输出变量名 | |   `stepCode` | `string` | | 步骤编码 | |   `stepName` | `string` | | 步骤名称 | |   `updateTime` | `string` | | 更新时间 | | `message` | `string` | | 响应消息 | --- ### `PUT` /admin/product/formula/step/{formulaId} **更新公式步骤** 更新公式步骤的表达式、输入/输出变量等。 每次更新会自动保存一个版本快照,可通过版本历史接口查看和回滚。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `formulaId` | `integer` | 是 | formulaId | **请求体** `公式步骤请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `changeNote` | `string` | | 变更说明 | | `description` | `string` | | 描述 | | `executionOrder` | `int` | | 执行顺序 | | `expression` | `string` | 是 | Aviator表达式(支持数学运算、条件判断、内置函数;可引用前置步骤的输出变量和公式变量表中的变量) | | `groupId` | `long` | 是 | 公式组ID | | `inputVars` | `string` | | 输入变量(逗号分隔) | | `outputVar` | `string` | 是 | 输出变量名 | | `stepCode` | `string` | 是 | 步骤编码 | | `stepName` | `string` | 是 | 步骤名称 | **响应** `统一响应结果«公式步骤VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `公式步骤VO` | | 响应数据 | |   `createTime` | `string` | | 创建时间 | |   `description` | `string` | | 描述 | |   `executionOrder` | `int` | | 执行顺序 | |   `expression` | `string` | | 表达式 | |   `formulaId` | `string` | | 公式ID | |   `groupId` | `string` | | 公式组ID | |   `inputVars` | `string` | | 输入变量(逗号分隔) | |   `isEnabled` | `boolean` | | 是否启用 | |   `outputVar` | `string` | | 输出变量名 | |   `stepCode` | `string` | | 步骤编码 | |   `stepName` | `string` | | 步骤名称 | |   `updateTime` | `string` | | 更新时间 | | `message` | `string` | | 响应消息 | --- ### `DELETE` /admin/product/formula/step/{formulaId} **删除公式步骤** 删除指定的公式步骤。删除后其他步骤的执行顺序不会自动调整。 **注意**:如果后续步骤引用了被删步骤的输出变量,执行时会报错。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `formulaId` | `integer` | 是 | formulaId | **响应** `统一响应结果«Void»` --- ### `PUT` /admin/product/formula/step/{formulaId}/rollback/{versionNum} **回滚公式步骤到指定版本** 将公式步骤回滚到历史版本。 回滚操作会用历史版本的表达式、变量等覆盖当前内容,并创建一个新的版本记录。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `formulaId` | `integer` | 是 | formulaId | | `versionNum` | `integer` | 是 | versionNum | **响应** `统一响应结果«公式步骤VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `公式步骤VO` | | 响应数据 | |   `createTime` | `string` | | 创建时间 | |   `description` | `string` | | 描述 | |   `executionOrder` | `int` | | 执行顺序 | |   `expression` | `string` | | 表达式 | |   `formulaId` | `string` | | 公式ID | |   `groupId` | `string` | | 公式组ID | |   `inputVars` | `string` | | 输入变量(逗号分隔) | |   `isEnabled` | `boolean` | | 是否启用 | |   `outputVar` | `string` | | 输出变量名 | |   `stepCode` | `string` | | 步骤编码 | |   `stepName` | `string` | | 步骤名称 | |   `updateTime` | `string` | | 更新时间 | | `message` | `string` | | 响应消息 | --- ### `PUT` /admin/product/formula/step/{formulaId}/toggle **启用/禁用公式步骤** 切换公式步骤的启用状态。 禁用的步骤在公式执行时会被跳过,不影响其他步骤的执行。 适用场景:临时跳过某个计算步骤进行调试或测试。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `formulaId` | `integer` | 是 | formulaId | **响应** `统一响应结果«Void»` --- ### `GET` /admin/product/formula/step/{formulaId}/versions **公式步骤版本历史** 获取公式步骤的所有历史版本列表,按版本号倒序。 每次更新步骤表达式会自动创建新版本,方便追溯和回滚。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `formulaId` | `integer` | 是 | formulaId | **响应** `统一响应结果«List«公式版本历史VO»»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `公式版本历史VO[]` | | 响应数据 | |   `changeNote` | `string` | | 变更说明 | |   `changedBy` | `string` | | 变更人ID | |   `createTime` | `string` | | 创建时间 | |   `expression` | `string` | | 表达式 | |   `formulaId` | `string` | | 公式ID | |   `versionId` | `string` | | 版本ID | |   `versionNum` | `int` | | 版本号 | | `message` | `string` | | 响应消息 | --- ### `POST` /admin/product/formula/test **测试公式执行** 使用自定义变量值测试公式组的执行结果,不影响任何业务数据。 传入公式组ID和测试变量(变量名→值的映射),返回每个步骤的执行结果。 适用于公式调试:验证表达式是否正确、计算结果是否符合预期。 如果某步骤执行出错,会在结果中标明错误信息。 **请求体** `公式测试请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `groupId` | `long` | 是 | 公式组ID | | `variables` | `object` | 是 | 测试变量(变量名→值) | **响应** `统一响应结果«公式测试结果VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `公式测试结果VO` | | 响应数据 | |   `errorMessage` | `string` | | 错误信息 | |   `finalVariables` | `object` | | 最终变量表 | |   `stepResults` | `步骤执行结果[]` | | 各步骤执行结果 | |     `errorMessage` | `string` | | 错误信息 | |     `executionTimeMs` | `long` | | 执行耗时(毫秒) | |     `expression` | `string` | | 表达式 | |     `outputValue` | `object` | | 输出值 | |     `outputVar` | `string` | | 输出变量名 | |     `stepCode` | `string` | | 步骤编码 | |     `stepName` | `string` | | 步骤名称 | |     `success` | `boolean` | | 是否成功 | |   `success` | `boolean` | | 是否成功 | |   `totalTimeMs` | `long` | | 总耗时(毫秒) | | `message` | `string` | | 响应消息 | --- ### `POST` /admin/product/formula/var **创建公式变量** 创建公式变量定义。变量名(varName)全局唯一,建议使用驼峰命名。 可指定适用的产品类型列表(productTypes),为空则适用于所有类型。 **关联字典**: - product_type(产品类型,变量适用范围):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品 **请求体** `公式变量请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `category` | `string` | 是 | 变量分类:INPUT/INTERMEDIATE/OUTPUT | | `defaultValue` | `string` | | 默认值 | | `description` | `string` | | 描述 | | `productTypes` | `string[]` | | 适用产品类型列表 | | `varName` | `string` | 是 | 变量名 | | `varType` | `string` | 是 | 变量类型:DECIMAL/INTEGER/BOOLEAN/STRING | **响应** `统一响应结果«公式变量VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `公式变量VO` | | 响应数据 | |   `category` | `string` | | 变量分类:INPUT/INTERMEDIATE/OUTPUT | |   `defaultValue` | `string` | | 默认值 | |   `description` | `string` | | 描述 | |   `productTypes` | `string[]` | | 适用产品类型列表 | |   `varId` | `string` | | 变量ID | |   `varName` | `string` | | 变量名 | |   `varType` | `string` | | 变量类型:DECIMAL/INTEGER/BOOLEAN/STRING | | `message` | `string` | | 响应消息 | --- ### `GET` /admin/product/formula/var/list **公式变量列表** 获取公式变量列表,可按变量分类筛选。 **变量分类**: - INPUT:输入变量,从业务数据获取(如成人人数、资源单价) - INTERMEDIATE:中间变量,由公式步骤计算得出 - OUTPUT:输出变量,最终报价结果(如总成本、售价) **查询参数** | 参数 | 类型 | 必填 | 说明 | 示例 | | --- | --- | --- | --- | --- | | `category` | `string` | | category | | **响应** `统一响应结果«List«公式变量VO»»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `公式变量VO[]` | | 响应数据 | |   `category` | `string` | | 变量分类:INPUT/INTERMEDIATE/OUTPUT | |   `defaultValue` | `string` | | 默认值 | |   `description` | `string` | | 描述 | |   `productTypes` | `string[]` | | 适用产品类型列表 | |   `varId` | `string` | | 变量ID | |   `varName` | `string` | | 变量名 | |   `varType` | `string` | | 变量类型:DECIMAL/INTEGER/BOOLEAN/STRING | | `message` | `string` | | 响应消息 | --- ### `PUT` /admin/product/formula/var/{varId} **更新公式变量** 更新公式变量定义。 **关联字典**: - product_type(产品类型,变量适用范围):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `varId` | `integer` | 是 | varId | **请求体** `公式变量请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `category` | `string` | 是 | 变量分类:INPUT/INTERMEDIATE/OUTPUT | | `defaultValue` | `string` | | 默认值 | | `description` | `string` | | 描述 | | `productTypes` | `string[]` | | 适用产品类型列表 | | `varName` | `string` | 是 | 变量名 | | `varType` | `string` | 是 | 变量类型:DECIMAL/INTEGER/BOOLEAN/STRING | **响应** `统一响应结果«公式变量VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `公式变量VO` | | 响应数据 | |   `category` | `string` | | 变量分类:INPUT/INTERMEDIATE/OUTPUT | |   `defaultValue` | `string` | | 默认值 | |   `description` | `string` | | 描述 | |   `productTypes` | `string[]` | | 适用产品类型列表 | |   `varId` | `string` | | 变量ID | |   `varName` | `string` | | 变量名 | |   `varType` | `string` | | 变量类型:DECIMAL/INTEGER/BOOLEAN/STRING | | `message` | `string` | | 响应消息 | --- ### `DELETE` /admin/product/formula/var/{varId} **删除公式变量** 删除公式变量定义。 **注意**:如果有公式步骤引用了该变量,删除后步骤执行时会报错。建议先确认无引用再删除。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `varId` | `integer` | 是 | varId | **响应** `统一响应结果«Void»` --- ## 家庭分组管理 ### `GET` /admin/product/item/{productId}/families **获取家庭分组列表** 获取产品的家庭分组列表,按排序序号升序。 **仅适用于 CUSTOM(定制)产品**。 家庭分组用于将定制产品的行程按家庭单位分配,每个家庭可以有不同的人数和行程安排。 行程节点通过 familyIds 字段关联到具体的家庭分组。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **响应** `统一响应结果«List«家庭分组VO»»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `家庭分组VO[]` | | 响应数据 | |   `adultCount` | `int` | | 成人数 | |   `babyCount` | `int` | | 幼童数 | |   `childCount` | `int` | | 儿童数 | |   `familyId` | `string` | | 家庭ID | |   `familyName` | `string` | | 家庭名称 | |   `sortOrder` | `int` | | 排序序号 | |   `youngChildCount` | `int` | | 小童数 | | `message` | `string` | | 响应消息 | --- ### `POST` /admin/product/item/{productId}/family **添加家庭分组** 为 CUSTOM 定制产品添加一个家庭分组,指定家庭名称和各类型人数。 添加后可在行程节点中关联此家庭,实现按家庭分配行程。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **请求体** `家庭分组保存请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `adultCount` | `int` | | 成人数 | | `babyCount` | `int` | | 幼童数 | | `childCount` | `int` | | 儿童数 | | `familyName` | `string` | 是 | 家庭名称 | | `sortOrder` | `int` | | 排序序号 | | `youngChildCount` | `int` | | 小童数 | **响应** `统一响应结果«家庭分组VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `家庭分组VO` | | 响应数据 | |   `adultCount` | `int` | | 成人数 | |   `babyCount` | `int` | | 幼童数 | |   `childCount` | `int` | | 儿童数 | |   `familyId` | `string` | | 家庭ID | |   `familyName` | `string` | | 家庭名称 | |   `sortOrder` | `int` | | 排序序号 | |   `youngChildCount` | `int` | | 小童数 | | `message` | `string` | | 响应消息 | --- ### `PUT` /admin/product/item/{productId}/family/{familyId} **更新家庭分组** 更新家庭分组的名称、各类型人数等信息。 **仅适用于 CUSTOM(定制)产品**。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `familyId` | `integer` | | 家庭ID | | `productId` | `integer` | | 产品ID | **请求体** `家庭分组保存请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `adultCount` | `int` | | 成人数 | | `babyCount` | `int` | | 幼童数 | | `childCount` | `int` | | 儿童数 | | `familyName` | `string` | 是 | 家庭名称 | | `sortOrder` | `int` | | 排序序号 | | `youngChildCount` | `int` | | 小童数 | **响应** `统一响应结果«家庭分组VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `家庭分组VO` | | 响应数据 | |   `adultCount` | `int` | | 成人数 | |   `babyCount` | `int` | | 幼童数 | |   `childCount` | `int` | | 儿童数 | |   `familyId` | `string` | | 家庭ID | |   `familyName` | `string` | | 家庭名称 | |   `sortOrder` | `int` | | 排序序号 | |   `youngChildCount` | `int` | | 小童数 | | `message` | `string` | | 响应消息 | --- ### `DELETE` /admin/product/item/{productId}/family/{familyId} **删除家庭分组** 删除家庭分组。如果有行程节点通过 familyIds 关联了该分组,需要手动移除关联。 **仅适用于 CUSTOM(定制)产品**。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `familyId` | `integer` | | 家庭ID | | `productId` | `integer` | | 产品ID | **响应** `统一响应结果«Void»` --- ## 小程序-产品 ### `GET` /mp/product/list **产品列表(C端)** 小程序端产品列表接口,仅返回已上架(PUBLISHED)的产品。 支持按产品类型、季节、行程天数、目的地、产品线、支付模式、定制师等筛选。 默认按 sortOrder 排序,也可按价格或行程天数排序。 **关联字典**: - product_type(产品类型,筛选条件):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品 **查询参数** | 参数 | 类型 | 必填 | 说明 | 示例 | | --- | --- | --- | --- | --- | | `designerId` | `integer(int64)` | | 定制师ID(创建者ID)筛选 | 1893012345678901234 | | `destination` | `string` | | 目的地筛选 | 丽江 | | `keyword` | `string` | | 搜索关键词(产品名称) | 丽江 | | `lineId` | `string` | | 产品线ID筛选 | 1893012345678901234 | | `page` | `integer(int32)` | | 页码 | 1 | | `pageSize` | `integer(int32)` | | 每页条数 | 10 | | `paymentMode` | `string` | | 支付模式筛选:FULL=全款 DEPOSIT=定金+尾款 null=全部 | DEPOSIT | | `productType` | `string` | | 产品类型:CORE=核心产品 ROUTE=线路产品 CUSTOM=定制产品 GROUP=小蒙马拼团 | CORE | | `season` | `string` | | 季节筛选 | spring | | `sortBy` | `string` | | 排序字段:price/tripDays/default(默认按sortOrder) | price | | `sortDir` | `string` | | 排序方向:asc/desc | asc | | `tripDays` | `integer(int32)` | | 行程天数筛选 | 5 | **响应** `统一响应结果«分页结果«C端产品列表VO»»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `分页结果«C端产品列表VO»` | | 响应数据 | |   `page` | `int` | | 当前页码 | |   `pageSize` | `int` | | 每页条数 | |   `records` | `C端产品列表VO[]` | | 数据列表 | |     `coverImageUrl` | `string` | | 封面图URL | |     `creatorAvatarUrl` | `string` | | 定制师头像URL | |     `departureCity` | `string` | | 出发城市 | |     `destinationCity` | `string` | | 目的地城市 | |     `lineName` | `string` | | 产品线名称 | |     `name` | `string` | | 产品名称 | |     `paymentMode` | `string` | | 支付模式:FULL=全款 DEPOSIT=定金+尾款 | |     `productId` | `string` | | 产品ID | |     `productType` | `string` | | 产品类型:CORE=核心产品 ROUTE=线路产品 CUSTOM=定制产品 GROUP=小蒙马拼团 | |     `routeMapUrl` | `string` | | 路径图URL | |     `seasons` | `string[]` | | 适用季节列表 | |     `startPrice` | `number` | | 起步价(来自定价配置) | |     `subtitle` | `string` | | 副标题 | |     `tags` | `string[]` | | 产品标签列表 | |     `tripDays` | `int` | | 行程天数 | |     `tripNights` | `int` | | 行程晚数 | |   `total` | `int` | | 总记录数 | | `message` | `string` | | 响应消息 | --- ### `GET` /mp/product/{productId} **产品详情(C端)** 小程序端产品详情接口,仅返回已上架(PUBLISHED)的产品。 包含完整的行程信息、定价配置、费用说明、创作者寄语等。 未上架的产品会返回 404 错误。 **关联字典**: - product_type(产品类型):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品 - product_category(产品分类):family=亲子游, honeymoon=蜜月游, photography=旅拍, experience=体验, driving=自驾 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **响应** `统一响应结果«产品详情VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品详情VO` | | 响应数据 | |   `adultCount` | `int` | | 成人人数 | |   `babyCount` | `int` | | 婴儿人数 | |   `benefitsDescription` | `权益分组[]` | | 权益说明(静态,所有产品相同) | |     `items` | `权益项[]` | | 权益项列表 | |     `title` | `string` | | 分组标题,如:儿童权益 (1.2m以下) | |   `bookingNotice` | `string` | | 预定须知 | |   `cancelPolicy` | `string` | | 退改政策 | |   `carouselImages` | `string[]` | | 轮播图列表 | |   `carouselVideoUrl` | `string` | | 轮播视频URL | |   `chatMessages` | `群聊消息VO[]` | | 群聊消息列表 | |     `avatar` | `string` | | 用户头像URL(type=user时有效) | |     `text` | `string` | | 消息内容 | |     `type` | `string` | | 消息类型: user/creator | |   `childCount` | `int` | | 儿童人数 | |   `costItems` | `产品成本项VO[]` | | 成本项列表 | |     `category` | `string` | | 成本项类别:HOTEL/SCENIC/VEHICLE/ACTIVITY/SERVICE/DINING/OTHER | |     `description` | `string` | | 成本项描述 | |     `id` | `string` | | 成本项ID | |     `sortOrder` | `int` | | 排序序号 | |     `title` | `string` | | 成本项标题 | |     `type` | `string` | | 成本项类型:INCLUDED=费用包含 EXCLUDED=费用不含 SELF_PAY=自理费用 | |   `coverImageUrl` | `string` | | 封面图URL | |   `createBy` | `string` | | 创建人ID | |   `createTime` | `string` | | 创建时间 | |   `creatorAvatarUrl` | `string` | | 定制师头像URL | |   `creatorIntro` | `string` | | 创作者寄语 | |   `customFees` | `产品自定义费用项VO[]` | | 自定义费用项列表 | |     `description` | `string` | | 费用说明 | |     `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |     `feeAmount` | `number` | | 费用金额 | |     `feeName` | `string` | | 费用项名称 | |     `feeUnit` | `string` | | 费用单位 | |     `id` | `string` | | 费用项ID | |     `sortOrder` | `int` | | 排序序号 | |   `customizerId` | `string` | | 定制师ID | |   `departureCity` | `string` | | 出发城市 | |   `destinationCities` | `string[]` | | 途经城市列表(从行程节点资源去重提取) | |   `destinationCity` | `string` | | 目的地城市 | |   `families` | `家庭分组VO[]` | | 家庭分组列表(定制产品) | |     `adultCount` | `int` | | 成人数 | |     `babyCount` | `int` | | 幼童数 | |     `childCount` | `int` | | 儿童数 | |     `familyId` | `string` | | 家庭ID | |     `familyName` | `string` | | 家庭名称 | |     `sortOrder` | `int` | | 排序序号 | |     `youngChildCount` | `int` | | 小童数 | |   `folderId` | `string` | | 所属文件夹ID | |   `groupChatQrUrl` | `string` | | 群聊二维码URL | |   `groupRoomId` | `string` | | 企微群聊ID(用于会话存档展示群消息) | |   `isBooking` | `boolean` | | 是否预约产品 | |   `itineraryDays` | `行程天VO[]` | | 行程天列表 | |     `dayId` | `string` | | 行程天ID | |     `dayNumber` | `int` | | 天数编号 | |     `dayTitle` | `string` | | 天标题 | |     `hotels` | `每日酒店VO[]` | | 当日酒店列表 | |     `nodes` | `行程节点VO[]` | | 行程节点列表 | |     `restaurants` | `用餐选项VO[]` | | 当日用餐列表 | |     `routeSummary` | `string` | | 路线概览 | |   `lineId` | `string` | | 产品线ID | |   `lineName` | `string` | | 产品线名称 | |   `lineSubtitle` | `string` | | 产品线副标题 | |   `maxAdultPerOrder` | `int` | | 每单最大成人数(null=不限) | |   `maxChildPerOrder` | `int` | | 每单最大儿童数(null=不限) | |   `mchId` | `string` | | 商户号 | |   `minAdultPerOrder` | `int` | | 每单最少成人数(null=默认1) | |   `name` | `string` | | 产品名称 | |   `paymentMode` | `string` | | 支付模式:FULL=全款 DEPOSIT=定金+尾款 | |   `pricing` | `产品定价配置VO` | | 定价配置 | |     `adultExtraBed` | `number` | | 成人加床费 | |     `babyPrice` | `number` | | 婴儿价 | |     `balanceDueDays` | `int` | | 尾款支付截止天数(出发前N天) | |     `childDiscountPercent` | `number` | | 儿童折扣百分比 | |     `childNoBed` | `number` | | 儿童不占床价 | |     `childWithBed` | `number` | | 儿童占床价 | |     `companionPrice` | `number` | | 陪同人员价格 | |     `customTotalPrice` | `number` | | 定制产品总价(CUSTOM模式下使用) | |     `depositAmount` | `number` | | 定金金额 | |     `depositRatio` | `int` | | 定金比例(百分比) | |     `extraCostPerPerson` | `number` | | 每人额外成本 | |     `insuranceFee` | `number` | | 保险费用 | |     `markupPercent` | `number` | | 加价百分比(PERCENT模式下使用) | |     `maxGroupSize` | `int` | | 最大成团人数 | |     `mealBudget` | `number` | | 餐费预算 | |     `minGroupSize` | `int` | | 最小成团人数 | |     `paymentType` | `string` | | 支付方式:FULL=全款 DEPOSIT=定金+尾款 | |     `pricingId` | `string` | | 定价配置ID | |     `pricingMode` | `string` | | 定价模式:AUTO=自动计算 MANUAL=手动定价 CUSTOM=定制定价 | |     `productId` | `string` | | 产品ID | |     `profitAmount` | `number` | | 利润金额(FIXED模式下使用) | |     `profitMode` | `string` | | 利润模式:FIXED=固定金额 PERCENT=百分比 | |     `singleRoomDiff` | `number` | | 单房差 | |     `vehicleModelIds` | `string[]` | | 车型ID列表 | |     `vehicleWarning` | `string` | | 车辆绑定警告信息(为空表示绑定成功) | |   `productId` | `string` | | 产品ID | |   `productNo` | `string` | | 产品编号 | |   `productType` | `string` | | 产品类型:CORE=核心产品 ROUTE=线路产品 CUSTOM=定制产品 GROUP=小蒙马拼团 | |   `publishedAt` | `string` | | 发布时间 | |   `routeMapUrl` | `string` | | 路径图URL(后端自动生成) | |   `seasons` | `string[]` | | 适用季节列表 | |   `showChatGroup` | `boolean` | | 是否显示群聊入口 | |   `showReview` | `boolean` | | 是否显示评价 | |   `showTripDistance` | `boolean` | | 是否显示行程距离 | |   `showTripTime` | `boolean` | | 是否显示行程时间 | |   `sortOrder` | `int` | | 排序序号 | |   `staffConfigs` | `产品人员配置VO[]` | | 人员配置列表(定制产品) | |     `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |     `id` | `string` | | 记录ID | |     `quantity` | `int` | | 数量 | |     `sortOrder` | `int` | | 排序序号 | |     `staffType` | `string` | | 人员类型:GUIDE/GUIDE_ASSISTANT/PHOTOGRAPHER/LEADER/OTHER | |     `staffTypeName` | `string` | | 人员类型名称 | |   `startPrice` | `number` | | 起步价:未来一年价格日历中最低成人售价 | |   `status` | `string` | | 产品状态:DRAFT/PENDING_REVIEW/REVIEWED/REJECTED/PUBLISHED/UNPUBLISHED/COMPLETED | |   `subtitle` | `string` | | 副标题 | |   `suppliesList` | `产品物资VO[]` | | 物资列表 | |     `billingType` | `string` | | 计费方式:BY_PERSON=按人头 BY_COUNT=按次/按件 | |     `costPerPerson` | `number` | | 每人成本 | |     `coverUrl` | `string` | | 封面图URL | |     `dayNumber` | `int` | | 天数编号(scope=DAY时生效) | |     `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |     `id` | `string` | | 记录ID | |     `quantity` | `int` | | 数量 | |     `scope` | `string` | | 适用范围:ALL=整个行程 DAY=指定天 | |     `sortOrder` | `int` | | 排序序号 | |     `suppliesId` | `string` | | 物资ID | |     `suppliesName` | `string` | | 物资名称 | |   `tags` | `string[]` | | 产品标签列表 | |   `teamExperienceYears` | `int` | | 团队经验年数 | |   `tripDays` | `int` | | 行程天数 | |   `tripNights` | `int` | | 行程晚数 | |   `updateBy` | `string` | | 更新人ID | |   `updateTime` | `string` | | 更新时间 | |   `warmTips` | `string` | | 温馨提示 | |   `youngChildCount` | `int` | | 小童人数 | | `message` | `string` | | 响应消息 | --- ### `POST` /mp/product/{productId}/quote **报价计算(C端)** 小程序端报价计算接口,根据用户选择的日期和人数计算总价。 内部会校验产品是否存在且已上架。 详细计算逻辑参见管理后台的报价计算接口说明。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **请求体** `报价请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `adultCount` | `int` | 是 | 成人人数 | | `babyCount` | `int` | | 婴儿人数(按固定 babyPrice 计算) | | `childCount` | `int` | | 儿童人数(占床,按儿童价计算) | | `childNeedBed` | `boolean` | | 儿童是否加床(true 时额外加收 childWithBed 费用) | | `departureDate` | `string` | 是 | 出发日期 | | `youngChildCount` | `int` | | 小童人数(不占床,按儿童价 × childDiscountPercent 折扣比例计算) | **响应** `统一响应结果«报价结果VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `报价结果VO` | | 响应数据 | |   `customFeeCost` | `number` | | 自定义费用合计(定制产品) | |   `dayCosts` | `每日成本明细[]` | | 每日成本明细列表 | |     `activityCost` | `number` | | 活动成本 | |     `dayCostTotal` | `number` | | 当日成本合计 | |     `dayNumber` | `int` | | 天数编号 | |     `diningCost` | `number` | | 餐饮成本 | |     `extraCost` | `number` | | 额外成本 | |     `hotelCost` | `number` | | 酒店成本 | |     `scenicCost` | `number` | | 景区成本 | |     `serviceCost` | `number` | | 服务成本 | |     `staffCost` | `number` | | 人员成本 | |     `vehicleCost` | `number` | | 车辆成本 | |   `extraCostItems` | `额外成本明细项[]` | | 额外成本明细列表 | |     `costItemName` | `string` | | 成本项名称 | |     `daily` | `boolean` | | 是否按天计算 | |     `days` | `int` | | 天数(按天计算时) | |     `quantity` | `int` | | 数量 | |     `subtotal` | `number` | | 小计金额 | |     `unitPrice` | `number` | | 单价 | |   `extraCostPerPerson` | `number` | | 每人额外成本 | |   `extraCostTotal` | `number` | | 额外成本合计 | |   `familyCosts` | `家庭成本明细[]` | | 家庭分组成本明细(定制产品,有分组时返回) | |     `activityCost` | `number` | | 活动成本 | |     `adultCount` | `int` | | 成人数 | |     `babyCost` | `number` | | 婴儿固定成本 | |     `babyCount` | `int` | | 幼童数 | |     `childCount` | `int` | | 儿童数 | |     `costPerPerson` | `number` | | 人均成本(家庭成本/付费人头) | |     `customFeeCost` | `number` | | 自定义费用成本 | |     `extraCost` | `number` | | 额外成本 | |     `familyId` | `string` | | 家庭ID | |     `familyName` | `string` | | 家庭名称 | |     `headcount` | `int` | | 人头数 | |     `hotelCost` | `number` | | 酒店成本 | |     `insuranceCost` | `number` | | 保险成本 | |     `payingHeadcount` | `int` | | 付费人头数(不含幼童) | |     `personCosts` | `每人成本明细[]` | | 每人分项成本列表 | |     `scenicCost` | `number` | | 景区成本 | |     `sellPricePerPerson` | `number` | | 人均售价(家庭售价/付费人头) | |     `serviceCost` | `number` | | 服务成本 | |     `staffCost` | `number` | | 人员成本 | |     `suppliesCost` | `number` | | 物资成本 | |     `totalCost` | `number` | | 家庭成本合计 | |     `totalProfit` | `number` | | 家庭利润合计 | |     `totalSellPrice` | `number` | | 家庭售价合计 | |     `vehicleCost` | `number` | | 车辆成本 | |     `youngChildCount` | `int` | | 小童数 | |   `grandTotalCost` | `number` | | 总成本合计 | |   `grandTotalProfit` | `number` | | 总利润合计 | |   `grandTotalSellPrice` | `number` | | 总售价合计 | |   `insuranceFee` | `number` | | 保险费用 | |   `profitRate` | `number` | | 利润率(百分比) | |   `staffCost` | `number` | | 人员成本 | |   `suppliesCost` | `number` | | 物资成本 | |   `totalAdultCost` | `number` | | 成人总成本 | |   `totalAdultProfit` | `number` | | 成人总利润 | |   `totalAdultSellPrice` | `number` | | 成人总售价 | |   `totalBabyCost` | `number` | | 婴儿总成本 | |   `totalBabySellPrice` | `number` | | 婴儿总售价 | |   `totalChildCost` | `number` | | 儿童总成本 | |   `totalChildSellPrice` | `number` | | 儿童总售价 | |   `totalYoungChildCost` | `number` | | 小童总成本 | |   `totalYoungChildSellPrice` | `number` | | 小童总售价 | |   `warnings` | `string[]` | | 警告信息列表 | | `message` | `string` | | 响应消息 | --- ## 报价计算 ### `GET` /admin/product/item/{productId}/group-quote **GROUP产品报价(按套餐组合)** 为 GROUP(小蒙马拼团)产品按团期批次和套餐组合计算报价。 GROUP 产品的价格由批次下的套餐组合(combo)决定,不同组合有不同的成人/儿童人数搭配和价格。 传入 batchId 指定团期批次,adultCount 用于匹配合适的套餐组合。 **与普通报价的区别**:普通报价从价格日历取单价,GROUP 报价从套餐组合取打包价。 **关联字典**: - product_type(产品类型,仅限GROUP):GROUP=小蒙马拼团 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **查询参数** | 参数 | 类型 | 必填 | 说明 | 示例 | | --- | --- | --- | --- | --- | | `adultCount` | `integer(int32)` | | 成人人数 | | | `batchId` | `integer(int64)` | | 团期ID | | **响应** `统一响应结果«GROUP产品报价结果»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `GROUP产品报价结果` | | 响应数据 | |   `adultCostPrice` | `number` | | 成人成本价(单房差+每人费用) | |   `adultSellPrice` | `number` | | 成人售价 | |   `childCostPrice` | `number` | | 儿童成本价(每人费用,不含酒店) | |   `childSellPrice` | `number` | | 儿童售价 | |   `code` | `int` | | 返回码: 0=成功, 1=非GROUP产品, 2=错误 | |   `dayCosts` | `每日成本明细[]` | | 每日成本明细 | |     `activityCost` | `number` | | 活动成本 | |     `dayCostTotal` | `number` | | 当日成本合计 | |     `dayNumber` | `int` | | 天数编号 | |     `diningCost` | `number` | | 餐饮成本 | |     `extraCost` | `number` | | 额外成本 | |     `hotelCost` | `number` | | 酒店成本 | |     `scenicCost` | `number` | | 景区成本 | |     `serviceCost` | `number` | | 服务成本 | |     `staffCost` | `number` | | 人员成本 | |     `vehicleCost` | `number` | | 车辆成本 | |   `extraCostItems` | `额外成本明细项[]` | | 额外成本明细列表 | |     `costItemName` | `string` | | 成本项名称 | |     `daily` | `boolean` | | 是否按天计算 | |     `days` | `int` | | 天数(按天计算时) | |     `quantity` | `int` | | 数量 | |     `subtotal` | `number` | | 小计金额 | |     `unitPrice` | `number` | | 单价 | |   `extraCostPerPerson` | `number` | | 额外成本(人均) | |   `extraCostTotal` | `number` | | 额外成本总额(团队) | |   `hotelCostTotal` | `number` | | 酒店总成本 | |   `message` | `string` | | 错误信息(code!=0时) | |   `perPersonCost` | `number` | | 每人成本(不含酒店) | |   `profitMode` | `string` | | 利润模式 | |   `singleRoomSupplement` | `number` | | 单房差(酒店总成本/2) | |   `warnings` | `string[]` | | 警告信息 | | `message` | `string` | | 响应消息 | --- ### `POST` /admin/product/item/{productId}/quote **计算报价** 根据出发日期和人数组合,计算产品的完整报价。 **计算流程**: 1. 从价格日历获取指定日期的单价 2. 按人数类型分别计算:成人 × 成人价、儿童 × 儿童价 3. 小童按儿童价 × 折扣比例(childDiscountPercent)计算 4. 婴儿使用固定价格(babyPrice) 5. 儿童加床(childNeedBed=true)额外加收 childWithBed 费用 **CUSTOM/ROUTE 产品**:价格日历存的是整单总价,不按人头乘算。 **GROUP 产品**:建议使用 group-quote 接口,支持套餐组合报价。 **关联字典**: - product_type(产品类型,影响计算逻辑):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **请求体** `报价请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `adultCount` | `int` | 是 | 成人人数 | | `babyCount` | `int` | | 婴儿人数(按固定 babyPrice 计算) | | `childCount` | `int` | | 儿童人数(占床,按儿童价计算) | | `childNeedBed` | `boolean` | | 儿童是否加床(true 时额外加收 childWithBed 费用) | | `departureDate` | `string` | 是 | 出发日期 | | `youngChildCount` | `int` | | 小童人数(不占床,按儿童价 × childDiscountPercent 折扣比例计算) | **响应** `统一响应结果«报价结果VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `报价结果VO` | | 响应数据 | |   `customFeeCost` | `number` | | 自定义费用合计(定制产品) | |   `dayCosts` | `每日成本明细[]` | | 每日成本明细列表 | |     `activityCost` | `number` | | 活动成本 | |     `dayCostTotal` | `number` | | 当日成本合计 | |     `dayNumber` | `int` | | 天数编号 | |     `diningCost` | `number` | | 餐饮成本 | |     `extraCost` | `number` | | 额外成本 | |     `hotelCost` | `number` | | 酒店成本 | |     `scenicCost` | `number` | | 景区成本 | |     `serviceCost` | `number` | | 服务成本 | |     `staffCost` | `number` | | 人员成本 | |     `vehicleCost` | `number` | | 车辆成本 | |   `extraCostItems` | `额外成本明细项[]` | | 额外成本明细列表 | |     `costItemName` | `string` | | 成本项名称 | |     `daily` | `boolean` | | 是否按天计算 | |     `days` | `int` | | 天数(按天计算时) | |     `quantity` | `int` | | 数量 | |     `subtotal` | `number` | | 小计金额 | |     `unitPrice` | `number` | | 单价 | |   `extraCostPerPerson` | `number` | | 每人额外成本 | |   `extraCostTotal` | `number` | | 额外成本合计 | |   `familyCosts` | `家庭成本明细[]` | | 家庭分组成本明细(定制产品,有分组时返回) | |     `activityCost` | `number` | | 活动成本 | |     `adultCount` | `int` | | 成人数 | |     `babyCost` | `number` | | 婴儿固定成本 | |     `babyCount` | `int` | | 幼童数 | |     `childCount` | `int` | | 儿童数 | |     `costPerPerson` | `number` | | 人均成本(家庭成本/付费人头) | |     `customFeeCost` | `number` | | 自定义费用成本 | |     `extraCost` | `number` | | 额外成本 | |     `familyId` | `string` | | 家庭ID | |     `familyName` | `string` | | 家庭名称 | |     `headcount` | `int` | | 人头数 | |     `hotelCost` | `number` | | 酒店成本 | |     `insuranceCost` | `number` | | 保险成本 | |     `payingHeadcount` | `int` | | 付费人头数(不含幼童) | |     `personCosts` | `每人成本明细[]` | | 每人分项成本列表 | |     `scenicCost` | `number` | | 景区成本 | |     `sellPricePerPerson` | `number` | | 人均售价(家庭售价/付费人头) | |     `serviceCost` | `number` | | 服务成本 | |     `staffCost` | `number` | | 人员成本 | |     `suppliesCost` | `number` | | 物资成本 | |     `totalCost` | `number` | | 家庭成本合计 | |     `totalProfit` | `number` | | 家庭利润合计 | |     `totalSellPrice` | `number` | | 家庭售价合计 | |     `vehicleCost` | `number` | | 车辆成本 | |     `youngChildCount` | `int` | | 小童数 | |   `grandTotalCost` | `number` | | 总成本合计 | |   `grandTotalProfit` | `number` | | 总利润合计 | |   `grandTotalSellPrice` | `number` | | 总售价合计 | |   `insuranceFee` | `number` | | 保险费用 | |   `profitRate` | `number` | | 利润率(百分比) | |   `staffCost` | `number` | | 人员成本 | |   `suppliesCost` | `number` | | 物资成本 | |   `totalAdultCost` | `number` | | 成人总成本 | |   `totalAdultProfit` | `number` | | 成人总利润 | |   `totalAdultSellPrice` | `number` | | 成人总售价 | |   `totalBabyCost` | `number` | | 婴儿总成本 | |   `totalBabySellPrice` | `number` | | 婴儿总售价 | |   `totalChildCost` | `number` | | 儿童总成本 | |   `totalChildSellPrice` | `number` | | 儿童总售价 | |   `totalYoungChildCost` | `number` | | 小童总成本 | |   `totalYoungChildSellPrice` | `number` | | 小童总售价 | |   `warnings` | `string[]` | | 警告信息列表 | | `message` | `string` | | 响应消息 | --- ## 拼团批次管理 ### `POST` /admin/product/item/{productId}/batch **创建主批次** 为 GROUP(小蒙马拼团)产品创建一个团期主批次。 **仅适用于 GROUP 产品类型**。 每个批次有独立的出发日期、报名截止日期、人数上限。 创建后状态为 PENDING(待开放),需手动开启报名。 **批次状态流转**:PENDING → ENROLLING(报名中)→ CONFIRMED(已成团)→ CLOSED(已关闭) 任意报名状态均可被解散(DISBANDED)。 **关联字典**: - product_type(产品类型,仅限GROUP):GROUP=小蒙马拼团 - batch_status(批次状态):PENDING=待开放, ENROLLING=报名中, CONFIRMED=已成团, FULL=已满员, CLOSED=已关闭, DISBANDED=已解散, IN_PROGRESS=进行中, FINISHED=已结束 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | 是 | productId | **请求体** `创建拼团批次请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `batchName` | `string` | 是 | 批次名称 | | `departureDate` | `string` | 是 | 出发日期 | | `enrollmentDeadline` | `string` | 是 | 报名截止日期,必须早于出发日期 | | `maxParticipants` | `int` | 是 | 最大参团人数(报名人数达到上限后自动关闭报名) | | `minParticipants` | `int` | | 最低成团人数(0=不限制,达到此人数自动变为CONFIRMED状态) | | `remark` | `string` | | 备注说明 | | `sortOrder` | `int` | | 排序序号(越小越靠前) | **响应** `统一响应结果«团批次VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `团批次VO` | | 响应数据 | |   `batchId` | `string` | | 批次ID | |   `batchLabel` | `string` | | 批次标签(简称) | |   `batchName` | `string` | | 批次名称 | |   `batchNo` | `string` | | 批次编号 | |   `batchStatus` | `string` | | 批次状态: PENDING/ENROLLING/CONFIRMED/FULL/CLOSED/IN_PROGRESS/FINISHED/DISBANDED | |   `createBy` | `string` | | 创建人ID | |   `createTime` | `string` | | 创建时间 | |   `departureDate` | `string` | | 出发日期 | |   `endDate` | `string` | | 结束日期 | |   `enrolledCount` | `int` | | 已报名人数 | |   `enrollmentDeadline` | `string` | | 报名截止日期 | |   `maxParticipants` | `int` | | 最大人数 | |   `minParticipants` | `int` | | 最少成团人数 | |   `parentBatchId` | `string` | | 父批次ID(子批次时有值) | |   `productId` | `string` | | 产品ID | |   `remainingSlots` | `int` | | 剩余名额 | |   `remark` | `string` | | 备注 | |   `sortOrder` | `int` | | 排序 | |   `subBatches` | `团批次VO[]` | | 子批次列表(树形) | |     `batchId` | `string` | | 批次ID | |     `batchLabel` | `string` | | 批次标签(简称) | |     `batchName` | `string` | | 批次名称 | |     `batchNo` | `string` | | 批次编号 | |     `batchStatus` | `string` | | 批次状态: PENDING/ENROLLING/CONFIRMED/FULL/CLOSED/IN_PROGRESS/FINISHED/DISBANDED | |     `createBy` | `string` | | 创建人ID | |     `createTime` | `string` | | 创建时间 | |     `departureDate` | `string` | | 出发日期 | |     `endDate` | `string` | | 结束日期 | |     `enrolledCount` | `int` | | 已报名人数 | |     `enrollmentDeadline` | `string` | | 报名截止日期 | |     `maxParticipants` | `int` | | 最大人数 | |     `minParticipants` | `int` | | 最少成团人数 | |     `parentBatchId` | `string` | | 父批次ID(子批次时有值) | |     `productId` | `string` | | 产品ID | |     `remainingSlots` | `int` | | 剩余名额 | |     `remark` | `string` | | 备注 | |     `sortOrder` | `int` | | 排序 | |     `subBatches` | `团批次VO[]` | | 子批次列表(树形) | |     `updateTime` | `string` | | 更新时间 | |   `updateTime` | `string` | | 更新时间 | | `message` | `string` | | 响应消息 | --- ### `GET` /admin/product/item/{productId}/batch/list **批次列表(树形)** 获取产品所有批次,以树形结构返回(主批次包含子批次列表)。 按出发日期升序排列,包含每个批次的报名人数和剩余名额。 **关联字典**: - batch_status(批次状态,返回字段):PENDING=待开放, ENROLLING=报名中, CONFIRMED=已成团, FULL=已满员, CLOSED=已关闭, DISBANDED=已解散, IN_PROGRESS=进行中, FINISHED=已结束 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | 是 | productId | **响应** `统一响应结果«List«团批次VO»»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `团批次VO[]` | | 响应数据 | |   `batchId` | `string` | | 批次ID | |   `batchLabel` | `string` | | 批次标签(简称) | |   `batchName` | `string` | | 批次名称 | |   `batchNo` | `string` | | 批次编号 | |   `batchStatus` | `string` | | 批次状态: PENDING/ENROLLING/CONFIRMED/FULL/CLOSED/IN_PROGRESS/FINISHED/DISBANDED | |   `createBy` | `string` | | 创建人ID | |   `createTime` | `string` | | 创建时间 | |   `departureDate` | `string` | | 出发日期 | |   `endDate` | `string` | | 结束日期 | |   `enrolledCount` | `int` | | 已报名人数 | |   `enrollmentDeadline` | `string` | | 报名截止日期 | |   `maxParticipants` | `int` | | 最大人数 | |   `minParticipants` | `int` | | 最少成团人数 | |   `parentBatchId` | `string` | | 父批次ID(子批次时有值) | |   `productId` | `string` | | 产品ID | |   `remainingSlots` | `int` | | 剩余名额 | |   `remark` | `string` | | 备注 | |   `sortOrder` | `int` | | 排序 | |   `subBatches` | `团批次VO[]` | | 子批次列表(树形) | |     `batchId` | `string` | | 批次ID | |     `batchLabel` | `string` | | 批次标签(简称) | |     `batchName` | `string` | | 批次名称 | |     `batchNo` | `string` | | 批次编号 | |     `batchStatus` | `string` | | 批次状态: PENDING/ENROLLING/CONFIRMED/FULL/CLOSED/IN_PROGRESS/FINISHED/DISBANDED | |     `createBy` | `string` | | 创建人ID | |     `createTime` | `string` | | 创建时间 | |     `departureDate` | `string` | | 出发日期 | |     `endDate` | `string` | | 结束日期 | |     `enrolledCount` | `int` | | 已报名人数 | |     `enrollmentDeadline` | `string` | | 报名截止日期 | |     `maxParticipants` | `int` | | 最大人数 | |     `minParticipants` | `int` | | 最少成团人数 | |     `parentBatchId` | `string` | | 父批次ID(子批次时有值) | |     `productId` | `string` | | 产品ID | |     `remainingSlots` | `int` | | 剩余名额 | |     `remark` | `string` | | 备注 | |     `sortOrder` | `int` | | 排序 | |     `subBatches` | `团批次VO[]` | | 子批次列表(树形) | |     `updateTime` | `string` | | 更新时间 | |   `updateTime` | `string` | | 更新时间 | | `message` | `string` | | 响应消息 | --- ### `GET` /admin/product/item/{productId}/batch/{batchId} **批次详情** 获取单个批次的完整信息,包括批次基本信息、服务人员配置、套餐组合等。 **关联字典**: - batch_status(批次状态):PENDING=待开放, ENROLLING=报名中, CONFIRMED=已成团, FULL=已满员, CLOSED=已关闭, DISBANDED=已解散, IN_PROGRESS=进行中, FINISHED=已结束 - staff_type(人员类型,服务人员配置):GUIDE=领队, DRIVER=司机, PHOTOGRAPHER=摄影师, ASSISTANT=助理, OTHER=其他 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `batchId` | `integer` | 是 | batchId | | `productId` | `integer` | 是 | productId | **响应** `统一响应结果«团批次详情VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `团批次详情VO` | | 响应数据 | |   `batchId` | `string` | | 批次ID | |   `batchLabel` | `string` | | 批次标签(简称) | |   `batchName` | `string` | | 批次名称 | |   `batchNo` | `string` | | 批次编号 | |   `batchStatus` | `string` | | 批次状态: PENDING/ENROLLING/CONFIRMED/FULL/CLOSED/IN_PROGRESS/FINISHED/DISBANDED | |   `createBy` | `string` | | 创建人ID | |   `createTime` | `string` | | 创建时间 | |   `departureDate` | `string` | | 出发日期 | |   `endDate` | `string` | | 结束日期 | |   `enrolledCount` | `int` | | 已报名人数 | |   `enrollmentDeadline` | `string` | | 报名截止日期 | |   `maxParticipants` | `int` | | 最大人数 | |   `minParticipants` | `int` | | 最少成团人数 | |   `parentBatchId` | `string` | | 父批次ID(子批次时有值) | |   `productId` | `string` | | 产品ID | |   `remainingSlots` | `int` | | 剩余名额 | |   `remark` | `string` | | 备注 | |   `sortOrder` | `int` | | 排序 | |   `staff` | `团批次服务人员VO[]` | | 服务人员列表 | |     `batchId` | `string` | | 批次ID | |     `createTime` | `string` | | 创建时间 | |     `id` | `string` | | 记录ID | |     `productId` | `string` | | 产品ID | |     `remark` | `string` | | 备注 | |     `sortOrder` | `int` | | 排序 | |     `staffId` | `string` | | 服务人员ID | |     `staffName` | `string` | | 姓名 | |     `staffPhone` | `string` | | 手机号 | |     `staffRole` | `string` | | 角色: GUIDE/GUIDE_ASSISTANT/PHOTOGRAPHER/LEADER/OTHER | |   `subBatches` | `团批次VO[]` | | 子批次列表(树形) | |     `batchId` | `string` | | 批次ID | |     `batchLabel` | `string` | | 批次标签(简称) | |     `batchName` | `string` | | 批次名称 | |     `batchNo` | `string` | | 批次编号 | |     `batchStatus` | `string` | | 批次状态: PENDING/ENROLLING/CONFIRMED/FULL/CLOSED/IN_PROGRESS/FINISHED/DISBANDED | |     `createBy` | `string` | | 创建人ID | |     `createTime` | `string` | | 创建时间 | |     `departureDate` | `string` | | 出发日期 | |     `endDate` | `string` | | 结束日期 | |     `enrolledCount` | `int` | | 已报名人数 | |     `enrollmentDeadline` | `string` | | 报名截止日期 | |     `maxParticipants` | `int` | | 最大人数 | |     `minParticipants` | `int` | | 最少成团人数 | |     `parentBatchId` | `string` | | 父批次ID(子批次时有值) | |     `productId` | `string` | | 产品ID | |     `remainingSlots` | `int` | | 剩余名额 | |     `remark` | `string` | | 备注 | |     `sortOrder` | `int` | | 排序 | |     `subBatches` | `团批次VO[]` | | 子批次列表(树形) | |     `updateTime` | `string` | | 更新时间 | |   `updateTime` | `string` | | 更新时间 | | `message` | `string` | | 响应消息 | --- ### `PUT` /admin/product/item/{productId}/batch/{batchId} **更新批次** 更新批次基本信息。仅传入需要修改的字段。 已有报名人员的批次修改人数上限时,不能低于已报名人数。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `batchId` | `integer` | 是 | batchId | | `productId` | `integer` | 是 | productId | **请求体** `更新拼团批次请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `batchName` | `string` | | 批次名称 | | `departureDate` | `string` | | 出发日期 | | `enrollmentDeadline` | `string` | | 报名截止日期 | | `maxParticipants` | `int` | | 最大参团人数(不能低于已报名人数) | | `minParticipants` | `int` | | 最低成团人数(0=不限制) | | `remark` | `string` | | 备注说明 | | `sortOrder` | `int` | | 排序序号 | **响应** `统一响应结果«团批次VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `团批次VO` | | 响应数据 | |   `batchId` | `string` | | 批次ID | |   `batchLabel` | `string` | | 批次标签(简称) | |   `batchName` | `string` | | 批次名称 | |   `batchNo` | `string` | | 批次编号 | |   `batchStatus` | `string` | | 批次状态: PENDING/ENROLLING/CONFIRMED/FULL/CLOSED/IN_PROGRESS/FINISHED/DISBANDED | |   `createBy` | `string` | | 创建人ID | |   `createTime` | `string` | | 创建时间 | |   `departureDate` | `string` | | 出发日期 | |   `endDate` | `string` | | 结束日期 | |   `enrolledCount` | `int` | | 已报名人数 | |   `enrollmentDeadline` | `string` | | 报名截止日期 | |   `maxParticipants` | `int` | | 最大人数 | |   `minParticipants` | `int` | | 最少成团人数 | |   `parentBatchId` | `string` | | 父批次ID(子批次时有值) | |   `productId` | `string` | | 产品ID | |   `remainingSlots` | `int` | | 剩余名额 | |   `remark` | `string` | | 备注 | |   `sortOrder` | `int` | | 排序 | |   `subBatches` | `团批次VO[]` | | 子批次列表(树形) | |     `batchId` | `string` | | 批次ID | |     `batchLabel` | `string` | | 批次标签(简称) | |     `batchName` | `string` | | 批次名称 | |     `batchNo` | `string` | | 批次编号 | |     `batchStatus` | `string` | | 批次状态: PENDING/ENROLLING/CONFIRMED/FULL/CLOSED/IN_PROGRESS/FINISHED/DISBANDED | |     `createBy` | `string` | | 创建人ID | |     `createTime` | `string` | | 创建时间 | |     `departureDate` | `string` | | 出发日期 | |     `endDate` | `string` | | 结束日期 | |     `enrolledCount` | `int` | | 已报名人数 | |     `enrollmentDeadline` | `string` | | 报名截止日期 | |     `maxParticipants` | `int` | | 最大人数 | |     `minParticipants` | `int` | | 最少成团人数 | |     `parentBatchId` | `string` | | 父批次ID(子批次时有值) | |     `productId` | `string` | | 产品ID | |     `remainingSlots` | `int` | | 剩余名额 | |     `remark` | `string` | | 备注 | |     `sortOrder` | `int` | | 排序 | |     `subBatches` | `团批次VO[]` | | 子批次列表(树形) | |     `updateTime` | `string` | | 更新时间 | |   `updateTime` | `string` | | 更新时间 | | `message` | `string` | | 响应消息 | --- ### `DELETE` /admin/product/item/{productId}/batch/{batchId} **删除批次** 删除批次(软删除)。 **限制**:已有报名人员的批次不能直接删除,需先解散批次。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `batchId` | `integer` | 是 | batchId | | `productId` | `integer` | 是 | productId | **响应** `统一响应结果«Void»` --- ### `PUT` /admin/product/item/{productId}/batch/{batchId}/close **关闭报名(ENROLLING/CONFIRMED->CLOSED)** 关闭批次报名,不再接受新的报名。 已报名的订单不受影响,仅阻止新增报名。 适用于报名截止日期到达或手动提前关闭的场景。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `batchId` | `integer` | 是 | batchId | | `productId` | `integer` | 是 | productId | **响应** `统一响应结果«Void»` --- ### `POST` /admin/product/item/{productId}/batch/{batchId}/disband **解散批次** 解散批次并处理已报名的订单。 **重要**:解散操作会触发以下流程: 1. 批次状态变更为 DISBANDED 2. 通过 MQ 消息通知订单服务,自动取消该批次下的所有未完成订单 3. 已支付订单会触发退款流程 必须填写解散原因(如:报名人数不足、行程调整等)。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `batchId` | `integer` | 是 | batchId | | `productId` | `integer` | 是 | productId | **请求体** `解散批次请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `reason` | `string` | 是 | 解散原因(如:报名人数不足、行程调整等) | **响应** `统一响应结果«Void»` --- ### `PUT` /admin/product/item/{productId}/batch/{batchId}/open **开启报名(PENDING->ENROLLING)** 将批次从 PENDING 状态变更为 ENROLLING(报名中)。 开启后用户可在小程序端看到该团期并报名。 前提条件:产品必须已上架(PUBLISHED)。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `batchId` | `integer` | 是 | batchId | | `productId` | `integer` | 是 | productId | **响应** `统一响应结果«Void»` --- ### `GET` /admin/product/item/{productId}/batch/{batchId}/staff **服务人员列表** **关联字典**: - staff_type(人员类型):GUIDE=领队, DRIVER=司机, PHOTOGRAPHER=摄影师, ASSISTANT=助理, OTHER=其他 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `batchId` | `integer` | 是 | batchId | | `productId` | `integer` | 是 | productId | **响应** `统一响应结果«List«团批次服务人员VO»»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `团批次服务人员VO[]` | | 响应数据 | |   `batchId` | `string` | | 批次ID | |   `createTime` | `string` | | 创建时间 | |   `id` | `string` | | 记录ID | |   `productId` | `string` | | 产品ID | |   `remark` | `string` | | 备注 | |   `sortOrder` | `int` | | 排序 | |   `staffId` | `string` | | 服务人员ID | |   `staffName` | `string` | | 姓名 | |   `staffPhone` | `string` | | 手机号 | |   `staffRole` | `string` | | 角色: GUIDE/GUIDE_ASSISTANT/PHOTOGRAPHER/LEADER/OTHER | | `message` | `string` | | 响应消息 | --- ### `POST` /admin/product/item/{productId}/batch/{batchId}/staff **保存服务人员(全量替换)** 保存批次的服务人员配置,采用全量替换模式(先删后增)。 每次提交完整的人员列表,替换掉该批次原有的所有人员配置。 人员来源于资源服务的人员库,通过 staffId 关联。 **角色类型**:LEADER(领队)/PHOTOGRAPHER(摄影师)/DRIVER(司机)/OTHER(其他) **关联字典**: - staff_type(人员类型):GUIDE=领队, DRIVER=司机, PHOTOGRAPHER=摄影师, ASSISTANT=助理, OTHER=其他 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `batchId` | `integer` | 是 | batchId | | `productId` | `integer` | 是 | productId | **请求体** `批次服务人员分配请求[]` **响应** `统一响应结果«List«团批次服务人员VO»»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `团批次服务人员VO[]` | | 响应数据 | |   `batchId` | `string` | | 批次ID | |   `createTime` | `string` | | 创建时间 | |   `id` | `string` | | 记录ID | |   `productId` | `string` | | 产品ID | |   `remark` | `string` | | 备注 | |   `sortOrder` | `int` | | 排序 | |   `staffId` | `string` | | 服务人员ID | |   `staffName` | `string` | | 姓名 | |   `staffPhone` | `string` | | 手机号 | |   `staffRole` | `string` | | 角色: GUIDE/GUIDE_ASSISTANT/PHOTOGRAPHER/LEADER/OTHER | | `message` | `string` | | 响应消息 | --- ### `POST` /admin/product/item/{productId}/batch/{batchId}/staff/copy-from/{sourceId} **从其他批次复制服务人员** 将源批次的服务人员配置复制到当前批次(全量替换当前批次已有人员)。 适用场景:多个团期使用相同的服务人员班底。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `batchId` | `integer` | 是 | batchId | | `productId` | `integer` | 是 | productId | | `sourceId` | `integer` | 是 | sourceId | **响应** `统一响应结果«List«团批次服务人员VO»»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `团批次服务人员VO[]` | | 响应数据 | |   `batchId` | `string` | | 批次ID | |   `createTime` | `string` | | 创建时间 | |   `id` | `string` | | 记录ID | |   `productId` | `string` | | 产品ID | |   `remark` | `string` | | 备注 | |   `sortOrder` | `int` | | 排序 | |   `staffId` | `string` | | 服务人员ID | |   `staffName` | `string` | | 姓名 | |   `staffPhone` | `string` | | 手机号 | |   `staffRole` | `string` | | 角色: GUIDE/GUIDE_ASSISTANT/PHOTOGRAPHER/LEADER/OTHER | | `message` | `string` | | 响应消息 | --- ### `POST` /admin/product/item/{productId}/batch/{batchId}/sub-batch **创建子批次(溢出)** 当主批次人数满员时,创建子批次接收溢出报名。 子批次共享主批次的出发日期和行程,但有独立的人数上限和报名人数。 适用场景:某团期特别火爆,需要扩容但希望分开管理。 子批次在列表中显示为主批次的子级节点。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `batchId` | `integer` | 是 | batchId | | `productId` | `integer` | 是 | productId | **请求体** `创建拼团批次请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `batchName` | `string` | 是 | 批次名称 | | `departureDate` | `string` | 是 | 出发日期 | | `enrollmentDeadline` | `string` | 是 | 报名截止日期,必须早于出发日期 | | `maxParticipants` | `int` | 是 | 最大参团人数(报名人数达到上限后自动关闭报名) | | `minParticipants` | `int` | | 最低成团人数(0=不限制,达到此人数自动变为CONFIRMED状态) | | `remark` | `string` | | 备注说明 | | `sortOrder` | `int` | | 排序序号(越小越靠前) | **响应** `统一响应结果«团批次VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `团批次VO` | | 响应数据 | |   `batchId` | `string` | | 批次ID | |   `batchLabel` | `string` | | 批次标签(简称) | |   `batchName` | `string` | | 批次名称 | |   `batchNo` | `string` | | 批次编号 | |   `batchStatus` | `string` | | 批次状态: PENDING/ENROLLING/CONFIRMED/FULL/CLOSED/IN_PROGRESS/FINISHED/DISBANDED | |   `createBy` | `string` | | 创建人ID | |   `createTime` | `string` | | 创建时间 | |   `departureDate` | `string` | | 出发日期 | |   `endDate` | `string` | | 结束日期 | |   `enrolledCount` | `int` | | 已报名人数 | |   `enrollmentDeadline` | `string` | | 报名截止日期 | |   `maxParticipants` | `int` | | 最大人数 | |   `minParticipants` | `int` | | 最少成团人数 | |   `parentBatchId` | `string` | | 父批次ID(子批次时有值) | |   `productId` | `string` | | 产品ID | |   `remainingSlots` | `int` | | 剩余名额 | |   `remark` | `string` | | 备注 | |   `sortOrder` | `int` | | 排序 | |   `subBatches` | `团批次VO[]` | | 子批次列表(树形) | |     `batchId` | `string` | | 批次ID | |     `batchLabel` | `string` | | 批次标签(简称) | |     `batchName` | `string` | | 批次名称 | |     `batchNo` | `string` | | 批次编号 | |     `batchStatus` | `string` | | 批次状态: PENDING/ENROLLING/CONFIRMED/FULL/CLOSED/IN_PROGRESS/FINISHED/DISBANDED | |     `createBy` | `string` | | 创建人ID | |     `createTime` | `string` | | 创建时间 | |     `departureDate` | `string` | | 出发日期 | |     `endDate` | `string` | | 结束日期 | |     `enrolledCount` | `int` | | 已报名人数 | |     `enrollmentDeadline` | `string` | | 报名截止日期 | |     `maxParticipants` | `int` | | 最大人数 | |     `minParticipants` | `int` | | 最少成团人数 | |     `parentBatchId` | `string` | | 父批次ID(子批次时有值) | |     `productId` | `string` | | 产品ID | |     `remainingSlots` | `int` | | 剩余名额 | |     `remark` | `string` | | 备注 | |     `sortOrder` | `int` | | 排序 | |     `subBatches` | `团批次VO[]` | | 子批次列表(树形) | |     `updateTime` | `string` | | 更新时间 | |   `updateTime` | `string` | | 更新时间 | | `message` | `string` | | 响应消息 | --- ## 行政区划搜索 ### `GET` /admin/product/district/search **搜索行政区划(城市/区县)** 通过高德地图 API 搜索行政区划,用于产品的出发城市和目的地城市选择。 输入关键词(如"丽江"、"昆明"),返回匹配的城市/区县列表,包含行政区划编码。 **关联字典**: - cities(城市):搜索结果可用于产品行程中的城市预览 - city(城市筛选):搜索结果可用于资源面板城市筛选 **查询参数** | 参数 | 类型 | 必填 | 说明 | 示例 | | --- | --- | --- | --- | --- | | `keywords` | `string` | | 搜索关键词 | | **响应** `统一响应结果«List«行政区划搜索结果»»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `行政区划搜索结果[]` | | 响应数据 | |   `adcode` | `string` | | 行政区编码 | |   `level` | `string` | | 级别: city/district | |   `levelName` | `string` | | 级别中文名 | |   `name` | `string` | | 行政区名称 | | `message` | `string` | | 响应消息 | --- ## 行程管理 ### `PUT` /admin/product/dining/{id} **更新餐饮推荐** 更新餐饮推荐的餐厅、用餐类型(早/午/晚)、描述等信息。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `id` | `integer` | | 餐饮推荐ID | **请求体** `用餐选项请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `coverUrl` | `string` | | 餐食封面图URL | | `mealTypes` | `string` | | 餐次:早餐/午餐/晚餐 | | `priceInfo` | `string` | | 价格信息 | | `quantity` | `int` | | 数量 | | `restaurantId` | `string` | | 餐厅ID(GROUP产品可不传) | | `restaurantName` | `string` | | 餐厅/餐食名称 | | `sortOrder` | `int` | | 排序序号 | | `unitPrice` | `number` | | 餐食单价(元,GROUP产品用于成本计算) | **响应** `统一响应结果«用餐选项VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `用餐选项VO` | | 响应数据 | |   `coverUrl` | `string` | | 餐食封面图URL | |   `dayNumber` | `int` | | 天数编号 | |   `id` | `string` | | 记录ID | |   `mealTypes` | `string` | | 餐次:早餐/午餐/晚餐 | |   `priceInfo` | `string` | | 价格信息 | |   `quantity` | `int` | | 数量 | |   `restaurantId` | `string` | | 餐厅ID | |   `restaurantName` | `string` | | 餐厅/餐食名称 | |   `sortOrder` | `int` | | 排序序号 | |   `unitPrice` | `number` | | 餐食单价(元) | | `message` | `string` | | 响应消息 | --- ### `DELETE` /admin/product/dining/{id} **删除餐饮推荐** 删除指定的餐饮推荐记录。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `id` | `integer` | | 餐饮推荐ID | **响应** `统一响应结果«Void»` --- ### `PUT` /admin/product/hotel/{id} **更新每日住宿** 更新住宿记录的酒店、房型、数量等信息。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `id` | `integer` | | 住宿记录ID | **请求体** `每日酒店配置请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `coverUrl` | `string` | | 封面图URL | | `familyIds` | `string[]` | | 所属家庭ID列表(定制产品,不传=所有家庭共享) | | `familyRoomConfig` | `object` | | 家庭房间分配(定制产品):{familyId: roomCount},如 {"123": 2, "456": 1} | | `hotelId` | `string` | 是 | 酒店ID | | `hotelName` | `string` | | 酒店名称 | | `isDefault` | `boolean` | | 是否默认酒店 | | `roomCount` | `int` | | 房间数量 | | `roomTypeId` | `string` | | 关联房型ID(定制产品必填,核心产品为空) | | `roomTypeName` | `string` | | 房型名称 | | `sortOrder` | `int` | | 排序序号 | **响应** `统一响应结果«每日酒店VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `每日酒店VO` | | 响应数据 | |   `coverUrl` | `string` | | 封面图URL | |   `dayNumber` | `int` | | 天数编号 | |   `familyIds` | `string[]` | | 所属家庭ID列表(NULL=所有家庭共享) | |   `familyRoomConfig` | `object` | | 家庭房间分配:{familyId: roomCount} | |   `hotelId` | `string` | | 酒店ID | |   `hotelName` | `string` | | 酒店名称 | |   `id` | `string` | | 记录ID | |   `isDefault` | `boolean` | | 是否默认酒店 | |   `roomCount` | `int` | | 房间数量 | |   `roomTypeId` | `string` | | 房型ID | |   `roomTypeName` | `string` | | 房型名称 | |   `sortOrder` | `int` | | 排序序号 | | `message` | `string` | | 响应消息 | --- ### `DELETE` /admin/product/hotel/{id} **删除每日住宿** 删除指定住宿记录。删除后该天的住宿成本会从报价中移除。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `id` | `integer` | | 住宿记录ID | **响应** `统一响应结果«Void»` --- ### `PUT` /admin/product/item/{productId}/day/{dayNumber} **更新行程天** 更新指定天的行程信息,如当天主题、概述等。 行程天在创建产品时根据 tripDays 自动生成,不支持单独增删,只能更新。 dayNumber 从 1 开始,对应第几天的行程。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `dayNumber` | `integer` | | 天数编号 | | `productId` | `integer` | | 产品ID | **请求体** `行程天请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `dayTitle` | `string` | | 天标题 | | `routeSummary` | `string` | | 路线概览 | **响应** `统一响应结果«行程天VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `行程天VO` | | 响应数据 | |   `dayId` | `string` | | 行程天ID | |   `dayNumber` | `int` | | 天数编号 | |   `dayTitle` | `string` | | 天标题 | |   `hotels` | `每日酒店VO[]` | | 当日酒店列表 | |     `coverUrl` | `string` | | 封面图URL | |     `dayNumber` | `int` | | 天数编号 | |     `familyIds` | `string[]` | | 所属家庭ID列表(NULL=所有家庭共享) | |     `familyRoomConfig` | `object` | | 家庭房间分配:{familyId: roomCount} | |     `hotelId` | `string` | | 酒店ID | |     `hotelName` | `string` | | 酒店名称 | |     `id` | `string` | | 记录ID | |     `isDefault` | `boolean` | | 是否默认酒店 | |     `roomCount` | `int` | | 房间数量 | |     `roomTypeId` | `string` | | 房型ID | |     `roomTypeName` | `string` | | 房型名称 | |     `sortOrder` | `int` | | 排序序号 | |   `nodes` | `行程节点VO[]` | | 行程节点列表 | |     `costPrice` | `number` | | 资源成本价(来自资源价格日历) | |     `dayId` | `string` | | 所属行程天ID | |     `description` | `string` | | 节点描述 | |     `distanceKm` | `number` | | 距离(公里) | |     `durationMinutes` | `int` | | 时长(分钟) | |     `emojiIcon` | `string` | | 表情图标 | |     `extraData` | `string` | | 扩展数据(JSON格式) | |     `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |     `images` | `string[]` | | 节点图片列表 | |     `latitude` | `number` | | 纬度 | |     `longitude` | `number` | | 经度 | |     `nodeId` | `string` | | 节点ID | |     `nodeName` | `string` | | 节点名称 | |     `nodeType` | `string` | | 节点类型:SCENIC/HOTEL/RESTAURANT/ACTIVITY/VEHICLE/SERVICE/FREE/NOTE | |     `quantity` | `int` | | 数量 | |     `resourceDetail` | `资源详情` | | 绑定资源的详细信息(含图片、地址等) | |     `resourceId` | `string` | | 关联资源ID | |     `resourceName` | `string` | | 关联资源名称 | |     `resourceType` | `string` | | 关联资源类型:SCENIC_SPOT/HOTEL/RESTAURANT/ACTIVITY/VEHICLE/SERVICE | |     `sortOrder` | `int` | | 排序序号 | |     `startTime` | `string` | | 开始时间 | |   `restaurants` | `用餐选项VO[]` | | 当日用餐列表 | |     `coverUrl` | `string` | | 餐食封面图URL | |     `dayNumber` | `int` | | 天数编号 | |     `id` | `string` | | 记录ID | |     `mealTypes` | `string` | | 餐次:早餐/午餐/晚餐 | |     `priceInfo` | `string` | | 价格信息 | |     `quantity` | `int` | | 数量 | |     `restaurantId` | `string` | | 餐厅ID | |     `restaurantName` | `string` | | 餐厅/餐食名称 | |     `sortOrder` | `int` | | 排序序号 | |     `unitPrice` | `number` | | 餐食单价(元) | |   `routeSummary` | `string` | | 路线概览 | | `message` | `string` | | 响应消息 | --- ### `GET` /admin/product/item/{productId}/day/{dayNumber}/dining **获取某天的餐厅推荐列表** 获取指定天的所有餐饮推荐,包含餐厅名称、用餐类型、描述等信息。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `dayNumber` | `integer` | | 天数编号 | | `productId` | `integer` | | 产品ID | **响应** `统一响应结果«List«用餐选项VO»»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `用餐选项VO[]` | | 响应数据 | |   `coverUrl` | `string` | | 餐食封面图URL | |   `dayNumber` | `int` | | 天数编号 | |   `id` | `string` | | 记录ID | |   `mealTypes` | `string` | | 餐次:早餐/午餐/晚餐 | |   `priceInfo` | `string` | | 价格信息 | |   `quantity` | `int` | | 数量 | |   `restaurantId` | `string` | | 餐厅ID | |   `restaurantName` | `string` | | 餐厅/餐食名称 | |   `sortOrder` | `int` | | 排序序号 | |   `unitPrice` | `number` | | 餐食单价(元) | | `message` | `string` | | 响应消息 | --- ### `POST` /admin/product/item/{productId}/day/{dayNumber}/dining **添加每日餐厅推荐** 为指定天添加餐饮推荐,关联资源服务中的餐厅。 用于展示当天的用餐安排,可按早/午/晚分类。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `dayNumber` | `integer` | | 天数编号 | | `productId` | `integer` | | 产品ID | **请求体** `用餐选项请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `coverUrl` | `string` | | 餐食封面图URL | | `mealTypes` | `string` | | 餐次:早餐/午餐/晚餐 | | `priceInfo` | `string` | | 价格信息 | | `quantity` | `int` | | 数量 | | `restaurantId` | `string` | | 餐厅ID(GROUP产品可不传) | | `restaurantName` | `string` | | 餐厅/餐食名称 | | `sortOrder` | `int` | | 排序序号 | | `unitPrice` | `number` | | 餐食单价(元,GROUP产品用于成本计算) | **响应** `统一响应结果«用餐选项VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `用餐选项VO` | | 响应数据 | |   `coverUrl` | `string` | | 餐食封面图URL | |   `dayNumber` | `int` | | 天数编号 | |   `id` | `string` | | 记录ID | |   `mealTypes` | `string` | | 餐次:早餐/午餐/晚餐 | |   `priceInfo` | `string` | | 价格信息 | |   `quantity` | `int` | | 数量 | |   `restaurantId` | `string` | | 餐厅ID | |   `restaurantName` | `string` | | 餐厅/餐食名称 | |   `sortOrder` | `int` | | 排序序号 | |   `unitPrice` | `number` | | 餐食单价(元) | | `message` | `string` | | 响应消息 | --- ### `POST` /admin/product/item/{productId}/day/{dayNumber}/hotel **添加每日住宿** 为指定天添加住宿安排,关联资源服务中的酒店和房型。 每天可以有多个住宿选项(如不同档次),参与成本自动计算。 住宿费用会体现在价格日历的成本计算中。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `dayNumber` | `integer` | | 天数编号 | | `productId` | `integer` | | 产品ID | **请求体** `每日酒店配置请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `coverUrl` | `string` | | 封面图URL | | `familyIds` | `string[]` | | 所属家庭ID列表(定制产品,不传=所有家庭共享) | | `familyRoomConfig` | `object` | | 家庭房间分配(定制产品):{familyId: roomCount},如 {"123": 2, "456": 1} | | `hotelId` | `string` | 是 | 酒店ID | | `hotelName` | `string` | | 酒店名称 | | `isDefault` | `boolean` | | 是否默认酒店 | | `roomCount` | `int` | | 房间数量 | | `roomTypeId` | `string` | | 关联房型ID(定制产品必填,核心产品为空) | | `roomTypeName` | `string` | | 房型名称 | | `sortOrder` | `int` | | 排序序号 | **响应** `统一响应结果«每日酒店VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `每日酒店VO` | | 响应数据 | |   `coverUrl` | `string` | | 封面图URL | |   `dayNumber` | `int` | | 天数编号 | |   `familyIds` | `string[]` | | 所属家庭ID列表(NULL=所有家庭共享) | |   `familyRoomConfig` | `object` | | 家庭房间分配:{familyId: roomCount} | |   `hotelId` | `string` | | 酒店ID | |   `hotelName` | `string` | | 酒店名称 | |   `id` | `string` | | 记录ID | |   `isDefault` | `boolean` | | 是否默认酒店 | |   `roomCount` | `int` | | 房间数量 | |   `roomTypeId` | `string` | | 房型ID | |   `roomTypeName` | `string` | | 房型名称 | |   `sortOrder` | `int` | | 排序序号 | | `message` | `string` | | 响应消息 | --- ### `GET` /admin/product/item/{productId}/day/{dayNumber}/hotels **获取某天的住宿列表** 获取指定天的所有住宿安排,包含酒店名称、房型、数量等信息。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `dayNumber` | `integer` | | 天数编号 | | `productId` | `integer` | | 产品ID | **响应** `统一响应结果«List«每日酒店VO»»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `每日酒店VO[]` | | 响应数据 | |   `coverUrl` | `string` | | 封面图URL | |   `dayNumber` | `int` | | 天数编号 | |   `familyIds` | `string[]` | | 所属家庭ID列表(NULL=所有家庭共享) | |   `familyRoomConfig` | `object` | | 家庭房间分配:{familyId: roomCount} | |   `hotelId` | `string` | | 酒店ID | |   `hotelName` | `string` | | 酒店名称 | |   `id` | `string` | | 记录ID | |   `isDefault` | `boolean` | | 是否默认酒店 | |   `roomCount` | `int` | | 房间数量 | |   `roomTypeId` | `string` | | 房型ID | |   `roomTypeName` | `string` | | 房型名称 | |   `sortOrder` | `int` | | 排序序号 | | `message` | `string` | | 响应消息 | --- ### `POST` /admin/product/item/{productId}/day/{dayNumber}/node **添加行程节点** 在指定天添加一个行程节点。节点是行程的最小单元,可关联资源服务中的景区、酒店、活动等。 **节点类型**:TRANSPORT(交通)/SCENIC(景区)/DINING(餐饮)/ACTIVITY(活动)/PHOTOGRAPHY(摄影)/HOTEL(酒店)/FREE(自由活动)/CUSTOM(自定义) **CUSTOM 定制产品特有**:可通过 familyIds 指定节点所属的家庭分组,实现按家庭分配行程。 新建节点自动追加到当天最后位置,可通过排序接口调整顺序。 **关联字典**: - city(城市,资源面板筛选用):用于在添加节点时按城市筛选可选资源 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `dayNumber` | `integer` | | 天数编号 | | `productId` | `integer` | | 产品ID | **请求体** `创建行程节点请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `description` | `string` | | 节点描述 | | `distanceKm` | `number` | | 距离(公里) | | `durationMinutes` | `int` | | 时长(分钟) | | `emojiIcon` | `string` | | 表情图标 | | `extraData` | `string` | | 扩展数据(JSON格式) | | `familyIds` | `string[]` | | 所属家庭ID列表(仅CUSTOM定制产品使用,实现按家庭分配行程节点) | | `images` | `string[]` | | 节点图片列表 | | `latitude` | `number` | | 纬度 | | `longitude` | `number` | | 经度 | | `nodeName` | `string` | 是 | 节点名称 | | `nodeType` | `string` | 是 | 节点类型:TRANSPORT(交通)/SCENIC(景区)/DINING(餐饮)/ACTIVITY(活动)/PHOTOGRAPHY(摄影)/HOTEL(酒店)/FREE(自由活动)/CUSTOM(自定义) | | `quantity` | `int` | | 数量 | | `resourceId` | `string` | | 关联资源ID(来自资源服务,关联后节点名称和图片可自动同步) | | `resourceType` | `string` | | 关联资源类型(关联后可从资源服务获取价格参与成本计算):SCENIC/HOTEL/RESTAURANT/ACTIVITY/VEHICLE/SERVICE | | `startTime` | `string` | | 开始时间 | **响应** `统一响应结果«行程节点VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `行程节点VO` | | 响应数据 | |   `costPrice` | `number` | | 资源成本价(来自资源价格日历) | |   `dayId` | `string` | | 所属行程天ID | |   `description` | `string` | | 节点描述 | |   `distanceKm` | `number` | | 距离(公里) | |   `durationMinutes` | `int` | | 时长(分钟) | |   `emojiIcon` | `string` | | 表情图标 | |   `extraData` | `string` | | 扩展数据(JSON格式) | |   `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |   `images` | `string[]` | | 节点图片列表 | |   `latitude` | `number` | | 纬度 | |   `longitude` | `number` | | 经度 | |   `nodeId` | `string` | | 节点ID | |   `nodeName` | `string` | | 节点名称 | |   `nodeType` | `string` | | 节点类型:SCENIC/HOTEL/RESTAURANT/ACTIVITY/VEHICLE/SERVICE/FREE/NOTE | |   `quantity` | `int` | | 数量 | |   `resourceDetail` | `资源详情` | | 绑定资源的详细信息(含图片、地址等) | |     `address` | `string` | | 地址 | |     `city` | `string` | | 所在城市 | |     `cover` | `string` | | 封面图URL | |     `description` | `string` | | 简介/描述 | |     `featureIntro` | `string` | | 图文详情(featureIntro JSON) | |     `images` | `string[]` | | 图片URL列表(轮播图) | |     `latitude` | `number` | | 纬度 | |     `longitude` | `number` | | 经度 | |     `name` | `string` | | 资源名称 | |     `rating` | `number` | | 评分 | |     `resourceId` | `string` | | 资源ID | |     `resourceType` | `string` | | 资源类型: SCENIC_SPOT/HOTEL/RESTAURANT/ACTIVITY | |     `subtitle` | `string` | | 副标题 | |     `tags` | `string[]` | | 标签列表 | |   `resourceId` | `string` | | 关联资源ID | |   `resourceName` | `string` | | 关联资源名称 | |   `resourceType` | `string` | | 关联资源类型:SCENIC_SPOT/HOTEL/RESTAURANT/ACTIVITY/VEHICLE/SERVICE | |   `sortOrder` | `int` | | 排序序号 | |   `startTime` | `string` | | 开始时间 | | `message` | `string` | | 响应消息 | --- ### `GET` /admin/product/item/{productId}/day/{dayNumber}/nodes **获取某天的节点列表** 获取指定天的所有行程节点,按排序顺序返回。 每个节点包含类型、名称、时间、关联资源信息、图片等完整数据。 **关联字典**: - city(城市):资源面板城市筛选 - cities(城市ID映射):城市名称预览 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `dayNumber` | `integer` | | 天数编号 | | `productId` | `integer` | | 产品ID | **响应** `统一响应结果«List«行程节点VO»»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `行程节点VO[]` | | 响应数据 | |   `costPrice` | `number` | | 资源成本价(来自资源价格日历) | |   `dayId` | `string` | | 所属行程天ID | |   `description` | `string` | | 节点描述 | |   `distanceKm` | `number` | | 距离(公里) | |   `durationMinutes` | `int` | | 时长(分钟) | |   `emojiIcon` | `string` | | 表情图标 | |   `extraData` | `string` | | 扩展数据(JSON格式) | |   `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |   `images` | `string[]` | | 节点图片列表 | |   `latitude` | `number` | | 纬度 | |   `longitude` | `number` | | 经度 | |   `nodeId` | `string` | | 节点ID | |   `nodeName` | `string` | | 节点名称 | |   `nodeType` | `string` | | 节点类型:SCENIC/HOTEL/RESTAURANT/ACTIVITY/VEHICLE/SERVICE/FREE/NOTE | |   `quantity` | `int` | | 数量 | |   `resourceDetail` | `资源详情` | | 绑定资源的详细信息(含图片、地址等) | |     `address` | `string` | | 地址 | |     `city` | `string` | | 所在城市 | |     `cover` | `string` | | 封面图URL | |     `description` | `string` | | 简介/描述 | |     `featureIntro` | `string` | | 图文详情(featureIntro JSON) | |     `images` | `string[]` | | 图片URL列表(轮播图) | |     `latitude` | `number` | | 纬度 | |     `longitude` | `number` | | 经度 | |     `name` | `string` | | 资源名称 | |     `rating` | `number` | | 评分 | |     `resourceId` | `string` | | 资源ID | |     `resourceType` | `string` | | 资源类型: SCENIC_SPOT/HOTEL/RESTAURANT/ACTIVITY | |     `subtitle` | `string` | | 副标题 | |     `tags` | `string[]` | | 标签列表 | |   `resourceId` | `string` | | 关联资源ID | |   `resourceName` | `string` | | 关联资源名称 | |   `resourceType` | `string` | | 关联资源类型:SCENIC_SPOT/HOTEL/RESTAURANT/ACTIVITY/VEHICLE/SERVICE | |   `sortOrder` | `int` | | 排序序号 | |   `startTime` | `string` | | 开始时间 | | `message` | `string` | | 响应消息 | --- ### `PUT` /admin/product/item/{productId}/day/{dayNumber}/nodes/sort **行程节点拖拽排序** 重新排列指定天的所有行程节点顺序。前端拖拽排序后,将新的节点ID顺序全量提交。 nodeIds 列表中的顺序即为新的排序顺序(从上到下)。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `dayNumber` | `integer` | | 天数编号 | | `productId` | `integer` | | 产品ID | **请求体** `节点排序请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `nodeIds` | `string[]` | 是 | 节点ID有序列表,按期望排序顺序排列 | **响应** `统一响应结果«Void»` --- ### `GET` /admin/product/item/{productId}/days **获取行程天列表** 获取产品所有行程天的信息,按 dayNumber 升序排列。 每一天包含当天主题、概述等信息,不包含节点详情(节点通过单独接口获取)。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **响应** `统一响应结果«List«行程天VO»»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `行程天VO[]` | | 响应数据 | |   `dayId` | `string` | | 行程天ID | |   `dayNumber` | `int` | | 天数编号 | |   `dayTitle` | `string` | | 天标题 | |   `hotels` | `每日酒店VO[]` | | 当日酒店列表 | |     `coverUrl` | `string` | | 封面图URL | |     `dayNumber` | `int` | | 天数编号 | |     `familyIds` | `string[]` | | 所属家庭ID列表(NULL=所有家庭共享) | |     `familyRoomConfig` | `object` | | 家庭房间分配:{familyId: roomCount} | |     `hotelId` | `string` | | 酒店ID | |     `hotelName` | `string` | | 酒店名称 | |     `id` | `string` | | 记录ID | |     `isDefault` | `boolean` | | 是否默认酒店 | |     `roomCount` | `int` | | 房间数量 | |     `roomTypeId` | `string` | | 房型ID | |     `roomTypeName` | `string` | | 房型名称 | |     `sortOrder` | `int` | | 排序序号 | |   `nodes` | `行程节点VO[]` | | 行程节点列表 | |     `costPrice` | `number` | | 资源成本价(来自资源价格日历) | |     `dayId` | `string` | | 所属行程天ID | |     `description` | `string` | | 节点描述 | |     `distanceKm` | `number` | | 距离(公里) | |     `durationMinutes` | `int` | | 时长(分钟) | |     `emojiIcon` | `string` | | 表情图标 | |     `extraData` | `string` | | 扩展数据(JSON格式) | |     `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |     `images` | `string[]` | | 节点图片列表 | |     `latitude` | `number` | | 纬度 | |     `longitude` | `number` | | 经度 | |     `nodeId` | `string` | | 节点ID | |     `nodeName` | `string` | | 节点名称 | |     `nodeType` | `string` | | 节点类型:SCENIC/HOTEL/RESTAURANT/ACTIVITY/VEHICLE/SERVICE/FREE/NOTE | |     `quantity` | `int` | | 数量 | |     `resourceDetail` | `资源详情` | | 绑定资源的详细信息(含图片、地址等) | |     `resourceId` | `string` | | 关联资源ID | |     `resourceName` | `string` | | 关联资源名称 | |     `resourceType` | `string` | | 关联资源类型:SCENIC_SPOT/HOTEL/RESTAURANT/ACTIVITY/VEHICLE/SERVICE | |     `sortOrder` | `int` | | 排序序号 | |     `startTime` | `string` | | 开始时间 | |   `restaurants` | `用餐选项VO[]` | | 当日用餐列表 | |     `coverUrl` | `string` | | 餐食封面图URL | |     `dayNumber` | `int` | | 天数编号 | |     `id` | `string` | | 记录ID | |     `mealTypes` | `string` | | 餐次:早餐/午餐/晚餐 | |     `priceInfo` | `string` | | 价格信息 | |     `quantity` | `int` | | 数量 | |     `restaurantId` | `string` | | 餐厅ID | |     `restaurantName` | `string` | | 餐厅/餐食名称 | |     `sortOrder` | `int` | | 排序序号 | |     `unitPrice` | `number` | | 餐食单价(元) | |   `routeSummary` | `string` | | 路线概览 | | `message` | `string` | | 响应消息 | --- ### `POST` /admin/product/item/{productId}/staff-config **添加人员配置** 为产品添加服务人员配置(如领队、摄影师、司机等),关联资源服务中的人员。 人员配置是产品级别的模板,GROUP 产品的实际人员在团期批次中单独分配。 人员费用参与成本自动计算。 **关联字典**: - staff_type(人员类型):GUIDE=领队, DRIVER=司机, PHOTOGRAPHER=摄影师, ASSISTANT=助理, OTHER=其他 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **请求体** `人员配置请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | | `quantity` | `int` | 是 | 数量 | | `sortOrder` | `int` | | 排序序号 | | `staffType` | `string` | 是 | 人员类型:GUIDE/GUIDE_ASSISTANT/PHOTOGRAPHER/LEADER/OTHER | **响应** `统一响应结果«产品人员配置VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品人员配置VO` | | 响应数据 | |   `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |   `id` | `string` | | 记录ID | |   `quantity` | `int` | | 数量 | |   `sortOrder` | `int` | | 排序序号 | |   `staffType` | `string` | | 人员类型:GUIDE/GUIDE_ASSISTANT/PHOTOGRAPHER/LEADER/OTHER | |   `staffTypeName` | `string` | | 人员类型名称 | | `message` | `string` | | 响应消息 | --- ### `GET` /admin/product/item/{productId}/staff-configs **获取产品人员配置列表** **关联字典**: - staff_type(人员类型):GUIDE=领队, DRIVER=司机, PHOTOGRAPHER=摄影师, ASSISTANT=助理, OTHER=其他 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **响应** `统一响应结果«List«产品人员配置VO»»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品人员配置VO[]` | | 响应数据 | |   `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |   `id` | `string` | | 记录ID | |   `quantity` | `int` | | 数量 | |   `sortOrder` | `int` | | 排序序号 | |   `staffType` | `string` | | 人员类型:GUIDE/GUIDE_ASSISTANT/PHOTOGRAPHER/LEADER/OTHER | |   `staffTypeName` | `string` | | 人员类型名称 | | `message` | `string` | | 响应消息 | --- ### `GET` /admin/product/item/{productId}/supplies **获取产品物资列表** 获取产品关联的所有物资配品,包含物资名称、数量、单价等信息。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **响应** `统一响应结果«List«产品物资VO»»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品物资VO[]` | | 响应数据 | |   `billingType` | `string` | | 计费方式:BY_PERSON=按人头 BY_COUNT=按次/按件 | |   `costPerPerson` | `number` | | 每人成本 | |   `coverUrl` | `string` | | 封面图URL | |   `dayNumber` | `int` | | 天数编号(scope=DAY时生效) | |   `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |   `id` | `string` | | 记录ID | |   `quantity` | `int` | | 数量 | |   `scope` | `string` | | 适用范围:ALL=整个行程 DAY=指定天 | |   `sortOrder` | `int` | | 排序序号 | |   `suppliesId` | `string` | | 物资ID | |   `suppliesName` | `string` | | 物资名称 | | `message` | `string` | | 响应消息 | --- ### `POST` /admin/product/item/{productId}/supplies **添加物资配品** 为产品添加物资配品(如帐篷、睡袋、登山杖等),关联资源服务中的物资。 物资配品是产品级别的,不区分具体哪一天,参与成本计算。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `productId` | `integer` | | 产品ID | **请求体** `物资配置请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `billingType` | `string` | | 计费方式:BY_PERSON=按人头 BY_COUNT=按次/按件 | | `costPerPerson` | `number` | | 每人成本 | | `coverUrl` | `string` | | 封面图URL | | `dayNumber` | `int` | | 天数编号(scope=DAY时生效) | | `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | | `quantity` | `int` | | 数量 | | `scope` | `string` | | 适用范围:ALL=整个行程 DAY=指定天 | | `sortOrder` | `int` | | 排序序号 | | `suppliesId` | `string` | 是 | 物资ID | | `suppliesName` | `string` | | 物资名称 | **响应** `统一响应结果«产品物资VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品物资VO` | | 响应数据 | |   `billingType` | `string` | | 计费方式:BY_PERSON=按人头 BY_COUNT=按次/按件 | |   `costPerPerson` | `number` | | 每人成本 | |   `coverUrl` | `string` | | 封面图URL | |   `dayNumber` | `int` | | 天数编号(scope=DAY时生效) | |   `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |   `id` | `string` | | 记录ID | |   `quantity` | `int` | | 数量 | |   `scope` | `string` | | 适用范围:ALL=整个行程 DAY=指定天 | |   `sortOrder` | `int` | | 排序序号 | |   `suppliesId` | `string` | | 物资ID | |   `suppliesName` | `string` | | 物资名称 | | `message` | `string` | | 响应消息 | --- ### `PUT` /admin/product/node/{nodeId} **更新行程节点** 更新行程节点信息,仅传入需要修改的字段。 可修改节点名称、时间、关联资源、图片、描述等。 **关联字典**: - city(城市):资源面板城市筛选 - cities(城市ID映射):城市名称预览 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `nodeId` | `integer` | | 行程节点ID | **请求体** `更新行程节点请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `description` | `string` | | 节点描述 | | `distanceKm` | `number` | | 距离(公里) | | `durationMinutes` | `int` | | 时长(分钟) | | `emojiIcon` | `string` | | 表情图标 | | `extraData` | `string` | | 扩展数据(JSON格式) | | `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | | `images` | `string[]` | | 节点图片列表 | | `latitude` | `number` | | 纬度 | | `longitude` | `number` | | 经度 | | `nodeName` | `string` | | 节点名称 | | `nodeType` | `string` | | 节点类型:TRANSPORT(交通)/SCENIC(景区)/DINING(餐饮)/ACTIVITY(活动)/PHOTOGRAPHY(摄影)/HOTEL(酒店)/FREE(自由活动)/CUSTOM(自定义) | | `quantity` | `int` | | 数量 | | `resourceId` | `string` | | 关联资源ID | | `resourceType` | `string` | | 关联资源类型:SCENIC_SPOT/HOTEL/RESTAURANT/ACTIVITY/VEHICLE/SERVICE | | `startTime` | `string` | | 开始时间 | **响应** `统一响应结果«行程节点VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `行程节点VO` | | 响应数据 | |   `costPrice` | `number` | | 资源成本价(来自资源价格日历) | |   `dayId` | `string` | | 所属行程天ID | |   `description` | `string` | | 节点描述 | |   `distanceKm` | `number` | | 距离(公里) | |   `durationMinutes` | `int` | | 时长(分钟) | |   `emojiIcon` | `string` | | 表情图标 | |   `extraData` | `string` | | 扩展数据(JSON格式) | |   `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |   `images` | `string[]` | | 节点图片列表 | |   `latitude` | `number` | | 纬度 | |   `longitude` | `number` | | 经度 | |   `nodeId` | `string` | | 节点ID | |   `nodeName` | `string` | | 节点名称 | |   `nodeType` | `string` | | 节点类型:SCENIC/HOTEL/RESTAURANT/ACTIVITY/VEHICLE/SERVICE/FREE/NOTE | |   `quantity` | `int` | | 数量 | |   `resourceDetail` | `资源详情` | | 绑定资源的详细信息(含图片、地址等) | |     `address` | `string` | | 地址 | |     `city` | `string` | | 所在城市 | |     `cover` | `string` | | 封面图URL | |     `description` | `string` | | 简介/描述 | |     `featureIntro` | `string` | | 图文详情(featureIntro JSON) | |     `images` | `string[]` | | 图片URL列表(轮播图) | |     `latitude` | `number` | | 纬度 | |     `longitude` | `number` | | 经度 | |     `name` | `string` | | 资源名称 | |     `rating` | `number` | | 评分 | |     `resourceId` | `string` | | 资源ID | |     `resourceType` | `string` | | 资源类型: SCENIC_SPOT/HOTEL/RESTAURANT/ACTIVITY | |     `subtitle` | `string` | | 副标题 | |     `tags` | `string[]` | | 标签列表 | |   `resourceId` | `string` | | 关联资源ID | |   `resourceName` | `string` | | 关联资源名称 | |   `resourceType` | `string` | | 关联资源类型:SCENIC_SPOT/HOTEL/RESTAURANT/ACTIVITY/VEHICLE/SERVICE | |   `sortOrder` | `int` | | 排序序号 | |   `startTime` | `string` | | 开始时间 | | `message` | `string` | | 响应消息 | --- ### `DELETE` /admin/product/node/{nodeId} **删除行程节点** 删除指定行程节点,同天其他节点的排序自动调整。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `nodeId` | `integer` | | 行程节点ID | **响应** `统一响应结果«Void»` --- ### `POST` /admin/product/node/{nodeId}/copy **复制行程节点** 复制指定节点到同一天的末尾位置,包括节点的所有属性(名称、资源关联、图片等)。 适用场景:同一天有相似的行程安排时快速复制。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `nodeId` | `integer` | | 行程节点ID | **响应** `统一响应结果«行程节点VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `行程节点VO` | | 响应数据 | |   `costPrice` | `number` | | 资源成本价(来自资源价格日历) | |   `dayId` | `string` | | 所属行程天ID | |   `description` | `string` | | 节点描述 | |   `distanceKm` | `number` | | 距离(公里) | |   `durationMinutes` | `int` | | 时长(分钟) | |   `emojiIcon` | `string` | | 表情图标 | |   `extraData` | `string` | | 扩展数据(JSON格式) | |   `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |   `images` | `string[]` | | 节点图片列表 | |   `latitude` | `number` | | 纬度 | |   `longitude` | `number` | | 经度 | |   `nodeId` | `string` | | 节点ID | |   `nodeName` | `string` | | 节点名称 | |   `nodeType` | `string` | | 节点类型:SCENIC/HOTEL/RESTAURANT/ACTIVITY/VEHICLE/SERVICE/FREE/NOTE | |   `quantity` | `int` | | 数量 | |   `resourceDetail` | `资源详情` | | 绑定资源的详细信息(含图片、地址等) | |     `address` | `string` | | 地址 | |     `city` | `string` | | 所在城市 | |     `cover` | `string` | | 封面图URL | |     `description` | `string` | | 简介/描述 | |     `featureIntro` | `string` | | 图文详情(featureIntro JSON) | |     `images` | `string[]` | | 图片URL列表(轮播图) | |     `latitude` | `number` | | 纬度 | |     `longitude` | `number` | | 经度 | |     `name` | `string` | | 资源名称 | |     `rating` | `number` | | 评分 | |     `resourceId` | `string` | | 资源ID | |     `resourceType` | `string` | | 资源类型: SCENIC_SPOT/HOTEL/RESTAURANT/ACTIVITY | |     `subtitle` | `string` | | 副标题 | |     `tags` | `string[]` | | 标签列表 | |   `resourceId` | `string` | | 关联资源ID | |   `resourceName` | `string` | | 关联资源名称 | |   `resourceType` | `string` | | 关联资源类型:SCENIC_SPOT/HOTEL/RESTAURANT/ACTIVITY/VEHICLE/SERVICE | |   `sortOrder` | `int` | | 排序序号 | |   `startTime` | `string` | | 开始时间 | | `message` | `string` | | 响应消息 | --- ### `PUT` /admin/product/node/{nodeId}/move **移动行程节点到其他天** 将节点从当前天移动到目标天的末尾位置。 移动后原天和目标天的节点排序自动调整。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `nodeId` | `integer` | | 行程节点ID | **请求体** `节点移动请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `targetDayNumber` | `int` | 是 | 目标天数编号 | **响应** `统一响应结果«行程节点VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `行程节点VO` | | 响应数据 | |   `costPrice` | `number` | | 资源成本价(来自资源价格日历) | |   `dayId` | `string` | | 所属行程天ID | |   `description` | `string` | | 节点描述 | |   `distanceKm` | `number` | | 距离(公里) | |   `durationMinutes` | `int` | | 时长(分钟) | |   `emojiIcon` | `string` | | 表情图标 | |   `extraData` | `string` | | 扩展数据(JSON格式) | |   `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |   `images` | `string[]` | | 节点图片列表 | |   `latitude` | `number` | | 纬度 | |   `longitude` | `number` | | 经度 | |   `nodeId` | `string` | | 节点ID | |   `nodeName` | `string` | | 节点名称 | |   `nodeType` | `string` | | 节点类型:SCENIC/HOTEL/RESTAURANT/ACTIVITY/VEHICLE/SERVICE/FREE/NOTE | |   `quantity` | `int` | | 数量 | |   `resourceDetail` | `资源详情` | | 绑定资源的详细信息(含图片、地址等) | |     `address` | `string` | | 地址 | |     `city` | `string` | | 所在城市 | |     `cover` | `string` | | 封面图URL | |     `description` | `string` | | 简介/描述 | |     `featureIntro` | `string` | | 图文详情(featureIntro JSON) | |     `images` | `string[]` | | 图片URL列表(轮播图) | |     `latitude` | `number` | | 纬度 | |     `longitude` | `number` | | 经度 | |     `name` | `string` | | 资源名称 | |     `rating` | `number` | | 评分 | |     `resourceId` | `string` | | 资源ID | |     `resourceType` | `string` | | 资源类型: SCENIC_SPOT/HOTEL/RESTAURANT/ACTIVITY | |     `subtitle` | `string` | | 副标题 | |     `tags` | `string[]` | | 标签列表 | |   `resourceId` | `string` | | 关联资源ID | |   `resourceName` | `string` | | 关联资源名称 | |   `resourceType` | `string` | | 关联资源类型:SCENIC_SPOT/HOTEL/RESTAURANT/ACTIVITY/VEHICLE/SERVICE | |   `sortOrder` | `int` | | 排序序号 | |   `startTime` | `string` | | 开始时间 | | `message` | `string` | | 响应消息 | --- ### `PUT` /admin/product/staff-config/{id} **更新人员配置** **关联字典**: - staff_type(人员类型):GUIDE=领队, DRIVER=司机, PHOTOGRAPHER=摄影师, ASSISTANT=助理, OTHER=其他 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `id` | `integer` | | 人员配置ID | **请求体** `人员配置请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | | `quantity` | `int` | 是 | 数量 | | `sortOrder` | `int` | | 排序序号 | | `staffType` | `string` | 是 | 人员类型:GUIDE/GUIDE_ASSISTANT/PHOTOGRAPHER/LEADER/OTHER | **响应** `统一响应结果«产品人员配置VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品人员配置VO` | | 响应数据 | |   `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |   `id` | `string` | | 记录ID | |   `quantity` | `int` | | 数量 | |   `sortOrder` | `int` | | 排序序号 | |   `staffType` | `string` | | 人员类型:GUIDE/GUIDE_ASSISTANT/PHOTOGRAPHER/LEADER/OTHER | |   `staffTypeName` | `string` | | 人员类型名称 | | `message` | `string` | | 响应消息 | --- ### `DELETE` /admin/product/staff-config/{id} **删除人员配置** 删除指定的人员配置记录。删除后该人员费用不再计入成本。 **关联字典**: - staff_type(人员类型):GUIDE=领队, DRIVER=司机, PHOTOGRAPHER=摄影师, ASSISTANT=助理, OTHER=其他 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `id` | `integer` | | 人员配置ID | **响应** `统一响应结果«Void»` --- ### `PUT` /admin/product/supplies/{id} **更新物资配品** 更新物资配品的关联物资、数量等信息。修改后会影响成本自动计算结果。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `id` | `integer` | | 物资配品ID | **请求体** `物资配置请求` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `billingType` | `string` | | 计费方式:BY_PERSON=按人头 BY_COUNT=按次/按件 | | `costPerPerson` | `number` | | 每人成本 | | `coverUrl` | `string` | | 封面图URL | | `dayNumber` | `int` | | 天数编号(scope=DAY时生效) | | `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | | `quantity` | `int` | | 数量 | | `scope` | `string` | | 适用范围:ALL=整个行程 DAY=指定天 | | `sortOrder` | `int` | | 排序序号 | | `suppliesId` | `string` | 是 | 物资ID | | `suppliesName` | `string` | | 物资名称 | **响应** `统一响应结果«产品物资VO»` | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `code` | `int` | | 状态码 | | `data` | `产品物资VO` | | 响应数据 | |   `billingType` | `string` | | 计费方式:BY_PERSON=按人头 BY_COUNT=按次/按件 | |   `costPerPerson` | `number` | | 每人成本 | |   `coverUrl` | `string` | | 封面图URL | |   `dayNumber` | `int` | | 天数编号(scope=DAY时生效) | |   `familyIds` | `string[]` | | 所属家庭ID列表(定制产品按家庭分配) | |   `id` | `string` | | 记录ID | |   `quantity` | `int` | | 数量 | |   `scope` | `string` | | 适用范围:ALL=整个行程 DAY=指定天 | |   `sortOrder` | `int` | | 排序序号 | |   `suppliesId` | `string` | | 物资ID | |   `suppliesName` | `string` | | 物资名称 | | `message` | `string` | | 响应消息 | --- ### `DELETE` /admin/product/supplies/{id} **删除物资配品** 删除指定的物资配品记录。删除后该物资费用不再计入成本。 **路径参数** | 参数 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `id` | `integer` | | 物资配品ID | **响应** `统一响应结果«Void»` ---