From 540ad7899097dc7a08682f5f15b73bd88edca646 Mon Sep 17 00:00:00 2001 From: kennethcheng Date: Sat, 2 May 2026 21:16:03 +0800 Subject: [PATCH] =?UTF-8?q?fix(ui):=20=E4=BF=AE=E5=A4=8D=E8=B5=B0=E5=8A=BF?= =?UTF-8?q?=E5=9B=BE=E6=8A=95=E5=85=A5=E6=9C=AC=E9=87=91=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E6=98=A0=E5=B0=84=EF=BC=8C=E8=A7=A3=E5=86=B3=E6=9C=AA=E6=8A=98?= =?UTF-8?q?=E7=AE=97=E6=9C=AC=E5=B8=81=E6=95=B0=E6=8D=AE=E8=AF=AF=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Memory.md | 8 ++++++++ app/dashboard/page.tsx | 5 +++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Memory.md b/Memory.md index e88f591..9fa322d 100644 --- a/Memory.md +++ b/Memory.md @@ -198,6 +198,14 @@ ## 修复记录 +## 修复大盘走势图的字段绑定错误,将投入本金的渲染变量从总市值 (totalCnyValue) 修正为折算后的法币本金 (totalCnyValue - totalPnlCny),实现前后端财务数据的最终对齐 (Task 79) +- **根因分析**:在 `app/dashboard/page.tsx` 的 `loadSnapshots()` 函数中(第 172-192 行),今日快照的 `totalCostCny` 被错误地赋值为 `summary.totalCnyValue`(总市值),导致走势图中的"投入本金"曲线与"总市值"曲线完全重合。 +- **具体修复**: + - 在 `getPortfolioSummary()` 返回的汇总数据中新增 `totalCostCny` 的推导计算:`totalCostCny = totalCnyValue - totalPnlCny`(投入本金 = 总市值 - 累计盈亏)。 + - 将 `lastSnapshot.totalCostCny` 和 `data.push({ totalCostCny: ... })` 两处错误赋值修正为使用该推导值。 +- **验收**:鼠标悬浮在历史节点上,Tooltip 里的"投入本金"显示真实的累计投入成本(如 ¥5094.59),而非虚高的总市值(如 ¥704.65),净盈亏百分比回归正常比例。 +- **影响范围**:`app/dashboard/page.tsx` 的 `loadSnapshots()` 函数(`src/components/dashboard/net-worth-chart.tsx` 组件本身已正确使用 `totalCostCny`,无需修改)。 + ## 修复行情解析引擎的正则匹配规则,增加对 [.\-] 等特殊字符的支持,解决 BRK.B 等特殊股票代码解析失败导致现价归零的 Bug (Task 62) - 修复了 `src/actions/market.ts` 中 `getTencentSymbol()` 函数的 `cleanSymbol` 正则过滤逻辑:将 `/[^0-9A-Z]/g` 升级为 `/[^0-9A-Z.\-]/g`,保留小数点 `.` 和连字符 `-`。 - 修复了 `app/api/cron/fetch-prices/route.ts` 中 `fetchStockPrice()` 函数的同名正则过滤逻辑,保持一致。 diff --git a/app/dashboard/page.tsx b/app/dashboard/page.tsx index 60ed2ef..bbd6d8c 100644 --- a/app/dashboard/page.tsx +++ b/app/dashboard/page.tsx @@ -175,15 +175,16 @@ export default function DashboardPage() { const summary = await getPortfolioSummary(); const data = await getSnapshots(); const todayStr = new Date().toISOString().slice(0, 10); + const totalCostCny = new Big(summary.totalCnyValue).minus(new Big(summary.totalPnlCny)).toString(); const lastSnapshot = data[data.length - 1]; if (lastSnapshot && lastSnapshot.date === todayStr) { lastSnapshot.totalValueCny = summary.totalCnyValue; - lastSnapshot.totalCostCny = summary.totalCnyValue; + lastSnapshot.totalCostCny = totalCostCny; } else { data.push({ date: todayStr, totalValueCny: summary.totalCnyValue, - totalCostCny: summary.totalCnyValue, + totalCostCny, }); } setSnapshots(data);