From 8f42a1054ee802a939c8d1d4e6ed26cc5fcd4765 Mon Sep 17 00:00:00 2001 From: Hyungi Ahn Date: Tue, 21 Oct 2025 10:34:45 +0900 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A7=20=EC=99=84=EC=A0=84=ED=95=9C=20?= =?UTF-8?q?=EC=8A=A4=ED=82=A4=EB=A7=88=20=EC=9E=90=EB=8F=99=ED=99=94=20?= =?UTF-8?q?=EC=8B=9C=EC=8A=A4=ED=85=9C=20=EA=B5=AC=EC=B6=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ✨ 주요 기능: - 완전한 데이터베이스 스키마 분석 및 자동 마이그레이션 시스템 - 44개 테이블 완전 지원 (운영 서버 43개 + 1개 추가) - 누락된 테이블/컬럼 자동 감지 및 생성 🔧 해결된 스키마 문제: - users.status 컬럼 누락 → 자동 추가 - files 테이블 4개 컬럼 누락 → 자동 추가 - materials 테이블 22개 컬럼 누락 → 자동 추가 - support_details, purchase_requests, purchase_request_items 테이블 누락 → 자동 생성 - material_purchase_tracking.description, purchase_status 컬럼 누락 → 자동 추가 🚀 자동화 도구: - schema_analyzer.py: 코드와 DB 스키마 비교 분석 - auto_migrator.py: 자동 마이그레이션 실행 - docker_migrator.py: Docker 환경용 간편 마이그레이션 - schema_monitor.py: 실시간 스키마 모니터링 📋 리비전 관리 시스템: - 8개 카테고리별 리비전 페이지 구현 - PIPE Cutting Plan 관리 시스템 - PIPE Issue Management 시스템 - 완전한 리비전 비교 및 추적 기능 🎯 사용법: docker exec tk-mp-backend python3 scripts/docker_migrator.py 앞으로 스키마 문제가 발생하면 위 명령 하나로 자동 해결! --- PIPE_DATABASE_TABLES.md | 255 ++++ PIPE_DEVELOPMENT_GUIDE.md | 1123 +++++++++++++++++ SCHEMA_ANALYSIS.md | 212 ++++ backend/app/routers/enhanced_revision.py | 409 ++++++ backend/app/routers/pipe_excel.py | 224 ++++ backend/app/routers/pipe_issue.py | 535 ++++++++ backend/app/routers/pipe_revision.py | 435 +++++++ backend/app/routers/pipe_snapshot.py | 338 +++++ backend/app/routers/revision_comparison.py | 97 ++ backend/app/routers/revision_material.py | 199 +++ backend/app/routers/revision_redirect.py | 130 ++ backend/app/routers/revision_status.py | 258 ++++ .../app/services/enhanced_revision_service.py | 488 +++++++ .../services/pipe_data_extraction_service.py | 396 ++++++ .../services/pipe_issue_snapshot_service.py | 362 ++++++ backend/app/services/pipe_revision_service.py | 541 ++++++++ .../services/pipe_snapshot_excel_service.py | 220 ++++ .../services/revision_comparison_service.py | 224 ++++ .../app/services/revision_logic_service.py | 478 +++++++ .../app/services/revision_material_service.py | 425 +++++++ .../app/services/revision_status_service.py | 421 ++++++ backend/app/utils/pipe_utils.py | 583 +++++++++ backend/scripts/auto_migrator.py | 199 +++ backend/scripts/docker_migrator.py | 405 ++++++ backend/scripts/schema_analyzer.py | 361 ++++++ backend/scripts/schema_monitor.py | 278 ++++ frontend/src/components/ErrorBoundary.jsx | 117 ++ .../revision/FittingRevisionManager.jsx | 260 ++++ .../revision/PipeRevisionManager.jsx | 270 ++++ .../revision/RevisionComparisonView.css | 663 ++++++++++ .../revision/RevisionComparisonView.jsx | 608 +++++++++ .../revision/RevisionStatusIndicator.css | 323 +++++ .../revision/RevisionStatusIndicator.jsx | 279 ++++ frontend/src/hooks/usePipeIssue.js | 333 +++++ frontend/src/hooks/usePipeRevision.js | 386 ++++++ frontend/src/hooks/useRevisionComparison.js | 389 ++++++ frontend/src/hooks/useRevisionLogic.js | 314 +++++ frontend/src/hooks/useRevisionRedirect.js | 108 ++ frontend/src/hooks/useRevisionStatus.js | 399 ++++++ frontend/src/pages/EnhancedRevisionPage.css | 815 ++++++++++++ frontend/src/pages/EnhancedRevisionPage.jsx | 683 ++++++++++ .../src/pages/PipeIssueManagementPage.css | 593 +++++++++ .../src/pages/PipeIssueManagementPage.jsx | 781 ++++++++++++ .../src/pages/revision/BoltRevisionPage.jsx | 463 +++++++ .../pages/revision/CategoryRevisionPage.css | 537 ++++++++ .../pages/revision/FittingRevisionPage.jsx | 141 +++ .../src/pages/revision/FlangeRevisionPage.jsx | 141 +++ .../src/pages/revision/GasketRevisionPage.jsx | 459 +++++++ .../pages/revision/PipeCuttingPlanPage.css | 666 ++++++++++ .../pages/revision/PipeCuttingPlanPage.jsx | 681 ++++++++++ .../pages/revision/SpecialRevisionPage.jsx | 460 +++++++ .../pages/revision/SupportRevisionPage.jsx | 450 +++++++ .../revision/UnclassifiedRevisionPage.jsx | 483 +++++++ .../src/pages/revision/ValveRevisionPage.jsx | 453 +++++++ frontend/src/utils/pipeUtils.js | 592 +++++++++ 55 files changed, 22443 insertions(+) create mode 100644 PIPE_DATABASE_TABLES.md create mode 100644 PIPE_DEVELOPMENT_GUIDE.md create mode 100644 SCHEMA_ANALYSIS.md create mode 100644 backend/app/routers/enhanced_revision.py create mode 100644 backend/app/routers/pipe_excel.py create mode 100644 backend/app/routers/pipe_issue.py create mode 100644 backend/app/routers/pipe_revision.py create mode 100644 backend/app/routers/pipe_snapshot.py create mode 100644 backend/app/routers/revision_comparison.py create mode 100644 backend/app/routers/revision_material.py create mode 100644 backend/app/routers/revision_redirect.py create mode 100644 backend/app/routers/revision_status.py create mode 100644 backend/app/services/enhanced_revision_service.py create mode 100644 backend/app/services/pipe_data_extraction_service.py create mode 100644 backend/app/services/pipe_issue_snapshot_service.py create mode 100644 backend/app/services/pipe_revision_service.py create mode 100644 backend/app/services/pipe_snapshot_excel_service.py create mode 100644 backend/app/services/revision_comparison_service.py create mode 100644 backend/app/services/revision_logic_service.py create mode 100644 backend/app/services/revision_material_service.py create mode 100644 backend/app/services/revision_status_service.py create mode 100644 backend/app/utils/pipe_utils.py create mode 100644 backend/scripts/auto_migrator.py create mode 100644 backend/scripts/docker_migrator.py create mode 100644 backend/scripts/schema_analyzer.py create mode 100644 backend/scripts/schema_monitor.py create mode 100644 frontend/src/components/ErrorBoundary.jsx create mode 100644 frontend/src/components/revision/FittingRevisionManager.jsx create mode 100644 frontend/src/components/revision/PipeRevisionManager.jsx create mode 100644 frontend/src/components/revision/RevisionComparisonView.css create mode 100644 frontend/src/components/revision/RevisionComparisonView.jsx create mode 100644 frontend/src/components/revision/RevisionStatusIndicator.css create mode 100644 frontend/src/components/revision/RevisionStatusIndicator.jsx create mode 100644 frontend/src/hooks/usePipeIssue.js create mode 100644 frontend/src/hooks/usePipeRevision.js create mode 100644 frontend/src/hooks/useRevisionComparison.js create mode 100644 frontend/src/hooks/useRevisionLogic.js create mode 100644 frontend/src/hooks/useRevisionRedirect.js create mode 100644 frontend/src/hooks/useRevisionStatus.js create mode 100644 frontend/src/pages/EnhancedRevisionPage.css create mode 100644 frontend/src/pages/EnhancedRevisionPage.jsx create mode 100644 frontend/src/pages/PipeIssueManagementPage.css create mode 100644 frontend/src/pages/PipeIssueManagementPage.jsx create mode 100644 frontend/src/pages/revision/BoltRevisionPage.jsx create mode 100644 frontend/src/pages/revision/CategoryRevisionPage.css create mode 100644 frontend/src/pages/revision/FittingRevisionPage.jsx create mode 100644 frontend/src/pages/revision/FlangeRevisionPage.jsx create mode 100644 frontend/src/pages/revision/GasketRevisionPage.jsx create mode 100644 frontend/src/pages/revision/PipeCuttingPlanPage.css create mode 100644 frontend/src/pages/revision/PipeCuttingPlanPage.jsx create mode 100644 frontend/src/pages/revision/SpecialRevisionPage.jsx create mode 100644 frontend/src/pages/revision/SupportRevisionPage.jsx create mode 100644 frontend/src/pages/revision/UnclassifiedRevisionPage.jsx create mode 100644 frontend/src/pages/revision/ValveRevisionPage.jsx create mode 100644 frontend/src/utils/pipeUtils.js diff --git a/PIPE_DATABASE_TABLES.md b/PIPE_DATABASE_TABLES.md new file mode 100644 index 0000000..06e35ae --- /dev/null +++ b/PIPE_DATABASE_TABLES.md @@ -0,0 +1,255 @@ +# 🗄️ 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 관리 시스템**의 데이터베이스 기반이 구축되었습니다! 🚀 diff --git a/PIPE_DEVELOPMENT_GUIDE.md b/PIPE_DEVELOPMENT_GUIDE.md new file mode 100644 index 0000000..7a3acad --- /dev/null +++ b/PIPE_DEVELOPMENT_GUIDE.md @@ -0,0 +1,1123 @@ +# 🔧 PIPE Cutting Plan & 이슈 관리 시스템 개발 가이드 + +## 📋 목차 +1. [시스템 개요](#시스템-개요) +2. [전체 워크플로우](#전체-워크플로우) +3. [데이터베이스 설계](#데이터베이스-설계) +4. [페이지별 상세 설계](#페이지별-상세-설계) +5. [API 엔드포인트](#api-엔드포인트) +6. [리비전 관리 로직](#리비전-관리-로직) +7. [개발 우선순위](#개발-우선순위) +8. [기술 스택](#기술-스택) + +--- + +## 🎯 시스템 개요 + +### **핵심 목적** +- PIPE 자재의 체계적인 Cutting Plan 관리 +- 구역별/도면별 단관 정보 관리 +- 리비전 시 변경사항 추적 및 비교 +- 현장 이슈 및 문제점 체계적 기록 + +### **주요 특징** +- **2단계 워크플로우**: 구역 할당 → 라인번호 입력 +- **스마트 리비전**: 기존 데이터와 신규 BOM 자동 비교 +- **현장 이슈 관리**: 도면별/단관별 문제점 추적 +- **Excel 연동**: 완전한 데이터 내보내기 지원 + +--- + +## 🔄 전체 워크플로우 + +```mermaid +graph TD + A[BOM 업로드] --> B{PIPE 데이터 추출} + B --> C[1단계: 구역별 도면 할당] + C --> D[2단계: 라인번호 입력] + D --> E[3단계: 단관 정보 확인] + E --> F[Cutting Plan 저장] + + F --> G{새로운 리비전?} + G -->|Yes| H[4단계: 리비전 비교] + G -->|No| I[이슈 관리 페이지] + + H --> J[변경사항 확인/수정] + J --> K[5단계: 변경 도면 요약] + K --> L[파이프 구매량 재계산] + L --> I + + I --> M[현장 이슈 입력] + M --> N[Excel 내보내기] +``` + +--- + +## 🗄️ 데이터베이스 설계 + +### **1. pipe_cutting_plans** (단관 정보) +```sql +CREATE TABLE pipe_cutting_plans ( + id SERIAL PRIMARY KEY, + job_no VARCHAR(50) NOT NULL, + file_id INTEGER REFERENCES files(id), + + -- 기본 정보 + area VARCHAR(10), -- #01, #02 등 + drawing_name VARCHAR(100) NOT NULL, -- P&ID-001 + line_no VARCHAR(50) NOT NULL, -- LINE-A-001 + + -- 파이프 정보 + material_grade VARCHAR(50), -- A106 GR.B + schedule_spec VARCHAR(20), -- SCH40, SCH80 + nominal_size VARCHAR(50), -- 4", 6", 8" + length_mm DECIMAL(10,3) NOT NULL, -- 1500.0 + + -- 끝단 정보 + end_preparation VARCHAR(20), -- 무개선, 한개선, 양개선 + + -- 메타데이터 + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + created_by VARCHAR(100), + + -- 인덱스 + INDEX idx_cutting_plans_job (job_no), + INDEX idx_cutting_plans_area_drawing (area, drawing_name), + INDEX idx_cutting_plans_material (material_grade, nominal_size) +); +``` + +### **2. pipe_revision_comparisons** (리비전 비교) +```sql +CREATE TABLE pipe_revision_comparisons ( + id SERIAL PRIMARY KEY, + job_no VARCHAR(50) NOT NULL, + current_file_id INTEGER REFERENCES files(id), + previous_cutting_plan_id INTEGER REFERENCES pipe_cutting_plans(id), + + -- 비교 결과 + comparison_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + total_drawings INTEGER, -- 전체 도면 수 + changed_drawings INTEGER, -- 변경된 도면 수 + unchanged_drawings INTEGER, -- 변경되지 않은 도면 수 + + -- 단관 변경 통계 + total_segments INTEGER, -- 전체 단관 수 + added_segments INTEGER, -- 추가된 단관 + removed_segments INTEGER, -- 삭제된 단관 + modified_segments INTEGER, -- 수정된 단관 + unchanged_segments INTEGER, -- 변경되지 않은 단관 + + -- 메타데이터 + created_by VARCHAR(100), + is_applied BOOLEAN DEFAULT FALSE, + applied_at TIMESTAMP, + applied_by VARCHAR(100) +); +``` + +### **3. pipe_revision_changes** (리비전 변경 상세) +```sql +CREATE TABLE pipe_revision_changes ( + id SERIAL PRIMARY KEY, + comparison_id INTEGER REFERENCES pipe_revision_comparisons(id), + + -- 변경 정보 + drawing_name VARCHAR(100) NOT NULL, + change_type VARCHAR(20) NOT NULL, -- 'added', 'removed', 'modified', 'unchanged' + + -- 이전 데이터 (수정/삭제의 경우) + old_line_no VARCHAR(50), + old_material_grade VARCHAR(50), + old_schedule_spec VARCHAR(20), + old_nominal_size VARCHAR(50), + old_length_mm DECIMAL(10,3), + old_end_preparation VARCHAR(20), + + -- 새로운 데이터 (추가/수정의 경우) + new_line_no VARCHAR(50), + new_material_grade VARCHAR(50), + new_schedule_spec VARCHAR(20), + new_nominal_size VARCHAR(50), + new_length_mm DECIMAL(10,3), + new_end_preparation VARCHAR(20), + + -- 변경 사유 + change_reason TEXT, + + -- 메타데이터 + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); +``` + +### **4. pipe_drawing_issues** (도면 전반 이슈) +```sql +CREATE TABLE pipe_drawing_issues ( + id SERIAL PRIMARY KEY, + job_no VARCHAR(50) NOT NULL, + area VARCHAR(10) NOT NULL, + drawing_name VARCHAR(100) NOT NULL, + + -- 이슈 정보 + issue_description TEXT NOT NULL, + severity VARCHAR(20) DEFAULT 'medium', -- 'low', 'medium', 'high', 'critical' + status VARCHAR(20) DEFAULT 'open', -- 'open', 'in_progress', 'resolved' + + -- 해결 정보 + resolution_notes TEXT, + resolved_by VARCHAR(100), + resolved_at TIMESTAMP, + + -- 메타데이터 + reported_by VARCHAR(100), + reported_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); +``` + +### **5. pipe_segment_issues** (단관별 이슈) +```sql +CREATE TABLE pipe_segment_issues ( + id SERIAL PRIMARY KEY, + job_no VARCHAR(50) NOT NULL, + area VARCHAR(10) NOT NULL, + drawing_name VARCHAR(100) NOT NULL, + line_no VARCHAR(50) NOT NULL, + + -- 원본 정보 + original_material_info VARCHAR(100), + original_length DECIMAL(10,3), + + -- 이슈 정보 + issue_description TEXT NOT NULL, + issue_type VARCHAR(50), -- 'cutting', 'installation', 'material', 'routing', 'other' + + -- 변경사항 (있는 경우) + length_change DECIMAL(10,3), -- +/- 변경량 + new_length DECIMAL(10,3), -- 최종 길이 + material_change VARCHAR(100), -- 재질 변경 정보 + + -- 이슈 관리 + severity VARCHAR(20) DEFAULT 'medium', + status VARCHAR(20) DEFAULT 'open', + + -- 해결 정보 + resolution_notes TEXT, + resolved_by VARCHAR(100), + resolved_at TIMESTAMP, + + -- 메타데이터 + cutting_plan_id INTEGER REFERENCES pipe_cutting_plans(id), + reported_by VARCHAR(100), + reported_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); +``` + +--- + +## 📄 페이지별 상세 설계 + +### **1. PIPE Cutting Plan 메인 페이지** +**파일**: `frontend/src/pages/revision/PipeCuttingPlanPage.jsx` + +#### **1단계: 구역별 도면 할당** +```javascript +// UI 구조 +
+

