question-review-workbench.blade.php 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <x-filament::page>
  2. @php($stats = $this->stats())
  3. <div class="space-y-4">
  4. <div class="grid grid-cols-4 gap-4">
  5. <x-filament::section>
  6. <div class="text-xs text-gray-500">待审核</div>
  7. <div class="text-2xl font-semibold text-gray-900">{{ $stats['pending'] ?? 0 }}</div>
  8. </x-filament::section>
  9. <x-filament::section>
  10. <div class="text-xs text-gray-500">已审核</div>
  11. <div class="text-2xl font-semibold text-gray-900">{{ $stats['reviewed'] ?? 0 }}</div>
  12. </x-filament::section>
  13. <x-filament::section>
  14. <div class="text-xs text-gray-500">已通过</div>
  15. <div class="text-2xl font-semibold text-gray-900">{{ $stats['accepted'] ?? 0 }}</div>
  16. </x-filament::section>
  17. <x-filament::section>
  18. <div class="text-xs text-gray-500">总题量</div>
  19. <div class="text-2xl font-semibold text-gray-900">{{ $stats['all'] ?? 0 }}</div>
  20. </x-filament::section>
  21. </div>
  22. <div class="flex flex-wrap items-center gap-3">
  23. <x-filament::input.wrapper class="w-44">
  24. <x-filament::input.select wire:model="groupBy">
  25. <option value="paper">按卷子分组</option>
  26. <option value="part">按区块分组</option>
  27. <option value="type">按题型分组</option>
  28. </x-filament::input.select>
  29. </x-filament::input.wrapper>
  30. <x-filament::button color="gray" wire:click="selectAllVisible">全选列表</x-filament::button>
  31. <x-filament::button color="gray" wire:click="clearSelection">清空选择</x-filament::button>
  32. <x-filament::button color="gray" wire:click="jumpToNextIssue">跳转下一个问题</x-filament::button>
  33. </div>
  34. <div class="grid grid-cols-12 gap-6">
  35. <div class="col-span-4">
  36. <x-filament::section>
  37. <div class="text-sm text-gray-500 mb-2">题目列表</div>
  38. <div class="max-h-[520px] overflow-y-auto divide-y divide-gray-100">
  39. @foreach($this->groupedCandidates() as $group => $items)
  40. <div class="px-3 py-2 text-xs font-semibold text-slate-500 bg-slate-50">{{ $group }}</div>
  41. @foreach($items as $candidate)
  42. @php($meta = $candidate->meta ?? [])
  43. <label class="flex gap-2 py-2">
  44. <input type="checkbox" wire:model="selectedIds" value="{{ $candidate->id }}" class="mt-1 rounded border-gray-300">
  45. <button type="button" wire:click="selectCandidate({{ $candidate->id }})" class="text-left flex-1">
  46. <div class="text-sm text-gray-900">{{ \Illuminate\Support\Str::limit($candidate->stem ?? $candidate->raw_markdown, 80) }}</div>
  47. <div class="text-xs text-gray-500 flex flex-wrap gap-2 items-center">
  48. <span>{{ $candidate->sourcePaper?->title }} · {{ $candidate->part?->title }}</span>
  49. @if(($candidate->ai_confidence ?? 0) < 0.6)
  50. <span class="px-2 py-0.5 rounded bg-amber-50 text-amber-700">低置信度</span>
  51. @endif
  52. @if(!$candidate->stem)
  53. <span class="px-2 py-0.5 rounded bg-rose-50 text-rose-700">缺题干</span>
  54. @endif
  55. @if(empty($meta['difficulty']))
  56. <span class="px-2 py-0.5 rounded bg-rose-50 text-rose-700">缺难度</span>
  57. @endif
  58. @if(empty($meta['kp_codes'] ?? []))
  59. <span class="px-2 py-0.5 rounded bg-rose-50 text-rose-700">缺知识点</span>
  60. @endif
  61. @if(empty($meta['answer']))
  62. <span class="px-2 py-0.5 rounded bg-rose-50 text-rose-700">缺答案</span>
  63. @endif
  64. </div>
  65. </button>
  66. </label>
  67. @endforeach
  68. @endforeach
  69. </div>
  70. </x-filament::section>
  71. </div>
  72. <div class="col-span-5">
  73. <x-filament::section>
  74. <div class="text-sm text-gray-500 mb-2">题目内容</div>
  75. <div class="prose prose-sm max-w-none bg-gray-50 p-4 rounded-lg min-h-[420px]">
  76. {!! \App\Services\MathFormulaProcessor::processFormulas($this->currentCandidate()?->stem ?? $this->currentCandidate()?->raw_markdown ?? '') !!}
  77. </div>
  78. </x-filament::section>
  79. </div>
  80. <div class="col-span-3 space-y-4">
  81. <x-filament::section heading="审核动作">
  82. <div class="space-y-2">
  83. <x-filament::button color="success" wire:click="approve">
  84. 标记为有效题目
  85. </x-filament::button>
  86. <x-filament::button color="danger" wire:click="reject">
  87. 标记为无效
  88. </x-filament::button>
  89. </div>
  90. </x-filament::section>
  91. <x-filament::section heading="批量审核">
  92. <div class="space-y-2">
  93. <x-filament::button color="success" wire:click="bulkApprove">
  94. 批量通过
  95. </x-filament::button>
  96. <x-filament::button color="danger" x-on:click.prevent="if(confirm('确认批量拒绝选中题目?')) { $wire.bulkReject() }">
  97. 批量拒绝
  98. </x-filament::button>
  99. </div>
  100. </x-filament::section>
  101. <x-filament::section heading="AI 辅助">
  102. <div class="space-y-2">
  103. <x-filament::button color="gray" wire:click="aiMatchKp">推荐知识点</x-filament::button>
  104. <x-filament::button color="gray" wire:click="aiGenerateSolution">生成解析</x-filament::button>
  105. <x-filament::button color="primary" wire:click="aiAssist">智能补全</x-filament::button>
  106. </div>
  107. </x-filament::section>
  108. <x-filament::section heading="风险提示">
  109. @php($meta = $this->currentCandidate()?->meta ?? [])
  110. <div class="space-y-2 text-sm text-slate-600">
  111. <div>AI 置信度:{{ $this->currentCandidate()?->ai_confidence ? number_format($this->currentCandidate()->ai_confidence * 100, 1) . '%' : '—' }}</div>
  112. <div>缺失字段:</div>
  113. <div class="flex flex-wrap gap-2">
  114. @if(empty($meta['difficulty']))
  115. <span class="px-2 py-0.5 rounded bg-rose-50 text-rose-700">难度</span>
  116. @endif
  117. @if(empty($meta['kp_codes'] ?? []))
  118. <span class="px-2 py-0.5 rounded bg-rose-50 text-rose-700">知识点</span>
  119. @endif
  120. @if(empty($meta['answer']))
  121. <span class="px-2 py-0.5 rounded bg-rose-50 text-rose-700">答案</span>
  122. @endif
  123. @if(empty($meta['solution']))
  124. <span class="px-2 py-0.5 rounded bg-rose-50 text-rose-700">解析</span>
  125. @endif
  126. @if(!empty($meta['difficulty']) && !empty($meta['kp_codes'] ?? []) && !empty($meta['answer']) && !empty($meta['solution']))
  127. <span class="px-2 py-0.5 rounded bg-emerald-50 text-emerald-700">无</span>
  128. @endif
  129. </div>
  130. </div>
  131. </x-filament::section>
  132. </div>
  133. </div>
  134. </div>
  135. </x-filament::page>