Files
sam-docs/dev/dev_plans/receiving-inspection-integration-plan.md
김보곤 59a3e03668 docs: [receiving] 수입검사 연동 문서 보강
- 구현 완료 항목 상태 명확화 (버튼 렌더링, 모달 연동 등 )
- 실제 코드 기반 흐름도 수정 (checkInspectionTemplate → hasInspectionTemplate)
- MNG 매핑 시 자동 동작하는 구조임을 명시
2026-03-17 22:03:07 +09:00

9.8 KiB
Raw Blame History

입고등록 × 수입검사 연동 계획

작성일: 2026-03-17 상태: 설계 중 담당: R&D실 (API) + 프론트엔드 개발자 (React)


1. 개요

1.1 목적

입고등록 시 선택한 품목에 맞는 수입검사 성적서(27종)를 자동 매칭하여 검사를 수행하고, 검사 결과를 입고 데이터에 반영한다.

1.2 현재 구현 상태

항목 상태 설명
DocumentService::resolve() 품목 ID → 수입검사 템플릿 자동 매칭
ReceivingService::getItemsWithInspectionTemplate() 입고 목록에서 has_inspection_template 플래그 반환
React checkInspectionTemplate() 입고 상세 로드 시 API 호출 → hasInspectionTemplate 상태 설정
React 수입검사 버튼 렌더링 hasInspectionTemplate === true → "수입검사하기" + "수입검사성적서 보기" 버튼 표시
ImportInspectionInputModal 수입검사 입력 모달 (검사항목 동적 로드)
InspectionModal 수입검사 성적서 보기 모달
MNG 중복 검증 동일 category 내 같은 품목 중복 연결 방지
품목 ↔ 템플릿 매핑 데이터 linked_item_ids에 품목 미연결 (27종 전부)
검사결과 → 입고 반영 API ⚠️ options에 저장은 되나 상태 전이 보강 필요

1.3 핵심 포인트

MNG에서 수입검사 템플릿의 linked_item_ids에 품목을 연결하면, 입고 상세 화면에 수입검사 버튼이 자동으로 표시된다. 추가 코드 변경 없이 데이터 매핑만으로 동작하는 구조.


2. 시스템 구조 (기존 인프라)

2.1 템플릿 ↔ 품목 매핑

MNG 문서양식관리
├─ document_templates (27종 수입검사 양식)
│   ├─ category: '수입검사'
│   ├─ linked_item_ids: [101, 102, 103]  ← 이 품목들이 이 검사서 사용
│   └─ sections → section_items (검사항목 N개, 동적)
│
API DocumentService::resolve()
├─ 입력: { category: 'incoming_inspection', item_id: 101 }
├─ 로직: linked_item_ids에 해당 item_id가 포함된 템플릿 검색
└─ 출력: { template: {...}, is_new: true/false }

2.2 입고 → 수입검사 흐름 (구현됨)

입고 상세 로드 (ReceivingDetail.tsx)
  ↓ loadData() → getReceivingById(id)
  ↓ result.data.itemId 확인
  ↓ checkInspectionTemplate(itemId) 호출
  ↓ API: GET /api/v1/documents/resolve?category=incoming_inspection&item_id={itemId}
  ↓
  ├─ hasTemplate: true
  │   → hasInspectionTemplate = true
  │   → customHeaderActions 렌더링:
  │      [수입검사하기] → ImportInspectionInputModal 오픈
  │      [수입검사성적서 보기] → InspectionModal 오픈
  │
  └─ hasTemplate: false
      → 버튼 미표시 (수입검사 불필요)

view/edit 모드에서만 버튼 표시. new 모드에서는 아직 품목이 저장되지 않았으므로 미표시.


3. 27종 검사서 ↔ 원자재 매핑 전략

3.1 매핑 방식: 1:N (한 템플릿 → 여러 품목)

수입검사 템플릿 A (SUS 판재)
  └─ linked_item_ids: [SUS304 3T, SUS304 2T, SUS316 3T, ...]

수입검사 템플릿 B (GI 도금강판)
  └─ linked_item_ids: [GI 0.5T, GI 0.8T, GI 1.0T, ...]

수입검사 템플릿 C (알루미늄)
  └─ linked_item_ids: [AL 40x40, AL 30x30, ...]

수입검사 템플릿 D (DC 모터)
  └─ linked_item_ids: [DC모터 24V, DC모터 12V, ...]

3.2 매핑 기준

기준 설명
재질 그룹 SUS, GI, AL, 플라스틱 등 동일 재질은 같은 검사항목
형태 그룹 판재, 코일, 프로파일, 봉강 등 형태별 검사 기준 차이
부품 유형 모터, 전자부품, 볼트/너트, 접착제 등

3.3 매핑 설정 방법

MNG 문서양식관리에서 각 수입검사 템플릿 수정 시 연결 품목을 설정한다.

