feat: 목록 관리 및 보고서 페이지 개선

- 목록 관리 페이지에 고급 필터링 시스템 추가
  - 프로젝트별, 검토상태별, 날짜별 필터링
  - 검토 완료/필요 항목 시각적 구분 및 정렬
  - 해결 시간 입력 + 확인 버튼으로 검토 완료 처리

- 부적합 조회 페이지에 동일한 필터링 기능 적용
  - 검토 상태에 따른 카드 스타일링 (음영 처리)
  - JavaScript 템플릿 리터럴 오류 수정

- 보고서 페이지 프로젝트별 분석 기능 추가
  - 프로젝트 선택 드롭다운 추가
  - 총 작업 공수를 프로젝트별 일일공수 데이터로 계산
  - 부적합 처리 시간, 카테고리 분석, 상세 목록 모두 프로젝트별 필터링
  - localStorage 키 이름 통일 (daily-work-data)
This commit is contained in:
hyungi
2025-10-24 10:13:32 +09:00
parent 44e2fb2e44
commit b024a178d0
25 changed files with 3498 additions and 307 deletions

173
DATABASE_SCHEMA.md Normal file
View File

@@ -0,0 +1,173 @@
# M-Project 데이터베이스 스키마 문서
## 개요
작업보고서 시스템의 PostgreSQL 데이터베이스 스키마 정의
---
## 테이블 구조
### 1. users (사용자)
사용자 계정 정보를 저장하는 테이블
| 컬럼명 | 타입 | 제약조건 | 설명 |
|--------|------|----------|------|
| id | INTEGER | PRIMARY KEY, AUTO_INCREMENT | 사용자 고유 ID |
| username | VARCHAR | UNIQUE, NOT NULL, INDEX | 로그인 아이디 |
| hashed_password | VARCHAR | NOT NULL | 암호화된 비밀번호 |
| full_name | VARCHAR | NULL | 사용자 실명 |
| role | ENUM | DEFAULT 'user' | 사용자 권한 (admin, user) |
| is_active | BOOLEAN | DEFAULT TRUE | 계정 활성화 상태 |
| created_at | TIMESTAMP | DEFAULT NOW() | 계정 생성일시 |
**인덱스:**
- `idx_users_username` ON username
- `idx_users_role` ON role
**ENUM 값:**
- role: 'admin', 'user'
---
### 2. projects (프로젝트)
프로젝트 정보를 저장하는 테이블
| 컬럼명 | 타입 | 제약조건 | 설명 |
|--------|------|----------|------|
| id | INTEGER | PRIMARY KEY, AUTO_INCREMENT | 프로젝트 고유 ID |
| job_no | VARCHAR(50) | UNIQUE, NOT NULL, INDEX | Job 번호 |
| project_name | VARCHAR(200) | NOT NULL | 프로젝트 이름 |
| created_by_id | INTEGER | FOREIGN KEY → users(id) | 생성자 ID |
| created_at | TIMESTAMP | DEFAULT NOW() | 생성일시 |
| is_active | BOOLEAN | DEFAULT TRUE | 활성 상태 |
**인덱스:**
- `idx_projects_job_no` ON job_no
- `idx_projects_created_by_id` ON created_by_id
- `idx_projects_is_active` ON is_active
**외래키:**
- created_by_id → users(id)
---
### 3. issues (부적합 사항)
부적합 사항 정보를 저장하는 테이블
| 컬럼명 | 타입 | 제약조건 | 설명 |
|--------|------|----------|------|
| id | INTEGER | PRIMARY KEY, AUTO_INCREMENT | 부적합 사항 고유 ID |
| photo_path | VARCHAR | NULL | 첫 번째 사진 경로 |
| photo_path2 | VARCHAR | NULL | 두 번째 사진 경로 |
| category | ENUM | NOT NULL | 부적합 카테고리 |
| description | TEXT | NOT NULL | 부적합 사항 설명 |
| status | ENUM | DEFAULT 'new' | 처리 상태 |
| reporter_id | INTEGER | FOREIGN KEY → users(id) | 보고자 ID |
| report_date | TIMESTAMP | DEFAULT NOW() | 보고일시 |
| work_hours | FLOAT | DEFAULT 0 | 작업 시간 |
| detail_notes | TEXT | NULL | 상세 메모 |
**인덱스:**
- `idx_issues_reporter_id` ON reporter_id
- `idx_issues_status` ON status
- `idx_issues_category` ON category
- `idx_issues_report_date` ON report_date
**ENUM 값:**
- category: 'material_missing', 'design_error', 'incoming_defect', 'inspection_miss'
- status: 'new', 'progress', 'complete'
**외래키:**
- reporter_id → users(id)
---
### 4. daily_works (일일 공수)
일일 작업 공수 정보를 저장하는 테이블
| 컬럼명 | 타입 | 제약조건 | 설명 |
|--------|------|----------|------|
| id | INTEGER | PRIMARY KEY, AUTO_INCREMENT | 일일 공수 고유 ID |
| date | TIMESTAMP | NOT NULL, INDEX | 작업 날짜 |
| worker_count | INTEGER | NOT NULL | 작업자 수 |
| regular_hours | FLOAT | NOT NULL | 정규 시간 |
| overtime_workers | INTEGER | DEFAULT 0 | 야근 작업자 수 |
| overtime_hours | FLOAT | DEFAULT 0 | 야근 시간 |
| overtime_total | FLOAT | DEFAULT 0 | 야근 총 시간 |
| total_hours | FLOAT | NOT NULL | 총 작업 시간 |
| created_by_id | INTEGER | FOREIGN KEY → users(id) | 생성자 ID |
| created_at | TIMESTAMP | DEFAULT NOW() | 생성일시 |
**인덱스:**
- `idx_daily_works_date` ON date
- `idx_daily_works_created_by_id` ON created_by_id
**외래키:**
- created_by_id → users(id)
---
## 관계도 (Relationships)
```
users (1) ←→ (N) projects
users (1) ←→ (N) issues
users (1) ←→ (N) daily_works
```
---
## 마이그레이션 파일 목록
1. `001_init.sql` - 초기 테이블 생성
2. `002_add_second_photo.sql` - issues 테이블에 두 번째 사진 필드 추가
3. `003_update_categories.sql` - 카테고리 업데이트
4. `004_fix_category_values.sql` - 카테고리 값 수정
5. `005_recreate_enum_type.sql` - ENUM 타입 재생성
6. `006_add_projects_table.sql` - projects 테이블 추가
---
## 기본 데이터
### 관리자 계정
- **Username:** hyungi
- **Password:** djg3-jj34-X3Q3
- **Role:** admin
- **Full Name:** 관리자
---
## 데이터베이스 연결 정보
- **Host:** localhost (Docker 내부: db)
- **Port:** 16432 (외부), 5432 (내부)
- **Database:** mproject
- **Username:** mproject
- **Password:** mproject2024
---
## 주의사항
1. **비밀번호 암호화:** bcrypt 해시 사용
2. **시간대:** 모든 TIMESTAMP는 Asia/Seoul (KST) 기준
3. **파일 업로드:** 사진 파일은 `/app/uploads` 디렉토리에 저장
4. **소프트 삭제:** projects 테이블은 is_active 필드로 소프트 삭제 구현
5. **인덱스 최적화:** 자주 조회되는 컬럼에 인덱스 설정
---
## 백업 및 복구
### 백업
```bash
docker-compose exec db pg_dump -U mproject mproject > backup.sql
```
### 복구
```bash
docker-compose exec -T db psql -U mproject mproject < backup.sql
```