fix: normalize upcoming ETA keys before text override

This commit is contained in:
2026-08-02 17:11:31 +08:00
parent db818209f2
commit 426e55a7f0
2 changed files with 16 additions and 5 deletions
+4 -3
View File
@@ -14,7 +14,7 @@
|----|------------|------------|--------|----------| |----|------------|------------|--------|----------|
| A | NBT 侧生成的 `announceKey` 仍未与 `create_target` 文本键完全匹配,导致没有走文本 ETA 覆盖 | High | Low | Rejected | | A | NBT 侧生成的 `announceKey` 仍未与 `create_target` 文本键完全匹配,导致没有走文本 ETA 覆盖 | High | Low | Rejected |
| B | `create_target` 文本里解析出的 ETA 本身就是“到发后/含停站”的字段,而不是进站前 ETA | Medium | Low | Inconclusive | | B | `create_target` 文本里解析出的 ETA 本身就是“到发后/含停站”的字段,而不是进站前 ETA | Medium | Low | Inconclusive |
| C | 文本解析到了正确 ETA,但后来又被 NBT 计算值覆盖 | Medium | Low | Rejected | | C | 文本解析到了正确 ETA,但后来又被 NBT 计算值覆盖,或因为键规范化不一致而未命中覆盖 | Medium | Low | In Progress |
| D | 同一班车在 NBT 与文本中的目的地/车次格式仍有额外差异(空格、平台、后缀) | High | Low | Rejected | | D | 同一班车在 NBT 与文本中的目的地/车次格式仍有额外差异(空格、平台、后缀) | High | Low | Rejected |
| E | `create_target` 文本切分错位,把 ETA 数值丢掉了,只留下中文单位(在 CC 中显示为 `??`) | High | Low | Confirmed | | E | `create_target` 文本切分错位,把 ETA 数值丢掉了,只留下中文单位(在 CC 中显示为 `??`) | High | Low | Confirmed |
@@ -24,7 +24,8 @@
- 屏幕证据:`TXT:-1 NBT:113 USE:113` - 屏幕证据:`TXT:-1 NBT:113 USE:113`
- 屏幕证据:`ETASTR:??` - 屏幕证据:`ETASTR:??`
- 结论:文本键已匹配成功,但 `etaStr` 仅剩单位文本,数值部分在切分时被错误丢弃。 - 结论:文本键已匹配成功,但 `etaStr` 仅剩单位文本,数值部分在切分时被错误丢弃。
- 后续证据:修复切分后,`TXT:60` 但 `USE` 仍保持 NBT 值,说明文本 ETA 未稳定命中最终覆盖,需统一键规范化。
## Verification Conclusion ## Verification Conclusion
- 根因已确认:`create_target` 文本解析错误地将第一段数字当成独立字段丢掉,导致 ETA 解析只看到中文单位。 - 已确认根因 1:`create_target` 文本解析错误地将第一段数字当成独立字段丢掉,导致 ETA 解析只看到中文单位。
- 下一步修复:改为将 ETA 解析为“数值 + 单位”的组合字符串,再交给 `parseEtaText()`。 - 新增根因 2:文本键与 NBT 键需要统一规范化(空格压缩/去首尾),否则文本 ETA 无法稳定覆盖最终值。
+12 -2
View File
@@ -2417,6 +2417,16 @@ local function parseEtaText(etaStr)
return -1 return -1
end end
local function normalizeUpcomingKey(trainName, destination)
local function clean(value)
value = tostring(value or "")
value = value:gsub("%s+", " ")
value = value:match("^%s*(.-)%s*$") or ""
return value
end
return clean(trainName) .. "_" .. clean(destination)
end
function Main.loop() function Main.loop()
while true do while true do
local now = os.epoch("utc") local now = os.epoch("utc")
@@ -2462,7 +2472,7 @@ function Main.loop()
end end
local etaSeconds = parseEtaText(etaStr) local etaSeconds = parseEtaText(etaStr)
if dest then if dest then
local textKey = tName .. "_" .. dest local textKey = normalizeUpcomingKey(tName, dest)
etaByText[textKey] = etaSeconds etaByText[textKey] = etaSeconds
if not dbg.textKey then if not dbg.textKey then
dbg.textKey = textKey dbg.textKey = textKey
@@ -2555,7 +2565,7 @@ function Main.loop()
local etaTicks = realArrival - currentTick local etaTicks = realArrival - currentTick
local etaSeconds = math.floor(etaTicks / (State.tickRate or 20)) local etaSeconds = math.floor(etaTicks / (State.tickRate or 20))
if etaSeconds < 0 then etaSeconds = 0 end if etaSeconds < 0 then etaSeconds = 0 end
local announceKey = trainName .. "_" .. destination local announceKey = normalizeUpcomingKey(trainName, destination)
if not dbg.nbtKey then if not dbg.nbtKey then
dbg.nbtKey = announceKey dbg.nbtKey = announceKey
dbg.nbtEta = etaSeconds dbg.nbtEta = etaSeconds