ViewTextbook.php 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. <?php
  2. namespace App\Filament\Resources\TextbookResource\Pages;
  3. use App\Filament\Resources\TextbookResource;
  4. use App\Models\SourcePaper;
  5. use App\Services\TextbookApiService;
  6. use Filament\Resources\Pages\ViewRecord;
  7. class ViewTextbook extends ViewRecord
  8. {
  9. protected static string $resource = TextbookResource::class;
  10. protected string $view = 'filament.resources.textbook-resource.view';
  11. public array $catalogTree = [];
  12. public array $linkedPapers = [];
  13. public array $catalogCoverage = [];
  14. public int $unlinkedPaperCount = 0;
  15. public function mount(int|string $record): void
  16. {
  17. parent::mount($record);
  18. $apiService = app(TextbookApiService::class);
  19. $this->catalogTree = $apiService->getTextbookCatalog((int) $this->record->id, 'tree');
  20. $seriesName = $this->record->series->name ?? null;
  21. $this->linkedPapers = SourcePaper::query()
  22. ->when($seriesName, fn ($query) => $query->where('textbook_series', $seriesName))
  23. ->latest('updated_at')
  24. ->take(8)
  25. ->get()
  26. ->map(fn ($paper) => [
  27. 'id' => $paper->id,
  28. 'title' => $paper->title ?: $paper->full_title ?: '未命名卷子',
  29. 'chapter' => $paper->chapter,
  30. 'grade' => $paper->grade,
  31. 'term' => $paper->term,
  32. 'source_type' => $paper->source_type,
  33. 'updated_at' => $paper->updated_at,
  34. ])
  35. ->toArray();
  36. $coverage = [];
  37. $unlinked = 0;
  38. SourcePaper::query()
  39. ->where('textbook_id', $this->record->id)
  40. ->get(['id', 'meta'])
  41. ->each(function ($paper) use (&$coverage, &$unlinked) {
  42. $catalogId = $paper->meta['catalog_node_id'] ?? null;
  43. if ($catalogId) {
  44. $coverage[$catalogId] = ($coverage[$catalogId] ?? 0) + 1;
  45. } else {
  46. $unlinked++;
  47. }
  48. });
  49. $this->catalogCoverage = $coverage;
  50. $this->unlinkedPaperCount = $unlinked;
  51. }
  52. }