Files
vexplor/docs/plan-bom-excel-upload.md
kjs 929b68299a feat: Implement BOM Excel upload and download functionality
- 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.
2026-02-27 07:50:22 +09:00

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

  • 테스트 1: 품번으로 item_info 일괄 조회 (존재하는 품번)
  • 테스트 2: 존재하지 않는 품번 에러 처리
  • 테스트 3: 플랫 데이터 → 트리 구조 변환 (parent_detail_id 계산)
  • 테스트 4: bom_detail INSERT (version_id 포함)
  • 테스트 5: 기존 디테일 처리 (추가 모드 vs 전체교체 모드)

2단계: 프론트엔드 모달

  • 테스트 6: 엑셀 파일 파싱 및 미리보기
  • 테스트 7: 품번 매핑 결과 표시 (성공/실패)
  • 테스트 8: 업로드 실행 및 결과 표시

3단계: 통합

  • 테스트 9: BomTreeComponent에 엑셀 업로드 버튼 추가
  • 테스트 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 라우트 추가

프론트엔드

  1. frontend/lib/registry/components/v2-bom-tree/BomExcelUploadModal.tsx - 전용 모달 신규
  2. frontend/lib/registry/components/v2-bom-tree/BomTreeComponent.tsx - 업로드 버튼 추가

진행 상태

  • 완료된 테스트는 [x]로 표시
  • 현재 진행 중인 테스트는 [진행중]으로 표시