import React from 'react'; import { Box, Card, CardContent, Grid, Typography, Stack, useTheme, alpha } from '@mui/material'; import { Storage as StorageIcon, Balance as BalanceIcon, Bolt as BoltIcon, AccessTime as AccessTimeIcon } from '@mui/icons-material'; import { useTranslation } from 'react-i18next'; function StatCard({ title, value, subValue, icon: Icon, color }) { const theme = useTheme(); return ( {title} {value} {subValue && ( {subValue} )} ); } export default function StatsCards({ data }) { const theme = useTheme(); const { t } = useTranslation(); // 格式化数字 const formatNumber = num => { if (num >= 1000000) return `${(num / 1000000).toFixed(1)}M`; if (num >= 1000) return `${(num / 1000).toFixed(1)}K`; return num; }; return ( {/* 总 Token 消耗 */} {/* 平均 Token 消耗/次 */} {/* 总调用次数 */} {t('monitoring.stats.successCalls', { count: formatNumber(data.successCalls) })} · {t('monitoring.stats.failedCalls', { count: formatNumber(data.failedCalls) })} {data.totalCalls > 0 && ( ({t('monitoring.stats.failureRate', { rate: ((data.failureRate || 0) * 100).toFixed(1) })}) )} } icon={BoltIcon} color={theme.palette.success.main} /> {/* 平均响应耗时 */} 0 ? t('monitoring.stats.basedOnSuccessCalls', { count: formatNumber(data.successCalls) }) : t('monitoring.stats.noSuccessCalls') } icon={AccessTimeIcon} color={theme.palette.warning.main} /> ); }