프로젝트 개발 가이드라인 추가

- TK-MP-Project의 코딩 컨벤션과 패턴 정리
- 자주 발생하는 이슈와 해결법 문서화
- AI 세션 간 일관성 확보를 위한 Rules 파일 생성
This commit is contained in:
Hyungi Ahn
2025-07-23 10:30:26 +09:00
parent 2d178f8161
commit 5fa0ac4202

159
RULES.md Normal file
View File

@@ -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