92 行
2.6 KiB
Markdown
92 行
2.6 KiB
Markdown
# 房务配房价格同步弹窗误触发(前端待处理)
|
|
|
|
## 背景
|
|
|
|
房务「选择酒店」弹窗中,后端候选接口已经返回房型级价格:
|
|
|
|
- `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`,点击「加入」弹同步结算价。
|
|
- 协议价和结算价都没改时,不出现任何价格同步弹窗。
|
|
|