feat: 모델 및 데이터베이스 구조 개선
- 모델 파일들의 데이터베이스 연결 및 쿼리 최적화 - 마이그레이션 파일 정리 및 통합 - Docker 설정 파일 추가 - 프로젝트 시작/중지 스크립트 추가 - README 및 문서 업데이트
This commit is contained in:
4567
api.hyungi.net/migrations/01_complete_data.sql
Normal file
4567
api.hyungi.net/migrations/01_complete_data.sql
Normal file
File diff suppressed because it is too large
Load Diff
4567
api.hyungi.net/migrations/99_restore_data.sql
Normal file
4567
api.hyungi.net/migrations/99_restore_data.sql
Normal file
File diff suppressed because it is too large
Load Diff
@@ -31,7 +31,7 @@ class WorkAnalysis {
|
||||
totalHours: parseFloat(stats.total_hours) || 0,
|
||||
totalReports: parseInt(stats.total_reports) || 0,
|
||||
activeProjects: parseInt(stats.active_projects) || 0,
|
||||
activeWorkers: parseInt(stats.active_workers) || 0,
|
||||
activeworkers: parseInt(stats.active_workers) || 0,
|
||||
errorRate: parseFloat(errorRate.toFixed(2)) || 0,
|
||||
avgHoursPerReport: parseFloat(stats.avg_hours_per_report) || 0
|
||||
};
|
||||
@@ -82,7 +82,7 @@ class WorkAnalysis {
|
||||
SUM(CASE WHEN dwr.work_status_id = 2 THEN 1 ELSE 0 END) as errorCount,
|
||||
COUNT(DISTINCT dwr.report_date) as workingDays
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN Workers w ON dwr.worker_id = w.worker_id
|
||||
LEFT JOIN workers w ON dwr.worker_id = w.worker_id
|
||||
WHERE dwr.report_date BETWEEN ? AND ?
|
||||
GROUP BY dwr.worker_id, w.worker_name
|
||||
ORDER BY totalHours DESC
|
||||
@@ -201,7 +201,7 @@ class WorkAnalysis {
|
||||
u.name as created_by_name,
|
||||
dwr.created_at
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN Workers w ON dwr.worker_id = w.worker_id
|
||||
LEFT JOIN workers w ON dwr.worker_id = w.worker_id
|
||||
LEFT JOIN Projects p ON dwr.project_id = p.project_id
|
||||
LEFT JOIN work_types wt ON dwr.work_type_id = wt.id
|
||||
LEFT JOIN work_status_types wst ON dwr.work_status_id = wst.id
|
||||
@@ -269,7 +269,7 @@ class WorkAnalysis {
|
||||
totalHours: parseFloat(row.total_hours) || 0,
|
||||
totalReports: parseInt(row.total_reports) || 0,
|
||||
avgHours: parseFloat(row.avg_hours) || 0,
|
||||
activeWorkers: parseInt(row.active_workers) || 0
|
||||
activeworkers: parseInt(row.active_workers) || 0
|
||||
}));
|
||||
} catch (error) {
|
||||
throw new Error(`요일별 패턴 분석 실패: ${error.message}`);
|
||||
@@ -301,7 +301,7 @@ class WorkAnalysis {
|
||||
error_type_name: row.error_type_name || `에러유형 ${row.error_type_id}`,
|
||||
errorCount: parseInt(row.error_count) || 0,
|
||||
totalHours: parseFloat(row.total_hours) || 0,
|
||||
affectedWorkers: parseInt(row.affected_workers) || 0,
|
||||
affectedworkers: parseInt(row.affected_workers) || 0,
|
||||
affectedProjects: parseInt(row.affected_projects) || 0
|
||||
}));
|
||||
} catch (error) {
|
||||
@@ -333,7 +333,7 @@ class WorkAnalysis {
|
||||
monthName: row.month_name,
|
||||
totalHours: parseFloat(row.total_hours) || 0,
|
||||
totalReports: parseInt(row.total_reports) || 0,
|
||||
activeWorkers: parseInt(row.active_workers) || 0,
|
||||
activeworkers: parseInt(row.active_workers) || 0,
|
||||
activeProjects: parseInt(row.active_projects) || 0,
|
||||
errorCount: parseInt(row.error_count) || 0,
|
||||
errorRate: row.total_reports > 0 ? parseFloat(((row.error_count / row.total_reports) * 100).toFixed(2)) : 0
|
||||
@@ -362,7 +362,7 @@ class WorkAnalysis {
|
||||
AND report_date BETWEEN ? AND ?
|
||||
)) * 100, 2) as percentage
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN Workers w ON dwr.worker_id = w.worker_id
|
||||
LEFT JOIN workers w ON dwr.worker_id = w.worker_id
|
||||
LEFT JOIN work_types wt ON dwr.work_type_id = wt.id
|
||||
LEFT JOIN Projects p ON dwr.project_id = p.project_id
|
||||
WHERE dwr.report_date BETWEEN ? AND ?
|
||||
|
||||
@@ -26,7 +26,7 @@ const getAnalysis = async (startDate, endDate) => {
|
||||
const summarySql = `
|
||||
SELECT
|
||||
COUNT(DISTINCT dwr.project_id) as totalProjects,
|
||||
COUNT(DISTINCT dwr.worker_id) as totalWorkers,
|
||||
COUNT(DISTINCT dwr.worker_id) as totalworkers,
|
||||
COUNT(DISTINCT dwr.task_id) as totalTasks,
|
||||
SUM(${workHoursCalc}) as totalHours
|
||||
FROM DailyWorkReports dwr
|
||||
@@ -48,7 +48,7 @@ const getAnalysis = async (startDate, endDate) => {
|
||||
const byWorkerSql = `
|
||||
SELECT w.worker_name as name, SUM(${workHoursCalc}) as hours, COUNT(DISTINCT dwr.project_id) as participants
|
||||
FROM DailyWorkReports dwr
|
||||
JOIN Workers w ON dwr.worker_id = w.worker_id
|
||||
JOIN workers w ON dwr.worker_id = w.worker_id
|
||||
${whereClause}
|
||||
GROUP BY w.worker_name
|
||||
HAVING hours > 0
|
||||
@@ -74,7 +74,7 @@ const getAnalysis = async (startDate, endDate) => {
|
||||
(${workHoursCalc}) as work_hours, dwr.memo
|
||||
FROM DailyWorkReports dwr
|
||||
JOIN Projects p ON dwr.project_id = p.project_id
|
||||
JOIN Workers w ON dwr.worker_id = w.worker_id
|
||||
JOIN workers w ON dwr.worker_id = w.worker_id
|
||||
JOIN Tasks t ON dwr.task_id = t.task_id
|
||||
${whereClause}
|
||||
HAVING work_hours > 0
|
||||
|
||||
@@ -46,7 +46,7 @@ const getAllByDate = async (date) => {
|
||||
d.id, d.date, w.worker_name, p.project_name, d.start_time, d.end_time,
|
||||
t.category, t.subcategory, d.description
|
||||
FROM DailyIssueReports d
|
||||
LEFT JOIN Workers w ON d.worker_id = w.worker_id
|
||||
LEFT JOIN workers w ON d.worker_id = w.worker_id
|
||||
LEFT JOIN Projects p ON d.project_id = p.project_id
|
||||
LEFT JOIN IssueTypes t ON d.issue_type_id = t.issue_type_id
|
||||
WHERE d.date = ?
|
||||
|
||||
@@ -54,7 +54,7 @@ const createDailyReport = async (reportData, callback) => {
|
||||
const [existingReports] = await conn.query(
|
||||
`SELECT dwr.created_by, u.name as created_by_name, COUNT(*) as count, SUM(dwr.work_hours) as total_hours
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN Users u ON dwr.created_by = u.user_id
|
||||
LEFT JOIN users u ON dwr.created_by = u.user_id
|
||||
WHERE dwr.report_date = ? AND dwr.worker_id = ?
|
||||
GROUP BY dwr.created_by`,
|
||||
[report_date, worker_id]
|
||||
@@ -82,7 +82,7 @@ const [existingReports] = await conn.query(
|
||||
const [finalReports] = await conn.query(
|
||||
`SELECT dwr.created_by, u.name as created_by_name, COUNT(*) as count, SUM(dwr.work_hours) as total_hours
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN Users u ON dwr.created_by = u.user_id
|
||||
LEFT JOIN users u ON dwr.created_by = u.user_id
|
||||
WHERE dwr.report_date = ? AND dwr.worker_id = ?
|
||||
GROUP BY dwr.created_by`,
|
||||
[report_date, worker_id]
|
||||
@@ -164,7 +164,7 @@ const getMyAccumulatedHours = async (date, worker_id, created_by, callback) => {
|
||||
ORDER BY created_at
|
||||
) as my_entries
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN Projects p ON dwr.project_id = p.project_id
|
||||
LEFT JOIN projects p ON dwr.project_id = p.project_id
|
||||
WHERE dwr.report_date = ? AND dwr.worker_id = ? AND dwr.created_by = ?
|
||||
`;
|
||||
|
||||
@@ -216,8 +216,8 @@ const getContributorsByDate = async (date, worker_id, callback) => {
|
||||
ORDER BY dwr.created_at SEPARATOR ', '
|
||||
) as entry_details
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN Users u ON dwr.created_by = u.user_id
|
||||
LEFT JOIN Projects p ON dwr.project_id = p.project_id
|
||||
LEFT JOIN users u ON dwr.created_by = u.user_id
|
||||
LEFT JOIN projects p ON dwr.project_id = p.project_id
|
||||
WHERE dwr.report_date = ? AND dwr.worker_id = ?
|
||||
GROUP BY dwr.created_by
|
||||
ORDER BY total_hours DESC, first_entry ASC
|
||||
@@ -245,9 +245,9 @@ const removeSpecificEntry = async (entry_id, deleted_by, callback) => {
|
||||
const [entryInfo] = await conn.query(
|
||||
`SELECT dwr.*, w.worker_name, p.project_name, u.name as created_by_name
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN Workers w ON dwr.worker_id = w.worker_id
|
||||
LEFT JOIN Projects p ON dwr.project_id = p.project_id
|
||||
LEFT JOIN Users u ON dwr.created_by = u.user_id
|
||||
LEFT JOIN workers w ON dwr.worker_id = w.worker_id
|
||||
LEFT JOIN projects p ON dwr.project_id = p.project_id
|
||||
LEFT JOIN users u ON dwr.created_by = u.user_id
|
||||
WHERE dwr.id = ?`,
|
||||
[entry_id]
|
||||
);
|
||||
@@ -333,12 +333,12 @@ const getSelectQuery = () => `
|
||||
dwr.created_at,
|
||||
dwr.updated_at
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN Workers w ON dwr.worker_id = w.worker_id
|
||||
LEFT JOIN Projects p ON dwr.project_id = p.project_id
|
||||
LEFT JOIN workers w ON dwr.worker_id = w.worker_id
|
||||
LEFT JOIN projects p ON dwr.project_id = p.project_id
|
||||
LEFT JOIN work_types wt ON dwr.work_type_id = wt.id
|
||||
LEFT JOIN work_status_types wst ON dwr.work_status_id = wst.id
|
||||
LEFT JOIN error_types et ON dwr.error_type_id = et.id
|
||||
LEFT JOIN Users u ON dwr.created_by = u.user_id
|
||||
LEFT JOIN users u ON dwr.created_by = u.user_id
|
||||
`;
|
||||
|
||||
/**
|
||||
@@ -524,7 +524,7 @@ const getSummaryByDate = async (date, callback) => {
|
||||
COUNT(*) as work_entries_count,
|
||||
SUM(CASE WHEN dwr.work_status_id = 2 THEN 1 ELSE 0 END) as error_count
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN Workers w ON dwr.worker_id = w.worker_id
|
||||
LEFT JOIN workers w ON dwr.worker_id = w.worker_id
|
||||
WHERE dwr.report_date = ?
|
||||
GROUP BY dwr.worker_id, dwr.report_date
|
||||
ORDER BY w.worker_name ASC
|
||||
@@ -553,7 +553,7 @@ const getSummaryByWorker = async (worker_id, callback) => {
|
||||
COUNT(*) as work_entries_count,
|
||||
SUM(CASE WHEN dwr.work_status_id = 2 THEN 1 ELSE 0 END) as error_count
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN Workers w ON dwr.worker_id = w.worker_id
|
||||
LEFT JOIN workers w ON dwr.worker_id = w.worker_id
|
||||
WHERE dwr.worker_id = ?
|
||||
GROUP BY dwr.report_date, dwr.worker_id
|
||||
ORDER BY dwr.report_date DESC
|
||||
@@ -587,8 +587,8 @@ const getMonthlySummary = async (year, month, callback) => {
|
||||
GROUP_CONCAT(DISTINCT p.project_name ORDER BY p.project_name) as projects,
|
||||
GROUP_CONCAT(DISTINCT wt.name ORDER BY wt.name) as work_types
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN Workers w ON dwr.worker_id = w.worker_id
|
||||
LEFT JOIN Projects p ON dwr.project_id = p.project_id
|
||||
LEFT JOIN workers w ON dwr.worker_id = w.worker_id
|
||||
LEFT JOIN projects p ON dwr.project_id = p.project_id
|
||||
LEFT JOIN work_types wt ON dwr.work_type_id = wt.id
|
||||
WHERE dwr.report_date BETWEEN ? AND ?
|
||||
GROUP BY dwr.report_date, dwr.worker_id
|
||||
|
||||
@@ -90,7 +90,7 @@ const create = async (report, callback) => {
|
||||
wr.work_details,
|
||||
wr.memo
|
||||
FROM WorkReports wr
|
||||
LEFT JOIN Workers w ON wr.worker_id = w.worker_id
|
||||
LEFT JOIN workers w ON wr.worker_id = w.worker_id
|
||||
LEFT JOIN Projects p ON wr.project_id = p.project_id
|
||||
LEFT JOIN Tasks t ON wr.task_id = t.task_id
|
||||
WHERE wr.\`date\` = ?
|
||||
|
||||
@@ -7,7 +7,7 @@ const create = async (worker, callback) => {
|
||||
const { worker_name, join_date, job_type, salary, annual_leave, status } = worker;
|
||||
|
||||
const [result] = await db.query(
|
||||
`INSERT INTO Workers
|
||||
`INSERT INTO workers
|
||||
(worker_name, join_date, job_type, salary, annual_leave, status)
|
||||
VALUES (?, ?, ?, ?, ?, ?)`,
|
||||
[worker_name, join_date, job_type, salary, annual_leave, status]
|
||||
@@ -23,7 +23,7 @@ const create = async (worker, callback) => {
|
||||
const getAll = async (callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const [rows] = await db.query(`SELECT * FROM Workers ORDER BY worker_id DESC`);
|
||||
const [rows] = await db.query(`SELECT * FROM workers ORDER BY worker_id DESC`);
|
||||
callback(null, rows);
|
||||
} catch (err) {
|
||||
callback(err);
|
||||
@@ -34,7 +34,7 @@ const getAll = async (callback) => {
|
||||
const getById = async (worker_id, callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const [rows] = await db.query(`SELECT * FROM Workers WHERE worker_id = ?`, [worker_id]);
|
||||
const [rows] = await db.query(`SELECT * FROM workers WHERE worker_id = ?`, [worker_id]);
|
||||
callback(null, rows[0]);
|
||||
} catch (err) {
|
||||
callback(err);
|
||||
@@ -48,7 +48,7 @@ const update = async (worker, callback) => {
|
||||
const { worker_id, worker_name, join_date, job_type, salary, annual_leave, status } = worker;
|
||||
|
||||
const [result] = await db.query(
|
||||
`UPDATE Workers
|
||||
`UPDATE workers
|
||||
SET worker_name = ?,
|
||||
join_date = ?,
|
||||
job_type = ?,
|
||||
@@ -70,7 +70,7 @@ const remove = async (worker_id, callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const [result] = await db.query(
|
||||
`DELETE FROM Workers WHERE worker_id = ?`,
|
||||
`DELETE FROM workers WHERE worker_id = ?`,
|
||||
[worker_id]
|
||||
);
|
||||
callback(null, result.affectedRows);
|
||||
|
||||
Reference in New Issue
Block a user