feat: 데이터베이스 및 웹 UI 대규모 리팩토링

- 삭제된 DB 테이블들과 관련 코드 정리:
  * 12개 사용하지 않는 테이블 삭제 (activity_logs, CuttingPlan, DailyIssueReports 등)
  * 관련 모델, 컨트롤러, 라우트 파일들 삭제
  * index.js에서 삭제된 라우트들 제거

- 웹 UI 페이지 정리:
  * 21개 사용하지 않는 페이지 삭제
  * issue-reports 폴더 전체 삭제
  * 모든 사용자 권한을 그룹장 대시보드로 통일

- 데이터베이스 스키마 정리:
  * v1 스키마로 통일 (daily_work_reports 테이블)
  * JSON 데이터 임포트 스크립트 구현
  * 외래키 관계 정리 및 데이터 일관성 확보

- 통합 Docker Compose 설정:
  * 모든 서비스를 단일 docker-compose.yml로 통합
  * 20000번대 포트 유지
  * JWT 시크릿 및 환경변수 설정

- 문서화:
  * DATABASE_SCHEMA.md: 현재 DB 스키마 문서화
  * DELETED_TABLES.md: 삭제된 테이블 목록
  * DELETED_PAGES.md: 삭제된 페이지 목록
This commit is contained in:
Hyungi Ahn
2025-11-03 09:26:50 +09:00
parent 2a3feca45b
commit 94ecc7333d
71 changed files with 15664 additions and 4385 deletions

View File

@@ -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
@@ -798,21 +798,21 @@ const createReportEntries = async ({ report_date, worker_id, entries }) => {
const insertedIds = [];
const sql = `
INSERT INTO daily_work_reports
(report_date, worker_id, project_id, task_id, work_hours, is_error, error_type_code_id, created_by_user_id)
(report_date, worker_id, project_id, work_type_id, work_hours, work_status_id, error_type_id, created_by)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
`;
for (const entry of entries) {
const { project_id, task_id, work_hours, is_error, error_type_code_id, created_by_user_id } = entry;
const { project_id, work_type_id, work_hours, work_status_id, error_type_id, created_by } = entry;
const [result] = await conn.query(sql, [
report_date,
worker_id,
project_id,
task_id,
work_type_id,
work_hours,
is_error,
error_type_code_id,
created_by_user_id
work_status_id || 1,
error_type_id,
created_by
]);
insertedIds.push(result.insertId);
}
@@ -840,27 +840,29 @@ const createReportEntries = async ({ report_date, worker_id, entries }) => {
*/
const getSelectQueryV2 = () => `
SELECT
dwr.report_id,
dwr.id,
dwr.report_date,
dwr.worker_id,
dwr.project_id,
dwr.task_id,
dwr.work_type_id,
dwr.work_status_id,
dwr.error_type_id,
dwr.work_hours,
dwr.is_error,
dwr.error_type_code_id,
dwr.created_by_user_id,
dwr.created_by,
w.worker_name,
p.project_name,
t.task_name,
c.code_name as error_type_name,
wt.name as work_type_name,
wst.name as work_status_name,
et.name as error_type_name,
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 projects p ON dwr.project_id = p.project_id
LEFT JOIN tasks t ON dwr.task_id = t.task_id
LEFT JOIN users u ON dwr.created_by_user_id = u.user_id
LEFT JOIN codes c ON dwr.error_type_code_id = c.code_id AND c.code_type_id = 'ERROR_TYPE'
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
`;
/**
@@ -881,9 +883,9 @@ const getReportsWithOptions = async (options) => {
whereConditions.push('dwr.worker_id = ?');
queryParams.push(options.worker_id);
}
if (options.created_by_user_id) {
whereConditions.push('dwr.created_by_user_id = ?');
queryParams.push(options.created_by_user_id);
if (options.created_by) {
whereConditions.push('dwr.created_by = ?');
queryParams.push(options.created_by);
}
// 필요에 따라 다른 조건 추가 가능 (project_id 등)