150 lines
3.8 KiB
JavaScript
150 lines
3.8 KiB
JavaScript
|
|
'use client';
|
||
|
|
|
||
|
|
import { useState, useEffect, useCallback } from 'react';
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 评估任务列表 Hook
|
||
|
|
*/
|
||
|
|
export default function useEvalTasks(projectId) {
|
||
|
|
const [tasks, setTasks] = useState([]);
|
||
|
|
const [loading, setLoading] = useState(true);
|
||
|
|
const [error, setError] = useState('');
|
||
|
|
const [page, setPage] = useState(1);
|
||
|
|
const [pageSize, setPageSize] = useState(12);
|
||
|
|
const [total, setTotal] = useState(0);
|
||
|
|
|
||
|
|
// 加载任务列表
|
||
|
|
const loadTasks = useCallback(
|
||
|
|
async (isRefresh = false) => {
|
||
|
|
if (!projectId) return;
|
||
|
|
|
||
|
|
try {
|
||
|
|
if (!isRefresh) setLoading(true);
|
||
|
|
setError('');
|
||
|
|
const response = await fetch(`/api/projects/${projectId}/eval-tasks?page=${page}&pageSize=${pageSize}`);
|
||
|
|
const result = await response.json();
|
||
|
|
|
||
|
|
if (result.code === 0) {
|
||
|
|
setTasks(result.data.items || []);
|
||
|
|
setTotal(result.data.total || 0);
|
||
|
|
} else {
|
||
|
|
setError(result.error || '加载失败');
|
||
|
|
}
|
||
|
|
} catch (err) {
|
||
|
|
console.error('加载评估任务失败:', err);
|
||
|
|
setError('加载失败');
|
||
|
|
} finally {
|
||
|
|
if (!isRefresh) setLoading(false);
|
||
|
|
}
|
||
|
|
},
|
||
|
|
[projectId, page, pageSize]
|
||
|
|
);
|
||
|
|
|
||
|
|
// 初始加载和分页变化加载
|
||
|
|
useEffect(() => {
|
||
|
|
loadTasks();
|
||
|
|
}, [loadTasks]);
|
||
|
|
|
||
|
|
// 自动刷新进行中的任务
|
||
|
|
useEffect(() => {
|
||
|
|
const hasProcessingTasks = tasks.some(t => t.status === 0);
|
||
|
|
if (!hasProcessingTasks) return;
|
||
|
|
|
||
|
|
const interval = setInterval(() => loadTasks(true), 5000);
|
||
|
|
return () => clearInterval(interval);
|
||
|
|
}, [tasks, loadTasks]);
|
||
|
|
|
||
|
|
// 删除任务
|
||
|
|
const deleteTask = useCallback(
|
||
|
|
async taskId => {
|
||
|
|
try {
|
||
|
|
const response = await fetch(`/api/projects/${projectId}/eval-tasks/${taskId}`, {
|
||
|
|
method: 'DELETE'
|
||
|
|
});
|
||
|
|
const result = await response.json();
|
||
|
|
|
||
|
|
if (result.code === 0) {
|
||
|
|
loadTasks();
|
||
|
|
return true;
|
||
|
|
} else {
|
||
|
|
setError(result.error || '删除失败');
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
} catch (err) {
|
||
|
|
console.error('删除任务失败:', err);
|
||
|
|
setError('删除失败');
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
},
|
||
|
|
[projectId]
|
||
|
|
);
|
||
|
|
|
||
|
|
// 中断任务
|
||
|
|
const interruptTask = useCallback(
|
||
|
|
async taskId => {
|
||
|
|
try {
|
||
|
|
const response = await fetch(`/api/projects/${projectId}/eval-tasks/${taskId}`, {
|
||
|
|
method: 'PUT',
|
||
|
|
headers: { 'Content-Type': 'application/json' },
|
||
|
|
body: JSON.stringify({ action: 'interrupt' })
|
||
|
|
});
|
||
|
|
const result = await response.json();
|
||
|
|
|
||
|
|
if (result.code === 0) {
|
||
|
|
loadTasks();
|
||
|
|
return true;
|
||
|
|
} else {
|
||
|
|
setError(result.error || '中断失败');
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
} catch (err) {
|
||
|
|
console.error('中断任务失败:', err);
|
||
|
|
setError('中断失败');
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
},
|
||
|
|
[projectId, loadTasks]
|
||
|
|
);
|
||
|
|
|
||
|
|
// 创建任务
|
||
|
|
const createTasks = useCallback(
|
||
|
|
async data => {
|
||
|
|
try {
|
||
|
|
const response = await fetch(`/api/projects/${projectId}/eval-tasks`, {
|
||
|
|
method: 'POST',
|
||
|
|
headers: { 'Content-Type': 'application/json' },
|
||
|
|
body: JSON.stringify(data)
|
||
|
|
});
|
||
|
|
const result = await response.json();
|
||
|
|
|
||
|
|
if (result.code === 0) {
|
||
|
|
loadTasks();
|
||
|
|
return { success: true, data: result.data };
|
||
|
|
} else {
|
||
|
|
return { success: false, error: result.error };
|
||
|
|
}
|
||
|
|
} catch (err) {
|
||
|
|
console.error('创建任务失败:', err);
|
||
|
|
return { success: false, error: '创建失败' };
|
||
|
|
}
|
||
|
|
},
|
||
|
|
[projectId, loadTasks]
|
||
|
|
);
|
||
|
|
|
||
|
|
return {
|
||
|
|
tasks,
|
||
|
|
loading,
|
||
|
|
error,
|
||
|
|
setError,
|
||
|
|
loadTasks,
|
||
|
|
deleteTask,
|
||
|
|
interruptTask,
|
||
|
|
createTasks,
|
||
|
|
page,
|
||
|
|
setPage,
|
||
|
|
pageSize,
|
||
|
|
setPageSize,
|
||
|
|
total
|
||
|
|
};
|
||
|
|
}
|