From ec0ec9ede1cf6542d5ed5fa1afac263226144173 Mon Sep 17 00:00:00 2001 From: yaosutu <770858045@qq.com> Date: Sat, 25 Jul 2026 11:00:58 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E9=85=92=E5=BA=97=E5=80=99?= =?UTF-8?q?=E9=80=89=E6=88=BF=E5=9E=8B=E7=BB=93=E7=AE=97=E4=BB=B7=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E5=A5=91=E7=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...…’åº—å€™é€‰è¡¥é½æˆ¿åž‹ç»“ç®—ä»·-修改接å£-管ç†åŽå°.md | 421 ++++++++++++++++++ 1 file changed, 421 insertions(+) create mode 100644 changelogs-v2/2026-07/25_5237_é…’åº—å€™é€‰è¡¥é½æˆ¿åž‹ç»“ç®—ä»·-修改接å£-管ç†åŽå°.md diff --git a/changelogs-v2/2026-07/25_5237_é…’åº—å€™é€‰è¡¥é½æˆ¿åž‹ç»“ç®—ä»·-修改接å£-管ç†åŽå°.md b/changelogs-v2/2026-07/25_5237_é…’åº—å€™é€‰è¡¥é½æˆ¿åž‹ç»“ç®—ä»·-修改接å£-管ç†åŽå°.md new file mode 100644 index 0000000..5ce520f --- /dev/null +++ b/changelogs-v2/2026-07/25_5237_é…’åº—å€™é€‰è¡¥é½æˆ¿åž‹ç»“ç®—ä»·-修改接å£-管ç†åŽå°.md @@ -0,0 +1,421 @@ +# ã€ä¿®æ”¹æŽ¥å£Â·ç®¡ç†åŽå°ã€‘é…’åº—å€™é€‰è¡¥é½æˆ¿åž‹ç»“ç®—ä»· (#5237) + +> **PR**: #5240 | **æœåŠ¡**: hl-order-service-v3 | **æ›´æ–°æ—¶é—´**: 2026-07-25 10:58 + +## 1. 接å£èƒŒæ™¯ + +管ç†åŽå°é…’店候选列表原æ¥åªåœ¨å€™é€‰é…’店顶层返回 `protoPrice`,å‰ç«¯æ— æ³•确认这个价格æ¥è‡ªå“ªä¸ªçœŸå®žæˆ¿åž‹ï¼Œä¹Ÿæ‹¿ä¸åˆ°åŒä¸€æˆ¿åž‹åŒä¸€å¤©çš„ç»“ç®—ä»·ã€‚é…æˆ¿æ—¶å¦‚æžœåªçœ‹æˆ¿åž‹åˆ—è¡¨æˆ–è‡ªè¡ŒåŒ¹é…æœ€ä½Žä»·ï¼Œå®¹æ˜“把å议价和结算价å£å¾„拆到ä¸åŒæˆ¿åž‹ã€‚ + +本次在候选酒店顶层补é½ï¼š + +- `protoPriceRoomTypeId`:产生顶层 `protoPrice` 的真实房型 ID。 +- `settlementPrice`:与 `protoPriceRoomTypeId` åŒä¸€æˆ¿åž‹ã€åŒä¸€å¤©çš„结算价。 + +顶层 `protoPrice`ã€`protoPriceRoomTypeId`ã€`settlementPrice` 是åŒä¸€ä»£è¡¨æˆ¿åž‹å£å¾„。未维护结算价时 `settlementPrice = null`,ä¸ä¼šç”¨å议价兜底。 + +## 2. å˜æ›´æ¸…å• + +| # | æŽ¥å£ | 方法 | 路径 | å˜æ›´ç±»åž‹ | 说明 | +|---|------|------|------|----------|------| +| 1 | 查询酒店候选(4 场景统一入å£ï¼‰ | GET | `/v3/admin/hotel-candidates` | ä¿®æ”¹æŽ¥å£ | 候选酒店项新增 `protoPriceRoomTypeId`ã€`settlementPrice` 两个出å‚字段;入å‚ä¸å˜ã€‚ | + +## 3. 接å£è¯¦æƒ… + +### 3.1 查询酒店候选(4 场景统一入å£ï¼‰ + +- **使用场景**:管ç†åŽå°åœ¨è®¢å•维度查询æŸä¸€æ™šçš„å€™é€‰é…’åº—ï¼Œç”¨äºŽé…æˆ¿é€‰é…’店ã€å›žæ˜¾å½“å‰å·²é…é…’åº—ã€æŒ‰äº§å“æ± /定制师点å/资æºåº“候选排åºã€‚ +- **认è¯**:需è¦ç®¡ç†åŽå° JWT。 +- **幂等性**:åªè¯»æŸ¥è¯¢ï¼Œå¹‚等。 +- **陿µ**:无接å£çº§ç‰¹æ®Šé™æµï¼›å—网关与æœåŠ¡é€šç”¨é™æµç­–略约æŸã€‚ + +## 4. 接å£å…¥å‚ + +### 4.1 è·¯å¾„å‚æ•° / Query 傿•° + +| 字段 | 类型 | å¿…å¡« | 说明 | +|------|------|------|------| +| `orderId` | String | 是 | è®¢å• ID。åŽç«¯ Long,JSON/Query 建议按字符串传,é¿å…é•¿ ID 精度问题。 | +| `dayNumber` | Integer | å¦ | 第几天,从 1 开始;用于推算 `stayDate = departDate + dayNumber - 1`。最å°å€¼ 1。 | +| `stayDate` | String | å¦ | 入使—¥æœŸï¼Œæ ¼å¼ `yyyy-MM-dd`;直接指定时优先于 `dayNumber` 推算。 | +| `city` | String | å¦ | åŸŽå¸‚ä»£ç æˆ–城市å;未传且éžå…³é”®è¯æ¨¡å¼æ—¶é»˜è®¤ä¸æŒ‰åŸŽå¸‚é™åˆ¶ã€‚ | +| `keyword` | String | å¦ | 关键è¯ï¼›éžç©ºæ—¶è·¨åŸŽ/çœåŒ¹é…酒店åã€åŸŽå¸‚ã€çœä»½ã€åœ°å€ï¼Œæ­¤æ—¶ `city` å¯ä¸ä¼ ã€‚ | +| `limit` | Integer | å¦ | è¿”å›žå€™é€‰æ¡æ•°ä¸Šé™ï¼Œé»˜è®¤ 30ï¼Œæœ€å° 1,最大 50。 | +| `roomCategory` | String | å¦ | 房型字典 code。 | +| `roomCount` | Integer | å¦ | 需è¦çš„æˆ¿é—´æ•°ï¼›æœ€å° 1。 | +| `preferredHotelId` | String | å¦ | 定制师指定的优先酒店 ID。åŽç«¯ Long,建议字符串传。 | +| `requirementId` | String | å¦ | 用房需求 ID;传入åŽå°†è¯¥éœ€æ±‚ days JSON 中当å‰å¤©çš„酒店候选作为定制师指定候选。åŽç«¯ Long,建议字符串传。 | + +### 4.2 请求体字段 + +GET æŽ¥å£æ— è¯·æ±‚体。 + +## 5. 出å‚字段 + +统一å“应结构: + +| 字段 | 类型 | 说明 | +|------|------|------| +| `code` | Integer | 业务状æ€ç ï¼ŒæˆåŠŸä¸º `200`。 | +| `message` | String | å“应消æ¯ï¼ŒæˆåŠŸä¸º `æˆåŠŸ`。 | +| `data` | Object | 酒店候选查询出å‚。 | +| `traceId` | String | 链路追踪 ID,å¯èƒ½ä¸ºç©ºã€‚ | +| `success` | Boolean | `code == 200` 时为 `true`。 | + +`data` 字段: + +| 字段 | 类型 | 说明 | +|------|------|------| +| `stayDate` | String | 入使—¥æœŸï¼Œæ ¼å¼ `yyyy-MM-dd`。 | +| `city` | String / null | æœ¬æ¬¡æŸ¥è¯¢ä½¿ç”¨çš„åŸŽå¸‚ï¼›å…³é”®è¯æ¨¡å¼æˆ–默认ä¸é™åŸŽå¸‚æ—¶å¯ä¸º `null`。 | +| `productType` | String | 产å“类型:`CORE` / `GROUP` / `CUSTOM`。 | +| `candidates` | Array | 候选酒店列表,已按产å“ç±»åž‹åˆ†æµæŽ’åºã€‚ | + +`data.candidates[]` 字段: + +| 字段 | 类型 | 说明 | +|------|------|------| +| `hotelId` | String | 酒店 ID。 | +| `hotelName` | String | 酒店å称。 | +| `level` | String / null | 酒店等级。 | +| `form` | String / null | ä½å®¿å½¢æ€ã€‚ | +| `address` | String / null | 地å€ã€‚ | +| `tags` | Array | è¿è¥æ ‡ç­¾ï¼›æ— æ ‡ç­¾æ—¶ä¸ºç©ºæ•°ç»„或 `null`。 | +| `contactPerson` | String / null | è”系人。 | +| `contactWechat` | String / null | è”系微信。 | +| `settleType` | String / null | 结算类型,å–å€¼è§ Â§6.1。 | +| `city` | String / null | 酒店所在城市。 | +| `district` | String / null | 酒店所在区/县。 | +| `roomTypes` | Array | è¯¥é…’åº—å½“æ—¥çœŸå®žæˆ¿åž‹åˆ—è¡¨ï¼›æ— æˆ¿åž‹æ•°æ®æ—¶ä¸ºç©ºæ•°ç»„。 | +| `protoPrice` | String / null | 代表房型å议价。与 `protoPriceRoomTypeId`ã€é¡¶å±‚ `settlementPrice` åŒä¸€æˆ¿åž‹åŒä¸€å¤©ã€‚ | +| `protoPriceRoomTypeId` | String / null | 产生顶层 `protoPrice` 的真实房型 ID。无有效å¯å”®å议价时为 `null`。 | +| `settlementPrice` | String / null | 与 `protoPriceRoomTypeId` åŒä¸€æˆ¿åž‹ã€åŒä¸€å¤©çš„结算价。未维护时为 `null`,ä¸ä¼šç”¨ `protoPrice` 兜底。 | +| `todayAvailable` | Integer / null | 今日全房型å¯ç”¨æˆ¿æ•°åˆè®¡ã€‚ | +| `availFreshness` | String / null | å¯ç”¨æ•°æ•°æ®æ—¶æ•ˆï¼š`fresh` / `stale` / `never_checked`。 | +| `lastCheckedAt` | String / null | æœ€è¿‘ä¸€æ¬¡æ ¸æˆ¿æ—¶é—´ï¼Œæ ¼å¼ `yyyy-MM-dd'T'HH:mm:ss`。 | +| `matchedRoomTypeAvailable` | Integer / null | åŒ¹é…æˆ¿åž‹ä»Šæ—¥å¯ç”¨æ•°ã€‚ | +| `matchedRoomTypeId` | String / null | 匹é…的房型 ID。 | +| `matchedRoomTypeLabel` | String / null | 匹é…的房型中文。 | +| `quickPickEnabled` | Boolean / null | æ˜¯å¦æ”¯æŒå¿«é€Ÿé…房。 | +| `quickPickDisabledReason` | String / null | ç½®ç°åŽŸå› ã€‚ | +| `isPoolMatch` | Boolean / null | 是å¦äº§å“池内。 | +| `poolMatchBadge` | Object / null | äº§å“æ± å†…徽章。 | +| `isConsultantRecommended` | Boolean / null | 是å¦è¢«å®šåˆ¶å¸ˆç‚¹å。 | +| `consultantRecommendBadge` | Object / null | 定制师点å徽章。 | +| `historyMatchScore` | Number / null | 历å²åŒ¹é…度,范围 0-1。 | +| `score` | Number / null | 排åºåˆ†æ•°ã€‚ | +| `recommendation` | String / null | 推èç†ç”±ã€‚ | +| `recommended` | Boolean / null | 是å¦ä¸ºæŽ¨è候选。 | +| `recommendSource` | String / null | æŽ¨èæ¥æºï¼Œè§ §6.4。 | +| `historyScoreStub` | Boolean / null | 历å²å‘½ä¸­åˆ†æ•°æ˜¯å¦ä¸º stub。 | +| `isCurrentlyAssigned` | Boolean / null | 是å¦ä¸ºæœ¬å¤©å½“å‰å·²é…酒店。 | +| `assignedRoomTypeId` | String / null | 本天当å‰å·²é…的房型 IDï¼›`isCurrentlyAssigned=true` æ—¶å¯ç”¨äºŽé¢„填原房型。 | + +`data.candidates[].roomTypes[]` 字段: + +| 字段 | 类型 | 说明 | +|------|------|------| +| `roomTypeId` | String | 房型 ID。 | +| `name` | String / null | 房型å称。 | +| `roomCategory` | String / null | 房型分类字典值。 | +| `bedType` | String / null | 床型,已按字典尽é‡ç¿»è¯‘;字典缺失时å¯å›žé€€ä¸º code。 | +| `maxOccupancy` | Integer / null | 最大入ä½äººæ•°ã€‚ | +| `available` | Integer / null | 今日å¯ç”¨æˆ¿æ•°ï¼›`unlimited=true` 时为 `null`,语义为ä¸é™ã€‚ | +| `unlimited` | Boolean | 是å¦ä¸é™åº“存。 | +| `stock` | Integer / null | 当å‰å¯ç”¨æˆ¿ï¼›`unlimited=true` 时为 `null`。 | +| `protocolPrice` | String / null | 该房型当日å议价。 | +| `settlementPrice` | String / null | 该房型当日结算价。 | +| `basePrice` | String / null | 标价/挂牌价。 | +| `inventoryStatus` | String | 库存状æ€ï¼Œè§ §6.2。 | + +徽章对象字段: + +| 字段 | 类型 | 说明 | +|------|------|------| +| `label` | String | 中文徽章文字。 | +| `color` | String | å¾½ç« è‰²ï¼Œè§ Â§6.5。 | +| `tooltip` | String | 悬浮æç¤ºã€‚ | + +## 6. 枚举 / æ•°æ®å­—å…¸ + +### 6.1 `settleType` + +**所属字段**:`data.candidates[].settleType` | **类型**:String | **å¿…å¡«**ï¼šå¦ + +| 值 | 中文 | 说明 | +|----|------|------| +| `cash` | 现付 | 到店或线下现金类结算。 | +| `sign` | ç­¾å• | 供应商签å•结算。 | +| `company` | å…¬å¸ä»˜ | å…¬å¸ç»Ÿä¸€ä»˜æ¬¾ç»“算。 | + +### 6.2 `inventoryStatus` + +**所属字段**:`data.candidates[].roomTypes[].inventoryStatus` | **类型**:String | **å¿…å¡«**:是 + +| 值 | 中文 | 说明 | +|----|------|------| +| `AVAILABLE` | å¯å”® | 有余é‡ï¼Œæˆ– `unlimited=true` ä¸é™åº“存。 | +| `FULL` | 满房 | 有日历记录,但库存为 0。 | +| `CLOSED` | 未开放 | 无该日价格日历记录。 | + +### 6.3 `availFreshness` + +**所属字段**:`data.candidates[].availFreshness` | **类型**:String | **å¿…å¡«**ï¼šå¦ + +| 值 | 中文 | 说明 | +|----|------|------| +| `fresh` | 最新 | å¯ç”¨äºŽå¿«é€Ÿé…房判断。 | +| `stale` | 过期 | 核房数æ®è¿‡æœŸã€‚ | +| `never_checked` | 从未核房 | æ— å¯ç”¨æ ¸æˆ¿æ•°æ®ã€‚ | + +### 6.4 `recommendSource` + +**所属字段**:`data.candidates[].recommendSource` | **类型**:String | **å¿…å¡«**ï¼šå¦ + +| 值 | 中文 | 说明 | +|----|------|------| +| `PRODUCT_POOL` | äº§å“æ±  | æ¥è‡ªäº§å“池候选。 | +| `CONSULTANT` | 定制师点å | æ¥è‡ªå®šåˆ¶å¸ˆæŒ‡å®šå€™é€‰ã€‚ | +| `RESOURCE_LIB` | 资æºåº“ | æ¥è‡ªèµ„æºåº“候选。 | + +### 6.5 `Badge.color` + +**所属字段**:`poolMatchBadge.color` / `consultantRecommendBadge.color` | **类型**:String | **å¿…å¡«**ï¼šå¦ + +| 值 | 中文 | 说明 | +|----|------|------| +| `blue` | è“色 | æ™®é€šæŽ¨èæˆ–池内标识。 | +| `gold` | 金色 | é«˜ä¼˜å…ˆçº§æŽ¨èæ ‡è¯†ã€‚ | +| `gray` | ç°è‰² | å¼±æç¤ºæ ‡è¯†ã€‚ | + +## 7. é”™è¯¯ç  + +| code | å«ä¹‰ | 触å‘场景 | +|------|------|----------| +| `200` | æˆåŠŸ | 查询æˆåŠŸã€‚ | +| `400` | 傿•°é”™è¯¯ | `orderId` 为空ã€`dayNumber < 1`ã€`limit` 超出 1-50ã€`roomCount < 1`ã€æ—¥æœŸæ ¼å¼ä¸æ˜¯ `yyyy-MM-dd` ç­‰å‚æ•°ç»‘定或校验失败。 | +| `401` | æœªè®¤è¯ | JWT 缺失或无效。 | +| `403` | æ— æƒé™ | 当å‰è´¦å·æ— æƒè®¿é—®è¯¥ç®¡ç†åŽå°æŽ¥å£æˆ–è®¢å•æ•°æ®ã€‚ | +| `581007` | 订å•ä¸å­˜åœ¨ | `orderId` 对应订å•ä¸å­˜åœ¨ã€‚ | +| `500` | æœåŠ¡å†…éƒ¨é”™è¯¯ | éžé¢„期异常。 | + +## 8. 示例(3 组:典型 / 边界 / 异常) + +### 8.1 典型æˆåŠŸ + +**请求**: + +```http +GET /v3/admin/hotel-candidates?orderId=100001&dayNumber=1&stayDate=2026-07-25&limit=30&roomCount=2 HTTP/1.1 +Authorization: Bearer +``` + +无请求体。 + +**å“应**: + +```json +{ + "code": 200, + "message": "æˆåŠŸ", + "data": { + "stayDate": "2026-07-25", + "city": null, + "productType": "CORE", + "candidates": [ + { + "hotelId": "2023714929877450753", + "hotelName": "测试酒店", + "level": "舒适型", + "form": "HOTEL", + "address": "呼伦è´å°”市海拉尔区测试路 1 å·", + "tags": ["å议酒店"], + "contactPerson": "å¼ ç»ç†", + "contactWechat": "hotel_mgr", + "settleType": "sign", + "city": "呼伦è´å°”市", + "district": "海拉尔区", + "protoPrice": "280.00", + "protoPriceRoomTypeId": "2023727403196502017", + "settlementPrice": "279.00", + "todayAvailable": 7, + "availFreshness": "fresh", + "lastCheckedAt": null, + "matchedRoomTypeAvailable": 7, + "matchedRoomTypeId": "2023727403196502017", + "matchedRoomTypeLabel": "豪åŽå¤§åºŠæˆ¿", + "quickPickEnabled": true, + "quickPickDisabledReason": null, + "isPoolMatch": true, + "poolMatchBadge": { + "label": "äº§å“æ± å†…", + "color": "blue", + "tooltip": "æœ¬é…’åº—åœ¨äº§å“æ± å†…,优先推è" + }, + "isConsultantRecommended": false, + "consultantRecommendBadge": null, + "historyMatchScore": 0.85, + "score": 1185.0, + "recommendation": "池内 · 历å²åˆä½œ 8 啿ˆåŠŸçŽ‡ 95%", + "recommended": true, + "recommendSource": "PRODUCT_POOL", + "historyScoreStub": true, + "isCurrentlyAssigned": false, + "assignedRoomTypeId": null, + "roomTypes": [ + { + "roomTypeId": "2023727403196502017", + "name": "豪åŽå¤§åºŠæˆ¿", + "roomCategory": "KING", + "bedType": "大床", + "maxOccupancy": 2, + "available": 7, + "unlimited": false, + "stock": 7, + "protocolPrice": "280.00", + "settlementPrice": "279.00", + "basePrice": "568.00", + "inventoryStatus": "AVAILABLE" + } + ] + } + ] + }, + "traceId": "trace-20260725-0001", + "success": true +} +``` + +### 8.2 边界情况 + +**场景说明**:代表房型有å议价但未维护结算价,顶层 `settlementPrice` 返回 `null`,ä¸ä½¿ç”¨ `protoPrice` 兜底。 + +**请求**: + +```http +GET /v3/admin/hotel-candidates?orderId=100001&stayDate=2026-07-25&keyword=%E6%B5%B7%E6%8B%89%E5%B0%94&limit=1 HTTP/1.1 +Authorization: Bearer +``` + +无请求体。 + +**å“应**: + +```json +{ + "code": 200, + "message": "æˆåŠŸ", + "data": { + "stayDate": "2026-07-25", + "city": null, + "productType": "CUSTOM", + "candidates": [ + { + "hotelId": "2023714929877450753", + "hotelName": "测试酒店", + "settleType": "cash", + "protoPrice": "280.00", + "protoPriceRoomTypeId": "2023727403196502017", + "settlementPrice": null, + "roomTypes": [ + { + "roomTypeId": "2023727403196502017", + "name": "豪åŽå¤§åºŠæˆ¿", + "available": 7, + "unlimited": false, + "protocolPrice": "280.00", + "settlementPrice": null, + "basePrice": "568.00", + "inventoryStatus": "AVAILABLE" + } + ], + "quickPickEnabled": true, + "recommended": true, + "recommendSource": "RESOURCE_LIB" + } + ] + }, + "traceId": "trace-20260725-0002", + "success": true +} +``` + +### 8.3 业务失败(异常) + +**场景说明**:`orderId` 未传,触å‘傿•°æ ¡éªŒå¤±è´¥ã€‚ + +**请求**: + +```http +GET /v3/admin/hotel-candidates?stayDate=2026-07-25 HTTP/1.1 +Authorization: Bearer +``` + +无请求体。 + +**å“应**: + +```json +{ + "code": 400, + "message": "orderId ä¸èƒ½ä¸ºç©º", + "data": null, + "traceId": "trace-20260725-0003", + "success": false +} +``` + +## 9. 业务边界 + +- **适用场景**:管ç†åŽå°æŒ‰è®¢å•å’Œå…¥ä½æ—¥æŸ¥è¯¢é…’店候选;`stayDate` å¯ç›´æŽ¥ä¼ ï¼Œä¹Ÿå¯é€šè¿‡ `dayNumber` 和订å•å‡ºå‘æ—¥æŽ¨ç®—。 +- **ä¸é€‚用场景**:ä¸ç”¨äºŽå‰ç«¯ç›´æŽ¥æŸ¥è¯¢å†…éƒ¨èµ„æºæœåŠ¡ï¼›æœ¬æ–‡åªæè¿°ç®¡ç†åŽå° `/v3/admin/hotel-candidates`。 +- **特殊边界**:顶层 `protoPrice`ã€`protoPriceRoomTypeId`ã€`settlementPrice` 必须按åŒä¸€ä»£è¡¨æˆ¿åž‹ç†è§£ï¼›`settlementPrice = null` 表示该代表房型当天未维护结算价。 +- **特殊边界**:`roomTypes[].settlementPrice` 是æ¯ä¸ªæˆ¿åž‹è‡ªå·±çš„当日结算价;顶层 `settlementPrice` åªå¯¹åº” `protoPriceRoomTypeId` 指å‘的代表房型。 + +## 10. 修改å‰åŽå¯¹æ¯” + +### 10.1 字段级对比 + +| 字段 | æ”¹å‰ | æ”¹åŽ | +|------|------|------| +| `data.candidates[].protoPriceRoomTypeId` | ä¸è¿”回 | 返回产生顶层 `protoPrice` 的真实房型 ID;无有效å¯å”®å议价为 `null`。 | +| `data.candidates[].settlementPrice` | ä¸è¿”回 | 返回与 `protoPriceRoomTypeId` åŒä¸€æˆ¿åž‹ã€åŒä¸€å¤©çš„结算价;未维护为 `null`。 | +| `data.candidates[].protoPrice` | 已返回,但无法判断æ¥è‡ªå“ªä¸ªæˆ¿åž‹ | ä»è¿”回原字段,并与新增的 `protoPriceRoomTypeId`ã€é¡¶å±‚ `settlementPrice` 组æˆåŒä¸€ä»£è¡¨æˆ¿åž‹å£å¾„。 | + +### 10.2 行为级对比 + +| 行为 | æ”¹å‰ | æ”¹åŽ | +|------|------|------| +| 候选酒店顶层价格展示 | åªèƒ½æ‹¿åˆ°ä»£è¡¨å议价 `protoPrice`。 | å¯åŒæ—¶æ‹¿åˆ°ä»£è¡¨å议价ã€ä»£è¡¨æˆ¿åž‹ IDã€è¯¥ä»£è¡¨æˆ¿åž‹ç»“算价。 | +| 结算价为空 | 顶层没有结算价字段。 | 顶层 `settlementPrice` 返回 `null`ï¼›ä¸ä½¿ç”¨ `protoPrice` 兜底。 | + +## 11. å½±å“评估 / 回滚 + +### 11.1 å½±å“评估 + +- **是å¦ç ´åå‘åŽå…¼å®¹**:å¦ã€‚åªæ–°å¢žå‡ºå‚字段,已有字段åã€ç±»åž‹ã€å…¥å‚ä¸å˜ã€‚ +- **å‰ç«¯æ˜¯å¦å¿…é¡»åŒæ­¥ä¸Šçº¿**:å¦ã€‚è€å‰ç«¯å¯å¿½ç•¥æ–°å¢žå­—段;需è¦å±•示或回填结算价的页é¢å¯è¯»å–新增字段。 +- **å½±å“已有数æ®**:无数æ®è¿ç§»è¦æ±‚ï¼›åŽ†å²æœªç»´æŠ¤ç»“算价的房型按 `settlementPrice = null` 返回。 + +### 11.2 回滚方案 + +- **回滚方å¼**:回滚 PR #5240 åŽï¼Œé¡¶å±‚新增字段ä¸å†è¿”回。 +- **å›žæ»šåŽæ¸…ç†**:无å‰ç«¯æ•°æ®æ¸…ç†è¦æ±‚。 +- **回滚耗时**:按常规æœåŠ¡å›žæ»šæµç¨‹å¤„ç†ã€‚ + +## 12. 注æ„事项 + +- å‰ç«¯è¯»å–顶层 `settlementPrice` 时,ä¸è¦æŠŠ `null` 当作 `protoPrice`ï¼›`null` 表示未维护结算价。 +- 如需定ä½ä»·æ ¼æ¥è‡ªå“ªä¸ªæˆ¿åž‹ï¼Œä½¿ç”¨é¡¶å±‚ `protoPriceRoomTypeId` åŽ»åŒ¹é… `roomTypes[].roomTypeId`。 +- 金é¢å’Œé•¿ ID 在å“应 JSON 中按字符串处ç†ï¼Œä¾‹å¦‚ `"280.00"`ã€`"2023727403196502017"`。 + +## 13. å…³è” / è”系人 + +### 13.1 链接 + +- **Issue**: [#5237](https://git.1814.love:8443/wx/HL/issues/5237) +- **PR**: [#5240](https://git.1814.love:8443/wx/HL/pulls/5240) +- **Merge commit**: [dc6e2ef](https://git.1814.love:8443/wx/HL/commit/dc6e2ef6c2b49bd503353814f85723566d4413c6) + +### 13.2 è”系人 + +- **åŽç«¯è´Ÿè´£äºº**: @yst