ManageTextbooks.php 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. <?php
  2. namespace App\Filament\Resources\TextbookResource\Pages;
  3. use App\Filament\Resources\TextbookResource;
  4. use App\Services\TextbookApiService;
  5. use Filament\Actions;
  6. use Filament\Resources\Pages\ListRecords;
  7. use Illuminate\Contracts\Pagination\Paginator;
  8. use Illuminate\Pagination\LengthAwarePaginator;
  9. class ManageTextbooks extends ListRecords
  10. {
  11. protected static string $resource = TextbookResource::class;
  12. protected function getHeaderActions(): array
  13. {
  14. return [
  15. Actions\CreateAction::make()
  16. ->label('新建教材'),
  17. ];
  18. }
  19. protected function paginateTableQuery(\Illuminate\Database\Eloquent\builder $query): Paginator
  20. {
  21. return $this->getTableRecords();
  22. }
  23. public function getTableRecords(): Paginator
  24. {
  25. $apiService = app(TextbookApiService::class);
  26. $page = request()->get('page', 1);
  27. $perPage = $this->getTableRecordsPerPage();
  28. $filters = request()->input('tableFilters', []);
  29. $params = [
  30. 'page' => $page,
  31. 'per_page' => $perPage,
  32. 'stage' => $filters['stage']['value'] ?? null,
  33. 'grade' => $filters['grade']['value'] ?? null,
  34. 'semester' => $filters['semester']['value'] ?? null,
  35. 'naming_scheme' => $filters['naming_scheme']['value'] ?? null,
  36. 'status' => $filters['status']['value'] ?? null,
  37. 'keyword' => $filters['keyword']['value'] ?? null,
  38. ];
  39. $params = array_filter($params, fn ($value) => $value !== null && $value !== '');
  40. \Log::info('ManageTextbooks::getTableRecords called', [
  41. 'page' => $page,
  42. 'perPage' => $perPage
  43. ]);
  44. $result = $apiService->getTextbooks($params);
  45. \Log::info('API result', [
  46. 'total' => $result['meta']['total'] ?? 0,
  47. 'count' => count($result['data'] ?? [])
  48. ]);
  49. $records = collect($result['data'] ?? [])->map(function ($item) {
  50. $model = new \App\Models\Textbook();
  51. // 直接设置属性
  52. foreach ($item as $key => $value) {
  53. $model->setAttribute($key, $value);
  54. }
  55. $model->exists = true;
  56. // 确保ID被正确设置
  57. if (isset($item['id'])) {
  58. $model->id = $item['id'];
  59. }
  60. // 设置关联
  61. if (isset($item['series'])) {
  62. $seriesModel = new \App\Models\TextbookSeries();
  63. foreach ($item['series'] as $key => $value) {
  64. $seriesModel->setAttribute($key, $value);
  65. }
  66. $seriesModel->exists = true;
  67. $model->setRelation('series', $seriesModel);
  68. }
  69. return $model;
  70. });
  71. return new LengthAwarePaginator(
  72. $records,
  73. $result['meta']['total'] ?? 0,
  74. $perPage,
  75. $page,
  76. ['path' => request()->url()]
  77. );
  78. }
  79. }