import { useState, useEffect, useCallback } from 'react'
import { Table, Button, Tag, Progress, Result, Empty, Tabs, InputNumber, Card, Skeleton, message } from 'antd'
import {
PlayCircleOutlined,
PauseCircleOutlined,
DeleteOutlined,
CheckCircleOutlined,
CloseCircleOutlined,
SyncOutlined,
} from '@ant-design/icons'
const MAX_CONCURRENT = 3
export default function BatchManager() {
const [tasks, setTasks] = useState([])
const [maxConcurrent, setMaxConcurrent] = useState(MAX_CONCURRENT)
const [loading, setLoading] = useState(true)
const [error, setError] = useState(null)
const fetchTasks = useCallback(async () => {
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 {
setLoading(false)
}
}, [])
useEffect(() => {
fetchTasks()
const interval = setInterval(fetchTasks, 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()
} 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()
} catch (err) {
message.error(err.message)
}
}
const getStatusIcon = (status) => {
switch (status) {
case 'completed':
return