单败重构
This commit is contained in:
parent
47f97cd291
commit
5aabaddc31
@ -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)
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -86,7 +86,6 @@
|
||||
<tournament-bracket
|
||||
v-else-if="competition.status === 'starting'"
|
||||
:tournament-id="parseInt(route.query.id)"
|
||||
@refreshPlayers="fetchRegisteredPlayers"
|
||||
/>
|
||||
</template>
|
||||
|
||||
@ -919,22 +918,71 @@ const fetchFinalResults = async () => {
|
||||
try {
|
||||
const tournamentId = parseInt(route.query.id)
|
||||
const response = await getSignUpResultList()
|
||||
// 筛选当前赛事的玩家并按胜场数排序
|
||||
const results = response
|
||||
.filter(player => player.tournament_id === tournamentId)
|
||||
|
||||
console.log('原始API数据:', response)
|
||||
|
||||
// 筛选当前赛事的所有轮次数据
|
||||
const tournamentData = response.filter(player => player.tournament_id === tournamentId)
|
||||
|
||||
console.log('筛选后的赛事数据:', tournamentData)
|
||||
console.log('数据条数:', tournamentData.length)
|
||||
|
||||
// 按玩家名称分组,计算总胜利数和总失败数
|
||||
const playerStats = {}
|
||||
|
||||
tournamentData.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'
|
||||
|
||||
console.log(`处理第${index + 1}条数据:`, {
|
||||
id: player.id,
|
||||
sign_name: playerName,
|
||||
round: round,
|
||||
win: win,
|
||||
lose: lose,
|
||||
status: player.status
|
||||
})
|
||||
|
||||
if (!playerStats[playerName]) {
|
||||
playerStats[playerName] = {
|
||||
username: playerName,
|
||||
qq: player.qq || '',
|
||||
faction: player.faction || 'random',
|
||||
totalWin: 0,
|
||||
totalLose: 0,
|
||||
rounds: []
|
||||
}
|
||||
}
|
||||
|
||||
playerStats[playerName].totalWin += win
|
||||
playerStats[playerName].totalLose += lose
|
||||
playerStats[playerName].rounds.push(round)
|
||||
})
|
||||
|
||||
console.log('分组后的玩家统计:', playerStats)
|
||||
|
||||
// 转换为数组并按总胜利数排序
|
||||
const results = Object.values(playerStats)
|
||||
.sort((a, b) => {
|
||||
// 首先按总胜利数排序
|
||||
if (b.totalWin !== a.totalWin) {
|
||||
return b.totalWin - a.totalWin
|
||||
}
|
||||
// 如果胜利数相同,按失败数排序(失败数少的排名靠前)
|
||||
return a.totalLose - b.totalLose
|
||||
})
|
||||
.map((player, index) => ({
|
||||
rank: index + 1,
|
||||
username: player.sign_name,
|
||||
username: player.username,
|
||||
qq: player.qq,
|
||||
faction: player.faction,
|
||||
score: `${player.win}胜${player.lose}负`
|
||||
score: `${player.totalWin}胜${player.totalLose}负`,
|
||||
rounds: player.rounds.join(',')
|
||||
}))
|
||||
.sort((a, b) => {
|
||||
const aScore = parseInt(a.score.split('胜')[0])
|
||||
const bScore = parseInt(b.score.split('胜')[0])
|
||||
return bScore - aScore
|
||||
})
|
||||
|
||||
console.log('最终排名结果:', results)
|
||||
finalResults.value = results
|
||||
} catch (error) {
|
||||
console.error('获取最终结果失败:', error)
|
||||
|
Loading…
x
Reference in New Issue
Block a user