# BOM 엑셀 업로드 기능 개발 계획 ## 개요 탑씰(COMPANY_7) BOM관리 화면(screen_id=4168)에 엑셀 업로드 기능을 추가한다. BOM은 트리 구조(parent_detail_id 자기참조)이므로 범용 엑셀 업로드를 사용할 수 없고, BOM 전용 엑셀 업로드 컴포넌트를 개발한다. ## 핵심 구조 ### DB 테이블 - `bom` (마스터): id(UUID), item_id(→item_info), version, current_version_id - `bom_detail` (디테일-트리): id(UUID), bom_id(FK), parent_detail_id(자기참조), child_item_id(→item_info), level, seq_no, quantity, unit, loss_rate, process_type, version_id - `item_info`: id, item_number(품번), item_name(품명), division(구분), unit, size, material ### 엑셀 포맷 설계 (화면과 동일한 레벨 체계) 엑셀 파일은 다음 컬럼으로 구성: | 레벨 | 품번 | 품명 | 소요량 | 단위 | 로스율(%) | 공정구분 | 비고 | |------|------|------|--------|------|-----------|----------|------| | 0 | PROD-001 | 완제품A | 1 | EA | 0 | | ← BOM 헤더 (건너뜀) | | 1 | P-001 | 부품A | 2 | EA | 0 | | ← 직접 자품목 | | 2 | P-002 | 부품B | 3 | EA | 5 | 가공 | ← P-001의 하위 | | 1 | P-003 | 부품C | 1 | KG | 0 | | ← 직접 자품목 | | 2 | P-004 | 부품D | 4 | EA | 0 | 조립 | ← P-003의 하위 | | 1 | P-005 | 부품E | 1 | EA | 0 | | ← 직접 자품목 | - 레벨 0: BOM 헤더 (최상위 품목) → 업로드 시 건너뜀 (이미 존재) - 레벨 1: 직접 자품목 → bom_detail (parent_detail_id=null, DB level=0) - 레벨 2: 자품목의 하위 → bom_detail (parent_detail_id=부모ID, DB level=1) - 레벨 N: → bom_detail (DB level=N-1) - 품번으로 item_info를 조회하여 child_item_id 자동 매핑 ### 트리 변환 로직 (레벨 1 이상만 처리) 엑셀 행을 순서대로 순회하면서 (레벨 0 건너뜀): 1. 각 행의 엑셀 레벨에서 -1하여 DB 레벨 계산 2. 스택으로 부모-자식 관계 추적 ``` 행1(레벨0) → BOM 헤더, 건너뜀 행2(레벨1) → DB level=0, 스택: [행2] → parent_detail_id = null 행3(레벨2) → DB level=1, 스택: [행2, 행3] → parent_detail_id = 행2.id 행4(레벨1) → DB level=0, 스택: [행4] → parent_detail_id = null 행5(레벨2) → DB level=1, 스택: [행4, 행5] → parent_detail_id = 행4.id 행6(레벨1) → DB level=0, 스택: [행6] → parent_detail_id = null ``` ## 테스트 계획 ### 1단계: 백엔드 API - [x] 테스트 1: 품번으로 item_info 일괄 조회 (존재하는 품번) - [x] 테스트 2: 존재하지 않는 품번 에러 처리 - [x] 테스트 3: 플랫 데이터 → 트리 구조 변환 (parent_detail_id 계산) - [x] 테스트 4: bom_detail INSERT (version_id 포함) - [x] 테스트 5: 기존 디테일 처리 (추가 모드 vs 전체교체 모드) ### 2단계: 프론트엔드 모달 - [x] 테스트 6: 엑셀 파일 파싱 및 미리보기 - [x] 테스트 7: 품번 매핑 결과 표시 (성공/실패) - [x] 테스트 8: 업로드 실행 및 결과 표시 ### 3단계: 통합 - [x] 테스트 9: BomTreeComponent에 엑셀 업로드 버튼 추가 - [x] 테스트 10: 업로드 후 트리 자동 새로고침 ## 구현 파일 목록 ### 백엔드 1. `backend-node/src/services/bomService.ts` - `uploadBomExcel()` 함수 추가 2. `backend-node/src/controllers/bomController.ts` - `uploadBomExcel` 핸들러 추가 3. `backend-node/src/routes/bomRoutes.ts` - `POST /:bomId/excel-upload` 라우트 추가 ### 프론트엔드 4. `frontend/lib/registry/components/v2-bom-tree/BomExcelUploadModal.tsx` - 전용 모달 신규 5. `frontend/lib/registry/components/v2-bom-tree/BomTreeComponent.tsx` - 업로드 버튼 추가 ## 진행 상태 - 완료된 테스트는 [x]로 표시 - 현재 진행 중인 테스트는 [진행중]으로 표시