KnowledgeMindmap.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <?php
  2. namespace App\Filament\Pages;
  3. use App\Filament\Traits\HandlesMindmapDetails;
  4. use BackedEnum;
  5. use Filament\Pages\Page;
  6. use UnitEnum;
  7. class KnowledgeMindmap extends Page
  8. {
  9. use HandlesMindmapDetails;
  10. protected static string|BackedEnum|null $navigationIcon = 'heroicon-o-share';
  11. protected static string|UnitEnum|null $navigationGroup = null;
  12. protected static ?int $navigationSort = 4;
  13. protected static ?string $navigationLabel = '知识图谱脑图';
  14. protected static bool $shouldRegisterNavigation = false;
  15. protected static ?string $slug = 'knowledge-mindmap';
  16. protected static ?string $title = '知识图谱脑图';
  17. protected string $view = 'filament.pages.knowledge-mindmap';
  18. public $teachers = [];
  19. public $students = [];
  20. public $selectedTeacherId = '';
  21. public $selectedStudentId = '';
  22. public $selectedStudentName = '';
  23. public $masteryData = [];
  24. public $drawerOpen = false;
  25. public $selectedNode = null;
  26. public $nodeDetails = [];
  27. public function mount(): void
  28. {
  29. $this->loadTeachers();
  30. }
  31. public function loadTeachers(): void
  32. {
  33. // Use the same logic as the controller but directly here
  34. $teachers = \App\Models\Teacher::query()
  35. ->select('teacher_id', 'name')
  36. ->limit(10)
  37. ->get();
  38. if ($teachers->isEmpty()) {
  39. $this->teachers = [
  40. ['teacher_id' => 1, 'name' => '张老师'],
  41. ['teacher_id' => 2, 'name' => '李老师'],
  42. ['teacher_id' => 3, 'name' => '王老师'],
  43. ];
  44. } else {
  45. $this->teachers = $teachers->toArray();
  46. }
  47. }
  48. public function updatedSelectedTeacherId(): void
  49. {
  50. $this->students = [];
  51. $this->selectedStudentId = '';
  52. $this->selectedStudentName = '';
  53. $this->masteryData = [];
  54. if (!$this->selectedTeacherId) {
  55. return;
  56. }
  57. $students = \App\Models\Student::query()
  58. ->where('teacher_id', $this->selectedTeacherId)
  59. ->select('student_id', 'name')
  60. ->limit(20)
  61. ->get();
  62. if ($students->isEmpty()) {
  63. $this->students = [
  64. ['student_id' => 101, 'name' => '学生A'],
  65. ['student_id' => 102, 'name' => '学生B'],
  66. ['student_id' => 103, 'name' => '学生C'],
  67. ];
  68. } else {
  69. $this->students = $students->toArray();
  70. }
  71. }
  72. public function updatedSelectedStudentId(): void
  73. {
  74. $this->masteryData = [];
  75. $this->selectedStudentName = '';
  76. if (!$this->selectedStudentId) {
  77. $this->dispatch('mastery-updated', data: []);
  78. return;
  79. }
  80. // Find student name
  81. $student = collect($this->students)->firstWhere('student_id', $this->selectedStudentId);
  82. $this->selectedStudentName = $student['name'] ?? '';
  83. try {
  84. $service = app(\App\Services\LearningAnalyticsService::class);
  85. $response = $service->getStudentMasteryList($this->selectedStudentId);
  86. $data = $response['data'] ?? [];
  87. // Transform to map: { 'KP_CODE': { mastery_level: 0.8, total_attempts: 5, ... } }
  88. $masteryMap = [];
  89. foreach ($data as $item) {
  90. if (isset($item['kp_code'])) {
  91. $masteryMap[$item['kp_code']] = $item;
  92. }
  93. }
  94. $this->masteryData = $masteryMap;
  95. // Dispatch event to notify frontend to refresh graph
  96. $this->dispatch('mastery-updated', data: $masteryMap);
  97. } catch (\Exception $e) {
  98. \Illuminate\Support\Facades\Log::error('Failed to fetch mastery data', [
  99. 'student_id' => $this->selectedStudentId,
  100. 'error' => $e->getMessage()
  101. ]);
  102. $this->dispatch('mastery-updated', data: []);
  103. }
  104. }
  105. public function openDrawer($nodeId)
  106. {
  107. $this->selectedNode = $nodeId;
  108. $this->nodeDetails = $this->getNodeDetails($nodeId, $this->masteryData);
  109. $this->drawerOpen = true;
  110. }
  111. public function closeDrawer()
  112. {
  113. $this->drawerOpen = false;
  114. $this->selectedNode = null;
  115. $this->nodeDetails = [];
  116. }
  117. // Alias for shared mindmap drawer
  118. public function openMindmapDrawer(string $nodeId): void
  119. {
  120. $this->openDrawer($nodeId);
  121. }
  122. }