refactor: monitor_web 复用 _extract_transfer_info 避免双份维护

PR #85 把转账消息解析放在了 mcp_server._extract_transfer_info(处理
snake/camel 字段名漂移 + 未知 paysubtype 兜底),但 monitor_web.py
内联重新实现了一遍 paysubtype 标签表 + camelCase fallback。

后果:将来 WeChat 新增 paysubtype 时需要两处改,容易漂。

修复:monitor_web 改为调 mcp_server._extract_transfer_info,跟
chat_export_helpers._extract_transfer_extras 走同一条路径。

UI 行为零变化:
- 已知 paysubtype 显示中文 label(同原行为)
- 未知 paysubtype 显示空串(避免"未知(paysubtype=N)"在 UI 出现)
- 字段抽取/截断逻辑不变

本地验证 OLD vs NEW 字节级一致。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
ylytdeng
2026-05-12 21:11:19 +08:00
parent f03df51561
commit eb544b2bd6

View File

@@ -1318,26 +1318,23 @@ class SessionMonitor:
'items': items, 'items': items,
} }
elif app_type == 2000: elif app_type == 2000:
# 微信转账 — paysubtype 含义为社区共识表1/3/4 跨版本一致; # 微信转账 — 复用 mcp_server 已有的解析器,单一来源避免字段漂移
# 字段名在不同版本有 snake/camel 漂移,逐个尝试 # snake/camel 大小写、未来新 paysubtype 兜底)。
info = appmsg.find('wcpayinfo') import mcp_server # 已被 chat_export_helpers 验证 import 安全
paysubtype = '' info = mcp_server._extract_transfer_info(appmsg) or {}
fee_desc = '' pay_memo = info.get('pay_memo', '')
pay_memo = '' paysubtype = info.get('paysubtype', '')
if info is not None: # 已知 paysubtype 显示中文 label未知用空串而非"未知(paysubtype=N)"
paysubtype = (info.findtext('paysubtype') or '').strip() # 避免 UI 出现内部诊断字串。日志侧若需要可看 chat history。
fee_desc = (info.findtext('feedesc') or info.findtext('feeDesc') or '').strip() direction = (info.get('paysubtype_label', '')
pay_memo = (info.findtext('pay_memo') or info.findtext('paymemo') or '').strip() if paysubtype in mcp_server._TRANSFER_PAYSUBTYPE_LABEL
direction = { else '')
'1': '发起转账', '3': '已收款', '4': '已退还',
'5': '过期已退还', '7': '待领取', '8': '已领取',
}.get(paysubtype, '')
return { return {
'type': 'transfer', 'type': 'transfer',
'title': title or '微信转账', 'title': title or '微信转账',
'direction': direction, 'direction': direction,
'paysubtype': paysubtype, 'paysubtype': paysubtype,
'fee_desc': fee_desc, 'fee_desc': info.get('fee_desc', ''),
'pay_memo': pay_memo[:200] if pay_memo else '', 'pay_memo': pay_memo[:200] if pay_memo else '',
} }
else: else: