# 接口变更记录 — 2026-03-19 15:46

> **提交** `06a925b` · **作者** wx · **时间** 2026-03-19 15:46:08 +0800
>
> feat: 小程序产品详情返回退款政策完整内容（含退款规则）

## 变更总览

- **订单服务**
  - InternalRefund (+1)

---

## 订单服务

### InternalRefund

> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 标签 **「【内部接口】退款（Feign调用）」**

### 🆕 `GET` /internal/order/refund-policy/batch — 批量获取退款政策详情

> 根据政策ID列表批量获取退款政策详情（含退款规则）。

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

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `policyId` | `Long` | 政策ID |
| `policyName` | `String` | 政策名称 |
| `refundType` | `String` | 退款类型（字典：refund_type）DEPOSIT(定金)/BALANCE(尾款)/FULL(全款) |
| `isDefault` | `Boolean` | 是否为默认政策 |
| `enabled` | `Boolean` | 是否启用 |
| `remark` | `String` | 备注 |
| `createdBy` | `Long` | 创建人ID |
| `createTime` | `LocalDateTime` | 创建时间 |
| `updateTime` | `LocalDateTime` | 更新时间 |
| `rules` | `List<RuleVO>` | 退款规则列表 |
| `ruleId` | `Long` | 规则ID |
| `minDays` | `Integer` | 距出发最少天数 |
| `refundRatio` | `Integer` | 退款比例（百分比） |

**关联字典**

- `refund_type`（退款类型）：FULL=全款, DEPOSIT=定金, BALANCE=尾款

---

## 📦 其他数据对象变更

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

### 小程序聚合服务

