all(); Log::info('Received question generation callback', $data); // 验证回调数据 if (!isset($data['task_id']) || !isset($data['status'])) { return response()->json(['error' => 'Invalid callback data'], 400); } // 存储回调结果到 session 中,供前端查询 session(['question_gen_callback_' . $data['task_id'] => $data]); // ✅ 记录任务状态,10秒后自动清除 cache([$data['task_id'] => $data], now()->addSeconds(10)); // ✅ 使用事件替代轮询 - 直接分发事件给前端 if ($data['status'] === 'completed') { QuestionGenerationCompleted::dispatch( $data['task_id'], $data['kp_code'] ?? '', $data['total'] ?? 0 ); } elseif ($data['status'] === 'failed') { QuestionGenerationFailed::dispatch( $data['task_id'], $data['kp_code'] ?? '', $data['error'] ?? '未知错误' ); } return response()->json([ 'success' => true, 'message' => 'Callback received', 'status' => $data['status'] ]); } catch (\Exception $e) { Log::error('Callback processing failed: ' . $e->getMessage()); return response()->json(['error' => $e->getMessage()], 500); } })->name('api.questions.callback'); // 获取题目生成回调结果 Route::get('/questions/callback/{taskId}', function (string $taskId) { $callbackData = session('question_gen_callback_' . $taskId); if ($callbackData) { // 清除已读取的回调数据 session()->forget('question_gen_callback_' . $taskId); return response()->json($callbackData); } return response()->json(['status' => 'pending'], 202); })->name('api.questions.callback.get'); // 题目相关 API Route::get('/questions', function (QuestionServiceApi $service) { try { $page = (int) request()->get('page', 1); $perPage = (int) request()->get('per_page', 25); $filters = [ 'kp_code' => request()->get('kp_code'), 'difficulty' => request()->get('difficulty'), 'search' => request()->get('search'), ]; $response = $service->listQuestions($page, $perPage, $filters); return response()->json($response); } catch (\Exception $e) { \Log::error('Failed to fetch questions: ' . $e->getMessage()); return response()->json([ 'data' => [], 'meta' => [ 'page' => 1, 'per_page' => 25, 'total' => 0, 'total_pages' => 0, ], 'error' => $e->getMessage(), ], 500); } }); // 获取题目统计信息 Route::get('/questions/statistics', function (QuestionServiceApi $service) { try { $stats = $service->getStatistics(); return response()->json($stats); } catch (\Exception $e) { \Log::error('Failed to get question statistics: ' . $e->getMessage()); return response()->json(['error' => $e->getMessage()], 500); } }); // 语义搜索题目 Route::post('/questions/search', function (QuestionServiceApi $service) { try { $data = request()->only(['query', 'limit']); $results = $service->searchQuestions($data['query'], $data['limit'] ?? 20); return response()->json($results); } catch (\Exception $e) { \Log::error('Question search failed: ' . $e->getMessage()); return response()->json(['error' => $e->getMessage()], 500); } }); // 获取单个题目详情 Route::get('/questions/{id}', function (int $id, QuestionServiceApi $service) { try { $question = $service->getQuestionById($id); if (!$question) { return response()->json(['error' => 'Question not found'], 404); } return response()->json($question); } catch (\Exception $e) { \Log::error("Failed to get question {$id}: " . $e->getMessage()); return response()->json(['error' => $e->getMessage()], 500); } }); // AI 生成题目 Route::post('/questions/generate', function (QuestionServiceApi $service) { try { $data = request()->only(['kp_code', 'keyword', 'count', 'strategy']); $result = $service->generateQuestions($data); return response()->json($result); } catch (\Exception $e) { \Log::error('Question generation failed: ' . $e->getMessage()); return response()->json([ 'success' => false, 'message' => $e->getMessage(), ], 500); } }); // 删除题目 Route::delete('/questions/{id}', function (int $id, QuestionServiceApi $service) { try { $deleted = $service->deleteQuestion($id); return response()->json([ 'success' => $deleted, 'message' => $deleted ? 'Question deleted' : 'Failed to delete', ]); } catch (\Exception $e) { \Log::error("Failed to delete question {$id}: " . $e->getMessage()); return response()->json([ 'success' => false, 'message' => $e->getMessage(), ], 500); } }); // 获取知识点选项 Route::get('/knowledge-points', function (QuestionServiceApi $service) { try { $points = $service->getKnowledgePointOptions(); return response()->json($points); } catch (\Exception $e) { \Log::error('Failed to get knowledge points: ' . $e->getMessage()); return response()->json([], 500); } }); /* |-------------------------------------------------------------------------- | MathRecSys 集成 API 路由 |-------------------------------------------------------------------------- */ use App\Http\Controllers\Api\StudentController; // 健康检查 Route::get('/mathrecsys/health', [StudentController::class, 'checkServiceHealth'])->name('api.mathrecsys.health'); // 学生相关 API Route::prefix('mathrecsys/students')->name('api.mathrecsys.students.')->group(function () { // 获取学生完整信息 Route::get('{studentId}', [StudentController::class, 'show'])->name('show'); // 获取个性化推荐 Route::get('{studentId}/recommendations', [StudentController::class, 'getRecommendations'])->name('recommendations'); // 获取学习轨迹 Route::get('{studentId}/trajectory', [StudentController::class, 'getTrajectory'])->name('trajectory'); // 获取学习建议 Route::get('{studentId}/suggestions', [StudentController::class, 'getSuggestions'])->name('suggestions'); // 智能分析题目 Route::post('{studentId}/analyze', [StudentController::class, 'analyzeQuestion'])->name('analyze'); // 更新掌握度 Route::put('{studentId}/mastery', [StudentController::class, 'updateMastery'])->name('update-mastery'); }); // 班级分析 API Route::prefix('mathrecsys/classes')->name('api.mathrecsys.classes.')->group(function () { Route::get('{classId}/analysis', [StudentController::class, 'classAnalysis'])->name('analysis'); }); // 测试 API Route::get('/mathrecsys/test', function () { return response()->json([ 'success' => true, 'message' => 'MathRecSys API integration is working', 'timestamp' => now()->toISOString() ]); })->name('api.mathrecsys.test');