diff --git a/RULES.md b/RULES.md new file mode 100644 index 0000000..68015c0 --- /dev/null +++ b/RULES.md @@ -0,0 +1,159 @@ +# πŸ—οΈ 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 \ No newline at end of file