first-update
This commit is contained in:
@@ -0,0 +1,171 @@
|
||||
import { NextResponse } from 'next/server';
|
||||
import { PrismaClient } from '@prisma/client';
|
||||
|
||||
const prisma = new PrismaClient();
|
||||
|
||||
// 获取任务详情
|
||||
export async function GET(request, { params }) {
|
||||
try {
|
||||
const { projectId, taskId } = params;
|
||||
|
||||
// 验证必填参数
|
||||
if (!projectId || !taskId) {
|
||||
return NextResponse.json(
|
||||
{
|
||||
code: 400,
|
||||
error: '缺少必要参数'
|
||||
},
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
|
||||
// 查询任务详情
|
||||
const task = await prisma.task.findUnique({
|
||||
where: {
|
||||
id: taskId,
|
||||
projectId
|
||||
}
|
||||
});
|
||||
|
||||
if (!task) {
|
||||
return NextResponse.json(
|
||||
{
|
||||
code: 404,
|
||||
error: '任务不存在'
|
||||
},
|
||||
{ status: 404 }
|
||||
);
|
||||
}
|
||||
|
||||
return NextResponse.json({
|
||||
code: 0,
|
||||
data: task,
|
||||
message: '获取任务详情成功'
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('获取任务详情失败:', String(error));
|
||||
return NextResponse.json(
|
||||
{
|
||||
code: 500,
|
||||
error: '获取任务详情失败',
|
||||
message: error.message
|
||||
},
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// 更新任务状态
|
||||
export async function PATCH(request, { params }) {
|
||||
try {
|
||||
const { projectId, taskId } = params;
|
||||
const data = await request.json();
|
||||
|
||||
// 验证必填参数
|
||||
if (!projectId || !taskId) {
|
||||
return NextResponse.json(
|
||||
{
|
||||
code: 400,
|
||||
error: '缺少必要参数'
|
||||
},
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
|
||||
// 获取要更新的字段
|
||||
const { status, completedCount, totalCount, detail, note, endTime } = data;
|
||||
|
||||
// 构建更新数据
|
||||
const updateData = {};
|
||||
|
||||
if (status !== undefined) {
|
||||
updateData.status = status;
|
||||
}
|
||||
|
||||
if (completedCount !== undefined) {
|
||||
updateData.completedCount = completedCount;
|
||||
}
|
||||
|
||||
if (totalCount !== undefined) {
|
||||
updateData.totalCount = totalCount;
|
||||
}
|
||||
|
||||
if (detail !== undefined) {
|
||||
updateData.detail = detail;
|
||||
}
|
||||
|
||||
if (note !== undefined) {
|
||||
updateData.note = note;
|
||||
}
|
||||
|
||||
// 如果状态变为已完成、失败或已中断,自动添加结束时间
|
||||
if (status === 1 || status === 2 || status === 3) {
|
||||
updateData.endTime = endTime || new Date();
|
||||
}
|
||||
|
||||
// 更新任务
|
||||
const updatedTask = await prisma.task.update({
|
||||
where: {
|
||||
id: taskId
|
||||
},
|
||||
data: updateData
|
||||
});
|
||||
|
||||
return NextResponse.json({
|
||||
code: 0,
|
||||
data: updatedTask,
|
||||
message: '更新任务状态成功'
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('更新任务状态失败:', String(error));
|
||||
return NextResponse.json(
|
||||
{
|
||||
code: 500,
|
||||
error: '更新任务状态失败',
|
||||
message: error.message
|
||||
},
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// 删除任务
|
||||
export async function DELETE(request, { params }) {
|
||||
try {
|
||||
const { projectId, taskId } = params;
|
||||
|
||||
// 验证必填参数
|
||||
if (!projectId || !taskId) {
|
||||
return NextResponse.json(
|
||||
{
|
||||
code: 400,
|
||||
error: '缺少必要参数'
|
||||
},
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
|
||||
// 删除任务
|
||||
await prisma.task.delete({
|
||||
where: {
|
||||
id: taskId,
|
||||
projectId
|
||||
}
|
||||
});
|
||||
|
||||
return NextResponse.json({
|
||||
code: 0,
|
||||
message: '删除任务成功'
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('删除任务失败:', String(error));
|
||||
return NextResponse.json(
|
||||
{
|
||||
code: 500,
|
||||
error: '删除任务失败',
|
||||
message: error.message
|
||||
},
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
import { NextResponse } from 'next/server';
|
||||
import { PrismaClient } from '@prisma/client';
|
||||
|
||||
const prisma = new PrismaClient();
|
||||
|
||||
// 获取项目的所有任务列表
|
||||
export async function GET(request, { params }) {
|
||||
try {
|
||||
const { projectId } = params;
|
||||
const { searchParams } = new URL(request.url);
|
||||
|
||||
// 可选参数: 任务类型和任务状态
|
||||
const taskType = searchParams.get('taskType');
|
||||
const statusStr = searchParams.get('status');
|
||||
|
||||
// 分页参数
|
||||
const page = parseInt(searchParams.get('page') || '0');
|
||||
const limit = parseInt(searchParams.get('limit') || '10');
|
||||
|
||||
// 构建查询条件
|
||||
const where = { projectId };
|
||||
|
||||
if (taskType) {
|
||||
where.taskType = taskType;
|
||||
}
|
||||
|
||||
if (statusStr && !isNaN(parseInt(statusStr))) {
|
||||
where.status = parseInt(statusStr);
|
||||
}
|
||||
|
||||
// 获取任务总数
|
||||
const total = await prisma.task.count({ where });
|
||||
|
||||
// 获取任务列表,按创建时间降序排序,并应用分页
|
||||
const tasks = await prisma.task.findMany({
|
||||
where,
|
||||
orderBy: {
|
||||
createAt: 'desc'
|
||||
},
|
||||
skip: page * limit,
|
||||
take: limit
|
||||
});
|
||||
|
||||
return NextResponse.json({
|
||||
code: 0,
|
||||
data: tasks,
|
||||
total,
|
||||
page,
|
||||
limit,
|
||||
message: '任务列表获取成功'
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('获取任务列表失败:', String(error));
|
||||
return NextResponse.json(
|
||||
{
|
||||
code: 500,
|
||||
error: '获取任务列表失败',
|
||||
message: error.message
|
||||
},
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
}
|
||||
164
easy-dataset-main/app/api/projects/[projectId]/tasks/route.js
Normal file
164
easy-dataset-main/app/api/projects/[projectId]/tasks/route.js
Normal file
@@ -0,0 +1,164 @@
|
||||
import { NextResponse } from 'next/server';
|
||||
import path from 'path';
|
||||
import fs from 'fs/promises';
|
||||
import { getProjectRoot } from '@/lib/db/base';
|
||||
import { getTaskConfig } from '@/lib/db/projects';
|
||||
import { processTask } from '@/lib/services/tasks';
|
||||
import { db } from '@/lib/db/index';
|
||||
|
||||
function normalizeModelEndpoint(endpoint = '') {
|
||||
let normalizedEndpoint = String(endpoint).trim();
|
||||
if (!normalizedEndpoint) {
|
||||
return '';
|
||||
}
|
||||
if (normalizedEndpoint.includes('/chat/completions')) {
|
||||
normalizedEndpoint = normalizedEndpoint.replace('/chat/completions', '');
|
||||
}
|
||||
return normalizedEndpoint;
|
||||
}
|
||||
|
||||
function normalizeTaskModelInfo(modelInfo) {
|
||||
if (!modelInfo) {
|
||||
return {};
|
||||
}
|
||||
let parsedModelInfo = modelInfo;
|
||||
if (typeof modelInfo === 'string') {
|
||||
try {
|
||||
parsedModelInfo = JSON.parse(modelInfo);
|
||||
} catch (error) {
|
||||
return {};
|
||||
}
|
||||
}
|
||||
if (parsedModelInfo && typeof parsedModelInfo === 'object' && parsedModelInfo.endpoint) {
|
||||
parsedModelInfo.endpoint = normalizeModelEndpoint(parsedModelInfo.endpoint);
|
||||
}
|
||||
return parsedModelInfo;
|
||||
}
|
||||
|
||||
// 获取任务配置
|
||||
export async function GET(request, { params }) {
|
||||
try {
|
||||
const { projectId } = params;
|
||||
|
||||
// 验证项目 ID
|
||||
if (!projectId) {
|
||||
return NextResponse.json({ error: 'Project ID is required' }, { status: 400 });
|
||||
}
|
||||
|
||||
// 获取项目根目录
|
||||
const projectRoot = await getProjectRoot();
|
||||
const projectPath = path.join(projectRoot, projectId);
|
||||
|
||||
// 检查项目是否存在
|
||||
try {
|
||||
await fs.access(projectPath);
|
||||
} catch (error) {
|
||||
return NextResponse.json({ error: 'Project does not exist' + projectPath }, { status: 404 });
|
||||
}
|
||||
|
||||
const taskConfig = await getTaskConfig(projectId);
|
||||
return NextResponse.json(taskConfig);
|
||||
} catch (error) {
|
||||
console.error('Failed to obtain task configuration:', String(error));
|
||||
return NextResponse.json({ error: 'Failed to obtain task configuration' }, { status: 500 });
|
||||
}
|
||||
}
|
||||
|
||||
// 更新任务配置
|
||||
export async function PUT(request, { params }) {
|
||||
try {
|
||||
const { projectId } = params;
|
||||
|
||||
// 验证项目 ID
|
||||
if (!projectId) {
|
||||
return NextResponse.json({ error: 'Project ID is required' }, { status: 400 });
|
||||
}
|
||||
|
||||
// 获取请求体
|
||||
const taskConfig = await request.json();
|
||||
|
||||
// 验证请求体
|
||||
if (!taskConfig) {
|
||||
return NextResponse.json({ error: 'Task configuration cannot be empty' }, { status: 400 });
|
||||
}
|
||||
|
||||
// 获取项目根目录
|
||||
const projectRoot = await getProjectRoot();
|
||||
const projectPath = path.join(projectRoot, projectId);
|
||||
|
||||
// 检查项目是否存在
|
||||
try {
|
||||
await fs.access(projectPath);
|
||||
} catch (error) {
|
||||
return NextResponse.json({ error: 'Project does not exist' }, { status: 404 });
|
||||
}
|
||||
|
||||
// 获取任务配置文件路径
|
||||
const taskConfigPath = path.join(projectPath, 'task-config.json');
|
||||
|
||||
// 写入任务配置文件
|
||||
await fs.writeFile(taskConfigPath, JSON.stringify(taskConfig, null, 2), 'utf-8');
|
||||
|
||||
return NextResponse.json({ message: 'Task configuration updated successfully' });
|
||||
} catch (error) {
|
||||
console.error('Failed to update task configuration:', String(error));
|
||||
return NextResponse.json({ error: 'Failed to update task configuration' }, { status: 500 });
|
||||
}
|
||||
}
|
||||
|
||||
// 创建新任务
|
||||
export async function POST(request, { params }) {
|
||||
try {
|
||||
const { projectId } = params;
|
||||
const data = await request.json();
|
||||
|
||||
// 验证必填字段
|
||||
const { taskType, modelInfo, language, detail = '', totalCount = 0, note } = data;
|
||||
|
||||
if (!taskType) {
|
||||
return NextResponse.json(
|
||||
{
|
||||
code: 400,
|
||||
error: 'Missing required parameter: taskType'
|
||||
},
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
|
||||
// 创建新任务
|
||||
const newTask = await db.task.create({
|
||||
data: {
|
||||
projectId,
|
||||
taskType,
|
||||
status: 0, // 初始状态: 处理中
|
||||
modelInfo: JSON.stringify(normalizeTaskModelInfo(modelInfo)),
|
||||
language: language || 'zh-CN',
|
||||
detail: detail || '',
|
||||
totalCount,
|
||||
note: note ? JSON.stringify(note) : '',
|
||||
completedCount: 0
|
||||
}
|
||||
});
|
||||
|
||||
// 异步启动任务处理
|
||||
processTask(newTask.id).catch(err => {
|
||||
console.error(`Task startup failed: ${newTask.id}`, String(err));
|
||||
});
|
||||
|
||||
return NextResponse.json({
|
||||
code: 0,
|
||||
data: newTask,
|
||||
message: 'Task created successfully'
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Failed to create task:', String(error));
|
||||
return NextResponse.json(
|
||||
{
|
||||
code: 500,
|
||||
error: 'Failed to create task',
|
||||
message: error.message
|
||||
},
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user