PR #923 squash 合并到 dev commit 0e029c38 GET /mp/product/{id}/tier-compare 返回 tiers[].hotels[] 每项新增 coverUrl/hotelType/city PR #913 姊妹修复 字段兜底/key规则 与主详情完全一致
4.7 KiB
小程序档位对比 - 住宿补酒店封面图 / 类型 / 城市
- 日期: 2026-04-19
- PR: #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。
四、响应示例对比
前
{
"code": 200,
"data": {
"tiers": [{
"tierSeq": 1,
"tierName": "标准",
"hotels": [{
"dayNumber": 1,
"hotelId": 9001,
"hotelName": "呼伦贝尔香格里拉大酒店",
"tierSeq": 1
}]
}]
}
}
后
{
"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 分钟内仍返回旧数据:
redis-cli --scan --pattern 'mp:product:tier-compare:*' | xargs -r redis-cli del
九、回归验证
测试环境已验证(productId=2044306857534636034):
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)