prepare($meetSql); $stmt->bind_param('ii', $meet_id, $_SESSION['user_id']); $stmt->execute(); $meetResult = $stmt->get_result(); $meet = $meetResult->fetch_assoc(); $stmt->close(); if (!$meet) { header('Location: ../result/index.php'); exit; } // 获取项目信息 $eventSql = "SELECT id, name, gender_category, type FROM events WHERE id = ? AND meet_id = ?"; $stmt = $conn->prepare($eventSql); $stmt->bind_param('ii', $event_id, $meet_id); $stmt->execute(); $eventResult = $stmt->get_result(); $event = $eventResult->fetch_assoc(); $stmt->close(); if (!$event) { header('Location: results.php?meet_id=' . $meet_id); exit; } // 查询项目的所有成绩 $resultsSql = "SELECT a.id as athlete_id, a.name as athlete_name, t.name as team_name, s.round_type, s.heat_number, ha.lane_number, r.result, r.ranking, r.is_valid, r.remarks FROM results r JOIN heat_assignments ha ON r.heat_assignment_id = ha.id JOIN schedules s ON ha.schedule_id = s.id JOIN athletes a ON ha.athlete_id = a.id JOIN teams t ON a.team_id = t.id WHERE s.event_id = ? ORDER BY r.ranking ASC, r.result ASC"; $stmt = $conn->prepare($resultsSql); $stmt->bind_param('i', $event_id); $stmt->execute(); $resultsData = $stmt->get_result(); $results = []; while ($row = $resultsData->fetch_assoc()) { $results[] = $row; } $stmt->close(); // 检查是否为预赛 $isPreliminary = false; $hasFinalsScheduled = false; if (!empty($results)) { // 如果至少有一个结果是预赛,则显示晋级功能 $isPreliminary = $results[0]['round_type'] == 'preliminary'; // 检查是否已经安排了决赛 $checkFinalsSql = "SELECT id FROM schedules WHERE event_id = ? AND round_type = 'final'"; $stmt = $conn->prepare($checkFinalsSql); $stmt->bind_param('i', $event_id); $stmt->execute(); $finalsResult = $stmt->get_result(); $hasFinalsScheduled = $finalsResult->num_rows > 0; $finalScheduleId = $hasFinalsScheduled ? $finalsResult->fetch_assoc()['id'] : 0; $stmt->close(); } // 获取决赛名单 $finalistsList = []; if ($hasFinalsScheduled && !empty($finalScheduleId)) { $finalistsSql = "SELECT a.id, a.name as athlete_name, t.name as team_name, ha.lane_number FROM heat_assignments ha JOIN athletes a ON ha.athlete_id = a.id JOIN teams t ON a.team_id = t.id WHERE ha.schedule_id = ? ORDER BY ha.lane_number"; $stmt = $conn->prepare($finalistsSql); $stmt->bind_param('i', $finalScheduleId); $stmt->execute(); $finalistsResult = $stmt->get_result(); while ($row = $finalistsResult->fetch_assoc()) { $finalistsList[] = $row; } $stmt->close(); } // 调试模式 $isDebug = isset($_GET['debug']) && $_GET['debug'] == 1; // 晋级处理 $advanceMessage = ''; if (isset($_POST['advance_to_finals']) && $isPreliminary && !$hasFinalsScheduled) { $numToAdvance = (int)$_POST['num_to_advance']; if ($numToAdvance > 0 && $numToAdvance <= count($results)) { try { // 开始事务 $conn->begin_transaction(); // 1. 创建决赛赛程 $createFinalSql = "INSERT INTO schedules (event_id, round_type, heat_number, status) VALUES (?, 'final', 1, 'upcoming')"; $stmt = $conn->prepare($createFinalSql); $stmt->bind_param('i', $event_id); $stmt->execute(); $finalScheduleId = $conn->insert_id; $stmt->close(); // 2. 为晋级运动员创建道次分配 // 只取排名前N的,且成绩有效的运动员 $validResults = array_filter($results, function($r) { return $r['is_valid'] == 1 && !empty($r['result']); }); // 按成绩排序(径赛越小越好) usort($validResults, function($a, $b) { return $a['result'] <=> $b['result']; }); // 取前N名 $advancingAthletes = array_slice($validResults, 0, $numToAdvance); // 分配道次(采用最简单的1-8顺序分配方式) foreach ($advancingAthletes as $index => $athlete) { $laneNumber = $index + 1; $insertAssignmentSql = "INSERT INTO heat_assignments (schedule_id, athlete_id, lane_number) VALUES (?, ?, ?)"; $stmt = $conn->prepare($insertAssignmentSql); $stmt->bind_param('iii', $finalScheduleId, $athlete['athlete_id'], $laneNumber); $stmt->execute(); $stmt->close(); } // 提交事务 $conn->commit(); $advanceMessage = '成功将' . count($advancingAthletes) . '名运动员晋级到决赛。'; // 刷新页面标记 $hasFinalsScheduled = true; // 重新获取决赛名单 $finalistsList = []; $finalistsSql = "SELECT a.id, a.name as athlete_name, t.name as team_name, ha.lane_number FROM heat_assignments ha JOIN athletes a ON ha.athlete_id = a.id JOIN teams t ON a.team_id = t.id WHERE ha.schedule_id = ? ORDER BY ha.lane_number"; $stmt = $conn->prepare($finalistsSql); $stmt->bind_param('i', $finalScheduleId); $stmt->execute(); $finalistsResult = $stmt->get_result(); while ($row = $finalistsResult->fetch_assoc()) { $finalistsList[] = $row; } $stmt->close(); } catch (Exception $e) { // 回滚事务 $conn->rollback(); $advanceMessage = '晋级处理失败: ' . $e->getMessage(); } } else { $advanceMessage = '无效的晋级人数。'; } } // 页面标题 $pageTitle = htmlspecialchars($event['name']) . " 成绩详情"; // 格式化成绩展示函数 function formatTrackResult($seconds) { if (empty($seconds)) return ''; $minutes = floor($seconds / 60); $seconds = $seconds % 60; if ($minutes > 0) { return sprintf('%d:%05.2f', $minutes, $seconds); } else { return sprintf('%.2f', $seconds); } } ?> 项目成绩 - 田径运动会编排管理系统
调试信息

返回成绩列表 关闭调试 调试
项目信息
项目名称:
项目类型:
性别组别:
成绩排名
该项目尚未录入任何成绩。
$result): ?>
名次 运动员 单位 轮次 道次 成绩 备注
'预赛', 'semifinal' => '半决赛', 'final' => '决赛', 'final_only' => '决赛' ]; echo isset($roundTypeNames[$result['round_type']]) ? $roundTypeNames[$result['round_type']] : $result['round_type']; ?> 第
晋级决赛名单
已创建决赛赛程,但尚未分配运动员道次。请联系管理员检查。
道次 运动员 单位
预赛晋级决赛设置
根据成绩从好到差排序,选择指定数量的运动员晋级
注意:晋级后将自动创建决赛赛程并分配道次,此操作不可撤销。
晋级决赛名单
道次 运动员 单位