115 lines
3.3 KiB
TypeScript
115 lines
3.3 KiB
TypeScript
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)
|
|
}
|
|
}
|
|
})
|