# 接口变更记录 — 2026-04-13 09:49

> **提交** `d90dfe18` · **作者** wx · **时间** 2026-04-13 09:49:25 +0800
>
> refactor(product-v2): 合并创建产品和Step1基础信息为一个接口

## 变更总览

- **hl-product-service-v2**
  - AdminProduct (+1, -2)

---

## hl-product-service-v2

### AdminProduct

### 🆕 `POST` /admin/product/item/basic — Step1 基础信息保存

> 创建+更新合一接口。

**请求体** `ProductBasicSaveReqVO`

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

**响应** `Result<Long>`

### ❌ ~~`POST` /admin/product/item — 创建产品~~

### ❌ ~~`PUT` /admin/product/item/{id}/basic — Step1 基础信息保存~~

---

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

```
M	hl-product-service-v2/src/main/java/com/hulalv/product/controller/admin/AdminProductController.java
M	hl-product-service-v2/src/main/java/com/hulalv/product/service/admin/ProductBasicService.java
M	hl-product-service-v2/src/main/java/com/hulalv/product/vo/admin/ProductBasicSaveReqVO.java
M	hl-product-service-v2/src/test/java/com/hulalv/product/controller/admin/AdminProductControllerTest.java
M	hl-product-service-v2/src/test/java/com/hulalv/product/service/admin/ProductBasicServiceTest.java
```
</details>