KnowledgeMindmap.php 4.4 KB

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