79 lines
2.2 KiB
TypeScript
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
|
|
}
|
|
})
|