@php $boxCounter = app(\App\Support\GradingMarkBoxCounter::class); // 按当前试卷真实题目动态生成判题卡条目(题量与方框数) $scanSheetItems = []; $countBlanks = fn($text): int => $boxCounter->countFillBlanks($text); $countSteps = fn($text): int => $boxCounter->countAnswerSteps($text); foreach (($questions['choice'] ?? []) as $q) { $scanSheetItems[] = ['no' => (int) ($q->question_number ?? 0), 'box_count' => 1]; } foreach (($questions['fill'] ?? []) as $q) { $scanSheetItems[] = ['no' => (int) ($q->question_number ?? 0), 'box_count' => $countBlanks($q->content ?? '')]; } foreach (($questions['answer'] ?? []) as $q) { $scanSheetItems[] = ['no' => (int) ($q->question_number ?? 0), 'box_count' => $countSteps($q->solution ?? '')]; } usort($scanSheetItems, static function ($a, $b) { return ($a['no'] <=> $b['no']); }); $scanSheetItems = array_values(array_filter($scanSheetItems, static function ($item) { return (int) ($item['no'] ?? 0) > 0; })); $assembleTypeLabel = $pdfMeta['assemble_type_label'] ?? null; $showAssembleType = !empty($assembleTypeLabel) && $assembleTypeLabel !== '未知类型'; $scanPaperCode = (string) ($pdfMeta['paper_id_num'] ?? $pdfMeta['exam_code'] ?? ''); if ($scanPaperCode === '' && !empty($paper->paper_id)) { $scanPaperCode = preg_replace('/^paper_/', '', (string) $paper->paper_id) ?: (string) $paper->paper_id; } $totalItems = count($scanSheetItems); $leftCount = (int) ceil($totalItems / 2); $leftItems = array_slice($scanSheetItems, 0, $leftCount); $rightItems = array_slice($scanSheetItems, $leftCount); @endphp