import { useState, useEffect, useCallback, useMemo } from 'react'
import { Table, Button, Progress, Result, Card, message, Popconfirm, Tooltip } from 'antd'
import { DeleteOutlined, CopyOutlined, SyncOutlined } from '@ant-design/icons'
import ContractCues from '../components/ContractCues'
import DecisionBadge from '../components/DecisionBadge'
import { StatusIcon, StatusTag } from '../components/StatusIcon'
import { getDecision, getErrorMessage } from '../utils/contractView'
export default function BatchManager() {
const [tasks, setTasks] = useState([])
const [loading, setLoading] = useState(true)
const [error, setError] = useState(null)
const fetchTasks = useCallback(async (showLoading = true) => {
if (showLoading) setLoading(true)
try {
const res = await fetch('/api/analysis/tasks')
if (!res.ok) throw new Error('获取任务列表失败')
const data = await res.json()
setTasks(data.tasks || [])
setError(null)
} catch (err) {
setError(err.message)
} finally {
if (showLoading) setLoading(false)
}
}, [])
useEffect(() => {
fetchTasks(true)
const interval = setInterval(() => fetchTasks(false), 5000)
return () => clearInterval(interval)
}, [fetchTasks])
const handleCancel = async (taskId) => {
try {
const res = await fetch(`/api/analysis/cancel/${taskId}`, { method: 'DELETE' })
if (!res.ok) throw new Error('取消失败')
message.success('任务已取消')
fetchTasks(false)
} catch (err) {
message.error(err.message)
}
}
const handleRetry = async (taskId) => {
const task = tasks.find(t => t.task_id === taskId)
if (!task) return
try {
const res = await fetch('/api/analysis/start', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ ticker: task.ticker }),
})
if (!res.ok) throw new Error('重试失败')
message.success('任务已重新提交')
fetchTasks(false)
} catch (err) {
message.error(err.message)
}
}
const handleCopyTaskId = (taskId) => {
navigator.clipboard.writeText(taskId).then(() => {
message.success('已复制任务ID')
}).catch(() => {
message.error('复制失败')
})
}
const columns = useMemo(() => [
{
title: '状态',
key: 'status',
width: 110,
render: (_, record) => (
<>