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

240 lines
9.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 입고등록 × 수입검사 연동 계획
> **작성일**: 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)
```typescript
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`를 설정하면 버튼이 자동 표시된다.
---
## 관련 문서
- [수입검사 성적서 연동 계획](incoming-inspection-document-integration-plan.md) — 기존 상세 설계
- [수입검사 템플릿 계획](incoming-inspection-templates-plan.md) — 템플릿 생성 계획
- [채번규칙](../../rules/numbering-rules.md) — 원자재 로트번호 채번
- [입고관리 분석](receiving-management-analysis-plan.md) — 입고 시스템 현황
---
**최종 업데이트**: 2026-03-17