72 lines
2.1 KiB
TypeScript
72 lines
2.1 KiB
TypeScript
import { createError, defineEventHandler } from 'h3'
|
|
import { and, count, db, eq, exists, schedules, semesters, songs, votes } from '~/drizzle/db'
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
// 检查认证和权限
|
|
const user = event.context.user
|
|
if (!user || !['ADMIN', 'SUPER_ADMIN'].includes(user.role)) {
|
|
throw createError({
|
|
statusCode: 403,
|
|
message: '需要管理员权限'
|
|
})
|
|
}
|
|
|
|
try {
|
|
// 获取所有学期
|
|
const semesterList = await db.select().from(semesters).orderBy(semesters.createdAt)
|
|
|
|
// 获取每个学期的统计数据
|
|
const semesterStats = await Promise.all(
|
|
semesterList.map(async (semester) => {
|
|
// 统计该学期的歌曲数量
|
|
const [totalSongsResult, totalSchedulesResult, totalRequestsResult] = await Promise.all([
|
|
db
|
|
.select({ count: count() })
|
|
.from(songs)
|
|
.where(eq(songs.semester, semester.name)),
|
|
|
|
// 统计该学期的排期数量(通过关联歌曲)
|
|
db
|
|
.select({ count: count() })
|
|
.from(schedules)
|
|
.innerJoin(songs, eq(schedules.songId, songs.id))
|
|
.where(eq(songs.semester, semester.name)),
|
|
|
|
// 统计该学期有投票的歌曲数量
|
|
db
|
|
.select({ count: count() })
|
|
.from(songs)
|
|
.where(
|
|
and(
|
|
eq(songs.semester, semester.name),
|
|
exists(db.select().from(votes).where(eq(votes.songId, songs.id)))
|
|
)
|
|
)
|
|
])
|
|
|
|
const [totalSongs, totalSchedules, totalRequests] = [
|
|
totalSongsResult[0]?.count || 0,
|
|
totalSchedulesResult[0]?.count || 0,
|
|
totalRequestsResult[0]?.count || 0
|
|
]
|
|
|
|
return {
|
|
semester: semester.name,
|
|
totalSongs,
|
|
totalSchedules,
|
|
totalRequests,
|
|
isActive: semester.isActive
|
|
}
|
|
})
|
|
)
|
|
|
|
return semesterStats
|
|
} catch (error) {
|
|
console.error('获取学期对比数据失败:', error)
|
|
throw createError({
|
|
statusCode: 500,
|
|
message: '获取学期对比数据失败'
|
|
})
|
|
}
|
|
})
|