feat: 일일순회점검 시스템 구축 및 관리 기능 개선

- 일일순회점검 시스템 신규 구현
  - DB 테이블: patrol_checklist_items, daily_patrol_sessions, patrol_check_records, workplace_items, item_types
  - API: /api/patrol/* 엔드포인트
  - 프론트엔드: 지도 기반 작업장 점검 UI

- 설비 관리 기능 개선
  - 구매 관련 필드 추가 (구매일, 가격, 공급업체 등)
  - 설비 코드 자동 생성 (TKP-XXX 형식)

- 작업장 관리 개선
  - 레이아웃 이미지 업로드 기능
  - 마커 위치 저장 기능

- 부서 관리 기능 추가
- 사이드바 네비게이션 카테고리 재구성
- 이미지 401 오류 수정 (정적 파일 경로 처리)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Hyungi Ahn
2026-02-04 11:41:41 +09:00
parent 2e9d24faf2
commit 90d3e32992
101 changed files with 17421 additions and 7047 deletions

View File

@@ -27,7 +27,7 @@
</div>
<div class="header-right">
<a href="#" id="dashboardBtn" class="dashboard-btn">
<a href="/pages/dashboard.html" id="dashboardBtn" class="dashboard-btn">
<span class="btn-icon">📊</span>
<span class="btn-text">대시보드</span>
</a>

View File

@@ -46,8 +46,14 @@
<span class="nav-arrow">&#9662;</span>
</button>
<div class="nav-category-items">
<a href="/pages/attendance/daily.html" class="nav-item" data-page-key="inspection.daily">
<span class="nav-text">일일 출퇴근</span>
<a href="/pages/inspection/daily-patrol.html" class="nav-item" data-page-key="inspection.daily_patrol">
<span class="nav-text">일일순회점검</span>
</a>
<a href="/pages/attendance/checkin.html" class="nav-item" data-page-key="inspection.checkin">
<span class="nav-text">출근 체크</span>
</a>
<a href="/pages/attendance/work-status.html" class="nav-item" data-page-key="inspection.work_status">
<span class="nav-text">근무 현황</span>
</a>
</div>
</div>
@@ -112,9 +118,6 @@
<a href="/pages/admin/accounts.html" class="nav-item" data-page-key="admin.accounts">
<span class="nav-text">계정 관리</span>
</a>
<a href="/pages/admin/page-access.html" class="nav-item" data-page-key="admin.page_access">
<span class="nav-text">권한 관리</span>
</a>
<a href="/pages/admin/workers.html" class="nav-item" data-page-key="admin.workers">
<span class="nav-text">작업자 관리</span>
</a>
@@ -320,8 +323,6 @@
/* 메인 콘텐츠 여백 */
body.has-sidebar .dashboard-container,
body.has-sidebar .main-content,
body.has-sidebar .page-container,
body.has-sidebar .work-report-container,
body.has-sidebar .analysis-container,
body.has-sidebar > .dashboard-main {
@@ -329,15 +330,33 @@ body.has-sidebar > .dashboard-main {
transition: margin-left 0.3s ease;
}
/* page-container 사용 시: page-container에만 margin 적용 (main-content 중복 방지) */
body.has-sidebar .page-container {
margin-left: 260px;
transition: margin-left 0.3s ease;
}
/* page-container 없이 main-content만 있는 경우 */
body.has-sidebar > .main-content {
margin-left: 260px;
transition: margin-left 0.3s ease;
}
body.has-sidebar.sidebar-collapsed .dashboard-container,
body.has-sidebar.sidebar-collapsed .main-content,
body.has-sidebar.sidebar-collapsed .page-container,
body.has-sidebar.sidebar-collapsed .work-report-container,
body.has-sidebar.sidebar-collapsed .analysis-container,
body.has-sidebar.sidebar-collapsed > .dashboard-main {
margin-left: 60px;
}
body.has-sidebar.sidebar-collapsed .page-container {
margin-left: 60px;
}
body.has-sidebar.sidebar-collapsed > .main-content {
margin-left: 60px;
}
/* 반응형 */
@media (max-width: 1024px) {
.sidebar-nav {
@@ -349,8 +368,8 @@ body.has-sidebar.sidebar-collapsed > .dashboard-main {
}
body.has-sidebar .dashboard-container,
body.has-sidebar .main-content,
body.has-sidebar .page-container,
body.has-sidebar > .main-content,
body.has-sidebar .work-report-container,
body.has-sidebar .analysis-container,
body.has-sidebar > .dashboard-main {