MNG > 문서 > 문서양식관리 > [수입검사 템플릿 선택] > 수정
  → "연결 품목" 영역에서 해당 검사서를 사용할 품목 선택
  → linked_item_ids에 자동 저장

중복 방지: 동일 category(수입검사) 내에서 같은 품목을 두 템플릿에 중복 연결 불가 (MNG에서 자동 검증).

3.4 매핑 검증

매핑 완료 후 아래 체크:

✅ 모든 원자재(RM) 품목이 최소 1개 수입검사 템플릿에 연결됨
✅ 동일 품목이 2개 이상 수입검사 템플릿에 중복 연결되지 않음
✅ 템플릿 없는 품목은 입고 시 수입검사 건너뜀 (정상 동작)

4. 구현 계획

Phase 1: 데이터 매핑 (MNG 작업, 코드 변경 없음)

MNG 문서양식관리에서 27종 수입검사 템플릿의 linked_item_ids에 원자재 품목 연결.

작업 담당 비고
27종 검사서 ↔ 원자재 매핑표 작성 R&D실 재질/형태별 그룹핑
MNG에서 linked_item_ids 설정 R&D실 각 템플릿 수정
매핑 검증 (누락/중복 체크) R&D실 API로 검증

Phase 2: API 보강 (백엔드, 필요 시)

Phase 1 완료 후 실제 검사 플로우를 테스트하며 부족한 부분을 보강한다.

작업 상태 설명
DocumentService::resolve() 완료 품목 → 템플릿 매칭
ReceivingService::getItemsWithInspectionTemplate() 완료 입고 목록 has_inspection_template 플래그
checkInspectionTemplate() React 호출 완료 입고 상세에서 버튼 표시 제어
수입검사 결과 → Receiving options 반영 ⚠️ 보강 필요 검사완료 시 inspectionDate/Result 자동 설정
입고 상태 전이 (inspection_pending) ⚠️ 보강 필요 검사 시작 → 검사대기, 검사완료 → 입고대기

Phase 3: React UI 보강 (프론트엔드, 필요 시)

버튼 표시 및 모달 연동은 이미 구현됨. 검사 결과 저장 후 입고 데이터 자동 반영 부분만 보강.

작업 상태 설명
수입검사하기 버튼 완료 hasInspectionTemplate 기반 조건부 렌더링
ImportInspectionInputModal 완료 검사항목 동적 로드 + 입력
InspectionModal (성적서 보기) 완료 저장된 검사 성적서 조회
검사 결과 저장 후 입고 자동 갱신 ⚠️ 보강 필요 handleImportInspectionSave()loadData() 이미 호출, API 보강 후 자동 반영

5. 관련 API 엔드포인트

5.1 기존 (구현 완료)

GET /api/v1/documents/resolve
  params: { category: 'incoming_inspection', item_id: 101 }
  → 해당 품목의 수입검사 템플릿 + 기존 문서 반환

POST /api/v1/documents
  → 검사 결과 문서 저장

GET /api/v1/items/{id}
  → 응답에 has_inspection_template 포함

5.2 보강 필요

PATCH /api/v1/receivings/{id}/inspection-result  (신규)
  body: { inspection_date, inspection_result, document_id? }
  → Receiving.options의 검사일/검사결과 업데이트
  → 상태 전이 (inspection_pending → receiving_pending)

6. 입고등록 화면 구조 (구현 완료)

수입검사 버튼 (헤더 영역)

┌──────────────────────────────────────────────────────────────────┐
│  입고 상세                         [수입검사하기] [성적서 보기]    │
│                                    ↑ hasInspectionTemplate=true   │
├──────────────────────────────────────────────────────────────────┤
│  기본 정보 (Card)                                                │
│  ...                                                             │
├──────────────────────────────────────────────────────────────────┤
│  수입검사 정보 (Card)                                             │
│  검사일: (readOnly, options에서 자동)                              │
│  검사결과: (readOnly, options에서 자동)                            │
│  업체 제공 성적서: [파일 업로드]                                    │
└──────────────────────────────────────────────────────────────────┘

버튼 렌더링 조건 (ReceivingDetail.tsx:882)

const customHeaderActions =
  (isViewMode || isEditMode) && detail && hasInspectionTemplate ? (
    <div className="flex gap-2">
      <Button onClick={handleInspection}>수입검사하기</Button>
      <Button onClick={handleViewInspectionReport}>수입검사성적서 보기</Button>
    </div>
  ) : undefined;
조건 결과
new 모드 버튼 미표시 (품목 미저장)
view/edit + hasInspectionTemplate=false 버튼 미표시
view/edit + hasInspectionTemplate=true 두 버튼 모두 표시

핵심: MNG에서 해당 품목의 수입검사 템플릿에 linked_item_ids를 설정하면 버튼이 자동 표시된다.


관련 문서


최종 업데이트: 2026-03-17