diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d473fb..2cb4f9d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ ## 2026-04-07 +### 修复额度页套餐建议引起的全局渲染报错 + +- `额度` 页面现在会先初始化 `packageRecommendation` 再渲染套餐建议,不再因为变量未定义把整个工作台渲染链打断。 +- 这次修复直接解决了公网页面点击 `AI 视频` 等直执行动作后被额度页报错拦住的问题,控制台已经恢复为无报错状态。 +- 对应前端回归也补了一条更硬的断言,锁住 `renderCreditsScreen()` 对套餐建议变量的初始化。 + ### 额度策略开始按真实用量给出套餐建议 - `租户额度与审计` 和 `额度` 工作区现在会根据当前项目最近的预算消耗、视频动作量、文案动作量和存储使用,直接给出 `试用 / 增长 / 规模 / 自定义` 的套餐建议。 diff --git a/web/storyforge-web-v4/assets/app.js b/web/storyforge-web-v4/assets/app.js index 17c6e05..b229f27 100644 --- a/web/storyforge-web-v4/assets/app.js +++ b/web/storyforge-web-v4/assets/app.js @@ -8184,6 +8184,10 @@ function renderCreditsScreen() { const usage = appState.tenantUsage || quota?.usage || {}; const categories = usage?.categories || {}; const forecast = getTenantQuotaForecastValues(quota || {}, usage); + const packageRecommendation = getTenantQuotaPackageRecommendation({ + ...(quota || {}), + package_label: quota?.config?.package_label || "custom" + }, usage); const estimatedVideoUsage = (categories.ai_video?.quantity || 0) + (categories.real_cut?.quantity || 0); const budgetAmount = (quota?.monthly_budget_cents || usage?.total_cost_cents || 0) / 100; const usedAmount = (usage?.total_cost_cents || 0) / 100; diff --git a/web/storyforge-web-v4/tests/workbench-pages.test.mjs b/web/storyforge-web-v4/tests/workbench-pages.test.mjs index 55e58c1..5a42d17 100644 --- a/web/storyforge-web-v4/tests/workbench-pages.test.mjs +++ b/web/storyforge-web-v4/tests/workbench-pages.test.mjs @@ -331,6 +331,7 @@ test("quota and review screens foreground live next-step guidance", () => { assert.match(tenantQuota, /renderTenantQuotaForecastTags\(quota \|\| \{\}, usage\)/); assert.match(tenantQuota, /packageRecommendation\.title/); assert.match(credits, /renderTenantQuotaForecastTags\(quota \|\| \{\}, usage\)/); + assert.match(credits, /const packageRecommendation = getTenantQuotaPackageRecommendation\(/); assert.match(credits, /

套餐建议<\/h4>/); assert.match(credits, /packageRecommendation\.summary/); assert.match(credits, /剩余 \${escapeHtml\(formatNumber\(forecast\.remainingBudgetCents \/ 100\)\)} 元/);