/** * 检查任务状态脚本 * 用于诊断卡住的任务:查看任务状态、进度、创建时间等 * * 使用方法: * npx ts-node scripts/check-task-status.ts [taskId] * 如果不提供 taskId,则显示所有进行中的任务 */ import { PrismaClient } from '@prisma/client'; import dotenv from 'dotenv'; dotenv.config(); const prisma = new PrismaClient(); async function checkTaskStatus(taskId?: string) { try { if (taskId) { // 查询指定任务 const task = await prisma.courseGenerationTask.findUnique({ where: { id: taskId }, include: { course: { select: { id: true, title: true, status: true, }, }, user: { select: { id: true, phone: true, nickname: true, }, }, }, }); if (!task) { console.log(`❌ 任务不存在: ${taskId}`); return; } console.log('\n=== 任务详情 ==='); console.log(`任务ID: ${task.id}`); console.log(`课程ID: ${task.courseId}`); console.log(`课程标题: ${task.course.title}`); console.log(`用户ID: ${task.userId}`); console.log(`用户: ${task.user.nickname || task.user.phone || 'N/A'}`); console.log(`状态: ${task.status}`); console.log(`进度: ${task.progress}%`); console.log(`当前步骤: ${task.currentStep || 'N/A'}`); console.log(`错误信息: ${task.errorMessage || 'N/A'}`); console.log(`来源类型: ${task.sourceType || 'N/A'}`); console.log(`导师类型: ${task.persona || 'N/A'}`); console.log(`创建时间: ${task.createdAt}`); console.log(`更新时间: ${task.updatedAt}`); console.log(`运行时长: ${Math.floor((Date.now() - task.createdAt.getTime()) / 1000 / 60)} 分钟`); if (task.status !== 'completed' && task.status !== 'failed') { const minutesSinceUpdate = Math.floor((Date.now() - task.updatedAt.getTime()) / 1000 / 60); if (minutesSinceUpdate > 5) { console.log(`⚠️ 警告: 任务已 ${minutesSinceUpdate} 分钟未更新,可能已卡住`); } } } else { // 查询所有进行中的任务 const tasks = await prisma.courseGenerationTask.findMany({ where: { status: { notIn: ['completed', 'failed'], }, }, include: { course: { select: { id: true, title: true, }, }, }, orderBy: { createdAt: 'desc', }, }); if (tasks.length === 0) { console.log('✅ 没有进行中的任务'); return; } console.log(`\n=== 进行中的任务 (共 ${tasks.length} 个) ===\n`); for (const task of tasks) { const minutesSinceUpdate = Math.floor((Date.now() - task.updatedAt.getTime()) / 1000 / 60); const minutesSinceCreate = Math.floor((Date.now() - task.createdAt.getTime()) / 1000 / 60); console.log(`任务ID: ${task.id}`); console.log(`课程: ${task.course.title} (${task.courseId})`); console.log(`状态: ${task.status} | 进度: ${task.progress}%`); console.log(`创建时间: ${task.createdAt} (${minutesSinceCreate} 分钟前)`); console.log(`更新时间: ${task.updatedAt} (${minutesSinceUpdate} 分钟前)`); if (minutesSinceUpdate > 5) { console.log(`⚠️ 警告: 已 ${minutesSinceUpdate} 分钟未更新,可能已卡住`); } console.log('---'); } } } catch (error: any) { console.error('❌ 查询失败:', error.message); } finally { await prisma.$disconnect(); } } // 从命令行参数获取 taskId const taskId = process.argv[2]; checkTaskStatus(taskId);