单败重构
This commit is contained in:
parent
292d913305
commit
f5bf2f01f5
@ -165,6 +165,11 @@ const generateSingleEliminationBracket = async () => {
|
|||||||
// 获取所有存在的轮次
|
// 获取所有存在的轮次
|
||||||
const existingRounds = Object.keys(roundsData).map(Number).sort((a, b) => a - b);
|
const existingRounds = Object.keys(roundsData).map(Number).sort((a, b) => a - b);
|
||||||
console.log('存在的轮次:', existingRounds);
|
console.log('存在的轮次:', existingRounds);
|
||||||
|
console.log('API数据按轮次分组:');
|
||||||
|
existingRounds.forEach(round => {
|
||||||
|
const roundData = tournament.value.apiData.filter(item => parseInt(item.round) === round);
|
||||||
|
console.log(`第${round}轮数据:`, roundData);
|
||||||
|
});
|
||||||
|
|
||||||
// 生成所有轮次的比赛
|
// 生成所有轮次的比赛
|
||||||
for (const round of existingRounds) {
|
for (const round of existingRounds) {
|
||||||
@ -259,6 +264,31 @@ const generateRoundMatches = async (round, roundData) => {
|
|||||||
lose: p.lose
|
lose: p.lose
|
||||||
})));
|
})));
|
||||||
|
|
||||||
|
// 检查第1轮是否有待匹配的玩家
|
||||||
|
if (round === 1) {
|
||||||
|
const pendingPlayers = roundData.filter(player => player.rival_name === '待定');
|
||||||
|
const matchedPlayers = roundData.filter(player => player.rival_name !== '待定');
|
||||||
|
console.log(`第1轮待匹配玩家:`, pendingPlayers.map(p => p.sign_name));
|
||||||
|
console.log(`第1轮已匹配玩家:`, matchedPlayers.map(p => `${p.sign_name} vs ${p.rival_name}`));
|
||||||
|
|
||||||
|
// 检查重复记录
|
||||||
|
const playerCounts = {};
|
||||||
|
roundData.forEach(player => {
|
||||||
|
playerCounts[player.sign_name] = (playerCounts[player.sign_name] || 0) + 1;
|
||||||
|
});
|
||||||
|
console.log(`第1轮玩家重复情况:`, playerCounts);
|
||||||
|
|
||||||
|
// 显示所有第1轮记录的详细信息
|
||||||
|
console.log(`第1轮所有记录详情:`, roundData.map(p => ({
|
||||||
|
id: p.id,
|
||||||
|
sign_name: p.sign_name,
|
||||||
|
rival_name: p.rival_name,
|
||||||
|
status: p.status,
|
||||||
|
win: p.win,
|
||||||
|
lose: p.lose
|
||||||
|
})));
|
||||||
|
}
|
||||||
|
|
||||||
// 处理已有数据的比赛
|
// 处理已有数据的比赛
|
||||||
for (const player of roundData) {
|
for (const player of roundData) {
|
||||||
if (usedPlayers.has(player.id)) {
|
if (usedPlayers.has(player.id)) {
|
||||||
@ -559,6 +589,87 @@ const handlePlayerAdvancement = async (match) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 匹配指定轮次的对手
|
||||||
|
const matchOpponentsInRound = async (round) => {
|
||||||
|
try {
|
||||||
|
// 获取指定轮次的所有待定玩家
|
||||||
|
const roundData = tournament.value.apiData.filter(item =>
|
||||||
|
parseInt(item.round) === round && item.rival_name === '待定'
|
||||||
|
);
|
||||||
|
|
||||||
|
console.log(`尝试匹配第${round}轮对手,待定玩家:`, roundData.map(p => p.sign_name));
|
||||||
|
|
||||||
|
// 如果待定玩家数量为偶数,可以两两匹配
|
||||||
|
if (roundData.length >= 2 && roundData.length % 2 === 0) {
|
||||||
|
// 从第二轮开始(round >= 1),按照从上到下的顺序分配对手
|
||||||
|
if (round >= 1) {
|
||||||
|
// 按ID排序,确保从上到下的顺序
|
||||||
|
const sortedPlayers = roundData.sort((a, b) => a.id - b.id);
|
||||||
|
|
||||||
|
console.log(`第${round}轮按ID排序的玩家:`, sortedPlayers.map(p => p.sign_name));
|
||||||
|
|
||||||
|
// 按照从上到下的顺序两两匹配
|
||||||
|
for (let i = 0; i < sortedPlayers.length; i += 2) {
|
||||||
|
const player1 = sortedPlayers[i];
|
||||||
|
const player2 = sortedPlayers[i + 1];
|
||||||
|
|
||||||
|
if (player1 && player2) {
|
||||||
|
// 更新player1的对手
|
||||||
|
const update1 = {
|
||||||
|
...player1,
|
||||||
|
rival_name: player2.sign_name
|
||||||
|
};
|
||||||
|
await updateSignUpResult(player1.id, update1);
|
||||||
|
|
||||||
|
// 更新player2的对手
|
||||||
|
const update2 = {
|
||||||
|
...player2,
|
||||||
|
rival_name: player1.sign_name
|
||||||
|
};
|
||||||
|
await updateSignUpResult(player2.id, update2);
|
||||||
|
|
||||||
|
console.log(`第${round}轮匹配对手: ${player1.sign_name} vs ${player2.sign_name}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 对手匹配完成后,重新获取API数据并更新树状图
|
||||||
|
console.log(`第${round}轮对手匹配完成,开始更新树状图...`);
|
||||||
|
await refreshTournamentData();
|
||||||
|
generateBracket();
|
||||||
|
drawBracket();
|
||||||
|
} else {
|
||||||
|
// 第0轮按ID排序
|
||||||
|
const sortedPlayers = roundData.sort((a, b) => a.id - b.id);
|
||||||
|
|
||||||
|
for (let i = 0; i < sortedPlayers.length; i += 2) {
|
||||||
|
const player1 = sortedPlayers[i];
|
||||||
|
const player2 = sortedPlayers[i + 1];
|
||||||
|
|
||||||
|
// 更新player1的对手
|
||||||
|
const update1 = {
|
||||||
|
...player1,
|
||||||
|
rival_name: player2.sign_name
|
||||||
|
};
|
||||||
|
await updateSignUpResult(player1.id, update1);
|
||||||
|
|
||||||
|
// 更新player2的对手
|
||||||
|
const update2 = {
|
||||||
|
...player2,
|
||||||
|
rival_name: player1.sign_name
|
||||||
|
};
|
||||||
|
await updateSignUpResult(player2.id, update2);
|
||||||
|
|
||||||
|
console.log(`匹配对手: ${player1.sign_name} vs ${player2.sign_name}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.log(`第${round}轮待定玩家数量为${roundData.length},无法匹配`);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`匹配第${round}轮对手失败:`, error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const confirmScore = async (match) => {
|
const confirmScore = async (match) => {
|
||||||
console.log('确认比分,比赛信息:', {
|
console.log('确认比分,比赛信息:', {
|
||||||
id: match.id,
|
id: match.id,
|
||||||
@ -568,7 +679,8 @@ const confirmScore = async (match) => {
|
|||||||
participant2: match.participant2?.name
|
participant2: match.participant2?.name
|
||||||
});
|
});
|
||||||
|
|
||||||
// 检查比赛顺序
|
// 检查比赛顺序(已注释掉)
|
||||||
|
/*
|
||||||
if (!isMatchOrderValid(match)) {
|
if (!isMatchOrderValid(match)) {
|
||||||
const currentRoundMatches = tournament.value.matches
|
const currentRoundMatches = tournament.value.matches
|
||||||
.filter(m => m.round === match.round)
|
.filter(m => m.round === match.round)
|
||||||
@ -589,6 +701,7 @@ const confirmScore = async (match) => {
|
|||||||
};
|
};
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// 处理轮空比赛
|
// 处理轮空比赛
|
||||||
if (!match.participant2) {
|
if (!match.participant2) {
|
||||||
@ -628,8 +741,21 @@ const confirmScore = async (match) => {
|
|||||||
rival_name: '待定'
|
rival_name: '待定'
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 检查是否已存在该玩家的晋级记录
|
||||||
|
const existingRecord = tournament.value.apiData.find(item =>
|
||||||
|
item.sign_name === p1Data.sign_name &&
|
||||||
|
parseInt(item.round) === nextRound
|
||||||
|
);
|
||||||
|
|
||||||
|
if (existingRecord) {
|
||||||
|
console.log(`轮空玩家 ${p1Data.sign_name} 在第${nextRound}轮已存在记录,跳过创建`);
|
||||||
|
} else {
|
||||||
await addSignUpResult(newRecord);
|
await addSignUpResult(newRecord);
|
||||||
console.log(`轮空玩家 ${p1Data.sign_name} 晋级到第${nextRound}轮`);
|
console.log(`轮空玩家 ${p1Data.sign_name} 晋级到第${nextRound}轮`);
|
||||||
|
|
||||||
|
// 尝试匹配对手
|
||||||
|
await matchOpponentsInRound(nextRound);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('处理轮空晋级失败:', error);
|
console.error('处理轮空晋级失败:', error);
|
||||||
@ -661,6 +787,12 @@ const confirmScore = async (match) => {
|
|||||||
match.winner = s1 > s2 ? match.participant1 : match.participant2;
|
match.winner = s1 > s2 ? match.participant1 : match.participant2;
|
||||||
match.decided = true;
|
match.decided = true;
|
||||||
|
|
||||||
|
console.log('比赛结果设置完成:', {
|
||||||
|
winner: match.winner?.name,
|
||||||
|
score: `${s1}:${s2}`,
|
||||||
|
decided: match.decided
|
||||||
|
});
|
||||||
|
|
||||||
// 更新API数据
|
// 更新API数据
|
||||||
try {
|
try {
|
||||||
const p1Data = tournament.value.apiData.find(item => item.id === match.participant1.id);
|
const p1Data = tournament.value.apiData.find(item => item.id === match.participant1.id);
|
||||||
@ -703,16 +835,32 @@ const confirmScore = async (match) => {
|
|||||||
rival_name: '待定'
|
rival_name: '待定'
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 检查是否已存在该玩家的晋级记录
|
||||||
|
const existingRecord = tournament.value.apiData.find(item =>
|
||||||
|
item.sign_name === winner.sign_name &&
|
||||||
|
parseInt(item.round) === nextRound
|
||||||
|
);
|
||||||
|
|
||||||
|
if (existingRecord) {
|
||||||
|
console.log(`玩家 ${winner.sign_name} 在第${nextRound}轮已存在记录,跳过创建`);
|
||||||
|
} else {
|
||||||
await addSignUpResult(newRecord);
|
await addSignUpResult(newRecord);
|
||||||
console.log(`为获胜者 ${winner.sign_name} 创建新记录,轮数: ${nextRound}`);
|
console.log(`为获胜者 ${winner.sign_name} 创建新记录,轮数: ${nextRound}`);
|
||||||
|
console.log('晋级记录详情:', newRecord);
|
||||||
|
|
||||||
|
// 尝试匹配对手
|
||||||
|
await matchOpponentsInRound(nextRound);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('更新比赛结果失败:', error);
|
console.error('更新比赛结果失败:', error);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 重新绘制和刷新
|
// 重新绘制和刷新
|
||||||
|
console.log('开始重新绘制和刷新数据...');
|
||||||
nextTick(() => drawD3Bracket());
|
nextTick(() => drawD3Bracket());
|
||||||
await loadTournamentData();
|
await loadTournamentData();
|
||||||
|
console.log('数据刷新完成');
|
||||||
emit('refreshPlayers');
|
emit('refreshPlayers');
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user