2.6 KiB
2.6 KiB
房务配房价格同步弹窗误触发(前端待处理)
背景
房务「选择酒店」弹窗中,后端候选接口已经返回房型级价格:
roomTypes[].protocolPriceroomTypes[].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 工具统一比较,只要满足:
320和320.00视为相等320.0和320.00视为相等320.01和320.00视为变化- 原值为空、输入也为空:不弹
- 原值有值、输入未改:不弹
- 原值有值、输入改成另一个金额:弹
触发口径
点击「加入」时:
protocolPrice数值变化,才弹同步协议价?settlementPrice数值变化,才弹同步结算价?- 两个价格都没变化,不弹任何同步价格确认,直接加入已选配房。
- 只改房间数、库存口径、酒店 / 房型选择,不应触发价格同步弹窗。
验收口径
- 后端返回
protocolPrice = "320.00",前端输入框显示320,点击「加入」不弹同步协议价。 - 后端返回
settlementPrice = "320.00",前端输入框显示320,点击「加入」不弹同步结算价。 - 手动把协议价改为
321,点击「加入」弹同步协议价。 - 手动把结算价改为
319,点击「加入」弹同步结算价。 - 协议价和结算价都没改时,不出现任何价格同步弹窗。