配房选酒店默认不按城市(后端 order+resource 改,跨城列全部)+更正前篇「返全集」定性(#4363/#4364)

这个提交包含在:
API Changelog Bot 2026-06-24 18:15:31 +08:00
父节点 597096129b
当前提交 a22e9c1ae3
共有 2 个文件被更改,包括 30 次插入29 次删除

查看文件

@ -0,0 +1,30 @@
# 配房选酒店默认不按城市(列全部在售·跨城,池内/定制师优先;搜索框可筛;已上线测试服·可对接)
> 变更类型:✨ 行为变更(后端 order + resource 一并改,已部署测试服并 API 实测)
> 端类型:管理后台(配房·「选择酒店」弹窗)
> 日期2026-06-24 工单:#4363 PR#4364 服务hl-order-service-v3 + hl-resource-service
> 关联:承接 #4346(本单做全)。**更正本目录早前「配房选择酒店候选列表后端返全集」那篇**——彼时后端实为按行程城市过滤(非纯前端 bug,我先前定性有误,致歉),现已改为默认不按城市。
---
## ⚠️ 关键说明
- **行为变更**:配房「选择酒店」`GET /v3/admin/hotel-candidates` **默认不再按行程城市过滤**,改为**列全部在售酒店**(带标签的池内 / 定制师推荐由后端排最前)。
- 用户在搜索框输入城市 / 关键词时才按城市 / 关键词筛(`city` / `keyword` 入参,行为不变)。
- 接口**无 total / 分页字段**,`candidates` 是完整数组(默认上限 30,排序后截断)。**前端全量顺序渲染 candidates,勿按标签过滤**。
## 1. 入参 / 出参(契约不变,仅默认行为变)
`GET /v3/admin/hotel-candidates`
- `orderId`(必传)/ `dayNumber`(推算 stayDate,**不再用于推算城市**/ `city`(选填,搜索框指定才按城市筛)/ `keyword`(选填,跨城 / 省关键词搜)/ `limit`(默认 **30**,上限 50
- 出参 `data.candidates[]` 字段同前hotelName / protoPrice / isPoolMatch / isConsultantRecommended / tags / ...;排序:定制师点名 > 池内 > 普通。
## 2. 测试服实测order 2069593503129636865 第 1 晚)
| 调用 | data.city | 候选城市 | 条数 |
|---|---|---|---|
| 默认(不传 city | null | **兴安盟 + 呼伦贝尔市(跨城)** | 10全部在售,池内海拉尔海棠排第 1 |
| 传 `city=海拉尔` | 海拉尔 | 呼伦贝尔市 | 1按城市筛 |
改前同一调用只返呼伦贝尔市 10 条(锁行程城市);改后跨城返全部在售(含兴安盟阿尔山成悦酒店)。
## 3. 前端动作
- **全量顺序渲染 `candidates`**(后端已排好序,带标签的在最前),弹窗「共 N 条」= candidates.length,勿按标签过滤。
- 搜索框:输入城市 → 传 `city`;跨城 / 关键词 → 传 `keyword`

查看文件

@ -1,29 +0,0 @@
# 配房「选择酒店」候选列表:后端返回全集 + 已排序,前端需全量渲染(接口说明·后端无改动)
> 变更类型:📖 接口使用说明(后端无改动;澄清前端渲染缺陷)
> 端类型:管理后台(配房·「选择酒店」弹窗)
> 日期2026-06-24 服务hl-order-service-v3 接口:`GET /v3/admin/hotel-candidates`
---
## ⚠️ 关键说明(定位为前端渲染 bug
- **现象**:配房「选择酒店」弹窗显示「共 N 条」,列表却只渲染 1 行(只剩池内/带标签那家),城市内其余酒店没显示。
- **定位****后端无问题**。`GET /v3/admin/hotel-candidates` 实测返回**城市内全部酒店**(测试服订单 2069593503129636865 第 1 晚返 **10 条**),且**已按「定制师点名 > 产品池内 > 普通」排好序**(池内的海拉尔海棠排第 1)。
- **根因**:该接口 RespVO **没有 total / 分页字段**,只有 `candidates` 完整数组。前端「共 N 条」= `candidates.length`,即前端**已收到全部 N 条**,却只渲染了 1 行(疑似误按 `isPoolMatch / isConsultantRecommended = true` 过滤,把普通酒店漏掉)。
- **前端动作****全量顺序渲染 `candidates` 数组,不要按标签过滤**。后端已排好序,带标签的天然在最前,普通酒店在后。
## 1. 接口出参(关键字段,本次无变更)
`GET /v3/admin/hotel-candidates``data.candidates[]`(完整数组,无分页,默认上限 limit=10,可传 limit 上调,≤50
| 字段 | 类型 | 说明 |
|---|---|---|
| `hotelName` | String | 酒店名 |
| `protoPrice` | String(BigDecimal) | 协议价 |
| `matchedRoomTypeLabel` / `matchedRoomTypeAvailable` | String / Integer | 匹配房型 / 可用房 |
| `isPoolMatch` | Boolean | 是否产品池内(前端标签「产品池内」) |
| `isConsultantRecommended` | Boolean | 是否定制师点名(前端标签「定制师推荐」) |
| `tags` | List<String> | 运营标签(草原景观 / 含早餐 / 性价比高 等) |
| `recommendSource` / `score` | String / Double | 推荐来源 / 排序分(后端已据此排序,前端勿重排,按返回顺序渲染即可) |
## 2. 测试服实测order 2069593503129636865 第 1 晚)
返回 **10 条**:海拉尔海棠(`isPoolMatch=true`,第 1+ 呼伦贝尔香格里拉 / 海拉尔嘉世豪 / 恩和瓦西里民宿 / 额尔古纳白桦 / 满洲里凯旋 / 额尔古纳豪星 / 海拉尔首旅京伦 / 额尔古纳玖成万豪 / 黑山头弘吉剌部 等 9 家城市内酒店。**前端应渲染全部 10 行**,当前只显示 1 行即缺陷所在。