小程序档位对比补酒店封面图/类型/城市
PR #923 squash 合并到 dev commit 0e029c38 GET /mp/product/{id}/tier-compare 返回 tiers[].hotels[] 每项新增 coverUrl/hotelType/city PR #913 姊妹修复 字段兜底/key规则 与主详情完全一致
这个提交包含在:
父节点
7a6df61262
当前提交
ab98d6a4f1
@ -0,0 +1,146 @@
|
||||
# 小程序档位对比 - 住宿补酒店封面图 / 类型 / 城市
|
||||
|
||||
- **日期**: 2026-04-19
|
||||
- **PR**: [#923](https://git.1814.love:8443/wx/HL/pulls/923) (squash merge → dev, `0e029c38`)
|
||||
- **类型**: FIX
|
||||
- **状态**: 已合并到 dev + 测试环境部署完成 + API 验证通过
|
||||
- **服务**: hl-product-service-v2(端口 8083)
|
||||
- **关联**: PR #913 姊妹修复(主详情已修,本 PR 覆盖档位对比)
|
||||
|
||||
---
|
||||
|
||||
## 一、为什么加这三个字段
|
||||
|
||||
PR #913 修复了 `GET /mp/product/{id}` 主详情的住宿封面图缺失(每日住宿卡左侧 100x100 封面图位)。但档位对比接口 `GET /mp/product/{id}/tier-compare` 的 `tiers[].hotels[]` 同样没返回 `coverUrl/hotelType/city`,前端档位对比画面展示酒店时封面依然空白。
|
||||
|
||||
根因:`MpProductService.tierCompare(...)` 组装 `HotelItem` 时**只做 `BeanUtil.toBean` 从 `ProductDayHotelDO` 快照拷贝**,未调 `resourceDetailFeignClient.batchDetails(...)` 取酒店资源详情(与主详情修复前症状一致)。
|
||||
|
||||
---
|
||||
|
||||
## 二、变更接口清单
|
||||
|
||||
| # | 方法 | 路径 | 影响 |
|
||||
|---|------|------|------|
|
||||
| 1 | GET | `/mp/product/{id}/tier-compare` | 返回的 `tiers[].hotels[]` 每项新增 `coverUrl` / `hotelType` / `city` 三字段 |
|
||||
|
||||
---
|
||||
|
||||
## 三、字段定义
|
||||
|
||||
### `MpTierCompareRespVO.HotelItem` 新增字段
|
||||
|
||||
| 字段 | 类型 | 说明 | 示例 | 可能为 null |
|
||||
|---|---|---|---|---|
|
||||
| `coverUrl` | String | 酒店封面图 URL(来自资源服务 cover) | `"https://hlgl-test.oss-cn-beijing.aliyuncs.com/test/material/2026/03/07/xxx.jpg"` | ✅ 酒店资源未配封面或 Feign 异常 |
|
||||
| `hotelType` | String | 酒店类型(字典 `hotel_type`:`FIVE_STAR` / `FOUR_STAR` / `BOUTIQUE` / `HOMESTAY` / ...) | `"FIVE_STAR"` | ✅ 可能为 null |
|
||||
| `city` | String | 酒店所在城市 | `"呼伦贝尔市"` | ✅ 可能为 null |
|
||||
|
||||
### 既有字段(语义不变)
|
||||
|
||||
`id` / `productId` / `dayId` / `dayNumber` / `tierSeq` / `hotelId` / `hotelName` / `roomTypeId` / `roomTypeName` / `roomCount` / `isDefault` / `sortOrder`。
|
||||
|
||||
---
|
||||
|
||||
## 四、响应示例对比
|
||||
|
||||
### 前
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"tiers": [{
|
||||
"tierSeq": 1,
|
||||
"tierName": "标准",
|
||||
"hotels": [{
|
||||
"dayNumber": 1,
|
||||
"hotelId": 9001,
|
||||
"hotelName": "呼伦贝尔香格里拉大酒店",
|
||||
"tierSeq": 1
|
||||
}]
|
||||
}]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 后
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": {
|
||||
"tiers": [{
|
||||
"tierSeq": 1,
|
||||
"tierName": "标准",
|
||||
"hotels": [{
|
||||
"dayNumber": 1,
|
||||
"hotelId": 9001,
|
||||
"hotelName": "呼伦贝尔香格里拉大酒店",
|
||||
"tierSeq": 1,
|
||||
"coverUrl": "https://hlgl-test.oss-cn-beijing.aliyuncs.com/test/material/2026/03/07/4be257ef92d0b76e401792e2f445c96d.jpg",
|
||||
"hotelType": "HOTEL",
|
||||
"city": "呼伦贝尔市"
|
||||
}]
|
||||
}]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 五、和主详情一致性保证
|
||||
|
||||
与 PR #913 的主详情修复**字段顺序和兜底逻辑完全一致**(开发验收员已核对):
|
||||
|
||||
| 点 | 做法 |
|
||||
|---|---|
|
||||
| `resourceMap` 的 key | `"HOTEL:" + hotelId` |
|
||||
| 字段覆盖顺序 | `cover` → `hotelType` → `city` → `name` |
|
||||
| null 值策略 | `dto == null` / 各字段 null 一律**保留 `BeanUtil` 快照**,不强制覆盖 |
|
||||
| Feign 异常 | `try/catch` → `resourceMap = Map.of()` + `log.warn` |
|
||||
| 批量 Feign | 一次 `batchDetails(null, hotelIds, null, null, null)`,非 N+1 |
|
||||
|
||||
**前端不会出现同一个酒店在主详情和档位对比接口中 `coverUrl` 值不一致的情况。**
|
||||
|
||||
---
|
||||
|
||||
## 六、前端容错要求
|
||||
|
||||
与 `2026-04-19_mp-product-detail-hotel-cover.md` 完全一致:三个字段**均可能为 null**,务必做判空:
|
||||
|
||||
- `coverUrl` 为空 → 显示默认占位图
|
||||
- `city` 为空 → 不显示地理位置标签
|
||||
- `hotelType` 为空 → 不显示类型标签
|
||||
|
||||
---
|
||||
|
||||
## 七、不兼容变更
|
||||
|
||||
**无**。纯新增字段,既有字段全部保留语义不变。
|
||||
|
||||
---
|
||||
|
||||
## 八、运维注意事项
|
||||
|
||||
本接口有 **5 分钟 Redis 缓存**(key 前缀 `mp:product:tier-compare:`)。测试环境已在本次部署时清理过;生产部署时**务必再清一次**,否则 C 端最长 5 分钟内仍返回旧数据:
|
||||
|
||||
```bash
|
||||
redis-cli --scan --pattern 'mp:product:tier-compare:*' | xargs -r redis-cli del
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 九、回归验证
|
||||
|
||||
测试环境已验证(productId=2044306857534636034):
|
||||
|
||||
```bash
|
||||
curl -sk "http://127.0.0.1:8080/mp/product/2044306857534636034/tier-compare" \
|
||||
-H "Authorization: Bearer {token}" \
|
||||
| jq '.data.tiers[].hotels[] | {hotelName, coverUrl, hotelType, city}'
|
||||
```
|
||||
|
||||
**实测结果**:
|
||||
- 呼伦贝尔香格里拉大酒店 → `coverUrl` 真实 OSS URL、`city=呼伦贝尔市`
|
||||
- 海拉尔海棠酒店 → `coverUrl` 真实 OSS URL、`city=呼伦贝尔市`
|
||||
- 三个新字段键均存在,均有真实值(非 null)
|
||||
正在加载...
x
在新工单中引用
屏蔽一个用户