From 2570144112a1036de3ce8ee71a5446c7f67c7058 Mon Sep 17 00:00:00 2001 From: kennethcheng Date: Sat, 2 May 2026 14:17:26 +0800 Subject: [PATCH] =?UTF-8?q?fix(api):=20=E7=A7=BB=E9=99=A4=E8=A1=8C?= =?UTF-8?q?=E6=83=85=E8=AF=B7=E6=B1=82=E7=9A=84=20s=5F=20=E5=89=8D?= =?UTF-8?q?=E7=BC=80=EF=BC=8C=E5=BC=BA=E5=88=B6=E8=8E=B7=E5=8F=96=E5=85=A8?= =?UTF-8?q?=E9=87=8F=E6=95=B0=E6=8D=AE=E4=BB=A5=E4=BF=AE=E5=A4=8D=E6=97=A5?= =?UTF-8?q?=E6=9C=9F=E7=BC=BA=E5=A4=B1=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Memory.md | 9 +++++++++ app/api/cron/fetch-prices/route.ts | 2 +- src/actions/market.ts | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Memory.md b/Memory.md index cafe881..9d0f68c 100644 --- a/Memory.md +++ b/Memory.md @@ -1,5 +1,14 @@ # Omniledger 架构与开发记忆 (Memory) +## 修复腾讯行情接口 URL 拼接逻辑,剔除导致数据残缺的 s_ (简易版) 前缀,确保所有市场强制获取包含时间戳的全量报文 (Task 67) +- 在 `app/api/cron/fetch-prices/route.ts` 的 `fetchStockPrice()` 函数与 `src/actions/market.ts` 的 `getTencentSymbol()` 函数中,将美股资产的前缀映射从 `'s_us'` 强制重构为 `'us'`。 +- **根因分析:** 腾讯财经 gtimg 接口使用 `s_us` 前缀时返回的是"简易版"报文(仅 ~10 个字段),缺失 Index 30 的日期时间字段;使用 `us` 前缀时返回"全量版"报文(60+ 个字段),包含完整的交易时间戳 `2026-05-01 16:00:06`。 +- 修改前的错误拼接:`https://sqt.gtimg.cn/q=s_usGOOG` → 10 字段,无日期 → 触发 `[Date Parse Fatal Error]`。 +- 修改后的正确拼接:`https://sqt.gtimg.cn/q=usGOOG` → 60+ 字段,Index 30 含日期 → `parseMarketDate()` 成功解析 `2026-05-01`。 +- 其他市场前缀保持不变:港股 `hk` (如 `hk01810`)、A股沪市 `sh` (如 `sh600009`)、A股深市 `sz` (如 `sz002594`)。 +- **验证:** `curl` 对比 `s_usGOOG` (10字段) vs `usGOOG` (60+字段),Cron 接口成功同步 21 条记录,0 失败,控制台无任何 `[Date Parse Fatal Error]` 报错,美股日期正确解析为 `2026-05-01`。 + + ## 部署防弹级 parseMarketDate 解析引擎,增加 payload 脏前缀清洗逻辑,彻底解决美股日期解析崩溃触发 fallback 的幽灵 Bug (Task 66) - 在 `app/api/cron/fetch-prices/route.ts` 中一字不差地替换 `parseMarketDate(rawString: string)` 为工业级防污染版本。 - **核心修复:** 新增 `payload.includes('="')` 脏前缀清洗逻辑,从腾讯 gtimg 原始响应中提取 `="` 之后的纯净数据段,剔除结尾 `";`,从根本上消除 `v_usGOOG="...` 前缀导致的数组偏移与数据污染风险。 diff --git a/app/api/cron/fetch-prices/route.ts b/app/api/cron/fetch-prices/route.ts index 963845f..e52bc23 100644 --- a/app/api/cron/fetch-prices/route.ts +++ b/app/api/cron/fetch-prices/route.ts @@ -71,7 +71,7 @@ async function fetchStockPrice(asset: { symbol: string; exchange: string | null break; case 'US': default: - tCode = 's_us' + cleanSymbol; + tCode = 'us' + cleanSymbol; break; } diff --git a/src/actions/market.ts b/src/actions/market.ts index 65d8a1a..9c4912b 100644 --- a/src/actions/market.ts +++ b/src/actions/market.ts @@ -15,7 +15,7 @@ function getTencentSymbol(asset: { symbol: string; exchange: string | null }): s case 'SZSE': return 'sz' + cleanSymbol; case 'HKEX': return 'hk' + cleanSymbol; case 'US': - default: return 's_us' + cleanSymbol; + default: return 'us' + cleanSymbol; } }