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