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)}
)}
)}
); }