- 목록 관리 페이지에 고급 필터링 시스템 추가 - 프로젝트별, 검토상태별, 날짜별 필터링 - 검토 완료/필요 항목 시각적 구분 및 정렬 - 해결 시간 입력 + 확인 버튼으로 검토 완료 처리 - 부적합 조회 페이지에 동일한 필터링 기능 적용 - 검토 상태에 따른 카드 스타일링 (음영 처리) - JavaScript 템플릿 리터럴 오류 수정 - 보고서 페이지 프로젝트별 분석 기능 추가 - 프로젝트 선택 드롭다운 추가 - 총 작업 공수를 프로젝트별 일일공수 데이터로 계산 - 부적합 처리 시간, 카테고리 분석, 상세 목록 모두 프로젝트별 필터링 - localStorage 키 이름 통일 (daily-work-data)
5.0 KiB
5.0 KiB
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_usernameON usernameidx_users_roleON 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_noON job_noidx_projects_created_by_idON created_by_ididx_projects_is_activeON 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_idON reporter_ididx_issues_statusON statusidx_issues_categoryON categoryidx_issues_report_dateON 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_dateON dateidx_daily_works_created_by_idON created_by_id
외래키:
- created_by_id → users(id)
관계도 (Relationships)
users (1) ←→ (N) projects
↓
users (1) ←→ (N) issues
↓
users (1) ←→ (N) daily_works
마이그레이션 파일 목록
001_init.sql- 초기 테이블 생성002_add_second_photo.sql- issues 테이블에 두 번째 사진 필드 추가003_update_categories.sql- 카테고리 업데이트004_fix_category_values.sql- 카테고리 값 수정005_recreate_enum_type.sql- ENUM 타입 재생성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
주의사항
- 비밀번호 암호화: bcrypt 해시 사용
- 시간대: 모든 TIMESTAMP는 Asia/Seoul (KST) 기준
- 파일 업로드: 사진 파일은
/app/uploads디렉토리에 저장 - 소프트 삭제: projects 테이블은 is_active 필드로 소프트 삭제 구현
- 인덱스 최적화: 자주 조회되는 컬럼에 인덱스 설정
백업 및 복구
백업
docker-compose exec db pg_dump -U mproject mproject > backup.sql
복구
docker-compose exec -T db psql -U mproject mproject < backup.sql