新增評分項目設定、資料庫整合
This commit is contained in:
166
app/api/criteria-templates/[id]/route.ts
Normal file
166
app/api/criteria-templates/[id]/route.ts
Normal file
@@ -0,0 +1,166 @@
|
||||
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 }
|
||||
);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user