# 🗄️ PIPE 관리 시스템 데이터베이스 테이블 가이드

## 📋 테이블 개요

PIPE 관리 시스템은 **7개의 전용 테이블**로 구성되어 있으며, 각각 고유한 역할을 담당합니다.

---

## 🔧 **1. pipe_cutting_plans**
**용도**: PIPE Cutting Plan의 단관 정보 저장

### **주요 컬럼**
- `job_no`: 작업 번호
- `area`: 구역 정보 (#01, #02 등)
- `drawing_name`: 도면명 (P&ID-001)
- `line_no`: 라인번호 (LINE-A-001)
- `material_grade`: 재질 (A106 GR.B)
- `schedule_spec`: 스케줄 (SCH40, SCH80)
- `nominal_size`: 호칭 크기 (4", 6")
- `length_mm`: 길이 (mm 단위)
- `end_preparation`: 끝단 가공 (무개선, 한개선, 양개선)

### **사용 시점**
- Cutting Plan 작성 시 단관 정보 저장
- 구역별 도면 할당 완료 후
- 라인번호 입력 완료 후

---

## 🔄 **2. pipe_revision_comparisons**
**용도**: PIPE 리비전 비교 결과 및 통계 저장

### **주요 컬럼**
- `job_no`: 작업 번호
- `current_file_id`: 현재 파일 ID
- `previous_cutting_plan_id`: 이전 Cutting Plan ID
- `total_drawings`: 전체 도면 수
- `changed_drawings`: 변경된 도면 수
- `total_segments`: 전체 단관 수
- `added_segments`: 추가된 단관 수
- `removed_segments`: 삭제된 단관 수
- `modified_segments`: 수정된 단관 수

### **사용 시점**
- 새로운 BOM 업로드 시 (Cutting Plan 작성 후)
- 기존 Cutting Plan과 신규 BOM 비교 시
- 리비전 변경사항 분석 시

---

## 📝 **3. pipe_revision_changes**
**용도**: PIPE 리비전 변경사항 상세 정보 저장

### **주요 컬럼**
- `comparison_id`: 비교 결과 ID (pipe_revision_comparisons 참조)
- `drawing_name`: 도면명
- `change_type`: 변경 유형 (added, removed, modified, unchanged)
- `old_*`: 이전 데이터 (라인번호, 재질, 길이 등)
- `new_*`: 새로운 데이터 (라인번호, 재질, 길이 등)
- `change_reason`: 변경 사유

### **사용 시점**
- 리비전 비교 수행 시 각 단관별 변경사항 기록
- 변경사항 상세 분석 시
- 리비전 이력 추적 시

---

## 📸 **4. pipe_issue_snapshots**
**용도**: 이슈 관리용 스냅샷 메타데이터 저장

### **주요 컬럼**
- `job_no`: 작업 번호
- `snapshot_name`: 스냅샷 이름
- `is_active`: 활성 상태
- `is_locked`: 잠금 상태 (이슈 관리 시작 시 true)
- `total_segments`: 총 단관 수
- `total_drawings`: 총 도면 수
- `created_at`: 생성 시간
- `locked_at`: 잠금 시간

### **사용 시점**
- Cutting Plan 확정 시 자동 생성
- 이슈 관리 시작 시 잠금
- 리비전 보호 활성화 시

---

## 🔒 **5. pipe_issue_segments**
**용도**: 스냅샷된 단관 정보 저장 (고정 데이터)

### **주요 컬럼**
- `snapshot_id`: 스냅샷 ID (pipe_issue_snapshots 참조)
- `area`: 구역 정보
- `drawing_name`: 도면명
- `line_no`: 라인번호
- `material_grade`: 재질
- `length_mm`: 길이
- `end_preparation`: 끝단 가공
- `original_cutting_plan_id`: 원본 Cutting Plan ID

### **사용 시점**
- Cutting Plan 확정 시 현재 데이터 복사
- 이슈 관리 페이지에서 기준 데이터로 사용
- 리비전과 무관하게 고정된 데이터 제공

---

## 📋 **6. pipe_drawing_issues**
**용도**: 도면 전반적인 이슈 저장

### **주요 컬럼**
- `snapshot_id`: 스냅샷 ID (pipe_issue_snapshots 참조)
- `area`: 구역 정보
- `drawing_name`: 도면명
- `issue_description`: 이슈 설명 (자유 텍스트)
- `severity`: 심각도 (low, medium, high, critical)
- `status`: 상태 (open, in_progress, resolved)
- `resolution_notes`: 해결 방법
- `reported_by`: 보고자

### **사용 시점**
- 현장에서 도면 전체에 대한 문제 발견 시
- 배관 간섭, 라우팅 변경 등 전반적 이슈 기록
- 설계 변경 요청 시

### **예시**
```
구역: #01
도면: P&ID-001
이슈: "도면 A 전체적으로 배관 간섭이 심함. 현장 여건상 일부 루트 변경 필요"
```

---

## 🔧 **7. pipe_segment_issues**
**용도**: 개별 단관별 이슈 저장

### **주요 컬럼**
- `snapshot_id`: 스냅샷 ID (pipe_issue_snapshots 참조)
- `segment_id`: 단관 ID (pipe_issue_segments 참조)
- `issue_description`: 이슈 설명
- `issue_type`: 이슈 유형 (cutting, installation, material, routing, other)
- `length_change`: 길이 변경량 (+/- mm)
- `new_length`: 최종 길이
- `material_change`: 재질 변경 정보
- `severity`: 심각도
- `status`: 상태

### **사용 시점**
- 개별 단관에서 문제 발견 시
- 현장 절단, 설치 문제 등 구체적 이슈 기록
- 단관별 수정사항 추적

### **예시**
```
구역: #01
도면: P&ID-001
라인번호: LINE-A-001
이슈: "설치가 힘들어 30mm 절단함"
길이 변경: -30mm
최종 길이: 1470mm
```

---

## 🔗 **테이블 관계도**

```
pipe_cutting_plans (단관 정보)
    ↓
pipe_revision_comparisons (리비전 비교)
    ↓
pipe_revision_changes (변경사항 상세)

pipe_cutting_plans (단관 정보)
    ↓ (확정 시 스냅샷)
pipe_issue_snapshots (스냅샷 메타)
    ↓
pipe_issue_segments (고정된 단관 정보)
    ↓
pipe_segment_issues (단관별 이슈)

pipe_issue_snapshots (스냅샷 메타)
    ↓
pipe_drawing_issues (도면별 이슈)
```

---

## 🎯 **데이터 흐름**

### **1. Cutting Plan 작성**
```
BOM 업로드 → PIPE 데이터 추출 → pipe_cutting_plans 저장
```

### **2. 리비전 발생**
```
새 BOM 업로드 → 기존 데이터 비교 → pipe_revision_comparisons + pipe_revision_changes 저장
```

### **3. Cutting Plan 확정**
```
확정 버튼 클릭 → pipe_issue_snapshots 생성 → pipe_issue_segments 복사 (고정)
```

### **4. 이슈 관리**
```
현장 이슈 발생 → pipe_drawing_issues (도면별) 또는 pipe_segment_issues (단관별) 저장
```

---

## 🔒 **리비전 보호 메커니즘**

### **확정 전**
- `pipe_cutting_plans`: 리비전 시 변경됨 ❌
- Excel 내보내기: 현재 데이터 기준 (변동 가능)

### **확정 후**
- `pipe_issue_snapshots`: 잠금 상태 🔒
- `pipe_issue_segments`: 고정된 데이터 ✅
- Excel 내보내기: 스냅샷 데이터 기준 (고정)
- 이슈 관리: 고정된 데이터 기준으로 진행

---

## 📊 **자동 마이그레이션**

모든 PIPE 관련 테이블은 `backend/scripts/analyze_and_fix_schema.py`에 포함되어 있어 **자동으로 생성**됩니다.

### **마이그레이션 포함 사항**
- ✅ 7개 테이블 자동 생성
- ✅ 모든 인덱스 자동 생성
- ✅ 외래키 제약조건 설정
- ✅ 기본값 및 제약조건 설정

### **배포 시 자동 실행**
```bash
# Docker 컨테이너 시작 시 자동 실행
./start.sh → analyze_and_fix_schema.py → PIPE 테이블 생성
```

---

## 🎉 **핵심 장점**

1. **완전한 리비전 보호**: 확정 후 데이터 변경 불가
2. **체계적 이슈 관리**: 도면별/단관별 구분 관리
3. **자동 마이그레이션**: 배포 시 자동 테이블 생성
4. **성능 최적화**: 모든 주요 컬럼에 인덱스 설정
5. **데이터 무결성**: 외래키 제약조건으로 관계 보장

이제 **완벽한 PIPE 관리 시스템**의 데이터베이스 기반이 구축되었습니다! 🚀
