docs: 告知前端修正房务价格同步误弹

这个提交包含在:
API Changelog Bot 2026-07-07 10:32:54 +08:00
父节点 6f1945966e
当前提交 be4f1ddd78

查看文件

@ -0,0 +1,91 @@
# 房务配房价格同步弹窗误触发(前端待处理)
## 背景
房务「选择酒店」弹窗中,后端候选接口已经返回房型级价格:
- `roomTypes[].protocolPrice`
- `roomTypes[].settlementPrice`
测试环境实测示例:
- 订单:`2074303545149980674`
- 日期:`2026-07-23`
- 房型:`2029944767501012994`
- 接口返回:`protocolPrice = "320.00"``settlementPrice = "320.00"`
但前端未修改任何协议价 / 结算价时,点击「加入」仍弹出:
- `同步协议价?`
- `同步结算价?`
## 问题原因
当前前端判断逻辑是字符串比较:
```js
function priceChanged(input, original) {
if (input == null || input === '') return false
return String(input) !== String(original ?? '')
}
```
弹窗输入用 `NInputNumber`,接口金额是字符串。
例如:
- 接口原值:`"320.00"`
- 输入控件值:`320`
- `String(320) !== String("320.00")`
- 结果为 `true`
所以数值未变化也会误判为价格变化。
## 前端需要调整
只在协议价或结算价的金额数值真实变化时,才弹同步确认。
建议把金额归一化后比较,不能直接字符串比较:
```js
function normalizePrice(value) {
if (value == null || value === '') return null
const n = Number(value)
return Number.isFinite(n) ? Math.round(n * 100) : null
}
function priceChanged(input, original) {
const next = normalizePrice(input)
const prev = normalizePrice(original)
if (next == null) return false
if (prev == null) return true
return next !== prev
}
```
也可以用 decimal 工具统一比较,只要满足:
- `320``320.00` 视为相等
- `320.0``320.00` 视为相等
- `320.01``320.00` 视为变化
- 原值为空、输入也为空:不弹
- 原值有值、输入未改:不弹
- 原值有值、输入改成另一个金额:弹
## 触发口径
点击「加入」时:
1. `protocolPrice` 数值变化,才弹 `同步协议价?`
2. `settlementPrice` 数值变化,才弹 `同步结算价?`
3. 两个价格都没变化,不弹任何同步价格确认,直接加入已选配房。
4. 只改房间数、库存口径、酒店 / 房型选择,不应触发价格同步弹窗。
## 验收口径
- 后端返回 `protocolPrice = "320.00"`,前端输入框显示 `320`,点击「加入」不弹同步协议价。
- 后端返回 `settlementPrice = "320.00"`,前端输入框显示 `320`,点击「加入」不弹同步结算价。
- 手动把协议价改为 `321`,点击「加入」弹同步协议价。
- 手动把结算价改为 `319`,点击「加入」弹同步结算价。
- 协议价和结算价都没改时,不出现任何价格同步弹窗。