import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card';
import { Spinner } from '@/components/ui/spinner';
import { Button } from '@/components/ui/button';
import { CheckCircle, XCircle, RotateCw } from 'lucide-react';
import { formatMs } from '../utils';
interface AnalysisRecord {
type: string;
name: string;
status: 'pending' | 'running' | 'done' | 'error';
start_ts?: string;
end_ts?: string;
duration_ms?: number;
tokens?: {
prompt_tokens: number;
completion_tokens: number;
total_tokens: number;
};
error?: string;
}
interface ExecutionDetailsProps {
financials: any;
isLoading: boolean;
error: any;
analysisRecords: AnalysisRecord[];
currentAnalysisTask: string | null;
totalElapsedMs: number;
retryAnalysis: (type: string) => void;
}
export function ExecutionDetails({
financials,
isLoading,
error,
analysisRecords,
currentAnalysisTask,
totalElapsedMs,
retryAnalysis,
}: ExecutionDetailsProps) {
return (
执行详情
{/* 执行概况卡片 */}
{financials && (
执行概况
{/* 财务数据状态 */}
{isLoading ? (
) : error ? (
) : (
)}
财务数据
{financials?.meta && (
耗时: {formatMs(financials.meta.elapsed_ms)}
API调用: {financials.meta.api_calls_total} 次
开始时间: {financials.meta.started_at}
{financials.meta.finished_at && (
结束时间: {financials.meta.finished_at}
)}
)}
{/* 分析任务状态 */}
{analysisRecords.length > 0 && (
分析任务
{analysisRecords.map((record, idx) => (
{record.status === 'running' && }
{record.status === 'done' && }
{record.status === 'error' && }
{record.name}
{record.status === 'running' ? '运行中' : record.status === 'done' ? '已完成' : record.status === 'error' ? '失败' : '待继续'}
{record.status === 'error' && (
)}
{record.duration_ms !== undefined && (
耗时: {formatMs(record.duration_ms)}
)}
{record.tokens && (
Token: {record.tokens.total_tokens}
(Prompt: {record.tokens.prompt_tokens},
Completion: {record.tokens.completion_tokens})
)}
{record.error && (
错误: {record.error}
)}
))}
)}
{/* 总体统计 */}
总体统计
总耗时: {formatMs(totalElapsedMs)}
{financials?.meta?.steps && (
财务数据完成步骤: {(financials.meta.steps as any[]).filter((s: any) => s?.status === 'done').length}/{(financials.meta.steps as any[]).length}
)}
{analysisRecords.length > 0 && (
<>
分析任务: {analysisRecords.filter(r => r.status === 'done').length}/{analysisRecords.length} 已完成
总Token消耗: {analysisRecords.reduce((sum, r) => sum + (r.tokens?.total_tokens || 0), 0)}
>
)}
)}
);
}