import { NextRequest, NextResponse } from 'next/server'; import { CriteriaTemplateService, CriteriaItemService } from '@/lib/services/database'; // GET - 獲取特定評分標準模板 export async function GET( request: NextRequest, { params }: { params: { id: string } } ) { try { const templateId = parseInt(params.id); if (isNaN(templateId)) { return NextResponse.json( { success: false, error: '無效的模板 ID' }, { status: 400 } ); } const template = await CriteriaTemplateService.findWithItems(templateId); if (!template) { return NextResponse.json( { success: false, error: '找不到指定的評分標準模板' }, { status: 404 } ); } return NextResponse.json({ success: true, data: template }); } catch (error) { console.error('獲取評分標準模板失敗:', error); return NextResponse.json( { success: false, error: '獲取評分標準模板失敗' }, { status: 500 } ); } } // PUT - 更新評分標準模板 export async function PUT( request: NextRequest, { params }: { params: { id: string } } ) { try { const templateId = parseInt(params.id); if (isNaN(templateId)) { return NextResponse.json( { success: false, error: '無效的模板 ID' }, { status: 400 } ); } const body = await request.json(); const { name, description, items } = body; if (!name || !items || !Array.isArray(items)) { return NextResponse.json( { success: false, error: '請提供模板名稱和評分項目' }, { status: 400 } ); } // 驗證權重總和 const totalWeight = items.reduce((sum: number, item: any) => sum + (item.weight || 0), 0); if (Math.abs(totalWeight - 100) > 0.01) { return NextResponse.json( { success: false, error: '權重總和必須等於 100%' }, { status: 400 } ); } // 驗證所有項目都有名稱 if (items.some((item: any) => !item.name?.trim())) { return NextResponse.json( { success: false, error: '所有評分項目都必須有名稱' }, { status: 400 } ); } // 使用事務更新模板和項目 const { transaction } = await import('@/lib/database'); await transaction(async (connection) => { // 更新模板 await connection.execute( 'UPDATE criteria_templates SET name = ?, description = ?, total_weight = ?, updated_at = NOW() WHERE id = ?', [name, description || '', totalWeight, templateId] ); // 刪除舊的評分項目 await connection.execute( 'DELETE FROM criteria_items WHERE template_id = ?', [templateId] ); // 創建新的評分項目 for (let i = 0; i < items.length; i++) { const item = items[i]; await connection.execute( 'INSERT INTO criteria_items (template_id, name, description, weight, max_score, sort_order) VALUES (?, ?, ?, ?, ?, ?)', [ templateId, item.name, item.description || '', item.weight, item.maxScore || 10, i + 1 ] ); } }); return NextResponse.json({ success: true, message: '評分標準模板更新成功' }); } catch (error) { console.error('更新評分標準模板失敗:', error); return NextResponse.json( { success: false, error: '更新評分標準模板失敗' }, { status: 500 } ); } } // DELETE - 刪除評分標準模板 export async function DELETE( request: NextRequest, { params }: { params: { id: string } } ) { try { const templateId = parseInt(params.id); if (isNaN(templateId)) { return NextResponse.json( { success: false, error: '無效的模板 ID' }, { status: 400 } ); } // 檢查是否為預設模板 const template = await CriteriaTemplateService.findById(templateId); if (template?.is_default) { return NextResponse.json( { success: false, error: '無法刪除預設模板' }, { status: 400 } ); } await CriteriaTemplateService.delete(templateId); return NextResponse.json({ success: true, message: '評分標準模板刪除成功' }); } catch (error) { console.error('刪除評分標準模板失敗:', error); return NextResponse.json( { success: false, error: '刪除評分標準模板失敗' }, { status: 500 } ); } }