Files
weeklyreport/backend/api/maintenance/report/link.post.ts

79 lines
2.2 KiB
TypeScript

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<LinkBody>(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
}
})