+
+
云账单管理
+
+
+ {activeTab === 'records' && (
+
+ )}
+ {activeTab === 'alerts' && (
+
+ )}
+
+
+
+
+ {([
+ { key: 'overview', label: '概览统计' },
+ { key: 'records', label: '成本记录' },
+ { key: 'alerts', label: '预警规则' },
+ ] as const).map(tab => (
+
+ ))}
+
+
+ {activeTab === 'overview' && (
+
+ {statsLoading ? (
+
加载中...
+ ) : stats ? (
+ <>
+
+ }
+ label="今日成本"
+ value={formatCurrency(stats.today_cost || 0)}
+ trend={stats.today_cost - (stats.yesterday_cost || 0)}
+ trendLabel={`昨日 ${formatCurrency(stats.yesterday_cost || 0)}`}
+ />
+ }
+ label="本月成本"
+ value={formatCurrency(stats.month_cost || 0)}
+ />
+ }
+ label="年度成本"
+ value={formatCurrency(stats.year_cost || 0)}
+ />
+ }
+ label="活跃预警"
+ value={`${stats.alerts?.length || 0} 条`}
+ alert={stats.alerts?.length > 0}
+ />
+
+
+ {stats.alerts?.length > 0 && (
+
+
+
+ 成本预警
+
+
+ {stats.alerts.map((a: any, i: number) => (
+
+
+ {a.rule_name}
+
+ {a.provider} · {a.metric === 'daily' ? '日' : '月'}成本
+
+
+
+ 当前 {formatCurrency(a.current)}
+ {' '}{a.operator}{' '}
+ 阈值 {formatCurrency(a.threshold)}
+
+
+ ))}
+
+
+ )}
+
+
+
+ 近 30 天成本趋势
+
+
+
+
+
+
+ 本月厂商成本分布
+ {(stats.provider_dist || []).length === 0 ? (
+ 暂无数据
+ ) : (
+
+
+ {stats.provider_dist.map((p: any, i: number) => (
+
+ {p.percent > 8 ? (providerLabels[p.provider] || p.provider) : ''}
+
+ ))}
+
+
+ {stats.provider_dist.map((p: any, i: number) => (
+
+
+
+
{providerLabels[p.provider] || p.provider}
+
+
+ {formatCurrency(p.cost)}
+ {p.percent.toFixed(1)}%
+
+
+ ))}
+
+
+ )}
+
+
+ >
+ ) : null}
+
+ )}
+
+ {activeTab === 'records' && (
+
+
+
+
+
+
+
+
+ setFilterStart(e.target.value)} />
+
+
+
+ setFilterEnd(e.target.value)} />
+
+
+
+
+ {recordsLoading ? (
+
加载中...
+ ) : records.length === 0 ? (
+
+ ) : (
+
+
+
+
+ | 日期 |
+ 厂商 |
+ 服务 |
+ 区域 |
+ 账号 |
+ 费用 |
+ 说明 |
+ 操作 |
+
+
+
+ {records.map((r) => (
+
+ | {r.billing_date} |
+
+
+
+ {providerLabels[r.provider] || r.provider}
+
+ |
+ {r.service || '-'} |
+ {r.region || '-'} |
+ {r.account_name || '-'} |
+ {formatCurrency(r.cost)} |
+ {r.description || '-'} |
+
+
+
+
+
+ |
+
+ ))}
+
+
+
+ )}
+
+ )}
+
+ {activeTab === 'alerts' && (
+
+ {rulesLoading ? (
+
加载中...
+ ) : rules.length === 0 ? (
+
+ ) : (
+
+ {rules.map((r) => (
+
+
+
+
+
+ {r.name}
+
+
handleToggleRule(r.id)} />
+
+
+
+ 厂商
+ {r.provider ? (providerLabels[r.provider] || r.provider) : '全部'}
+
+
+ 指标
+ {r.metric === 'daily' ? '日成本' : '月累计'}
+
+
+ 阈值
+ {r.operator} {formatCurrency(r.threshold)}
+
+ {r.last_triggered && (
+
+ 最后触发
+ {new Date(r.last_triggered).toLocaleString('zh-CN')}
+
+ )}
+
+
+
+
+
+
+
+ ))}
+
+ )}
+
+ )}
+
+
+
+
+
+ );
+}
+
+function StatCard({ icon, label, value, trend, trendLabel, alert }: {
+ icon: React.ReactNode;
+ label: string;
+ value: string;
+ trend?: number;
+ trendLabel?: string;
+ alert?: boolean;
+}) {
+ return (
+