# πŸ—οΈ TK-MP-Project Rules & Context ## πŸ“‹ **ν”„λ‘œμ νŠΈ κ°œμš”** - **λͺ©μ **: λ°°κ΄€ 자재 BOM 관리 및 리비전 비ꡐ μ‹œμŠ€ν…œ - **μ£Όμš” κΈ°λŠ₯**: 파일 μ—…λ‘œλ“œ, 자재 λΆ„λ₯˜, 리비전 비ꡐ, ꡬ맀 관리, μ—‘μ…€ 내보내기 ## πŸ› οΈ **기술 μŠ€νƒ** ``` Frontend: React.js + Material-UI + Vite + React Router DOM Backend: FastAPI + SQLAlchemy + Python Database: SQLite (개발) / PostgreSQL (운영) 기타: Axios, XLSX (SheetJS), file-saver ``` ## πŸ“ **ν”„λ‘œμ νŠΈ ꡬ쑰** ``` TK-MP-Project/ β”œβ”€β”€ frontend/src/ β”‚ β”œβ”€β”€ pages/ # νŽ˜μ΄μ§€ μ»΄ν¬λ„ŒνŠΈ β”‚ β”œβ”€β”€ components/ # μž¬μ‚¬μš© μ»΄ν¬λ„ŒνŠΈ β”‚ β”œβ”€β”€ utils/ # μœ ν‹Έλ¦¬ν‹° (μ—‘μ…€ λ“±) β”‚ └── api.js # API 톡신 β”œβ”€β”€ backend/app/ β”‚ β”œβ”€β”€ routers/ # API λΌμš°ν„° β”‚ β”œβ”€β”€ services/ # λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 (λΆ„λ₯˜κΈ° λ“±) β”‚ β”œβ”€β”€ models.py # DB λͺ¨λΈ β”‚ └── main.py # FastAPI μ•± └── database/ # DB μŠ€ν‚€λ§ˆ/μ‹œλ“œ ``` ## πŸ—„οΈ **핡심 λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆ** ```sql -- 핡심 ν…Œμ΄λΈ”λ“€ jobs (job_no, job_name, client_name, ...) files (id, job_no, revision, original_filename, ...) materials (id, file_id, original_description, classified_category, quantity, ...) pipe_details (material_id, length_mm, ...) -- 기타: fitting_details, flange_details, bolt_details, gasket_details ``` ## πŸ”§ **μ€‘μš”ν•œ μ½”λ”© μ»¨λ²€μ…˜ & νŒ¨ν„΄** ### **1. 자재 λΆ„λ₯˜ μ‹œμŠ€ν…œ** ```python # 항상 이 μˆœμ„œλ‘œ λΆ„λ₯˜κΈ° 호좜 classification_result = classify_pipe("", description, main_nom, length_value) # κ²°κ³Ό: {"category": "PIPE", "confidence": 0.95, ...} ``` ### **2. νŒŒμ΄ν”„ 길이 처리 κ·œμΉ™** ```javascript // ❌ μ ˆλŒ€ ν•˜μ§€ 말 것: 평균 길이 계산/ν‘œμ‹œ // βœ… 항상 ν•  것: 총 길이 κΈ°μ€€ 계산 const totalLength = quantity * unitLength; // 총 길이 = μˆ˜λŸ‰ Γ— λ‹¨μœ„κΈΈμ΄ ``` ### **3. 자재 ν•΄μ‹± κ·œμΉ™** ```python # 자재 κ³ μœ μ„± νŒλ‹¨: description + size + material_grade material_hash = hashlib.md5(f"{description}|{size_spec}|{material_grade}".encode()).hexdigest() ``` ### **4. 리비전 비ꡐ 둜직** ```python # 이전 리비전 μžλ™ 탐지: 숫자 기반 비ꡐ current_rev_num = int(current_revision.replace("Rev.", "")) # Rev.0 β†’ Rev.1 β†’ Rev.2 μˆœμ„œ ``` ## πŸ› **자주 λ°œμƒν•˜λŠ” 이슈 & 해결법** ### **1. νŒŒμ΄ν”„ 길이 ν•©μ‚° 문제** ```python # ❌ 잘λͺ»λœ SQL: GROUP BY에 pd.length_mm 포함 # βœ… μ˜¬λ°”λ₯Έ 방법: Pythonμ—μ„œ 같은 νŒŒμ΄ν”„λ“€ ν•©μΉ˜κΈ° if material_hash in materials_dict: existing["quantity"] += float(new_quantity) existing["total_length"] += new_quantity * unit_length ``` ### **2. ν”„λ‘ νŠΈμ—”λ“œ λ³€μˆ˜ μ΄ˆκΈ°ν™”** ```javascript // ❌ μ‚¬μš© 전에 μ„ μ–Έν•˜μ§€ μ•ŠμŒ const summaryData = [..., consolidatedMaterials.length, ...]; const consolidatedMaterials = consolidateMaterials(materials); // 뒀에 μ„ μ–Έ // βœ… μ‚¬μš© 전에 λ¨Όμ € μ„ μ–Έ const consolidatedMaterials = consolidateMaterials(materials); const summaryData = [..., consolidatedMaterials.length, ...]; ``` ### **3. API 응닡 처리** ```javascript // βœ… 항상 Axios 응닡 ꡬ쑰 확인 setComparisonResult(result.data || result); // response.data μš°μ„  ``` ## 🎯 **UI/UX κ°€μ΄λ“œλΌμΈ** ### **1. 자재 ν‘œμ‹œ κ·œμΉ™** - **νŒŒμ΄ν”„**: "총 길이: 4,561mm" (ν‰κ· λ‹¨μœ„ ν‘œμ‹œ κΈˆμ§€) - **기타 자재**: "μˆ˜λŸ‰: 24 EA" - **변경사항**: "이전: 2,781mm β†’ ν˜„μž¬: 4,561mm / λ³€ν™”: +1,780mm" ### **2. λ²„νŠΌ 넀이밍** - "BOM λͺ©λ‘μœΌλ‘œ" (λ’€λ‘œκ°€κΈ°) - "μ—‘μ…€ 내보내기" - "상세 비ꡐ 보기" ### **3. νŽ˜μ΄μ§€ λ„€λΉ„κ²Œμ΄μ…˜** ```javascript // BOM κ΄€λ ¨ νŽ˜μ΄μ§€λ“€μ€ job_no κΈ°μ€€μœΌλ‘œ 이동 navigate(`/bom-status?job_no=${jobNo}`); navigate(`/material-comparison?job_no=${jobNo}&revision=${revision}`); ``` ## πŸ”„ **개발 μ›Œν¬ν”Œλ‘œμš°** ### **1. λ°±μ—”λ“œ λ³€κ²½ μ‹œ** ```bash # 항상 κ°€μƒν™˜κ²½μ—μ„œ μ‹€ν–‰ (μ‚¬μš©μž μ„ ν˜Έμ‚¬ν•­) cd backend python -m uvicorn app.main:app --reload --host 0.0.0.0 --port 8000 ``` ### **2. λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆ λ³€κ²½ μ‹œ** ```sql -- scripts/ 폴더에 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ SQL 파일 생성 -- 번호 μˆœμ„œ: 01_, 02_, 03_... ``` ### **3. 컀밋 λ©”μ‹œμ§€** ``` ν•œκ΅­μ–΄λ‘œ μž‘μ„± (μ‚¬μš©μž μ„ ν˜Έμ‚¬ν•­) 예: "νŒŒμ΄ν”„ 길이 계산 및 μ—‘μ…€ 내보내기 버그 μˆ˜μ •" ``` ## ⚠️ **μ ˆλŒ€ ν•˜μ§€ 말아야 ν•  것듀** 1. **νŒŒμ΄ν”„ "ν‰κ· λ‹¨μœ„" ν‘œμ‹œ** - μ‚¬μš©μžκ°€ ν˜Όλž€μŠ€λŸ¬μ›Œν•¨ 2. **ν•˜λ“œμ½”λ”©λœ 길이 κ°’** - μ‹€μ œ λ°μ΄ν„°λ² μ΄μŠ€ κ°’ μ‚¬μš© 3. **μ˜μ–΄ 컀밋 λ©”μ‹œμ§€** - μ‚¬μš©μžκ°€ ν•œκ΅­μ–΄ μ„ ν˜Έ 4. **SQLμ—μ„œ κ³Όλ„ν•œ GROUP BY** - 같은 자재 뢄리됨 5. **λΉ„μœ¨ 기반 길이 계산** - μ‹€μ œ 총길이 μ‚¬μš©ν•΄μ•Ό 함 ## 🎯 **ν˜„μž¬ μ§„ν–‰ 상황** - βœ… 자재 μ—…λ‘œλ“œ 및 λΆ„λ₯˜ μ‹œμŠ€ν…œ - βœ… 리비전 비ꡐ κΈ°λŠ₯ - βœ… νŒŒμ΄ν”„ 길이 ν•©μ‚° 둜직 μˆ˜μ • - βœ… μ—‘μ…€ 내보내기 κΈ°λŠ₯ - 🚧 ꡬ맀 관리 μ‹œμŠ€ν…œ (μ§„ν–‰ 쀑) ## πŸ“š **μΆ”κ°€ 참고사항** - μ‚¬μš©μžλŠ” κ°€μƒν™˜κ²½μ—μ„œ Python 싀행을 μ„ ν˜Έ - λ°±μ—”λ“œ μ„œλ²„λŠ” μžλ™ μž¬μ‹œμž‘λ˜λ―€λ‘œ μˆ˜λ™ μž¬μ‹œμž‘ λΆˆν•„μš” - μž‘μ—… μƒνƒœλŠ” 'in-progress'와 'complete'λ₯Ό λͺ…ν™•νžˆ ν‘œμ‹œ --- **λ§ˆμ§€λ§‰ μ—…λ°μ΄νŠΈ**: 2024-12-20