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

@@ -1,181 +0,0 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>근태 검증 관리 시스템 | (주)테크니컬코리아</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="/css/attendance-validation.css">
<link rel="icon" type="image/png" href="/img/favicon.png">
<script src="/js/auth-check.js" defer></script>
</head>
<body class="bg-gray-50 min-h-screen">
<!-- 네비게이션 바 -->
<div id="navbar-container"></div>
<div class="max-w-7xl mx-auto p-6">
<!-- 뒤로가기 버튼 -->
<a href="javascript:history.back()" class="back-btn">
← 뒤로가기
</a>
<!-- 헤더 -->
<div class="page-header">
<div class="flex items-center justify-between">
<div class="flex items-center space-x-3">
<span class="text-4xl">👥</span>
<div>
<h1 class="text-3xl font-bold text-white">근태 검증 관리</h1>
<p class="text-lg text-white/90 mt-2">작업자별 근무시간을 검증하고 관리합니다</p>
</div>
</div>
<div class="text-sm text-white/80 bg-white/20 px-4 py-2 rounded-lg">
🔒 Admin 전용
</div>
</div>
</div>
<!-- 메시지 영역 -->
<div id="message-container"></div>
<!-- 로딩 화면 -->
<div id="loadingScreen" class="hidden">
<div class="loading-card">
<div class="flex items-center justify-center">
<div class="loading-spinner"></div>
<span class="ml-3 text-gray-600">데이터를 불러오는 중...</span>
</div>
</div>
</div>
<!-- 메인 콘텐츠 -->
<div id="mainContent">
<!-- 캘린더 섹션 -->
<div class="main-card">
<!-- 캘린더 헤더 -->
<div class="calendar-header">
<button id="prevMonth" class="nav-btn">
<span class="text-xl"></span>
</button>
<h2 id="currentMonthYear" class="text-2xl font-bold text-gray-800">
2025년 6월
</h2>
<button id="nextMonth" class="nav-btn">
<span class="text-xl"></span>
</button>
</div>
<!-- 월간 요약 정보 -->
<div class="summary-section">
<h3 class="summary-title">이번 달 요약</h3>
<div class="summary-grid">
<div class="summary-card normal">
<div id="normalCount" class="summary-number">0</div>
<div class="summary-label">✅ 정상</div>
</div>
<div class="summary-card warning">
<div id="reviewCount" class="summary-number">0</div>
<div class="summary-label">⚠️ 검토필요</div>
</div>
<div class="summary-card error">
<div id="missingCount" class="summary-number">0</div>
<div class="summary-label">❌ 미입력</div>
</div>
</div>
</div>
<!-- 요일 헤더 -->
<div class="weekday-header">
<div class="weekday sunday"></div>
<div class="weekday"></div>
<div class="weekday"></div>
<div class="weekday"></div>
<div class="weekday"></div>
<div class="weekday"></div>
<div class="weekday saturday"></div>
</div>
<!-- 캘린더 본체 -->
<div id="calendarGrid" class="calendar-grid">
<!-- 동적으로 생성됨 -->
</div>
<!-- 범례 -->
<div class="legend">
<div class="legend-item">
<div class="legend-dot normal"></div>
<span>정상</span>
</div>
<div class="legend-item">
<div class="legend-dot warning"></div>
<span>검토필요</span>
</div>
<div class="legend-item">
<div class="legend-dot error"></div>
<span>미입력</span>
</div>
</div>
<!-- 성능 상태 표시 (개발용) -->
<div id="performanceStatus" class="text-xs text-gray-500 text-center mt-4 hidden">
<div class="bg-gray-100 rounded-lg p-2">
🔄 순차 호출: <span id="activeReq">0</span>개 처리 중 |
📦 캐시: <span id="cacheCount">0</span>개 저장됨 |
⏳ 대기: <span id="queueCount">0</span>개 |
🚫 429 에러 방지 (2초 딜레이)
</div>
</div>
</div>
<!-- 작업자 리스트 섹션 -->
<div id="workersList" class="main-card">
<div class="empty-state">
<div class="empty-icon">🔄</div>
<h3 class="empty-title">날짜를 클릭해주세요</h3>
<p class="empty-description">
캘린더에서 날짜를 클릭하면 해당 날짜의 작업자 검증 내역을 확인할 수 있습니다.<br>
<strong>순차 호출 방식</strong>으로 안정적이지만 약 5초의 로딩 시간이 있습니다.
</p>
</div>
</div>
</div>
</div>
<!-- 수정 모달 -->
<div id="editModal" class="modal hidden">
<div class="modal-content">
<div class="modal-header">
<h3>✏️ 근무시간 수정</h3>
<button class="close-btn" onclick="closeEditModal()">×</button>
</div>
<div class="modal-body">
<div class="form-group">
<label>👤 작업자</label>
<input type="text" id="editWorkerName" class="form-input" readonly>
</div>
<div class="form-group">
<label>📊 현재 상태</label>
<input type="text" id="editWorkerStatus" class="form-input" readonly>
</div>
<div class="form-group">
<label>⏰ 근무시간 (시간)</label>
<input type="number" id="editWorkHours" class="form-input"
min="0" max="24" step="0.5" placeholder="근무시간을 입력하세요">
</div>
<div class="form-group">
<label>📝 수정 사유</label>
<textarea id="editReason" class="form-textarea"
placeholder="수정 사유를 입력하세요 (선택사항)"></textarea>
</div>
</div>
<div class="modal-footer">
<button class="btn-secondary" onclick="closeEditModal()">취소</button>
<button class="btn-primary" onclick="saveEditedWork()">💾 저장</button>
</div>
</div>
</div>
<script type="module" src="/js/load-navbar.js"></script>
<script src="/js/attendance-validation.js"></script>
</body>
</html>

