diff --git a/src/views/competition/CompetitionDetail.vue b/src/views/competition/CompetitionDetail.vue index 1edf4b5..53ced59 100644 --- a/src/views/competition/CompetitionDetail.vue +++ b/src/views/competition/CompetitionDetail.vue @@ -268,15 +268,6 @@ const statusMap = { 'finish': '已结束' } -// const factionMap = { -// 'allied': '盟军', -// 'soviet': '苏联', -// 'empire': '帝国', -// 'ob': 'OB', -// 'voice': '解说', -// 'random': '随机' -// } - // 状态管理 const competition = ref({ name: '', @@ -411,6 +402,17 @@ const handleUpdate = async () => { } 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: '更新成功!' } closeEditDialog() fetchTournamentDetail() // 刷新数据 @@ -426,7 +428,46 @@ const handleUpdate = async () => { const handleDelete = async () => { try { 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) successDialog.value = { visible: true, message: '删除成功!' } router.push('/competition') @@ -517,17 +558,19 @@ const fetchRegisteredPlayers = async () => { result.tournament_id === tournamentId ) - // 合并报名信息和结果信息,添加阵营信息 - registeredPlayers.value = tournamentResults.map(result => { - // 查找对应的报名信息 - const signup = tournamentSignups.find(s => s.username === result.sign_name) - - return { - ...result, - faction: signup?.faction || 'random', // 添加阵营信息 - qq: signup?.qq || '' // 添加QQ信息 - } - }) + // 合并报名信息和结果信息,添加阵营信息,只取轮数为0的玩家 + registeredPlayers.value = tournamentResults + .filter(result => result.round === '0' || result.round === 0 || !result.round) + .map(result => { + // 查找对应的报名信息 + const signup = tournamentSignups.find(s => s.username === result.sign_name) + + return { + ...result, + faction: signup?.faction || 'random', // 添加阵营信息 + qq: signup?.qq || '' // 添加QQ信息 + } + }) console.log('合并后的玩家数据:', registeredPlayers.value) } catch (error) { @@ -613,6 +656,13 @@ const handleStatusUpdate = async () => { console.log('更新赛事状态,发送数据:', updateData) await updateTournament(tournamentId, updateData) + + // 如果状态变为"进行中",为所有玩家生成对手 + if (selectedStatus.value === 'starting') { + console.log('状态变为进行中,开始生成对手...') + await generateOpponentsForAllPlayers(tournamentId) + } + successDialog.value = { visible: true, message: '状态更新成功!' } closeStatusDialog() 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 () => { try {