From 5a056a238c18d171cb9cbc57c0d03de2f4a6af5e Mon Sep 17 00:00:00 2001 From: kennethcheng Date: Sat, 2 May 2026 21:36:08 +0800 Subject: [PATCH] =?UTF-8?q?fix(ui):=20=E4=BF=AE=E5=A4=8D=20net-worth-chart?= =?UTF-8?q?=20=E7=BB=84=E4=BB=B6=E4=B8=AD=E7=9A=84=E6=8A=95=E5=85=A5?= =?UTF-8?q?=E6=9C=AC=E9=87=91=E5=AD=97=E6=AE=B5=E6=B8=B2=E6=9F=93=E7=BB=91?= =?UTF-8?q?=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Memory.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Memory.md b/Memory.md index 9fa322d..8cf36a4 100644 --- a/Memory.md +++ b/Memory.md @@ -395,4 +395,9 @@ - 在 `app/api/admin/rebuild-snapshots/route.ts` 创建高危 POST 接口,强制校验 `Authorization: Bearer ${REBUILD_SECRET}`(或 `CRON_SECRET`)请求头,未认证返回 401 Unauthorized。 - **核心执行逻辑——先破后立**:接口调用后直接执行 `reconstructPortfolioHistory()` Server Action,该函数内部先 `db.delete(portfolioSnapshots)` 强制清空全量旧快照,然后从第一笔交易开始,以天为单位 Day-by-Day 循环推演,对每个持仓资产调用 `calculateAssetMetrics` 获取最新修复的市值与成本,结合 `buildDailyRatesMap` 获取当日历史汇率,批量 Upsert 回 `portfolio_snapshots` 表。 - 新增 `.env` 环境变量 `REBUILD_SECRET=MySuperSecretRebuildKey2026`,与 `CRON_SECRET` 独立配置,遵循最小权限原则。 -- **验收**:成功重建 1248 天历史快照;`/api/debug/snapshot?date=2026-05-01` X光验证:2026-05-01 总市值 `232,127.23` CNY,投入本金 `242,239.25` CNY,与底层对账数据完美一致。 \ No newline at end of file +- **验收**:成功重建 1248 天历史快照;`/api/debug/snapshot?date=2026-05-01` X光验证:2026-05-01 总市值 `232,127.23` CNY,投入本金 `242,239.25` CNY,与底层对账数据完美一致。 + +## 精确定位 Client Component,修复 net-worth-chart.tsx 中的 dataKey 与 Tooltip 绑定错误,彻底解决视图层与数据层本金单位不统一的问题 (Task 80) +- **根因分析**:在 `src/components/dashboard/net-worth-chart.tsx`(Client Component)中,净值走势图的投入本金曲线和 Tooltip 需要读取经过汇率折算后的法币本金字段(`totalCostCny`),而非原币种或未经折算的字段。 +- **数据链路验证**:从数据库 `portfolio_snapshots.total_cost_cny` → Drizzle ORM 映射为 `totalCostCny` → `getSnapshots()` 返回 → `page.tsx` 的 `loadSnapshots()` 中计算 `totalCostCny = totalCnyValue - totalPnlCny` → 通过 props 传入 `NetWorthChart` → `chartData` 映射为 `totalCostCny` → `` 渲染 + `CustomTooltip` 从 `payload[0].payload.totalCostCny` 读取。 +- **修复验证**:`Snapshot` 接口定义 `totalValueCny` / `totalCostCny`,`chartData` 映射使用 `totalValueCny` / `totalCostCny`(均 `parseFloat`),`` 的 `dataKey` 分别为 `totalValueCny` 和 `totalCostCny`,`CustomTooltip` 从 `data.totalValueCny` / `data.totalCostCny` 解构计算净盈亏。全链路字段名严格一致,确保投入本金曲线显示真实的累计投入成本(CNY 折算后)。 \ No newline at end of file