View File

@@ -1,23 +0,0 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>공장 지도 등록</title>
<link rel="stylesheet" href="/css/admin.css">
</head>
<body>
<div id="navbar-placeholder"></div>
<div class="container">
<h2>공장 지도 등록</h2>
<form id="uploadForm">
<input type="text" name="factory_name" placeholder="공장명" required>
<input type="text" name="address" placeholder="주소" required>
<textarea name="description" placeholder="설명" required></textarea>
<input type="file" name="map_image" accept="image/*" required>
<button type="submit">등록</button>
</form>
</div>
<script src="/js/load-navbar.js"></script>
<script src="/js/admin/factory-upload.js"></script>
</body>
</html>

View File

@@ -1,62 +0,0 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>파이프 스펙 관리 | (주)테크니컬코리아</title>
<link rel="stylesheet" href="/css/main-layout.css">
<link rel="stylesheet" href="/css/admin.css" />
<link rel="icon" type="image/png" href="/img/favicon.png">
<script src="/js/auth-check.js" defer></script>
</head>
<body>
<div class="main-layout">
<div id="navbar-container"></div>
<div class="content-wrapper">
<div id="sidebar-container"></div>
<div id="content-container">
<div class="page-header">
<h1>🧪 파이프 스펙 관리</h1>
<p class="subtitle">배관 사양 정보를 등록하고 관리합니다.</p>
</div>
<div class="card">
<h3>새 파이프 스펙 등록</h3>
<form id="specForm" class="form-horizontal">
<div class="form-row">
<input type="text" id="material" placeholder="재질 (예: STS304)" required />
<input type="text" id="diameter_in" placeholder="직경 (예: 1, 1/2)" required />
<input type="text" id="schedule" placeholder="스케줄 (예: SCH40)" required />
<button type="submit" class="btn btn-primary">등록</button>
</div>
</form>
</div>
<div class="card">
<h3>등록된 파이프 스펙</h3>
<div class="table-responsive">
<table class="data-table">
<thead>
<tr>
<th>ID</th>
<th>스펙</th>
<th>작업</th>
</tr>
</thead>
<tbody id="specTableBody">
<tr><td colspan="3" class="text-center">불러오는 중...</td></tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<script type="module" src="/js/load-navbar.js"></script>
<script type="module" src="/js/load-sidebar.js"></script>
<script type="module" src="/js/manage-pipespec.js"></script>
</body>
</html>

