import { db } from '~/drizzle/db' import { expectedPlayDates, songs } from '~/drizzle/schema' import { desc, eq, and } from 'drizzle-orm' export default defineEventHandler(async (event) => { const method = event.node.req.method const user = event.context.user if (!user || (user.role !== 'ADMIN' && user.role !== 'SUPER_ADMIN')) { throw createError({ statusCode: 403, message: '权限不足' }) } if (method === 'GET') { const dates = await db.select().from(expectedPlayDates).orderBy(desc(expectedPlayDates.date)) const result = [] for (const d of dates) { const dateObj = new Date(d.date) const weekdays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'] const weekday = weekdays[dateObj.getDay()] let availableSeqs: number[] = [] if (d.availableSequences) { availableSeqs = d.availableSequences.split(',').map(s => parseInt(s.trim(), 10)).filter(n => !isNaN(n)) } const takenSongs = await db.select({ sequence: songs.expectedPlaySequence, title: songs.title, artist: songs.artist, requesterId: songs.requesterId }) .from(songs) .where( and( eq(songs.expectedPlayDate, d.date), eq(songs.played, false) ) ) const takenSeqs = new Set(takenSongs.map(s => s.sequence).filter(seq => seq !== null)) const takenDetails: Record = {} takenSongs.forEach(s => { if (s.sequence !== null) { takenDetails[s.sequence] = { title: s.title, artist: s.artist } } }) const freeSeqs = availableSeqs.filter(seq => !takenSeqs.has(seq)) result.push({ ...d, weekday, allSequences: availableSeqs.sort((a, b) => a - b), takenSequences: Array.from(takenSeqs).sort((a, b) => a - b), takenDetails, freeSequences: freeSeqs.sort((a, b) => a - b), isFull: freeSeqs.length === 0 }) } return result } if (method === 'POST') { const body = await readBody(event) const { date, availableSequences } = body if (!date || !availableSequences) { throw createError({ statusCode: 400, message: '日期和序号不能为空' }) } try { // 检查是否存在 const existing = await db.select().from(expectedPlayDates).where(eq(expectedPlayDates.date, date)) if (existing.length > 0) { // 更新 const result = await db.update(expectedPlayDates) .set({ availableSequences }) .where(eq(expectedPlayDates.date, date)) .returning() return result[0] } else { // 新增 const result = await db.insert(expectedPlayDates) .values({ date, availableSequences }) .returning() return result[0] } } catch (e: any) { throw createError({ statusCode: 500, message: e.message || '保存失败' }) } } })