修复时间戳继承导致新消息被误判为旧消息的问题 (Task #1685)

问题:
- OCR继承机制把旧时间戳(15:52:52)关联到新消息(17:38入库的'近期公告')
- freshness_score=-10.0,触发Task #1684的强制丢弃逻辑
- 导致新消息被误判为'陈旧历史消息'丢弃

修复:
- 区分'自身时间戳陈旧'和'继承时间戳陈旧'
- 继承时间戳的消息:检查DB是否有记录,有记录说明是新消息(刚入库),放行
- 自身时间戳陈旧的消息:保持强制丢弃逻辑

测试:
- 继承时间戳的新消息(DB有记录):放行
- 自身时间戳陈旧的旧消息(DB无记录):强制丢弃
This commit is contained in:
youpaishidifu
2026-09-02 17:46:03 +08:00
parent 7a2d99ba36
commit 027362dd29
+18 -9
View File
@@ -10893,6 +10893,9 @@ class MessageMonitor:
# - 超过1小时的消息:freshness_score == -10.0(扣10分)
# - 选择消息时分数必须>0才能处理
# - DB有记录的消息:不加分(避免重复处理)
# ⭐ Task #1685 修复: 区分"自身时间戳陈旧"和"继承时间戳陈旧"
# 继承时间戳的消息不应被强制丢弃(可能是新消息继承了旧时间戳)
_is_inherited_ts = isinstance(item, tuple) and len(item) == 2 and item[1] is not None
if freshness_score >= 5:
# ≥5分(5分钟内):直接放行,确保最终分数至少为5
old_score = score
@@ -10901,18 +10904,24 @@ class MessageMonitor:
elif freshness_score == -999.0:
# ⭐ Task #1661+#1665: 无有效时间戳(整批OCR丢失时间戳)
# 完全无法判断消息年龄,直接强制丢弃
# ⭐ 与 freshness_score < 0 统一:所有无法确认新鲜度的消息均强制丢弃
score = -100.0
logger.info(f"[{platform}] 无有效时间戳(OCR丢失?)强制丢弃: {item[:50]}")
elif freshness_score < 0:
# ⭐ Task #1684: 负分(超过1小时)→ 强制丢弃,不再仅扣10分
# 根因:短消息(+5)+疑问词(+10)可得15分,仅扣10分仍为5分>0,
# 导致数小时前的旧消息通过阈值被错误处理。
# 例:10:55发送的"什么是推广渠道违规?"在16:24被OCR读取,
# freshness_score=-10,基础分15-10=5>0 → 误回复。
# 修复:与-999.0一样强制丢弃,确保超过1小时的旧消息绝不触发回复。
score = -100.0
logger.info(f"[{platform}] 陈旧时间戳(>{abs(freshness_score)/10:.0f}h)强制丢弃: {item[:50]}")
# ⭐ Task #1684: 负分(超过1小时)→ 强制丢弃
# ⭐ Task #1685 修复: 继承时间戳的消息使用DB查重兜底,不强制丢弃
if _is_inherited_ts:
# 继承时间戳的消息:检查DB是否有记录,有记录说明是新消息
if self._msg_history and self._msg_history.has_ocr_message_record(platform, cleaned_item):
# DB有记录:说明是新消息(刚入库),继承了旧时间戳,放行
logger.info(f"[{platform}] 继承时间戳陈旧但DB有记录(新消息),放行: {item[:50]}")
else:
# DB无记录:可能是旧消息,强制丢弃
score = -100.0
logger.info(f"[{platform}] 继承时间戳陈旧且DB无记录,强制丢弃: {item[:50]}")
else:
# 自身时间戳陈旧:强制丢弃
score = -100.0
logger.info(f"[{platform}] 自身时间戳陈旧(>{abs(freshness_score)/10:.0f}h),强制丢弃: {item[:50]}")
else:
# 0-4分(10分钟-1小时):查DB决定是否加分
if self._msg_history and self._msg_history.has_ocr_message_record(platform, cleaned_item):