View File

@@ -1,109 +0,0 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>작업 검토 | (주)테크니컬코리아</title>
<link rel="stylesheet" href="/css/main-layout.css">
<link rel="stylesheet" href="/css/work-review.css">
<script src="/js/auth-check.js" defer></script>
</head>
<body>
<div class="main-layout-with-navbar">
<!-- 네비게이션 바 -->
<div id="navbar-container"></div>
<div class="content-wrapper">
<div class="review-container">
<!-- 뒤로가기 버튼 -->
<a href="javascript:history.back()" class="back-btn">
← 뒤로가기
</a>
<!-- 페이지 헤더 -->
<div class="page-header">
<h1>📋 작업 검토 대시보드</h1>
<p class="subtitle">캘린더에서 날짜를 클릭하여 해당 날짜의 작업 현황을 확인하고 검토하세요</p>
</div>
<!-- 메시지 영역 -->
<div id="message-container"></div>
<!-- 컨트롤 패널 -->
<div class="control-panel">
<div class="month-navigation">
<button class="nav-btn" id="prevMonth"> 이전</button>
<div class="current-month" id="currentMonth">2025년 6월</div>
<button class="nav-btn" id="nextMonth">다음 </button>
</div>
<div class="control-actions">
<button class="today-btn" id="goToday">📅 오늘</button>
</div>
</div>
<!-- 사용법 안내 -->
<div class="usage-guide">
<h3>📖 사용법</h3>
<div class="guide-grid">
<div class="guide-item">
<div class="guide-icon">👆</div>
<div class="guide-text">
<strong>날짜 클릭</strong><br>
캘린더에서 날짜를 클릭하면 해당 날짜의 작업 정보를 확인할 수 있습니다.
</div>
</div>
<div class="guide-item">
<div class="guide-icon">✏️</div>
<div class="guide-text">
<strong>작업 수정</strong><br>
각 작업 항목의 수정 버튼을 클릭하여 프로젝트, 작업 유형, 시간 등을 수정할 수 있습니다.
</div>
</div>
<div class="guide-item">
<div class="guide-icon">🗑️</div>
<div class="guide-text">
<strong>작업 삭제</strong><br>
개별 작업 또는 작업자의 모든 작업을 삭제할 수 있습니다.
</div>
</div>
<div class="guide-item">
<div class="guide-icon"></div>
<div class="guide-text">
<strong>검토 완료</strong><br>
작업 검토가 완료되면 검토 완료 버튼을 클릭하여 상태를 변경할 수 있습니다.
</div>
</div>
</div>
</div>
<!-- 캘린더 -->
<div class="calendar-container">
<h3 style="margin-bottom: 1rem;">📅 캘린더</h3>
<div class="calendar-grid" id="calendar">
<!-- 요일 헤더 -->
<div class="day-header"></div>
<div class="day-header"></div>
<div class="day-header"></div>
<div class="day-header"></div>
<div class="day-header"></div>
<div class="day-header"></div>
<div class="day-header"></div>
<!-- 날짜 셀들이 여기에 동적으로 추가됩니다 -->
</div>
</div>
<!-- 선택된 날짜 정보 -->
<div class="day-info-panel">
<div id="day-info-container">
<!-- 날짜별 정보가 여기에 동적으로 추가됩니다 -->
</div>
</div>
</div>
</div>
</div>
<!-- 스크립트 -->
<script type="module" src="/js/load-navbar.js"></script>
<script src="/js/work-review.js"></script>
</body>
</html>