diff --git a/web/storyforge-web-v4/assets/app.js b/web/storyforge-web-v4/assets/app.js index 98f1756..278c52f 100644 --- a/web/storyforge-web-v4/assets/app.js +++ b/web/storyforge-web-v4/assets/app.js @@ -3949,6 +3949,44 @@ function renderTenantQuotaPanel() { } const categories = usage?.categories || {}; const recentItems = safeArray(usage?.recent_items); + const categoryEntries = Object.values(categories || {}).sort((left, right) => (right?.cost_cents || 0) - (left?.cost_cents || 0)); + const topCategory = categoryEntries[0] || null; + const hasHardLimit = Boolean( + (quota?.monthly_budget_cents || 0) > 0 || + (quota?.storage_limit_bytes || 0) > 0 || + (quota?.analysis_quota || 0) > 0 || + (quota?.copy_quota || 0) > 0 || + (quota?.ai_video_quota || 0) > 0 || + (quota?.real_cut_quota || 0) > 0 || + (quota?.recorder_quota || 0) > 0 + ); + const usageCount = recentItems.length; + const quotaTaskTitle = quota?.storage_over_limit + ? "先处理存储超限" + : quota?.enabled === false + ? "先恢复额度保护" + : !hasHardLimit + ? "先补项目额度策略" + : usageCount + ? "先检查本周期消耗" + : "先跑出第一条计量"; + const quotaTaskSummary = quota?.storage_over_limit + ? "当前项目已经命中存储上限,先调整额度或清理产物,再继续高成本动作。" + : quota?.enabled === false + ? "额度保护已关闭,当前项目会按无限制模式运行,建议尽快恢复预算与动作保护。" + : !hasHardLimit + ? "当前项目虽然可继续运行,但还没有预算和动作配额,先把保护线补齐更稳。" + : usageCount + ? "本周期已经开始消耗额度,先看最主要的消耗来源,再决定是否收紧策略。" + : "额度已经建好,但当前周期还没有实际计量,先触发一次真实动作更容易校准策略。"; + const quotaTaskActionLabel = quota?.storage_over_limit || !hasHardLimit || quota?.enabled === false ? "调整额度" : usageCount ? "查看最近计量" : "去跑动作"; + const quotaTaskAction = quotaTaskActionLabel === "去跑动作" ? "goto-production" : quotaTaskActionLabel === "查看最近计量" ? "" : "open-tenant-quota"; + const usagePeriodLabel = usage?.cycle_start ? formatDateTime(usage.cycle_start).slice(0, 10) : "本周期"; + const quotaHealthTags = [ + quota?.enabled === false ? `额度保护关闭` : `额度保护开启`, + quota?.storage_over_limit ? `存储超限` : `存储正常`, + topCategory ? `${escapeHtml(`主要消耗 ${topCategory.category || "usage"}`)}` : `本周期未产生消耗` + ]; const cards = [ { label: "预算", value: `${formatNumber((quota?.monthly_budget_cents || 0) / 100)} 元`, sub: `已用 ${formatNumber((usage?.total_cost_cents || 0) / 100)} 元` }, { label: "分析配额", value: formatNumber(quota?.analysis_quota || 0), sub: `已用 ${formatNumber(categories.analysis?.quantity || 0)}` }, @@ -3959,22 +3997,36 @@ function renderTenantQuotaPanel() { ]; return `
${escapeHtml(reviewTaskSummary)}
+