完成競賽編輯功能

This commit is contained in:
2025-09-16 10:38:23 +08:00
parent 31ffaa1974
commit 1f2fb14bd0
8 changed files with 203 additions and 290 deletions

View File

@@ -1250,7 +1250,14 @@ export class CompetitionService {
const connection = await slavePool.getConnection();
try {
const [rows] = await connection.execute('SELECT id FROM competitions WHERE name = ? ORDER BY created_at DESC LIMIT 1', [name]);
return (rows as any[])[0]?.id || null;
const result = (rows as any[])[0]?.id || null;
// 確保返回的是字符串
if (result && typeof result !== 'string') {
return String(result);
}
return result;
} finally {
connection.release();
}
@@ -1361,6 +1368,19 @@ export class CompetitionService {
return await db.query(sql, [competitionId]);
}
// 獲取競賽的應用列表
static async getCompetitionApps(competitionId: string): Promise<any[]> {
const sql = `
SELECT a.*, ca.submitted_at, u.name as creator_name, u.department as creator_department
FROM competition_apps ca
JOIN apps a ON ca.app_id = a.id
LEFT JOIN users u ON a.creator_id = u.id
WHERE ca.competition_id = ? AND a.is_active = TRUE
ORDER BY ca.submitted_at ASC
`;
return await db.query(sql, [competitionId]);
}
// 為競賽添加團隊
static async addCompetitionTeams(competitionId: string, teamIds: string[]): Promise<boolean> {
try {
@@ -1409,6 +1429,54 @@ export class CompetitionService {
return result.affectedRows > 0;
}
// 為競賽添加應用
static async addCompetitionApps(competitionId: string, appIds: string[]): Promise<boolean> {
try {
const dbSyncFixed = new DatabaseSyncFixed();
// 先刪除現有的應用關聯
await db.delete('DELETE FROM competition_apps WHERE competition_id = ?', [competitionId]);
// 添加新的應用關聯
if (appIds.length > 0) {
// 獲取備機的競賽 ID - 通過名稱查找
const competition = await this.getCompetitionById(competitionId);
const slaveCompetitionId = await this.getSlaveCompetitionIdByName(competition?.name || '');
if (!slaveCompetitionId) {
console.error('找不到備機競賽 ID');
return false;
}
const relationData = appIds.map(appId => ({ app_id: appId }));
const result = await dbSyncFixed.smartDualInsertRelation(
'competition_apps',
competitionId,
slaveCompetitionId,
relationData,
'app_id'
);
if (!result.success) {
console.error('添加競賽應用失敗:', result.masterError || result.slaveError);
return false;
}
}
return true;
} catch (error) {
console.error('添加競賽應用失敗:', error);
return false;
}
}
// 從競賽中移除應用
static async removeCompetitionApp(competitionId: string, appId: string): Promise<boolean> {
const sql = 'DELETE FROM competition_apps WHERE competition_id = ? AND app_id = ?';
const result = await db.delete(sql, [competitionId, appId]);
return result.affectedRows > 0;
}
// 獲取競賽的獎項類型列表
static async getCompetitionAwardTypes(competitionId: string): Promise<any[]> {
const sql = `
@@ -1545,17 +1613,27 @@ export class CompetitionService {
const competition = await this.getCompetitionById(competitionId);
if (!competition) return null;
const [judges, teams, awardTypes, rules] = await Promise.all([
const [judges, teams, apps, awardTypes, rules] = await Promise.all([
this.getCompetitionJudges(competitionId),
this.getCompetitionTeams(competitionId),
this.getCompetitionApps(competitionId),
this.getCompetitionAwardTypes(competitionId),
this.getCompetitionRules(competitionId)
]);
// 轉換字段名稱以匹配前端期望的格式
return {
...competition,
startDate: competition.start_date,
endDate: competition.end_date,
evaluationFocus: competition.evaluation_focus,
maxTeamSize: competition.max_team_size,
isActive: competition.is_active,
createdAt: competition.created_at,
updatedAt: competition.updated_at,
judges,
teams,
apps,
awardTypes,
rules
};