📂 1단계: 구역별 도면 할당

+ + {/* 구역 입력 */} +
+ setCurrentArea(e.target.value)} + /> + +
+ + {/* 도면 선택 */} +
+

📋 사용 가능한 도면 목록

+ {availableDrawings.map(drawing => ( + + ))} +
+ + {/* 구역별 할당 현황 */} +
+ {areas.map(area => ( +
+

{area.name}

+
+ {area.drawings.map(drawing => ( + + {drawing} + + + ))} +
+
+ ))} +
+ + +
+``` + +#### **2단계: 라인번호 입력** +```javascript +
+

🔢 2단계: 라인번호 입력

+ + {/* 구역/도면 선택 */} +
+ + + +
+ + {/* 단관 정보 테이블 */} +
+ + + + + + + + + + + + + {pipeSegments.map((segment, index) => ( + + + + + + + + + ))} + +
라인번호재질규격길이(mm)끝단가공액션
+ updateSegmentLineNo(index, e.target.value)} + placeholder="LINE-A-001" + /> + {segment.material_grade}{segment.schedule_spec} {segment.nominal_size}{segment.length_mm} + + + +
+
+ +
+ + +
+
+``` + +#### **3단계: 단관 정보 확인** +```javascript +
+

✅ 3단계: 단관 정보 확인

