重构赛事信息(修改树状图前)

This commit is contained in:
2025-07-31 00:59:05 +08:00
parent 605d60ec7e
commit 47f97cd291

View File

@@ -268,15 +268,6 @@ const statusMap = {
'finish': '已结束' 'finish': '已结束'
} }
// const factionMap = {
// 'allied': '盟军',
// 'soviet': '苏联',
// 'empire': '帝国',
// 'ob': 'OB',
// 'voice': '解说',
// 'random': '随机'
// }
// 状态管理 // 状态管理
const competition = ref({ const competition = ref({
name: '', name: '',
@@ -411,6 +402,17 @@ const handleUpdate = async () => {
} }
await updateTournament(tournamentId, updateData) await updateTournament(tournamentId, updateData)
// 如果赛事名称发生变化更新所有玩家的tournament_name
if (editForm.value.name !== competition.value.name) {
await updateAllPlayersTournamentName(tournamentId, editForm.value.name)
}
// 如果状态变为"进行中",为所有玩家生成对手
if (selectedStatus.value === 'starting') {
await generateOpponentsForAllPlayers(tournamentId)
}
successDialog.value = { visible: true, message: '更新成功!' } successDialog.value = { visible: true, message: '更新成功!' }
closeEditDialog() closeEditDialog()
fetchTournamentDetail() // 刷新数据 fetchTournamentDetail() // 刷新数据
@@ -426,7 +428,46 @@ const handleUpdate = async () => {
const handleDelete = async () => { const handleDelete = async () => {
try { try {
isDeleting.value = true isDeleting.value = true
const tournamentId = route.query.id const tournamentId = parseInt(route.query.id)
// 先获取该赛事的所有报名玩家
const [signupList, resultList] = await Promise.all([
getSignUpList(),
getSignUpResultList()
])
// 筛选当前赛事的报名信息
const tournamentSignups = signupList.filter(signup =>
signup.tournament_id === tournamentId
)
// 筛选当前赛事的结果信息
const tournamentResults = resultList.filter(result =>
result.tournament_id === tournamentId
)
console.log(`准备删除赛事 ${tournamentId},共有 ${tournamentSignups.length} 个报名记录,${tournamentResults.length} 个结果记录`)
// 删除所有报名玩家
const deletePromises = []
// 删除所有报名信息
for (const signup of tournamentSignups) {
deletePromises.push(deleteSignUp(signup.id))
}
// 删除所有报名结果
for (const result of tournamentResults) {
deletePromises.push(deleteSignUpResult(result.id))
}
// 等待所有玩家删除操作完成
if (deletePromises.length > 0) {
await Promise.all(deletePromises)
console.log('所有报名玩家删除完成')
}
// 最后删除赛事
await deleteTournament(tournamentId) await deleteTournament(tournamentId)
successDialog.value = { visible: true, message: '删除成功!' } successDialog.value = { visible: true, message: '删除成功!' }
router.push('/competition') router.push('/competition')
@@ -517,17 +558,19 @@ const fetchRegisteredPlayers = async () => {
result.tournament_id === tournamentId result.tournament_id === tournamentId
) )
// 合并报名信息和结果信息,添加阵营信息 // 合并报名信息和结果信息,添加阵营信息只取轮数为0的玩家
registeredPlayers.value = tournamentResults.map(result => { registeredPlayers.value = tournamentResults
// 查找对应的报名信息 .filter(result => result.round === '0' || result.round === 0 || !result.round)
const signup = tournamentSignups.find(s => s.username === result.sign_name) .map(result => {
// 查找对应的报名信息
return { const signup = tournamentSignups.find(s => s.username === result.sign_name)
...result,
faction: signup?.faction || 'random', // 添加阵营信息 return {
qq: signup?.qq || '' // 添加QQ信息 ...result,
} faction: signup?.faction || 'random', // 添加阵营信息
}) qq: signup?.qq || '' // 添加QQ信息
}
})
console.log('合并后的玩家数据:', registeredPlayers.value) console.log('合并后的玩家数据:', registeredPlayers.value)
} catch (error) { } catch (error) {
@@ -613,6 +656,13 @@ const handleStatusUpdate = async () => {
console.log('更新赛事状态,发送数据:', updateData) console.log('更新赛事状态,发送数据:', updateData)
await updateTournament(tournamentId, updateData) await updateTournament(tournamentId, updateData)
// 如果状态变为"进行中",为所有玩家生成对手
if (selectedStatus.value === 'starting') {
console.log('状态变为进行中,开始生成对手...')
await generateOpponentsForAllPlayers(tournamentId)
}
successDialog.value = { visible: true, message: '状态更新成功!' } successDialog.value = { visible: true, message: '状态更新成功!' }
closeStatusDialog() closeStatusDialog()
fetchTournamentDetail() // 刷新数据 fetchTournamentDetail() // 刷新数据
@@ -704,6 +754,166 @@ const saveChanges = async () => {
} }
} }
// 更新所有玩家的赛事名称
const updateAllPlayersTournamentName = async (tournamentId, newTournamentName) => {
try {
console.log('开始更新所有玩家的赛事名称...')
// 获取当前赛事的所有玩家
const response = await getSignUpResultList()
const players = response.filter(player => player.tournament_id == tournamentId)
console.log(`找到 ${players.length} 个玩家需要更新赛事名称`)
if (players.length === 0) {
console.log('没有找到需要更新的玩家')
return
}
// 批量更新所有玩家的tournament_name
const updatePromises = players.map(player =>
updateSignUpResult(player.id, {
...player,
tournament_name: newTournamentName
})
)
// 等待所有更新完成
await Promise.all(updatePromises)
console.log('所有玩家的赛事名称更新完成')
} catch (error) {
console.error('更新玩家赛事名称失败:', error)
throw error
}
}
// 为所有玩家生成对手
const generateOpponentsForAllPlayers = async (tournamentId) => {
try {
console.log('=== 开始为所有玩家生成对手 ===')
console.log('当前赛事ID:', tournamentId)
// 获取当前赛事的所有玩家
const response = await getSignUpResultList()
console.log('获取到的所有结果数据:', response)
const players = response.filter(player => player.tournament_id == tournamentId)
console.log('筛选后的玩家数据:', players)
console.log(`找到 ${players.length} 个玩家需要生成对手`)
if (players.length === 0) {
console.log('没有找到需要生成对手的玩家')
return
}
// 显示原始玩家信息
console.log('=== 原始玩家信息 ===')
players.forEach((player, index) => {
console.log(`玩家${index + 1}:`, {
id: player.id,
sign_name: player.sign_name,
team_name: player.team_name,
tournament_id: player.tournament_id,
tournament_name: player.tournament_name
})
})
// 随机打乱玩家顺序
const shuffledPlayers = [...players].sort(() => Math.random() - 0.5)
console.log('=== 随机打乱后的玩家顺序 ===')
shuffledPlayers.forEach((player, index) => {
console.log(`${index + 1}位:`, player.sign_name)
})
// 生成对手配对
const updatePromises = []
const pairs = []
console.log('=== 开始生成配对 ===')
for (let i = 0; i < shuffledPlayers.length; i += 2) {
if (i + 1 < shuffledPlayers.length) {
// 有配对的情况
const player1 = shuffledPlayers[i]
const player2 = shuffledPlayers[i + 1]
console.log(`配对 ${i/2 + 1}: ${player1.sign_name} vs ${player2.sign_name}`)
pairs.push({
player1: player1.sign_name,
player2: player2.sign_name,
type: '对战'
})
// 更新player1的对手信息
const updateData1 = {
...player1,
rival_name: player2.sign_name,
win: '0',
lose: '0',
status: 'tie',
round: '0'
}
console.log(`更新 ${player1.sign_name} 的对手信息:`, updateData1)
updatePromises.push(updateSignUpResult(player1.id, updateData1))
// 更新player2的对手信息
const updateData2 = {
...player2,
rival_name: player1.sign_name,
win: '0',
lose: '0',
status: 'tie',
round: '0'
}
console.log(`更新 ${player2.sign_name} 的对手信息:`, updateData2)
updatePromises.push(updateSignUpResult(player2.id, updateData2))
} else {
// 最后一个玩家轮空
const player = shuffledPlayers[i]
console.log(`轮空: ${player.sign_name}`)
pairs.push({
player1: player.sign_name,
player2: null,
type: '轮空'
})
const updateData = {
...player,
rival_name: '轮空',
win: '0',
lose: '0',
status: 'tie',
round: '0'
}
console.log(`更新 ${player.sign_name} 的轮空信息:`, updateData)
updatePromises.push(updateSignUpResult(player.id, updateData))
}
}
console.log('=== 配对结果总结 ===')
pairs.forEach((pair, index) => {
if (pair.type === '对战') {
console.log(`配对${index + 1}: ${pair.player1} vs ${pair.player2}`)
} else {
console.log(`配对${index + 1}: ${pair.player1} (轮空)`)
}
})
console.log(`总共需要更新 ${updatePromises.length} 个玩家记录`)
// 等待所有更新完成
console.log('=== 开始批量更新 ===')
await Promise.all(updatePromises)
console.log('=== 所有玩家的对手生成完成 ===')
} catch (error) {
console.error('生成对手失败:', error)
throw error
}
}
// 获取最终结果 // 获取最终结果
const fetchFinalResults = async () => { const fetchFinalResults = async () => {
try { try {