ProcessOCRSubmission.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <?php
  2. namespace App\Jobs;
  3. use App\Models\OCRRecord;
  4. use App\Services\OCRProcessingService;
  5. use Illuminate\Bus\Queueable;
  6. use Illuminate\Contracts\Queue\ShouldQueue;
  7. use Illuminate\Foundation\Bus\Dispatchable;
  8. use Illuminate\Queue\InteractsWithQueue;
  9. use Illuminate\Queue\SerializesModels;
  10. use Illuminate\Support\Facades\Log;
  11. class ProcessOCRSubmission implements ShouldQueue
  12. {
  13. use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
  14. public int $ocrRecordId;
  15. public int $maxAttempts = 3;
  16. public function __construct(int $ocrRecordId)
  17. {
  18. $this->ocrRecordId = $ocrRecordId;
  19. }
  20. public function handle(OCRProcessingService $ocrService): void
  21. {
  22. $ocrRecord = OCRRecord::find($this->ocrRecordId);
  23. if (!$ocrRecord) {
  24. Log::error('OCR记录不存在', ['ocr_record_id' => $this->ocrRecordId]);
  25. return;
  26. }
  27. try {
  28. Log::info('开始处理OCR任务', ['ocr_record_id' => $this->ocrRecordId]);
  29. // 更新状态为处理中
  30. $ocrRecord->update(['status' => 'processing']);
  31. // 调用OCR服务 - 通过paper_title查找关联的试卷
  32. $paperId = null;
  33. if ($ocrRecord->paper_title) {
  34. $paper = \App\Models\Paper::where('paper_name', $ocrRecord->paper_title)->first();
  35. $paperId = $paper?->paper_id ?? $paper?->id;
  36. }
  37. $results = $ocrService->processImage($ocrRecord->file_path, $paperId);
  38. // 保存OCR结果到数据库
  39. foreach ($results['answers'] as $answer) {
  40. \App\Models\OCRQuestionResult::create([
  41. 'ocr_record_id' => $this->ocrRecordId,
  42. 'question_number' => $answer['q'],
  43. 'question_type' => $answer['type'],
  44. 'student_answer' => $answer['value'],
  45. 'answer_confidence' => $answer['confidence'] ?? 0.9,
  46. 'generation_status' => 'completed',
  47. ]);
  48. }
  49. // 更新OCR记录状态
  50. $ocrRecord->update([
  51. 'status' => 'completed',
  52. 'total_questions' => count($results['answers']),
  53. ]);
  54. Log::info('OCR处理完成', [
  55. 'ocr_record_id' => $this->ocrRecordId,
  56. 'question_count' => count($results['answers']),
  57. ]);
  58. // 触发AI判分任务
  59. \App\Jobs\AIGradingJob::dispatch($this->ocrRecordId);
  60. } catch (\Exception $e) {
  61. Log::error('OCR处理失败', [
  62. 'ocr_record_id' => $this->ocrRecordId,
  63. 'error' => $e->getMessage(),
  64. 'trace' => $e->getTraceAsString(),
  65. ]);
  66. $ocrRecord->update([
  67. 'status' => 'failed',
  68. 'error_message' => $e->getMessage(),
  69. ]);
  70. throw $e;
  71. }
  72. }
  73. }