+ + {/* 전체 요약 */} +
+
+

📊 전체 현황

+

총 구역: {areas.length}개

+

총 도면: {totalDrawings}개

+

총 단관: {totalSegments}개

+
+
+ + {/* 구역별 상세 */} + {areas.map(area => ( +
+

🏗️ {area.name} 구역

+ {area.drawings.map(drawing => ( +
+
📋 {drawing}
+ + + + + + + + + + + {getSegmentsForDrawing(area.name, drawing).map(segment => ( + + + + + + + ))} + +
라인번호재질/규격길이끝단가공
{segment.line_no}{segment.material_grade} {segment.schedule_spec} {segment.nominal_size}{segment.length_mm}mm{segment.end_preparation}
+
+ ))} +
+ ))} + +
+ + +
+
+``` + +### **2. 리비전 비교 페이지** +**파일**: `frontend/src/pages/revision/PipeRevisionComparisonPage.jsx` + +#### **4단계: 리비전 비교** +```javascript +
+

🔄 4단계: 리비전 비교

+ + {/* 비교 요약 */} +
+
+
+

➕ 추가된 단관

+ {comparisonResult.added_segments} +
+
+

➖ 삭제된 단관

+ {comparisonResult.removed_segments} +
+
+

🔧 수정된 단관

+ {comparisonResult.modified_segments} +
+
+

