| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- <?php
- use App\Services\QuestionServiceApi;
- use Illuminate\Support\Facades\Route;
- use Illuminate\Support\Facades\Log;
- use App\Events\QuestionGenerationCompleted;
- use App\Events\QuestionGenerationFailed;
- /*
- |--------------------------------------------------------------------------
- | 题库管理 API 路由
- |--------------------------------------------------------------------------
- */
- // 接收题目生成回调
- Route::post('/questions/callback', function () {
- try {
- $data = request()->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');
|