- Added endpoints for uploading BOM data from Excel and downloading BOM data in Excel format. - Developed the `createBomFromExcel` function to handle Excel uploads, including validation and error handling. - Implemented the `downloadBomExcelData` function to retrieve BOM data for Excel downloads. - Created a new `BomExcelUploadModal` component for the frontend to facilitate Excel file uploads. - Updated BOM routes to include new Excel upload and download routes, enhancing BOM management capabilities.
3.7 KiB
3.7 KiB
BOM 엑셀 업로드 기능 개발 계획
개요
탑씰(COMPANY_7) BOM관리 화면(screen_id=4168)에 엑셀 업로드 기능을 추가한다. BOM은 트리 구조(parent_detail_id 자기참조)이므로 범용 엑셀 업로드를 사용할 수 없고, BOM 전용 엑셀 업로드 컴포넌트를 개발한다.
핵심 구조
DB 테이블
bom(마스터): id(UUID), item_id(→item_info), version, current_version_idbom_detail(디테일-트리): id(UUID), bom_id(FK), parent_detail_id(자기참조), child_item_id(→item_info), level, seq_no, quantity, unit, loss_rate, process_type, version_iditem_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하여 DB 레벨 계산
- 스택으로 부모-자식 관계 추적
행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
- 테스트 1: 품번으로 item_info 일괄 조회 (존재하는 품번)
- 테스트 2: 존재하지 않는 품번 에러 처리
- 테스트 3: 플랫 데이터 → 트리 구조 변환 (parent_detail_id 계산)
- 테스트 4: bom_detail INSERT (version_id 포함)
- 테스트 5: 기존 디테일 처리 (추가 모드 vs 전체교체 모드)
2단계: 프론트엔드 모달
- 테스트 6: 엑셀 파일 파싱 및 미리보기
- 테스트 7: 품번 매핑 결과 표시 (성공/실패)
- 테스트 8: 업로드 실행 및 결과 표시
3단계: 통합
- 테스트 9: BomTreeComponent에 엑셀 업로드 버튼 추가
- 테스트 10: 업로드 후 트리 자동 새로고침
구현 파일 목록
백엔드
backend-node/src/services/bomService.ts-uploadBomExcel()함수 추가backend-node/src/controllers/bomController.ts-uploadBomExcel핸들러 추가backend-node/src/routes/bomRoutes.ts-POST /:bomId/excel-upload라우트 추가
프론트엔드
frontend/lib/registry/components/v2-bom-tree/BomExcelUploadModal.tsx- 전용 모달 신규frontend/lib/registry/components/v2-bom-tree/BomTreeComponent.tsx- 업로드 버튼 추가
진행 상태
- 완료된 테스트는 [x]로 표시
- 현재 진행 중인 테스트는 [진행중]으로 표시