修正評審連結問題、評審進度條異常

This commit is contained in:
2025-09-25 22:49:24 +08:00
parent b542ca49dd
commit cc92540952
3 changed files with 102 additions and 125 deletions

View File

@@ -1000,15 +1000,15 @@ export class JudgeService extends DatabaseServiceBase {
a.name as display_name
FROM apps a
INNER JOIN competition_apps ca ON a.id = ca.app_id
LEFT JOIN app_judge_scores js ON a.id = js.app_id AND js.judge_id = ?
LEFT JOIN judge_scores js ON a.id = js.app_id AND js.judge_id = ? AND js.competition_id = ?
WHERE ca.competition_id = ? AND a.is_active = 1
UNION ALL
SELECT DISTINCT
t.id,
t.name,
'team' as type,
a.id,
a.name,
'app' as type,
'team' as participant_type,
COALESCE(js.total_score, 0) as score,
CASE
@@ -1017,15 +1017,16 @@ export class JudgeService extends DatabaseServiceBase {
END as status,
js.submitted_at,
t.name as team_name,
t.name as display_name
FROM teams t
INNER JOIN competition_teams ct ON t.id = ct.team_id
LEFT JOIN app_judge_scores js ON js.app_id = CONCAT('team_', t.id) AND js.judge_id = ?
WHERE ct.competition_id = ? AND t.is_active = 1
CONCAT(t.name, ' - ', a.name) as display_name
FROM apps a
INNER JOIN competition_teams ct ON a.team_id = ct.team_id
LEFT JOIN teams t ON a.team_id = t.id
LEFT JOIN judge_scores js ON a.id = js.app_id AND js.judge_id = ? AND js.competition_id = ?
WHERE ct.competition_id = ? AND a.is_active = 1
ORDER BY display_name
`;
params = [judgeId, competitionId, judgeId, competitionId];
params = [judgeId, competitionId, competitionId, judgeId, competitionId, competitionId];
} else {
// 獲取所有競賽的任務
sql = `
@@ -1044,7 +1045,7 @@ export class JudgeService extends DatabaseServiceBase {
a.name as display_name
FROM apps a
INNER JOIN competition_apps ca ON a.id = ca.app_id
LEFT JOIN app_judge_scores js ON a.id = js.app_id AND js.judge_id = ?
LEFT JOIN judge_scores js ON a.id = js.app_id AND js.judge_id = ?
WHERE a.is_active = 1
UNION ALL
@@ -1065,7 +1066,7 @@ export class JudgeService extends DatabaseServiceBase {
FROM apps a
INNER JOIN competition_teams ct ON a.team_id = ct.team_id
LEFT JOIN teams t ON a.team_id = t.id
LEFT JOIN app_judge_scores js ON a.id = js.app_id AND js.judge_id = ?
LEFT JOIN judge_scores js ON a.id = js.app_id AND js.judge_id = ?
WHERE a.is_active = 1
ORDER BY display_name
@@ -2019,7 +2020,7 @@ export class CompetitionService extends DatabaseServiceBase {
ScoringService.getCompetitionRules(competitionId)
]);
// 根據日期動態計算競賽狀態
// 根據日期和評分進度動態計算競賽狀態
const now = new Date();
const startDate = new Date(competition.start_date);
const endDate = new Date(competition.end_date);
@@ -2037,7 +2038,18 @@ export class CompetitionService extends DatabaseServiceBase {
} else if (nowUTC >= startDateUTC && nowUTC <= endDateUTC) {
calculatedStatus = 'active'; // 進行中
} else if (nowUTC > endDateUTC) {
calculatedStatus = 'completed'; // 已完成
// 競賽結束後,檢查評分進度
try {
const scoringProgress = await ScoringService.getCompetitionScoringProgress(competitionId);
if (scoringProgress.percentage >= 100) {
calculatedStatus = 'completed'; // 評分完成,競賽完成
} else {
calculatedStatus = 'judging'; // 評分未完成,仍在評審中
}
} catch (error) {
console.error('獲取評分進度失敗,使用預設狀態:', error);
calculatedStatus = 'judging'; // 無法獲取進度時,預設為評審中
}
}
// 轉換字段名稱以匹配前端期望的格式
@@ -3877,114 +3889,52 @@ export class ScoringService extends DatabaseServiceBase {
try {
console.log('🔍 獲取競賽評分進度competitionId:', competitionId);
// 獲取競賽的評審數量
const judgesResult = await DatabaseServiceBase.safeQuery(`
SELECT COUNT(DISTINCT cj.judge_id) as judge_count
FROM competition_judges cj
WHERE cj.competition_id = ?
// 獲取競賽的參賽APP數量從 competition_teams 與 apps 串聯)
const appsResult = await DatabaseServiceBase.safeQuery(`
SELECT COUNT(DISTINCT a.id) as app_count
FROM competition_teams ct
INNER JOIN apps a ON ct.team_id = a.team_id
WHERE ct.competition_id = ? AND a.is_active = 1
`, [competitionId]);
const judgeCount = judgesResult[0]?.judge_count || 0;
console.log('🔍 評審數量:', judgeCount);
const appCount = appsResult[0]?.app_count || 0;
console.log('🔍 參賽APP數量 (從 competition_teams):', appCount);
// 獲取競賽類型
const competitionResult = await DatabaseServiceBase.safeQuery(`
SELECT type FROM competitions WHERE id = ?
// 獲取競賽的評分項目數量(從 competition_rules
const rulesResult = await DatabaseServiceBase.safeQuery(`
SELECT COUNT(*) as rule_count
FROM competition_rules
WHERE competition_id = ?
`, [competitionId]);
const competitionType = competitionResult[0]?.type || 'individual';
console.log('🔍 競賽類型:', competitionType);
let participantCount = 0;
if (competitionType === 'team') {
// 團隊競賽:獲取參賽團隊數量
const teamsResult = await DatabaseServiceBase.safeQuery(`
SELECT COUNT(DISTINCT ct.team_id) as team_count
FROM competition_teams ct
WHERE ct.competition_id = ?
`, [competitionId]);
participantCount = teamsResult[0]?.team_count || 0;
console.log('🔍 參賽團隊數量:', participantCount);
} else {
// 個人競賽獲取參賽APP數量
const appsResult = await DatabaseServiceBase.safeQuery(`
SELECT COUNT(DISTINCT ca.app_id) as app_count
FROM competition_apps ca
WHERE ca.competition_id = ?
`, [competitionId]);
participantCount = appsResult[0]?.app_count || 0;
console.log('🔍 參賽APP數量:', participantCount);
}
// 如果沒有評審或參賽者關聯,嘗試從其他方式獲取
let finalJudgeCount = judgeCount;
let finalParticipantCount = participantCount;
if (judgeCount === 0) {
// 嘗試從 judges 表獲取所有評審
const allJudgesResult = await DatabaseServiceBase.safeQuery('SELECT COUNT(*) as judge_count FROM judges');
finalJudgeCount = allJudgesResult[0]?.judge_count || 0;
console.log('🔍 使用所有評審數量:', finalJudgeCount);
}
if (participantCount === 0) {
if (competitionType === 'team') {
// 嘗試從 teams 表獲取所有團隊
const allTeamsResult = await DatabaseServiceBase.safeQuery('SELECT COUNT(*) as team_count FROM teams');
finalParticipantCount = allTeamsResult[0]?.team_count || 0;
console.log('🔍 使用所有團隊數量:', finalParticipantCount);
} else {
// 嘗試從 apps 表獲取所有APP
const allAppsResult = await DatabaseServiceBase.safeQuery('SELECT COUNT(*) as app_count FROM apps');
finalParticipantCount = allAppsResult[0]?.app_count || 0;
console.log('🔍 使用所有APP數量:', finalParticipantCount);
}
}
const ruleCount = rulesResult[0]?.rule_count || 0;
console.log('🔍 評分項目數量:', ruleCount);
// 獲取已完成的評分數量
let completedResult;
if (competitionType === 'team') {
// 團隊競賽:查詢團隊評分記錄
completedResult = await DatabaseServiceBase.safeQuery(`
SELECT COUNT(*) as completed_count
FROM app_judge_scores js
WHERE js.app_id LIKE 'team_%'
AND EXISTS (
SELECT 1 FROM competition_teams ct
WHERE ct.competition_id = ?
AND js.app_id = CONCAT('team_', ct.team_id)
)
`, [competitionId]);
} else {
// 個人競賽:查詢應用評分記錄
completedResult = await DatabaseServiceBase.safeQuery(`
SELECT COUNT(*) as completed_count
FROM app_judge_scores js
WHERE js.app_id NOT LIKE 'team_%'
AND EXISTS (
SELECT 1 FROM competition_apps ca
WHERE ca.competition_id = ?
AND ca.app_id = js.app_id
)
`, [competitionId]);
}
const completedResult = await DatabaseServiceBase.safeQuery(`
SELECT COUNT(*) as completed_count
FROM judge_scores js
WHERE js.competition_id = ?
`, [competitionId]);
const completed = completedResult[0]?.completed_count || 0;
const total = finalJudgeCount * finalParticipantCount;
// 計算總評分數參賽APP數量 × 評分項目數量
const total = appCount * ruleCount;
// 計算進度百分比確保不超過100%
const percentage = total > 0 ? Math.min(Math.round((completed / total) * 100), 100) : 0;
console.log('🔍 評分進度結果:', {
completed,
total,
percentage,
judgeCount: finalJudgeCount,
participantCount: finalParticipantCount,
competitionType
console.log('🔍 進度計算詳情:', {
appCount,
ruleCount,
total,
completed,
percentage
});
console.log('🔍 評分進度結果:', { completed, total, percentage });
return {
completed,
total,