feat: 목록 관리 및 보고서 페이지 개선
- 목록 관리 페이지에 고급 필터링 시스템 추가 - 프로젝트별, 검토상태별, 날짜별 필터링 - 검토 완료/필요 항목 시각적 구분 및 정렬 - 해결 시간 입력 + 확인 버튼으로 검토 완료 처리 - 부적합 조회 페이지에 동일한 필터링 기능 적용 - 검토 상태에 따른 카드 스타일링 (음영 처리) - JavaScript 템플릿 리터럴 오류 수정 - 보고서 페이지 프로젝트별 분석 기능 추가 - 프로젝트 선택 드롭다운 추가 - 총 작업 공수를 프로젝트별 일일공수 데이터로 계산 - 부적합 처리 시간, 카테고리 분석, 상세 목록 모두 프로젝트별 필터링 - localStorage 키 이름 통일 (daily-work-data)
This commit is contained in:
173
DATABASE_SCHEMA.md
Normal file
173
DATABASE_SCHEMA.md
Normal 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
|
||||
```
|
||||
Reference in New Issue
Block a user