feat(tksafety): 통합 출입신고 관리 시스템 구현

- DB 마이그레이션: request_type, visitor_name, department_id, check_in/out_time 컬럼 + status ENUM 확장
- 4소스 UNION 대시보드: 방문(외부/내부) + TBM + 협력업체 통합 조회
- 체크인/체크아웃 API + 내부 출입 신고(승인 불필요) 지원
- 통합 출입 현황판 페이지 신규 (entry-dashboard.html)
- 출입 신청/관리 페이지에 유형 필터 + 체크인/아웃 버튼 추가
- safety_entry_dashboard 권한 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Hyungi Ahn
2026-03-13 14:24:13 +09:00
parent 5a062759c5
commit 6a20056e05
16 changed files with 810 additions and 57 deletions

View File

@@ -34,7 +34,7 @@
<!-- Main -->
<div class="flex-1 min-w-0">
<!-- 통계 카드 -->
<div class="grid grid-cols-2 sm:grid-cols-4 gap-3 mb-5">
<div class="grid grid-cols-3 sm:grid-cols-6 gap-3 mb-5">
<div class="stat-card">
<div class="stat-value text-amber-600" id="statPending">0</div>
<div class="stat-label">대기중</div>
@@ -51,6 +51,14 @@
<div class="stat-value text-blue-600" id="statTrainingDone">0</div>
<div class="stat-label">교육완료</div>
</div>
<div class="stat-card">
<div class="stat-value text-blue-600" id="statCheckedIn">0</div>
<div class="stat-label">체크인</div>
</div>
<div class="stat-card">
<div class="stat-value text-gray-600" id="statCheckedOut">0</div>
<div class="stat-label">체크아웃</div>
</div>
</div>
<!-- 필터 -->
@@ -59,6 +67,14 @@
<h2 class="text-base font-semibold text-gray-800"><i class="fas fa-clipboard-check text-blue-500 mr-2"></i>출입 신청 관리</h2>
</div>
<div class="flex flex-wrap items-end gap-3">
<div>
<label class="block text-xs font-medium text-gray-600 mb-1">출입유형</label>
<select id="filterType" class="input-field px-3 py-2 rounded-lg text-sm">
<option value="">전체</option>
<option value="external">외부 방문</option>
<option value="internal">내부 출입</option>
</select>
</div>
<div>
<label class="block text-xs font-medium text-gray-600 mb-1">상태</label>
<select id="filterStatus" class="input-field px-3 py-2 rounded-lg text-sm">
@@ -67,6 +83,8 @@
<option value="approved">승인됨</option>
<option value="rejected">반려됨</option>
<option value="training_completed">교육완료</option>
<option value="checked_in">체크인</option>
<option value="checked_out">체크아웃</option>
</select>
</div>
<div>
@@ -89,9 +107,9 @@
<table class="visit-table">
<thead>
<tr>
<th>신청일</th>
<th>유형</th>
<th>신청자</th>
<th>업체</th>
<th>업체/이름</th>
<th class="text-center">인원</th>
<th>작업장</th>
<th>방문일</th>
@@ -163,8 +181,8 @@
</div>
</div>
<script src="/static/js/tksafety-core.js"></script>
<script src="/static/js/tksafety-visit-management.js"></script>
<script src="/static/js/tksafety-core.js?v=2"></script>
<script src="/static/js/tksafety-visit-management.js?v=2"></script>
<script>initVisitManagementPage();</script>
</body>
</html>