✅ 변경없음

+ {comparisonResult.unchanged_segments} +
+
+
+ + {/* 변경된 도면만 표시 */} +
+

📋 변경된 도면 목록

+ {changedDrawings.map(drawing => ( +
+
📄 {drawing.name}
+ + + + + + + + + + + + + {drawing.segments.map(segment => ( + + + + + + + + + ))} + +
상태라인번호재질/규격길이끝단가공변경사항
+ + {getStatusLabel(segment.change_type)} + + {segment.line_no}{segment.material_info}{segment.length_mm}mm{segment.end_preparation} + {segment.change_type !== 'unchanged' && ( +
+ {segment.changes.map(change => ( +
+ {change.field}: + {change.old_value} → {change.new_value} +
+ ))} +
+ )} +
+
+ ))} +
+ +
+ + +
+
+``` + +#### **5단계: 변경 도면 요약** +```javascript +
+

📊 5단계: 변경 도면 요약

+ + {/* 변경 도면만 집중 표시 */} +
+

⚠️ 검토가 필요한 도면들

+ {changedDrawingsOnly.map(drawing => ( +
+
+
📄 {drawing.name}
+
+ +{drawing.added_count} + -{drawing.removed_count} + ~{drawing.modified_count} +
+
+ +
+
📈 파이프 구매량 영향
+ {drawing.material_impacts.map(impact => ( +
+ {impact.material} + + {impact.length_change > 0 ? '+' : ''}{impact.length_change}m + + + ({impact.percentage_change > 0 ? '+' : ''}{impact.percentage_change}%) + +
+ ))} +
+
+ ))} +
+ + {/* 전체 구매량 재계산 */} +
+

