import { insertReturning, execute, query } from '../../../utils/db' import { getClientIp } from '../../../utils/ip' import { getCurrentUserEmail } from '../../../utils/user' interface TaskItem { description: string sourceTaskIds: number[] taskType: string taskHours?: number } interface LinkBody { reportId: number projectId: number tasks: TaskItem[] } /** * 유지보수 업무를 주간보고 실적으로 등록 * POST /api/maintenance/report/link */ export default defineEventHandler(async (event) => { const body = await readBody(event) const clientIp = getClientIp(event) const userEmail = await getCurrentUserEmail(event) if (!body.reportId || !body.projectId) { throw createError({ statusCode: 400, message: '보고서 ID와 프로젝트 ID가 필요합니다.' }) } if (!body.tasks || body.tasks.length === 0) { throw createError({ statusCode: 400, message: '등록할 실적이 없습니다.' }) } const insertedTaskIds: number[] = [] const linkedMaintenanceIds: number[] = [] for (const task of body.tasks) { // 주간보고 실적 등록 const result = await insertReturning(` INSERT INTO wr_weekly_report_task ( report_id, project_id, task_type, task_description, task_hours, is_completed, created_ip, created_email ) VALUES ($1, $2, $3, $4, $5, true, $6, $7) RETURNING task_id `, [ body.reportId, body.projectId, task.taskType || 'other', task.description, task.taskHours || null, clientIp, userEmail ]) const newTaskId = result.task_id insertedTaskIds.push(newTaskId) // 유지보수 업무와 연결 if (task.sourceTaskIds && task.sourceTaskIds.length > 0) { for (const maintenanceTaskId of task.sourceTaskIds) { await execute(` UPDATE wr_maintenance_task SET weekly_report_id = $1, updated_at = NOW() WHERE task_id = $2 AND weekly_report_id IS NULL `, [body.reportId, maintenanceTaskId]) linkedMaintenanceIds.push(maintenanceTaskId) } } } return { success: true, insertedCount: insertedTaskIds.length, linkedMaintenanceCount: linkedMaintenanceIds.length, taskIds: insertedTaskIds } })