기능구현중
This commit is contained in:
145
server/api/maintenance/stats.get.ts
Normal file
145
server/api/maintenance/stats.get.ts
Normal file
@@ -0,0 +1,145 @@
|
||||
import { query } from '../../utils/db'
|
||||
|
||||
/**
|
||||
* 유지보수 업무 통계
|
||||
* GET /api/maintenance/stats
|
||||
*/
|
||||
export default defineEventHandler(async (event) => {
|
||||
const params = getQuery(event)
|
||||
const projectId = params.projectId ? Number(params.projectId) : null
|
||||
const year = params.year ? Number(params.year) : new Date().getFullYear()
|
||||
const month = params.month ? Number(params.month) : null
|
||||
|
||||
const conditions: string[] = ['EXTRACT(YEAR FROM m.request_date) = $1']
|
||||
const values: any[] = [year]
|
||||
let paramIndex = 2
|
||||
|
||||
if (projectId) {
|
||||
conditions.push(`m.project_id = $${paramIndex++}`)
|
||||
values.push(projectId)
|
||||
}
|
||||
|
||||
if (month) {
|
||||
conditions.push(`EXTRACT(MONTH FROM m.request_date) = $${paramIndex++}`)
|
||||
values.push(month)
|
||||
}
|
||||
|
||||
const whereClause = conditions.join(' AND ')
|
||||
|
||||
// 상태별 통계
|
||||
const statusStats = await query(`
|
||||
SELECT
|
||||
m.status,
|
||||
COUNT(*) as count
|
||||
FROM wr_maintenance_task m
|
||||
WHERE ${whereClause}
|
||||
GROUP BY m.status
|
||||
`, values)
|
||||
|
||||
// 유형별 통계
|
||||
const typeStats = await query(`
|
||||
SELECT
|
||||
m.task_type,
|
||||
COUNT(*) as count
|
||||
FROM wr_maintenance_task m
|
||||
WHERE ${whereClause}
|
||||
GROUP BY m.task_type
|
||||
`, values)
|
||||
|
||||
// 우선순위별 통계
|
||||
const priorityStats = await query(`
|
||||
SELECT
|
||||
m.priority,
|
||||
COUNT(*) as count
|
||||
FROM wr_maintenance_task m
|
||||
WHERE ${whereClause}
|
||||
GROUP BY m.priority
|
||||
`, values)
|
||||
|
||||
// 월별 추이 (연간)
|
||||
const monthlyTrend = await query(`
|
||||
SELECT
|
||||
EXTRACT(MONTH FROM m.request_date) as month,
|
||||
COUNT(*) as total,
|
||||
COUNT(CASE WHEN m.status = 'COMPLETED' THEN 1 END) as completed
|
||||
FROM wr_maintenance_task m
|
||||
WHERE EXTRACT(YEAR FROM m.request_date) = $1
|
||||
${projectId ? 'AND m.project_id = $2' : ''}
|
||||
GROUP BY EXTRACT(MONTH FROM m.request_date)
|
||||
ORDER BY month
|
||||
`, projectId ? [year, projectId] : [year])
|
||||
|
||||
// 담당자별 통계
|
||||
const assigneeStats = await query(`
|
||||
SELECT
|
||||
e.employee_id,
|
||||
e.employee_name,
|
||||
COUNT(*) as total,
|
||||
COUNT(CASE WHEN m.status = 'COMPLETED' THEN 1 END) as completed
|
||||
FROM wr_maintenance_task m
|
||||
JOIN wr_employee_info e ON m.assignee_id = e.employee_id
|
||||
WHERE ${whereClause}
|
||||
GROUP BY e.employee_id, e.employee_name
|
||||
ORDER BY total DESC
|
||||
LIMIT 10
|
||||
`, values)
|
||||
|
||||
// 프로젝트별 통계
|
||||
const projectStats = await query(`
|
||||
SELECT
|
||||
p.project_id,
|
||||
p.project_name,
|
||||
COUNT(*) as total,
|
||||
COUNT(CASE WHEN m.status = 'COMPLETED' THEN 1 END) as completed
|
||||
FROM wr_maintenance_task m
|
||||
JOIN wr_project_info p ON m.project_id = p.project_id
|
||||
WHERE EXTRACT(YEAR FROM m.request_date) = $1
|
||||
${month ? 'AND EXTRACT(MONTH FROM m.request_date) = $2' : ''}
|
||||
GROUP BY p.project_id, p.project_name
|
||||
ORDER BY total DESC
|
||||
LIMIT 10
|
||||
`, month ? [year, month] : [year])
|
||||
|
||||
// 전체 합계
|
||||
const totalResult = await query(`
|
||||
SELECT
|
||||
COUNT(*) as total,
|
||||
COUNT(CASE WHEN m.status = 'COMPLETED' THEN 1 END) as completed,
|
||||
COUNT(CASE WHEN m.status = 'PENDING' THEN 1 END) as pending,
|
||||
COUNT(CASE WHEN m.status = 'IN_PROGRESS' THEN 1 END) as in_progress
|
||||
FROM wr_maintenance_task m
|
||||
WHERE ${whereClause}
|
||||
`, values)
|
||||
|
||||
return {
|
||||
year,
|
||||
month,
|
||||
projectId,
|
||||
summary: {
|
||||
total: Number(totalResult[0]?.total || 0),
|
||||
completed: Number(totalResult[0]?.completed || 0),
|
||||
pending: Number(totalResult[0]?.pending || 0),
|
||||
inProgress: Number(totalResult[0]?.in_progress || 0)
|
||||
},
|
||||
byStatus: statusStats.map((s: any) => ({ status: s.status, count: Number(s.count) })),
|
||||
byType: typeStats.map((t: any) => ({ taskType: t.task_type, count: Number(t.count) })),
|
||||
byPriority: priorityStats.map((p: any) => ({ priority: p.priority, count: Number(p.count) })),
|
||||
monthlyTrend: monthlyTrend.map((m: any) => ({
|
||||
month: Number(m.month),
|
||||
total: Number(m.total),
|
||||
completed: Number(m.completed)
|
||||
})),
|
||||
byAssignee: assigneeStats.map((a: any) => ({
|
||||
employeeId: a.employee_id,
|
||||
employeeName: a.employee_name,
|
||||
total: Number(a.total),
|
||||
completed: Number(a.completed)
|
||||
})),
|
||||
byProject: projectStats.map((p: any) => ({
|
||||
projectId: p.project_id,
|
||||
projectName: p.project_name,
|
||||
total: Number(p.total),
|
||||
completed: Number(p.completed)
|
||||
}))
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user