PromoteSourcePapersJob.php 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. <?php
  2. namespace App\Jobs;
  3. use App\Models\SourcePaper;
  4. use App\Services\QuestionCandidateToQuestionService;
  5. use App\Services\TaskManager;
  6. use Illuminate\Bus\Queueable;
  7. use Illuminate\Contracts\Queue\ShouldQueue;
  8. use Illuminate\Foundation\Bus\Dispatchable;
  9. use Illuminate\Queue\InteractsWithQueue;
  10. use Illuminate\Queue\SerializesModels;
  11. use Illuminate\Support\Facades\Log;
  12. class PromoteSourcePapersJob implements ShouldQueue
  13. {
  14. use Dispatchable;
  15. use InteractsWithQueue;
  16. use Queueable;
  17. use SerializesModels;
  18. public function __construct(
  19. public readonly string $taskId,
  20. public readonly array $paperIds
  21. ) {}
  22. public function handle(TaskManager $taskManager, QuestionCandidateToQuestionService $service): void
  23. {
  24. $paperIds = array_values(array_filter(array_unique(array_map('intval', $this->paperIds))));
  25. if (empty($paperIds)) {
  26. $taskManager->markTaskFailed($this->taskId, '未选择任何卷子');
  27. return;
  28. }
  29. $papers = SourcePaper::query()->whereIn('id', $paperIds)->get();
  30. if ($papers->isEmpty()) {
  31. $taskManager->markTaskFailed($this->taskId, '未找到可入库的卷子');
  32. return;
  33. }
  34. $summary = [
  35. 'processed' => 0,
  36. 'skipped' => 0,
  37. 'errors' => 0,
  38. ];
  39. $total = $papers->count();
  40. $taskManager->updateTaskProgress($this->taskId, 5, '开始入库');
  41. foreach ($papers as $index => $paper) {
  42. $taskManager->updateTaskProgress(
  43. $this->taskId,
  44. (int) (5 + (($index / max(1, $total)) * 80)),
  45. '正在处理:' . ($paper->title ?: ('卷子 #' . $paper->id))
  46. );
  47. $result = $service->promoteFromSourcePapers(collect([$paper]));
  48. $summary['processed'] += $result['processed'];
  49. $summary['skipped'] += $result['skipped'];
  50. $summary['errors'] += $result['errors'];
  51. }
  52. $taskManager->markTaskCompleted($this->taskId, [
  53. 'processed' => $summary['processed'],
  54. 'skipped' => $summary['skipped'],
  55. 'errors' => $summary['errors'],
  56. ]);
  57. Log::info('PromoteSourcePapersJob completed', [
  58. 'task_id' => $this->taskId,
  59. 'paper_ids' => $paperIds,
  60. 'summary' => $summary,
  61. ]);
  62. }
  63. }