ImportTemToQuestionsJob.php 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. <?php
  2. namespace App\Jobs;
  3. use App\Services\QuestionTemReviewService;
  4. use Illuminate\Bus\Queueable;
  5. use Illuminate\Contracts\Queue\ShouldQueue;
  6. use Illuminate\Foundation\Bus\Dispatchable;
  7. use Illuminate\Queue\InteractsWithQueue;
  8. use Illuminate\Queue\SerializesModels;
  9. use Illuminate\Support\Facades\Cache;
  10. use Illuminate\Support\Facades\Log;
  11. class ImportTemToQuestionsJob implements ShouldQueue
  12. {
  13. use Dispatchable;
  14. use InteractsWithQueue;
  15. use Queueable;
  16. use SerializesModels;
  17. public int $timeout = 120;
  18. public function __construct(
  19. public int $temId,
  20. public ?int $userId = null,
  21. public ?string $kpCode = null
  22. ) {
  23. }
  24. public function handle(QuestionTemReviewService $service): void
  25. {
  26. $statusKey = self::statusKey($this->temId);
  27. Cache::put($statusKey, ['state' => 'running', 'at' => now()->toDateTimeString()], now()->addMinutes(30));
  28. $result = $service->importTemRowToQuestions($this->temId);
  29. if (! empty($result['ok'])) {
  30. Cache::put($statusKey, [
  31. 'state' => 'done',
  32. 'question_id' => $result['question_id'] ?? null,
  33. 'message' => $result['message'] ?? '已入库',
  34. 'at' => now()->toDateTimeString(),
  35. ], now()->addMinutes(30));
  36. $this->bumpPageVersion();
  37. return;
  38. }
  39. Cache::put($statusKey, [
  40. 'state' => 'failed',
  41. 'message' => $result['message'] ?? '入库失败',
  42. 'at' => now()->toDateTimeString(),
  43. ], now()->addMinutes(30));
  44. }
  45. public function failed(\Throwable $e): void
  46. {
  47. Cache::put(self::statusKey($this->temId), [
  48. 'state' => 'failed',
  49. 'message' => $e->getMessage(),
  50. 'at' => now()->toDateTimeString(),
  51. ], now()->addMinutes(30));
  52. Log::error('ImportTemToQuestionsJob failed', ['tem_id' => $this->temId, 'error' => $e->getMessage()]);
  53. }
  54. public static function statusKey(int $temId): string
  55. {
  56. return "qtr:import:tem:{$temId}";
  57. }
  58. private function bumpPageVersion(): void
  59. {
  60. if (! $this->userId || ! $this->kpCode) {
  61. return;
  62. }
  63. $versionKey = "qtr:version:u{$this->userId}:kp{$this->kpCode}";
  64. Cache::add($versionKey, 1, now()->addHours(2));
  65. Cache::increment($versionKey);
  66. }
  67. }