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);
}
}
?>
项目成绩 - 田径运动会编排管理系统
调试信息
- 是否为预赛:
- 是否已安排决赛:
- 决赛ID:
- 决赛名单数量:
- 运动员成绩数量:
- 第一个成绩的轮次:
- 成绩首页
- 成绩查询
该项目尚未录入任何成绩。
名次 |
运动员 |
单位 |
轮次 |
道次 |
成绩 |
备注 |
$result): ?>
|
|
|
'预赛',
'semifinal' => '半决赛',
'final' => '决赛',
'final_only' => '决赛'
];
echo isset($roundTypeNames[$result['round_type']]) ?
$roundTypeNames[$result['round_type']] : $result['round_type'];
?>
第组
|
|
|
|
已创建决赛赛程,但尚未分配运动员道次。请联系管理员检查。