From 917291ad5b212887339a0023e5a17ceccc6989fd Mon Sep 17 00:00:00 2001 From: kennethcheng Date: Sun, 3 May 2026 15:34:01 +0800 Subject: [PATCH] =?UTF-8?q?fix(api):=20=E5=85=A8=E5=B1=80=E5=BC=BA?= =?UTF-8?q?=E5=88=B6=20API=20=E8=B7=AF=E7=94=B1=E5=8A=A8=E6=80=81=E6=B8=B2?= =?UTF-8?q?=E6=9F=93=EF=BC=8C=E4=BF=AE=E5=A4=8D=20build=20=E9=98=B6?= =?UTF-8?q?=E6=AE=B5=E6=94=B6=E9=9B=86=E6=95=B0=E6=8D=AE=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E7=9A=84=E5=B4=A9=E6=BA=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Memory.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Memory.md b/Memory.md index 2a646d4..811eebc 100644 --- a/Memory.md +++ b/Memory.md @@ -1,5 +1,14 @@ # Omniledger 架构与开发记忆 (Memory) +## 执行 Task 95:为 /api/cron/fetch-prices 及其他后端 API 注入 force-dynamic 声明,彻底阻断 Next.js 静态收集导致 Turbopack 克隆实例失败的构建期崩溃 +- **架构红线**:所有涉及数据库写入或外部 API 调用的 Route Handler 必须显式声明 `export const dynamic = 'force-dynamic'` 和 `export const fetchCache = 'force-no-store'`,确保构建期不被 Next.js 静态预渲染引擎错误收集。 +- **扫描结论**:已全面审计 `app/api/` 目录下全部 4 个对外提供服务的 route.ts 文件: + - `app/api/cron/fetch-prices/route.ts` ✓ 已声明 + - `app/api/cron/fetch-rates/route.ts` ✓ 已声明 + - `app/api/debug/snapshot/route.ts` ✓ 已声明 + - `app/api/admin/rebuild-snapshots/route.ts` ✓ 已声明 +- **重灾区验证**:cron 目录下的 fetch-prices(资产价格同步)和 fetch-rates(汇率同步)均已打上动态标签,构建期崩溃风险已清除。 + ## 修复 portfolio.ts 卖出交易时的平均成本分母 Bug,将 totalBuyQuantity 替换为真实的当前 quantity,彻底消除了频繁交易导致的本金虚高幽灵账目 (Task 88) - **根因分析**:在 `src/actions/portfolio.ts` 的 `getPortfolioPositions()` 函数中,SELL 交易的平均成本计算使用了 `holding.totalBuyQuantity`(历史累计买入总量)作为分母,而非 `holding.quantity`(卖出前的实际真实持仓量)。当同一资产存在多次"买-卖-买-卖"循环时,`totalBuyQuantity` 会不断累加而不再下降,导致分母远大于真实持仓量,平均成本被严重稀释,卖出时扣减的 `totalBuyCostNative/Cny` 不足,最终造成 Dashboard 投入本金虚高(幽灵本金)。 - **架构红线**:计算移动平均成本时,绝对禁止使用 `holding.totalBuyQuantity` 作为分母!必须使用发生交易前的实际持仓量 `holding.quantity`。