import { query } from '../../utils/db' /** * 유지보수 업무 목록 조회 * GET /api/maintenance/list * * Query params: * - projectId: 프로젝트 ID * - status: 상태 (PENDING, IN_PROGRESS, COMPLETED) * - priority: 우선순위 (HIGH, MEDIUM, LOW) * - keyword: 검색어 (제목, 내용, 요청자) * - startDate, endDate: 요청일 범위 * - page, pageSize: 페이지네이션 */ export default defineEventHandler(async (event) => { const params = getQuery(event) const projectId = params.projectId ? Number(params.projectId) : null const status = params.status as string | null const priority = params.priority as string | null const keyword = params.keyword as string | null const startDate = params.startDate as string | null const endDate = params.endDate as string | null const page = Number(params.page) || 1 const pageSize = Number(params.pageSize) || 20 const conditions: string[] = [] const values: any[] = [] let paramIndex = 1 if (projectId) { conditions.push(`t.project_id = $${paramIndex++}`) values.push(projectId) } if (status) { conditions.push(`t.status = $${paramIndex++}`) values.push(status) } if (priority) { conditions.push(`t.priority = $${paramIndex++}`) values.push(priority) } if (keyword) { conditions.push(`(t.request_title ILIKE $${paramIndex} OR t.request_content ILIKE $${paramIndex} OR t.requester_name ILIKE $${paramIndex})`) values.push(`%${keyword}%`) paramIndex++ } if (startDate) { conditions.push(`t.request_date >= $${paramIndex++}`) values.push(startDate) } if (endDate) { conditions.push(`t.request_date <= $${paramIndex++}`) values.push(endDate) } const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '' // 전체 카운트 const countSql = `SELECT COUNT(*) as total FROM wr_maintenance_task t ${whereClause}` const countResult = await query(countSql, values) const total = Number(countResult[0]?.total || 0) // 목록 조회 const offset = (page - 1) * pageSize const listSql = ` SELECT t.*, p.project_name, e.employee_name as assignee_name FROM wr_maintenance_task t LEFT JOIN wr_project_info p ON t.project_id = p.project_id LEFT JOIN wr_employee_info e ON t.assignee_id = e.employee_id ${whereClause} ORDER BY t.request_date DESC, t.task_id DESC LIMIT $${paramIndex++} OFFSET $${paramIndex++} ` values.push(pageSize, offset) const tasks = await query(listSql, values) return { tasks: tasks.map((t: any) => ({ taskId: t.task_id, projectId: t.project_id, projectName: t.project_name, requestDate: t.request_date, requestTitle: t.request_title, requestContent: t.request_content, requesterName: t.requester_name, requesterContact: t.requester_contact, taskType: t.task_type, priority: t.priority, status: t.status, assigneeId: t.assignee_id, assigneeName: t.assignee_name, devCompletedAt: t.dev_completed_at, opsCompletedAt: t.ops_completed_at, clientConfirmedAt: t.client_confirmed_at, createdAt: t.created_at })), pagination: { page, pageSize, total, totalPages: Math.ceil(total / pageSize) } } })