💰 파이프 구매량 재계산

+
+
+
+
이전 구매 계획
+ {previousPurchasePlan.map(item => ( +
+ {item.material} + {item.total_length}m +
+ ))} +
+
+
신규 구매 계획
+ {newPurchasePlan.map(item => ( +
+ {item.material} + {item.total_length}m + {item.additional_needed > 0 && ( + + (+{item.additional_needed}m 추가 필요) + + )} +
+ ))} +
+
+
+
+ +
+ + +
+
+``` + +### **3. 단관 이슈 관리 페이지** +**파일**: `frontend/src/pages/PipeIssueManagementPage.jsx` + +```javascript +
+
+

🛠️ 단관 이슈 관리

+

현장에서 발생하는 파이프 관련 이슈를 체계적으로 관리합니다

+
+ + {/* 검색/필터 섹션 */} +
+
+ + + + + +
+
+ + {/* 도면 전반 이슈 섹션 */} +
+

📋 도면 전반 이슈

+ + {/* 기존 이슈 목록 */} +
+ {drawingIssues.map(issue => ( +
+
+ + {issue.severity.toUpperCase()} + + + {issue.status.toUpperCase()} + +
+
+

{issue.issue_description}

+
+ 보고자: {issue.reported_by} | {issue.reported_at} +
+
+
+ + + {issue.status === 'open' && ( + + )} +
+
+ ))} +
+ + {/* 새 이슈 추가 */} +
+

➕ 새 도면 이슈 추가

+