From 5aabaddc316b4928087830ef45f9f24d347ee200 Mon Sep 17 00:00:00 2001 From: Kunagisa <1549184870@qq.com> Date: Fri, 1 Aug 2025 01:29:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=95=E8=B4=A5=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/RankContestant.vue | 121 +-- src/components/TournamentBracket.vue | 997 ++++++++++++-------- src/views/competition/CompetitionDetail.vue | 70 +- 3 files changed, 731 insertions(+), 457 deletions(-) diff --git a/src/components/RankContestant.vue b/src/components/RankContestant.vue index 773e081..584de10 100644 --- a/src/components/RankContestant.vue +++ b/src/components/RankContestant.vue @@ -46,76 +46,77 @@ const rankData = ref([]) const fetchRankData = async () => { try { const response = await getSignUpResultList() + console.log('RankContestant 原始数据:', response) + // 筛选当前赛事的玩家 const filteredPlayers = response.filter(player => player.tournament_id === props.tournamentId) + console.log('RankContestant 筛选后数据:', filteredPlayers) - // 计算每个玩家的积分 - const playersWithPoints = filteredPlayers.map(player => { - // 获取玩家积分,如果没有则计算 - let points = parseFloat(player.points || 0) + // 按玩家名称分组,计算总胜利数和总失败数 + const playerStats = {} + + filteredPlayers.forEach((player, index) => { + const playerName = player.sign_name + const win = parseInt(player.win || 0) + const lose = parseInt(player.lose || 0) + const round = player.round || '0' - // 如果没有积分字段,根据胜场和所在组别计算积分 - if (!player.points) { - const wins = parseInt(player.win) || 0 - // 败者组积分是胜者组的一半 - const multiplier = player.bracket_type === 'losers' ? 0.5 : 1 - points = wins * multiplier - } - - // 获取排名信息 - const rank = player.rank || '' - - return { + console.log(`RankContestant 处理第${index + 1}条数据:`, { id: player.id, - rank: rank, - username: player.sign_name, - faction: player.faction || player.team_name || '', - win: parseInt(player.win) || 0, - lose: parseInt(player.lose) || 0, - points: points, - status: player.status || '', - bracket_type: player.bracket_type || 'winners', // 默认为胜者组 - score: `${player.win}胜${player.lose}负 (${points.toFixed(1)}分)` + sign_name: playerName, + round: round, + win: win, + lose: lose, + status: player.status + }) + + if (!playerStats[playerName]) { + playerStats[playerName] = { + username: playerName, + faction: player.faction || player.team_name || '', + totalWin: 0, + totalLose: 0, + totalPoints: 0, + rounds: [] + } } + + playerStats[playerName].totalWin += win + playerStats[playerName].totalLose += lose + playerStats[playerName].rounds.push(round) + + // 计算积分(胜场数) + playerStats[playerName].totalPoints = playerStats[playerName].totalWin }) - // 排序逻辑 - const sortedPlayers = [...playersWithPoints].sort((a, b) => { - // 首先检查是否有明确的排名 - if (a.rank && b.rank) { - return parseInt(a.rank) - parseInt(b.rank) - } - - // 如果是决赛选手,按照状态排序(win在前,lose在后) - if (a.status === 'win' && b.status === 'lose') return -1 - if (a.status === 'lose' && b.status === 'win') return 1 - - // 按积分排序 - if (b.points !== a.points) { - return b.points - a.points - } - - // 如果积分相同,胜者组选手排在败者组选手前面 - if (a.bracket_type !== b.bracket_type) { - return a.bracket_type === 'winners' ? -1 : 1 - } - - // 如果积分和组别都相同,按胜场数排序 - if (b.win !== a.win) { - return b.win - a.win - } - - // 如果胜场数相同,则按负场数排序(负场数少的排前面) - return a.lose - b.lose - }) + console.log('RankContestant 分组后统计:', playerStats) - // 重新分配排名 - const results = sortedPlayers.map((player, index) => ({ - ...player, - rank: player.rank || (index + 1).toString() - })) + // 转换为数组并按总胜利数排序 + const sortedPlayers = Object.values(playerStats) + .sort((a, b) => { + // 首先按总胜利数排序 + if (b.totalWin !== a.totalWin) { + return b.totalWin - a.totalWin + } + // 如果胜利数相同,按失败数排序(失败数少的排名靠前) + return a.totalLose - b.totalLose + }) + .map((player, index) => ({ + id: index + 1, // 使用索引作为ID + rank: (index + 1).toString(), + username: player.username, + faction: player.faction, + win: player.totalWin, + lose: player.totalLose, + points: player.totalPoints, + status: '', + bracket_type: 'winners', + score: `${player.totalWin}胜${player.totalLose}负 (${player.totalPoints.toFixed(1)}分)`, + rounds: player.rounds.join(',') + })) - rankData.value = results + console.log('RankContestant 最终排名结果:', sortedPlayers) + rankData.value = sortedPlayers } catch (error) { console.error('获取排名数据失败:', error) } diff --git a/src/components/TournamentBracket.vue b/src/components/TournamentBracket.vue index 7475d77..ee34c40 100644 --- a/src/components/TournamentBracket.vue +++ b/src/components/TournamentBracket.vue @@ -1,41 +1,10 @@