|
@@ -119,6 +119,125 @@ class ExamAnalysisApiController extends Controller
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取PDF报告URL
|
|
|
|
|
+ * 查询指定试卷是否已有生成好的学情分析报告
|
|
|
|
|
+ */
|
|
|
|
|
+ public function getPdfUrl(string $paperId): JsonResponse
|
|
|
|
|
+ {
|
|
|
|
|
+ try {
|
|
|
|
|
+ // 首先尝试从 student_reports 表直接查询(最快速的方式)
|
|
|
|
|
+ $report = \App\Models\StudentReport::where('exam_id', $paperId)
|
|
|
|
|
+ ->where('report_type', 'exam_analysis')
|
|
|
|
|
+ ->first();
|
|
|
|
|
+
|
|
|
|
|
+ if ($report && $report->pdf_url && $report->generation_status === 'completed') {
|
|
|
|
|
+ Log::info('学情报告PDF URL查询成功(从数据库)', [
|
|
|
|
|
+ 'paper_id' => $paperId,
|
|
|
|
|
+ 'pdf_url' => $report->pdf_url,
|
|
|
|
|
+ ]);
|
|
|
|
|
+
|
|
|
|
|
+ return response()->json([
|
|
|
|
|
+ 'success' => true,
|
|
|
|
|
+ 'data' => [
|
|
|
|
|
+ 'paper_id' => $paperId,
|
|
|
|
|
+ 'status' => 'completed',
|
|
|
|
|
+ 'pdf_url' => $report->pdf_url,
|
|
|
|
|
+ 'message' => '报告已生成',
|
|
|
|
|
+ 'generated_at' => $report->generated_at?->toISOString(),
|
|
|
|
|
+ ]
|
|
|
|
|
+ ], 200, [], JSON_UNESCAPED_SLASHES);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 如果数据库中没有,尝试从任务系统查找
|
|
|
|
|
+ $task = $this->taskManager->findAnalysisTaskByPaperId($paperId);
|
|
|
|
|
+
|
|
|
|
|
+ if ($task) {
|
|
|
|
|
+ $status = $task['status'];
|
|
|
|
|
+ $pdfUrl = $task['pdf_url'] ?? null;
|
|
|
|
|
+
|
|
|
|
|
+ if ($status === \App\Services\TaskManager::STATUS_COMPLETED && $pdfUrl) {
|
|
|
|
|
+ // 任务已完成且有PDF URL
|
|
|
|
|
+ Log::info('学情报告PDF URL查询成功(从任务系统)', [
|
|
|
|
|
+ 'paper_id' => $paperId,
|
|
|
|
|
+ 'task_id' => $task['task_id'],
|
|
|
|
|
+ 'pdf_url' => $pdfUrl,
|
|
|
|
|
+ ]);
|
|
|
|
|
+
|
|
|
|
|
+ return response()->json([
|
|
|
|
|
+ 'success' => true,
|
|
|
|
|
+ 'data' => [
|
|
|
|
|
+ 'paper_id' => $paperId,
|
|
|
|
|
+ 'status' => 'completed',
|
|
|
|
|
+ 'pdf_url' => $pdfUrl,
|
|
|
|
|
+ 'message' => '报告已生成',
|
|
|
|
|
+ 'generated_at' => $task['completed_at'] ?? null,
|
|
|
|
|
+ ]
|
|
|
|
|
+ ], 200, [], JSON_UNESCAPED_SLASHES);
|
|
|
|
|
+ } elseif ($status === \App\Services\TaskManager::STATUS_PROCESSING) {
|
|
|
|
|
+ // 任务正在处理中
|
|
|
|
|
+ Log::info('学情报告正在生成中', [
|
|
|
|
|
+ 'paper_id' => $paperId,
|
|
|
|
|
+ 'task_id' => $task['task_id'],
|
|
|
|
|
+ 'progress' => $task['progress'] ?? 0,
|
|
|
|
|
+ ]);
|
|
|
|
|
+
|
|
|
|
|
+ return response()->json([
|
|
|
|
|
+ 'success' => true,
|
|
|
|
|
+ 'data' => [
|
|
|
|
|
+ 'paper_id' => $paperId,
|
|
|
|
|
+ 'status' => 'processing',
|
|
|
|
|
+ 'pdf_url' => null,
|
|
|
|
|
+ 'message' => '报告正在生成中,请稍后刷新页面查看',
|
|
|
|
|
+ 'progress' => $task['progress'] ?? 0,
|
|
|
|
|
+ ]
|
|
|
|
|
+ ], 200, [], JSON_UNESCAPED_SLASHES);
|
|
|
|
|
+ } elseif ($status === \App\Services\TaskManager::STATUS_FAILED) {
|
|
|
|
|
+ // 任务失败
|
|
|
|
|
+ Log::warning('学情报告生成失败', [
|
|
|
|
|
+ 'paper_id' => $paperId,
|
|
|
|
|
+ 'task_id' => $task['task_id'],
|
|
|
|
|
+ 'error' => $task['error'] ?? '未知错误',
|
|
|
|
|
+ ]);
|
|
|
|
|
+
|
|
|
|
|
+ return response()->json([
|
|
|
|
|
+ 'success' => false,
|
|
|
|
|
+ 'data' => [
|
|
|
|
|
+ 'paper_id' => $paperId,
|
|
|
|
|
+ 'status' => 'failed',
|
|
|
|
|
+ 'pdf_url' => null,
|
|
|
|
|
+ 'message' => '报告生成失败:' . ($task['error'] ?? '未知错误'),
|
|
|
|
|
+ ]
|
|
|
|
|
+ ], 200, [], JSON_UNESCAPED_SLASHES);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 既没有完成的任务,也没有正在进行的任务
|
|
|
|
|
+ Log::info('未找到学情报告任务', ['paper_id' => $paperId]);
|
|
|
|
|
+
|
|
|
|
|
+ return response()->json([
|
|
|
|
|
+ 'success' => true,
|
|
|
|
|
+ 'data' => [
|
|
|
|
|
+ 'paper_id' => $paperId,
|
|
|
|
|
+ 'status' => 'not_found',
|
|
|
|
|
+ 'pdf_url' => null,
|
|
|
|
|
+ 'message' => '报告尚未生成,请先提交试卷进行分析',
|
|
|
|
|
+ ]
|
|
|
|
|
+ ], 200, [], JSON_UNESCAPED_SLASHES);
|
|
|
|
|
+
|
|
|
|
|
+ } catch (\Exception $e) {
|
|
|
|
|
+ Log::error('查询学情报告PDF URL失败', [
|
|
|
|
|
+ 'paper_id' => $paperId,
|
|
|
|
|
+ 'error' => $e->getMessage(),
|
|
|
|
|
+ ]);
|
|
|
|
|
+
|
|
|
|
|
+ return response()->json([
|
|
|
|
|
+ 'success' => false,
|
|
|
|
|
+ 'message' => '查询失败:' . $e->getMessage(),
|
|
|
|
|
+ ], 500);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 从试卷ID获取学生ID
|
|
* 从试卷ID获取学生ID
|
|
|
*/
|
|
*/
|