hl-api-changelog/changelogs-v2/2026-07/36_房务配房价格同步弹窗误触发-前端待处理-管理后台.md
2026-07-07 10:32:54 +08:00

2.6 KiB

房务配房价格同步弹窗误触发(前端待处理)

背景

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

  • roomTypes[].protocolPrice
  • roomTypes[].settlementPrice

测试环境实测示例:

  • 订单:2074303545149980674
  • 日期:2026-07-23
  • 房型:2029944767501012994
  • 接口返回:protocolPrice = "320.00"settlementPrice = "320.00"

但前端未修改任何协议价 / 结算价时,点击「加入」仍弹出:

  • 同步协议价?
  • 同步结算价?

问题原因

当前前端判断逻辑是字符串比较:

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

所以数值未变化也会误判为价格变化。

前端需要调整

只在协议价或结算价的金额数值真实变化时,才弹同步确认。

建议把金额归一化后比较,不能直接字符串比较:

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 工具统一比较,只要满足:

  • 320320.00 视为相等
  • 320.0320.00 视为相等
  • 320.01320.00 视为变化
  • 原值为空、输入也为空:不弹
  • 原值有值、输入未改:不弹
  • 原值有值、输入改成另一个金额:弹

触发口径

点击「加入」时:

  1. protocolPrice 数值变化,才弹 同步协议价?
  2. settlementPrice 数值变化,才弹 同步结算价?
  3. 两个价格都没变化,不弹任何同步价格确认,直接加入已选配房。
  4. 只改房间数、库存口径、酒店 / 房型选择,不应触发价格同步弹窗。

验收口径

  • 后端返回 protocolPrice = "320.00",前端输入框显示 320,点击「加入」不弹同步协议价。
  • 后端返回 settlementPrice = "320.00",前端输入框显示 320,点击「加入」不弹同步结算价。
  • 手动把协议价改为 321,点击「加入」弹同步协议价。
  • 手动把结算价改为 319,点击「加入」弹同步结算价。
  • 协议价和结算价都没改时,不出现任何价格同步弹窗。