#### ✏️ MpCustomProductDetailVO

  - 🆕 `productNo` (`String`) — 产品编号
  - 🆕 `seasons` (`List<String>`) — 适用季节列表(编码)
  - 🆕 `seasonLabels` (`List<String>`) — 适用季节列表(中文)
  - 🆕 `isBooking` (`Boolean`) — 是否预约产品
  - 🆕 `minAdultPerOrder` (`Integer`) — 每单最少成人数(null=默认1)
  - 🆕 `maxAdultPerOrder` (`Integer`) — 每单最大成人数(null=不限)
  - 🆕 `maxChildPerOrder` (`Integer`) — 每单最大儿童数(null=不限)
  - 🆕 `carouselVideoUrl` (`String`) — 轮播视频URL
  - 🆕 `folderId` (`String`) — 所属文件夹ID
  - 🆕 `lineId` (`String`) — 产品线ID
  - 🆕 `lineName` (`String`) — 产品线名称
  - 🆕 `groupChatQrUrl` (`String`) — 群聊二维码URL
  - 🆕 `chatMessages` (`List<ChatMessageItem>`) — 群聊消息列表
  - 🆕 `showReview` (`Boolean`) — 是否显示评价
  - 🆕 `showChatGroup` (`Boolean`) — 是否显示群聊入口
  - 🆕 `showTripTime` (`Boolean`) — 是否显示行程时间
  - 🆕 `showTripDistance` (`Boolean`) — 是否显示行程距离
  - 🆕 `bookingTermsId` (`String`) — 预订条款ID
  - 🆕 `bookingTermsName` (`String`) — 预订条款名称
  - 🆕 `bookingTermsContent` (`String`) — 预订条款内容
  - 🆕 `refundPolicyIds` (`Map<String, String>`) — 退款政策映射（按退款类型绑定不同政策）。key=退款类型(FULL/DEPOSIT/BALANCE), value=政策ID
  - 🆕 `refundPolicies` (`Map<String, Object>`) — 退款政策详情（按退款类型分组）。key=退款类型(FULL/DEPOSIT/BALANCE)，value=政策详情(含policyName、rules等)
  - 🆕 `warmTipsId` (`String`) — 温馨提示ID
  - 🆕 `warmTipsName` (`String`) — 温馨提示名称
  - 🆕 `warmTipsContent` (`String`) — 温馨提示内容
  - 🆕 `customizerId` (`String`) — 定制师ID
  - 🆕 `customerName` (`String`) — 客户姓名（定制产品）
  - 🆕 `contactPhone` (`String`) — 联系电话（定制产品）
  - 🆕 `departureDate` (`LocalDate`) — 出发日期（定制产品）
  - 🆕 `publishedAt` (`LocalDateTime`) — 发布时间
  - 🆕 `teamExperienceYears` (`Integer`) — 团队经验年数
  - 🆕 `lineSubtitle` (`String`) — 产品线副标题
  - 🆕 `createBy` (`String`) — 创建人ID
  - 🆕 `mchId` (`String`) — 商户号
  - 🆕 `groupRoomId` (`String`) — 企微群聊ID
  - 🆕 `suppliesList` (`List<SuppliesItem>`) — 物资列表
  - 🆕 `benefitsDescription` (`List<BenefitGroupItem>`) — 权益说明（静态，所有产品相同）
  - 🆕 `updateTime` (`LocalDateTime`) — 更新时间
  - 🆕 `dayId` (`String`) — 所属行程天ID
  - 🆕 `dayNumber` (`Integer`) — 天数编号（scope=DAY时生效）
  - 🆕 `dayTitle` (`String`) — 天标题
  - 🆕 `routeSummary` (`String`) — 路线概览
  - 🆕 `nodes` (`List<ItineraryNodeItem>`) — 行程节点列表（含资源详情和图片）
  - 🆕 `hotels` (`List<DayHotelItem>`) — 当日酒店列表
  - 🆕 `restaurants` (`List<DiningOptionItem>`) — 当日用餐列表
  - 🆕 `nodeId` (`String`) — 节点ID
  - 🆕 `nodeType` (`String`) — 节点类型：TRANSPORT/SCENIC/RESTAURANT/ACTIVITY/PHOTOGRAPHY/HOTEL/FREE/CUSTOM/SERVICE/NOTE
  - 🆕 `nodeName` (`String`) — 节点名称
  - 🆕 `startTime` (`String`) — 开始时间
  - 🆕 `durationMinutes` (`Integer`) — 时长（分钟）
  - 🆕 `distanceKm` (`BigDecimal`) — 距离（公里）
  - 🆕 `longitude` (`BigDecimal`) — 经度
  - 🆕 `latitude` (`BigDecimal`) — 纬度
  - 🆕 `resourceType` (`String`) — 关联资源类型：SCENIC/HOTEL/RESTAURANT/ACTIVITY/VEHICLE/SERVICE/STAFF
  - 🆕 `resourceId` (`String`) — 关联资源ID
  - 🆕 `resourceName` (`String`) — 关联资源名称
  - 🆕 `description` (`String`) — 说明，如：含全部景点儿童票
  - 🆕 `images` (`List<String>`) — 节点图片列表
  - 🆕 `emojiIcon` (`String`) — 表情图标
  - 🆕 `extraData` (`String`) — 扩展数据（JSON格式）
  - 🆕 `resourceDetail` (`ResourceDetailDTO`) — 绑定资源的详细信息（含封面图cover、轮播图images、地址address等）
  - 🆕 `costPrice` (`BigDecimal`) — 资源成本价（来自资源价格日历）
  - 🆕 `hotelId` (`String`) — 酒店ID
  - 🆕 `hotelName` (`String`) — 酒店名称
  - 🆕 `coverUrl` (`String`) — 封面图URL
  - 🆕 `roomTypeId` (`String`) — 房型ID
  - 🆕 `roomTypeName` (`String`) — 房型名称
  - 🆕 `roomCount` (`Integer`) — 房间数量
  - 🆕 `isDefault` (`Boolean`) — 是否默认酒店
  - 🆕 `familyRoomConfig` (`Map<String, Integer>`) — 家庭房间分配：{familyId: roomCount}
  - 🆕 `restaurantId` (`String`) — 餐厅ID
  - 🆕 `restaurantName` (`String`) — 餐厅/餐食名称
  - 🆕 `mealTypes` (`String`) — 餐次：早餐/午餐/晚餐
  - 🆕 `priceInfo` (`String`) — 价格信息
  - 🆕 `unitPrice` (`BigDecimal`) — 餐食单价(元)
  - 🆕 `pricingId` (`String`) — 定价配置ID
  - 🆕 `pricingMode` (`String`) — 定价模式：AUTO=自动计算 MANUAL=手动定价 CUSTOM=定制定价
  - 🆕 `profitMode` (`String`) — 利润模式：FIXED=固定金额 PERCENT=百分比
  - 🆕 `profitAmount` (`BigDecimal`) — 利润金额（FIXED模式下使用）
  - 🆕 `markupPercent` (`BigDecimal`) — 加价百分比（PERCENT模式下使用）
  - 🆕 `adultExtraBed` (`BigDecimal`) — 成人加床费
  - 🆕 `insuranceFee` (`BigDecimal`) — 保险费用
  - 🆕 `mealBudget` (`BigDecimal`) — 餐费预算
  - 🆕 `childWithBed` (`BigDecimal`) — 儿童占床价
  - 🆕 `childNoBed` (`BigDecimal`) — 儿童不占床价
  - 🆕 `babyPrice` (`BigDecimal`) — 婴儿价
  - 🆕 `childDiscountPercent` (`BigDecimal`) — 儿童折扣百分比
  - 🆕 `vehicleModelIds` (`List<String>`) — 车型ID列表
  - 🆕 `extraCostPerPerson` (`BigDecimal`) — 每人额外成本
  - 🆕 `singleRoomDiff` (`BigDecimal`) — 单房差
  - 🆕 `companionPrice` (`BigDecimal`) — 陪同人员价格
  - 🆕 `customTotalPrice` (`BigDecimal`) — 定制产品总价（CUSTOM模式下使用）
  - 🆕 `minGroupSize` (`Integer`) — 最小成团人数
  - 🆕 `maxGroupSize` (`Integer`) — 最大成团人数
  - 🆕 `paymentType` (`String`) — 支付方式：FULL=全款 DEPOSIT=定金+尾款
  - 🆕 `depositRatio` (`Integer`) — 定金比例（百分比）
  - 🆕 `depositAmount` (`BigDecimal`) — 定金金额
  - 🆕 `balanceDueDays` (`Integer`) — 尾款支付截止天数（出发前N天）
  - 🆕 `type` (`String`) — 消息类型: user/creator
  - 🆕 `category` (`String`) — 类别，如：门票、住宿、餐饮
  - 🆕 `title` (`String`) — 分组标题，如：儿童权益 (1.2m以下)
  - 🆕 `feeName` (`String`) — 费用项名称
  - 🆕 `feeAmount` (`BigDecimal`) — 费用金额
  - 🆕 `feeUnit` (`String`) — 费用单位
  - 🆕 `suppliesId` (`String`) — 物资ID
  - 🆕 `suppliesName` (`String`) — 物资名称
  - 🆕 `billingType` (`String`) — 计费方式：BY_PERSON=按人头 BY_COUNT=按次/按件
  - 🆕 `scope` (`String`) — 适用范围：ALL=整个行程 DAY=指定天
  - 🆕 `costPerPerson` (`BigDecimal`) — 每人成本
  - 🆕 `items` (`List<BenefitItem>`) — 权益项列表
  - 🆕 `text` (`String`) — 消息内容
  - 🆕 `avatar` (`String`) — 用户头像URL（type=user时有效）
  - ✏️ `destinationCities`: 说明 "途经城市列表" → "途经城市列表（从行程节点资源去重提取）"
  - ✏️ `itineraryDays`: 类型 `List<Object>` → `List<ItineraryDayItem>`, 说明 "行程天列表（包含每天的景点、酒店、餐厅、活动等安排）" → "行程天列表（包含每天的景点、酒店、餐厅、活动等安排，含资源图片）"
  - ✏️ `pricing`: 类型 `Object` → `PricingItem`
  - ✏️ `costItems`: 类型 `List<Object>` → `List<CostItem>`, 说明 "成本项列表" → "成本项列表（费用包含/不含/自理）"
  - ✏️ `customFees`: 类型 `List<Object>` → `List<CustomFeeItem>`
  - ✏️ `staffConfigs`: 说明 "人员配置列表（定制产品专属：导游、领队、摄影师等）" → "人员配置列表（导游、领队、摄影师等）"
  - ✏️ `families`: 说明 "家庭分组列表（定制产品专属：按家庭分配人员和房间）" → "家庭分组列表（按家庭分配人员和房间）"

#### ✏️ MpProductDetailVO

  - 🆕 `refundPolicies` (`Map<String, Object>`) — 退款政策详情（按退款类型分组）。key=退款类型(FULL/DEPOSIT/BALANCE)，value=政策详情(含policyName、rules等)

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

```
M	hl-mp-service/src/main/java/com/hulalv/mp/controller/MpCustomizeController.java
M	hl-mp-service/src/main/java/com/hulalv/mp/feign/MpOrderFeignClient.java
M	hl-mp-service/src/main/java/com/hulalv/mp/feign/MpOrderFeignFallbackFactory.java
M	hl-mp-service/src/main/java/com/hulalv/mp/service/ProductAggregationService.java
M	hl-mp-service/src/main/java/com/hulalv/mp/vo/MpCustomProductDetailVO.java
M	hl-mp-service/src/main/java/com/hulalv/mp/vo/MpProductDetailVO.java
M	hl-order-service/src/main/java/com/hulalv/order/controller/InternalRefundController.java
```
</details>