From 0bc6e83ab9cbae0e8232e9853d5ae1f645bd837c Mon Sep 17 00:00:00 2001 From: Hyungi Ahn Date: Mon, 14 Jul 2025 08:23:04 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20TK-MP-Project=20=ED=95=B5=EC=8B=AC=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=ED=8C=8C=EC=9D=BC=EB=93=A4=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Docker Compose 개발 환경 설정 (PostgreSQL, pgAdmin, Redis) - 데이터베이스 스키마 초기 설계 (projects, files, materials 테이블) - Python requirements.txt 작성 (FastAPI, SQLAlchemy, Pandas 등) - .gitignore 설정 완료 (Python, Docker, 개발 도구 제외 파일) - README.md 작성 (프로젝트 개요, 기술 스택, 개발 로드맵) - Phase 1 기반 시스템 구축 준비 완료 --- .gitignore | 84 +++++++++++++++++++++ README.md | 123 +++++++++++++++++++++++++++++++ backend/app/__init__.py | 0 backend/app/main.py | 0 backend/requirements.txt | 28 +++++++ database/init/01_schema.sql | 130 +++++++++++++++++++++++++++++++++ database/init/02_seed_data.sql | 0 docker-compose.yml | 62 ++++++++++++++++ frontend/package.json | 0 9 files changed, 427 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 backend/app/__init__.py create mode 100644 backend/app/main.py create mode 100644 backend/requirements.txt create mode 100644 database/init/01_schema.sql create mode 100644 database/init/02_seed_data.sql create mode 100644 docker-compose.yml create mode 100644 frontend/package.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0b80ac7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,84 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# Virtual environments +venv/ +env/ +ENV/ +.venv + +# IDEs +.vscode/ +.idea/ +*.swp +*.swo + +# OS +.DS_Store +Thumbs.db + +# Logs +*.log +logs/ + +# Database +*.db +*.sqlite3 + +# Environment variables +.env +.env.local +.env.production + +# Node.js +node_modules/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# React build +frontend/build/ +frontend/dist/ + +# Docker +.docker/ + +# Temporary files +tmp/ +temp/ +*.tmp + +# Backup files +*.bak +*.backup + +# Config files with secrets +config/secrets.json +config/local.json + +# Uploads +uploads/ +media/ + +# TK-MP specific +database/backups/ +logs/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..ba8dfa9 --- /dev/null +++ b/README.md @@ -0,0 +1,123 @@ +아! 이해했습니다! 😅 +cat > README.md << 'EOF' 명령어에서 EOF까지의 모든 내용을 한 번에 입력하라는 뜻이에요. +즉, 이 전체 부분을 한 번에 복사해서 터미널에 붙여넣기하면 됩니다: +bashcat > README.md << 'EOF' +# 🚀 TK-MP-Project: BOM 시스템 개발 프로젝트 + +## 📋 프로젝트 개요 +BOM (Bill of Materials) 시스템의 기능 이상을 해결하고, 도면 완성 후 자재 관리의 모든 프로세스를 자동화하는 종합 시스템 개발 프로젝트입니다. + +## 🎯 프로젝트 목표 + +### 핵심 미션 +**"도면 완성 후 자재 관리의 모든 번거로움을 해결"** + +### 주요 해결 과제 +- 📄 **파일 분석 자동화**: 엑셀/CSV 자재 목록의 자동 분류 및 정제 +- 🔍 **정확한 분류 체계**: 파이프/피팅/볼트/밸브/계기류의 4단계 자동 분류 +- 💾 **체계적 데이터 관리**: 프로젝트별 버전 관리 및 이력 추적 +- 📊 **업무별 맞춤 출력**: 구매/생산/품질 각 팀의 필요에 맞는 자료 생성 +- 🔄 **리비전 변화 추적**: 도면 변경 시 자재 변경사항 자동 비교 + +## 💻 기술 스택 + +### Backend +- **Language**: Python 3.9+ +- **Framework**: FastAPI (고성능 API 서버) +- **Database**: PostgreSQL 15 (복잡한 관계형 데이터 처리) +- **ORM**: SQLAlchemy (데이터베이스 모델링) +- **Data Processing**: Pandas, openpyxl (파일 처리) + +### DevOps & Tools +- **Containerization**: Docker & Docker Compose +- **Version Control**: Git (Gitea 호스팅) +- **Development**: VS Code + Python 확장 + +## 🌐 개발 환경 설정 + +### Git 저장소 접속 +```bash +# VPN 연결 필요: vpn.hyungi.net:21194 +git clone http://192.168.1.227:10300/hyungi/TK-MP-Project.git +cd TK-MP-Project +데이터베이스 실행 +bash# PostgreSQL 및 pgAdmin 실행 +docker-compose up -d postgres pgadmin redis + +# 접속 확인 +# pgAdmin: http://localhost:5050 (admin@tkmp.local / admin2025) +Python 개발 환경 +bash# 가상환경 생성 +python -m venv venv +source venv/bin/activate # macOS/Linux + +# 의존성 설치 +pip install -r backend/requirements.txt + +# 개발 서버 실행 +cd backend +uvicorn app.main:app --reload --host 0.0.0.0 --port 8000 +📁 프로젝트 구조 +TK-MP-Project/ +├── README.md +├── docker-compose.yml +├── backend/ # FastAPI 백엔드 +│ ├── app/ +│ │ ├── models/ # SQLAlchemy 모델 +│ │ ├── schemas/ # Pydantic 스키마 +│ │ ├── api/ # API 라우터 +│ │ ├── core/ # 설정 및 유틸리티 +│ │ ├── services/ # 비즈니스 로직 +│ │ └── database/ # DB 연결 설정 +│ └── requirements.txt +├── database/ # DB 스키마 및 초기 데이터 +│ └── init/ +│ └── 01_schema.sql +└── docs/ # 프로젝트 문서 +🚀 개발 로드맵 +Phase 1: 기반 시스템 구축 (진행중) + + Git 환경 구축 ✅ + 데이터베이스 스키마 설계 ✅ + Docker 개발 환경 설정 ✅ + FastAPI 기본 구조 구현 + 파일 업로드 및 파싱 기능 + +Phase 2: 핵심 기능 개발 + + 자재 분류 알고리즘 구현 + 웹 인터페이스 구축 + 구매 BOM 생성 기능 + +Phase 3: 고도화 + + 리비전 비교 기능 + 파이프 cutting 자료 생성 + 사용자 테스트 및 최적화 + +🗄️ 데이터베이스 스키마 +핵심 테이블 + +projects: 프로젝트 관리 (코드 매칭, 버전 관리) +files: 업로드된 자재 목록 파일들 +materials: 개별 자재 상세 정보 (분류 결과 포함) + +주요 기능 + +프로젝트별 파일 버전 관리 (Rev.0, Rev.1, Rev.2) +자재 자동 분류 시스템 (카테고리, 재질, 사이즈) +분류 신뢰도 및 사용자 검증 시스템 + +📞 개발팀 + +Lead Developer: hyungi +Gitea Repository: http://192.168.1.227:10300/hyungi/TK-MP-Project + +🎯 다음 단계 + +데이터베이스 실행: docker-compose up -d postgres pgadmin +Python 환경 구축: 가상환경 생성 및 패키지 설치 +FastAPI 구조 구현: 기본 API 서버 및 모델 생성 + + +Last Updated: 2025.07.14 diff --git a/backend/app/__init__.py b/backend/app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/main.py b/backend/app/main.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/requirements.txt b/backend/requirements.txt new file mode 100644 index 0000000..b27762e --- /dev/null +++ b/backend/requirements.txt @@ -0,0 +1,28 @@ +# FastAPI 웹 프레임워크 +fastapi==0.104.1 +uvicorn[standard]==0.24.0 + +# 데이터베이스 +sqlalchemy==2.0.23 +psycopg2-binary==2.9.9 +alembic==1.13.1 + +# 파일 처리 +pandas==2.1.4 +openpyxl==3.1.2 +python-multipart==0.0.6 + +# 데이터 검증 +pydantic==2.5.2 +pydantic-settings==2.1.0 + +# 기타 유틸리티 +python-dotenv==1.0.0 +httpx==0.25.2 +redis==5.0.1 + +# 개발 도구 +pytest==7.4.3 +pytest-asyncio==0.21.1 +black==23.11.0 +flake8==6.1.0 diff --git a/database/init/01_schema.sql b/database/init/01_schema.sql new file mode 100644 index 0000000..b77aab1 --- /dev/null +++ b/database/init/01_schema.sql @@ -0,0 +1,130 @@ +-- TK-MP BOM 시스템 데이터베이스 스키마 +-- 생성일: 2025.07.14 + +-- ================================ +-- 1. 프로젝트 관리 +-- ================================ + +-- 프로젝트 기본 정보 +CREATE TABLE projects ( + id SERIAL PRIMARY KEY, + + -- 회사 공식 정보 + official_project_code VARCHAR(50) UNIQUE, -- PP5-5701-DRYING (정식 코드) + project_name VARCHAR(200) NOT NULL, + client_name VARCHAR(100), + + -- 설계팀 사용 정보 + design_project_code VARCHAR(50), -- 설계팀이 실제 사용한 코드 + design_project_name VARCHAR(200), -- 설계팀이 사용한 프로젝트명 + + -- 매칭 정보 + is_code_matched BOOLEAN DEFAULT false, -- 정식 코드 매칭 완료 여부 + matched_by VARCHAR(100), -- 매칭 작업자 + matched_at TIMESTAMP, -- 매칭 완료 시점 + + -- 기본 정보 + status VARCHAR(20) DEFAULT 'active', -- active/completed/on_hold + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + description TEXT, + notes TEXT +); + +-- ================================ +-- 2. 파일 관리 +-- ================================ + +-- 업로드된 자재 목록 파일들 +CREATE TABLE files ( + id SERIAL PRIMARY KEY, + project_id INTEGER REFERENCES projects(id) ON DELETE CASCADE, + filename VARCHAR(255) NOT NULL, + original_filename VARCHAR(255) NOT NULL, + file_path VARCHAR(500) NOT NULL, + revision VARCHAR(20) DEFAULT 'Rev.0', -- Rev.0, Rev.1, Rev.2 + upload_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + uploaded_by VARCHAR(100), + file_type VARCHAR(10), -- excel/csv/txt + file_size INTEGER, + is_active BOOLEAN DEFAULT true +); + +-- ================================ +-- 3. 자재 정보 (핵심 테이블) +-- ================================ + +-- 개별 자재 상세 정보 +CREATE TABLE materials ( + id SERIAL PRIMARY KEY, + file_id INTEGER REFERENCES files(id) ON DELETE CASCADE, + line_number INTEGER, -- Excel 행 번호 + original_description TEXT NOT NULL, -- 원본 품명 + + -- 분류 정보 + classified_category VARCHAR(50), -- 파이프/피팅/볼트/밸브/계기 + classified_subcategory VARCHAR(100), -- 엘보우/플랜지/벤드 등 + + -- 재질 및 스펙 + material_grade VARCHAR(50), -- A333-6, A105, SS316 + schedule VARCHAR(20), -- SCH40, SCH80, STD + size_spec VARCHAR(50), -- 6인치, 150A, M16 + + -- 수량 정보 + quantity DECIMAL(10,3) NOT NULL, + unit VARCHAR(10) NOT NULL, -- EA/mm/SET/kg + + -- 도면 정보 + drawing_name VARCHAR(100), -- P&ID-001-TANK + area_code VARCHAR(20), -- #01, #02, #03 + line_no VARCHAR(50), -- LINE-001-A + + -- 분류 신뢰도 및 검증 + classification_confidence DECIMAL(3,2), -- 0.00-1.00 분류 신뢰도 + is_verified BOOLEAN DEFAULT false, -- 사용자 검증 여부 + verified_by VARCHAR(100), + verified_at TIMESTAMP, + + -- 기타 + drawing_reference VARCHAR(100), + notes TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +-- ================================ +-- 4. 인덱스 생성 (성능 최적화) +-- ================================ + +-- 프로젝트 관련 인덱스 +CREATE INDEX idx_projects_official_code ON projects(official_project_code); +CREATE INDEX idx_projects_design_code ON projects(design_project_code); + +-- 파일 관련 인덱스 +CREATE INDEX idx_files_project ON files(project_id); +CREATE INDEX idx_files_active ON files(is_active); + +-- 자재 관련 인덱스 +CREATE INDEX idx_materials_file ON materials(file_id); +CREATE INDEX idx_materials_category ON materials(classified_category, classified_subcategory); +CREATE INDEX idx_materials_material_size ON materials(material_grade, size_spec); + +-- ================================ +-- 5. 기본 뷰 생성 +-- ================================ + +-- 프로젝트 상태 요약 뷰 +CREATE VIEW project_status_view AS +SELECT + p.id, + COALESCE(p.official_project_code, p.design_project_code) as display_code, + p.project_name, + p.status, + COUNT(f.id) as file_count, + COUNT(m.id) as material_count, + p.created_at +FROM projects p +LEFT JOIN files f ON p.id = f.project_id AND f.is_active = true +LEFT JOIN materials m ON f.id = m.file_id +GROUP BY p.id, p.official_project_code, p.design_project_code, + p.project_name, p.status, p.created_at +ORDER BY p.created_at DESC; diff --git a/database/init/02_seed_data.sql b/database/init/02_seed_data.sql new file mode 100644 index 0000000..e69de29 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..c991268 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,62 @@ +version: '3.8' + +services: + # PostgreSQL 데이터베이스 + postgres: + image: postgres:15-alpine + container_name: tk-mp-postgres + restart: unless-stopped + environment: + POSTGRES_DB: tk_mp_bom + POSTGRES_USER: tkmp_user + POSTGRES_PASSWORD: tkmp_password_2025 + POSTGRES_INITDB_ARGS: "--encoding=UTF-8 --locale=C" + ports: + - "5432:5432" + volumes: + - postgres_data:/var/lib/postgresql/data + - ./database/init:/docker-entrypoint-initdb.d + networks: + - tk-mp-network + + # pgAdmin 웹 관리도구 + pgadmin: + image: dpage/pgadmin4:latest + container_name: tk-mp-pgadmin + restart: unless-stopped + environment: + PGADMIN_DEFAULT_EMAIL: admin@tkmp.local + PGADMIN_DEFAULT_PASSWORD: admin2025 + PGADMIN_CONFIG_SERVER_MODE: 'False' + ports: + - "5050:80" + volumes: + - pgadmin_data:/var/lib/pgadmin + depends_on: + - postgres + networks: + - tk-mp-network + + # Redis (캐시 및 세션 관리용) + redis: + image: redis:7-alpine + container_name: tk-mp-redis + restart: unless-stopped + ports: + - "6379:6379" + volumes: + - redis_data:/data + networks: + - tk-mp-network + +volumes: + postgres_data: + driver: local + pgadmin_data: + driver: local + redis_data: + driver: local + +networks: + tk-mp-network: + driver: bridge diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..e69de29