# 房务配房价格同步弹窗误触发（前端待处理）

## 背景

房务「选择酒店」弹窗中，后端候选接口已经返回房型级价格：

- `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`，点击「加入」弹同步结算价。
- 协议价和结算价都没改时，不出现任何价格同步弹窗。

