- 개발팀 전용 폴더 dev/ 생성 (standards, guides, quickstart, changes, deploys, data, history, dev_plans 이동) - 프론트엔드 전용 폴더 frontend/ 생성 (api/ → frontend/api-specs/) - 기획팀 폴더 requests/ 생성 - plans/ → dev/dev_plans/ 이름 변경 - README.md 신규 (사람용 안내), INDEX.md 재작성 (Claude Code용) - resources.md 신규 (노션 링크용, assets/brochure 이관 예정) - CURRENT_WORKS.md 삭제, TODO.md → dev/ 이동 - 전체 참조 경로 업데이트 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
375 lines
15 KiB
Markdown
375 lines
15 KiB
Markdown
# Phase 5.2: 제품검사(FQC) 폼 구현 계획
|
||
|
||
> **작성일**: 2026-02-10
|
||
> **마스터 문서**: [`document-system-master.md`](./document-system-master.md)
|
||
> **상태**: 🔄 진행 중
|
||
> **선행 조건**: Phase 5.0 (공통: 검사기준서↔컬럼 연동) 완료 필요, Phase 5.1과 병렬 진행 가능
|
||
> **최종 분석일**: 2026-02-12
|
||
|
||
---
|
||
|
||
## 1. 개요
|
||
|
||
### 1.1 목적
|
||
mng에서 제품검사(FQC) 양식 템플릿을 관리하고, React 품질관리 화면(`/quality/inspections`)에서 수주건의 **개소별** 제품검사 문서를 생성/입력/결재할 수 있도록 한다.
|
||
|
||
### 1.2 제품검사 = 품질검사
|
||
- 동일 개념. "제품검사(FQC: Final Quality Control)"로 통일
|
||
- 수주건(Order) + 개소(OrderItem) 단위로 관리
|
||
- **전수검사**: 수주 50개소 → 제품검사 문서 50건 생성
|
||
|
||
### 1.3 현재 상태 (2026-02-12 분석)
|
||
|
||
| 항목 | 상태 | 비고 |
|
||
|------|:----:|------|
|
||
| React InspectionManagement | ✅ | `components/quality/InspectionManagement/` - 요청관리 CRUD (목록/등록/상세/캘린더) |
|
||
| React ProductInspectionDocument | ✅ | `quality/qms/components/documents/` - 하드코딩 11개 항목 |
|
||
| React 제품검사 모달 | ✅ | InspectionReportModal, ProductInspectionInputModal |
|
||
| React 문서시스템 뷰어 | ✅ | `components/document-system/` - DocumentViewer, TemplateInspectionContent |
|
||
| API Inspection 모델 | ✅ | `/api/v1/inspections` - JSON 기반, 단순 status (waiting→completed) |
|
||
| API Document 모델 | ✅ | EAV 정규화, 결재 워크플로우 (DRAFT→APPROVED) |
|
||
| mng 양식 템플릿 | ❌ | 미존재 (신규 생성 필요) |
|
||
| 개소별 문서 자동생성 | ❌ | 미구현 |
|
||
|
||
### 1.4 핵심 발견 사항
|
||
|
||
**두 개의 독립적 검사 시스템 존재:**
|
||
|
||
| 시스템 | 데이터 모델 | 특징 |
|
||
|--------|------------|------|
|
||
| InspectionManagement | `inspections` 테이블 (JSON) | 요청관리, 단순 상태, 결재 없음 |
|
||
| Document System | `documents` 테이블 (EAV) | 양식 기반, 결재 워크플로우, 이력 관리 |
|
||
|
||
**세 가지 검사항목 세트 발견:**
|
||
|
||
| 출처 | 항목 | 용도 |
|
||
|------|------|------|
|
||
| types.ts ProductInspectionData | 겉모양(가공/재봉/조립/연기차단재/하단마감재), 모터, 재질/치수, 시험 | 공장출하검사 |
|
||
| 계획문서 (이 문서) | 외관, 작동, 개폐속도, 방연/차연/내화, 안전, 비상개방, 전기배선, 설치, 부속 | **설치 후 최종검사 ← 채택** |
|
||
| QMS ProductInspectionDocument | 가공상태, 외관검사, 절단면, 도포상태, 조립, 슬릿, 규격치수, 마감처리, 내벽/마감/배색시트 | 제조품질검사 |
|
||
|
||
### 1.5 통합 전략 (확정)
|
||
|
||
> **InspectionManagement의 요청관리 흐름(목록/등록/상세/캘린더)은 유지하고,
|
||
> 검사 성적서 생성/입력/결재만 documents 시스템으로 전환한다.**
|
||
|
||
- `inspections` 테이블: 검사 요청/일정/상태 관리 (meta 정보) → **유지**
|
||
- `documents` 테이블: 검사 성적서 (양식 기반 상세 데이터, 결재) → **신규 연동**
|
||
- 연결: `documents.linkable_type = 'order_item'`, `document_links`로 Order/Inspection 연결
|
||
- 기존 InspectionReportModal/ProductInspectionInputModal → TemplateInspectionContent 기반 전환
|
||
|
||
### 1.6 성공 기준
|
||
1. mng에서 제품검사 양식 편집/미리보기 정상 동작
|
||
2. 수주 1건 선택 시 개소(OrderItem) 수만큼 Document 자동생성
|
||
3. 각 Document에 해당 개소의 정보(층-부호, 규격, 수량) 자동매핑
|
||
4. 개소별 검사 데이터 입력/저장/조회 가능
|
||
5. 결재 워크플로우 정상 동작
|
||
6. 기존 InspectionManagement 요청관리 기능 정상 유지
|
||
|
||
---
|
||
|
||
## 2. 데이터 흐름
|
||
|
||
```
|
||
Order (수주)
|
||
├─ order_no: "KD-TS-260210-01"
|
||
├─ client_name: "발주처명"
|
||
├─ site_name: "현장명"
|
||
├─ quantity: 50 (총 개소 수)
|
||
└─ items: OrderItem[] (50건)
|
||
├─ [0] floor_code="1F", symbol_code="A", specification="W7400×H2950"
|
||
├─ [1] floor_code="1F", symbol_code="B", specification="W5200×H3100"
|
||
└─ [49] ...
|
||
|
||
제품검사 요청 시:
|
||
↓
|
||
Document (50건 자동생성)
|
||
├─ Document[0]
|
||
│ ├─ template_id → 제품검사 양식
|
||
│ ├─ linkable_type = 'App\Models\OrderItem'
|
||
│ ├─ linkable_id = OrderItem[0].id
|
||
│ ├─ document_no = "FQC-260210-01"
|
||
│ ├─ title = "제품검사 - 1F-A (W7400×H2950)"
|
||
│ └─ document_data (EAV)
|
||
│ ├─ 기본필드: 납품명, 제품명, 발주처, LOT NO, 로트크기, 검사일자, 검사자
|
||
│ ├─ 검사데이터: 11개 항목별 적합/부적합
|
||
│ └─ Footer: 종합판정(합격/불합격)
|
||
├─ Document[1] → OrderItem[1]
|
||
└─ Document[49] → OrderItem[49]
|
||
|
||
+ document_links 연결:
|
||
├─ link_key="order" → Order.id
|
||
└─ link_key="inspection" → Inspection.id (있는 경우)
|
||
```
|
||
|
||
### 2.1 linkable 다형성 연결
|
||
|
||
| 필드 | 값 | 설명 |
|
||
|------|-----|------|
|
||
| `linkable_type` | `App\Models\OrderItem` | OrderItem 모델 |
|
||
| `linkable_id` | OrderItem.id | 개소 PK |
|
||
|
||
추가로 `document_links` 테이블을 통해:
|
||
- Order(수주) 연결: link_key="order"
|
||
- Inspection(검사요청) 연결: link_key="inspection" (InspectionManagement에서 연결 시)
|
||
- Process(공정) 연결: link_key="process" (해당되는 경우)
|
||
|
||
---
|
||
|
||
## 3. 작업 항목
|
||
|
||
| # | 작업 | 상태 | 완료 기준 | 비고 |
|
||
|---|------|:----:|----------|------|
|
||
| 5.2.1 | mng 제품검사 양식 시더 생성 | ✅ | ProductInspectionTemplateSeeder 작성 (template_id: 65). 결재3+기본필드7+섹션2+항목11+section_fields | 2026-02-12 |
|
||
| 5.2.2 | mng 양식 편집/미리보기 검증 | ✅ | 양식 edit → 미리보기 → 저장 정상 동작 확인 | 2026-02-12 |
|
||
| 5.2.3 | API 개소별 문서 일괄생성 | ✅ | `POST /api/v1/documents/bulk-create-fqc` + `GET /api/v1/documents/fqc-status`. DocumentService에 bulkCreateFqc/fqcStatus 추가 | 2026-02-12 |
|
||
| 5.2.4 | React 제품검사 모달 → 양식 기반 전환 | ✅ | fqcActions.ts + FqcDocumentContent.tsx 신규. InspectionReportModal/ProductInspectionInputModal 듀얼모드(FQC/legacy) | 2026-02-12 |
|
||
| 5.2.5 | 개소 목록/진행현황 UI | ✅ | InspectionDetail에 FQC 진행현황 통계 바 + 개소별 상태 뱃지(합격/불합격/진행중/미생성) + 조회 버튼 | 2026-02-12 |
|
||
|
||
---
|
||
|
||
## 4. 제품검사 항목 (설치 후 최종검사 11항목 - 확정)
|
||
|
||
| # | 카테고리 | 검사항목 | 검사기준 | 검사방식 | 측정유형 |
|
||
|---|---------|---------|---------|---------|---------|
|
||
| 1 | 외관 | 외관검사 | 사용상 결함이 없을 것 | visual | checkbox |
|
||
| 2 | 기능 | 작동상태 | 정상 작동 | visual | checkbox |
|
||
| 3 | 기능 | 개폐속도 | 규정 속도 범위 이내 | visual | checkbox |
|
||
| 4 | 성능 | 방연성능 | 기준 적합 | visual | checkbox |
|
||
| 5 | 성능 | 차연성능 | 기준 적합 | visual | checkbox |
|
||
| 6 | 성능 | 내화성능 | 기준 적합 | visual | checkbox |
|
||
| 7 | 안전 | 안전장치 | 정상 작동 | visual | checkbox |
|
||
| 8 | 안전 | 비상개방 | 정상 작동 | visual | checkbox |
|
||
| 9 | 설치 | 전기배선 | 규정 적합 | visual | checkbox |
|
||
| 10 | 설치 | 설치상태 | 규정 적합 | visual | checkbox |
|
||
| 11 | 부속 | 부속품 | 누락 없음 | visual | checkbox |
|
||
|
||
**특성:**
|
||
- 모든 항목이 visual/checkbox (적합/부적합)
|
||
- numeric 측정값 없음 → columns 구조가 중간검사보다 훨씬 단순
|
||
- **columns 자동 파생(방안1)**: checkbox → 판정(select) 컬럼
|
||
|
||
**결재라인**: 작성(품질) → 검토(품질QC) → 승인(경영)
|
||
**Footer**: 부적합 내용 + 종합판정(합격/불합격)
|
||
**자동판정**: 모든 항목 적합 → 합격, 1개라도 부적합 → 불합격
|
||
|
||
### 4.1 양식 시더 구조 (MidInspectionTemplateSeeder 패턴)
|
||
|
||
```php
|
||
// ProductInspectionTemplateSeeder
|
||
[
|
||
'name' => '제품검사 성적서',
|
||
'category' => '품질/제품검사',
|
||
'title' => '제 품 검 사 성 적 서',
|
||
'company_name' => '케이디산업',
|
||
'footer_remark_label' => '부적합 내용',
|
||
'footer_judgement_label' => '종합판정',
|
||
'footer_judgement_options' => ['합격', '불합격'],
|
||
|
||
'approval_lines' => [
|
||
['name' => '작성', 'dept' => '품질', 'role' => '담당자', 'sort_order' => 1],
|
||
['name' => '검토', 'dept' => '품질', 'role' => 'QC', 'sort_order' => 2],
|
||
['name' => '승인', 'dept' => '경영', 'role' => '대표', 'sort_order' => 3],
|
||
],
|
||
|
||
'basic_fields' => [
|
||
['label' => '납품명', 'field_type' => 'text'],
|
||
['label' => '제품명', 'field_type' => 'text'],
|
||
['label' => '발주처', 'field_type' => 'text'],
|
||
['label' => 'LOT NO', 'field_type' => 'text'],
|
||
['label' => '로트크기', 'field_type' => 'text'],
|
||
['label' => '검사일자', 'field_type' => 'date'],
|
||
['label' => '검사자', 'field_type' => 'text'],
|
||
],
|
||
|
||
'sections' => [
|
||
[
|
||
'title' => '제품검사 기준서',
|
||
'items' => [], // 기준서 섹션 (빈 섹션, 향후 확장)
|
||
],
|
||
[
|
||
'title' => '제품검사 DATA',
|
||
'items' => [
|
||
['category' => '외관', 'item' => '외관검사', ...],
|
||
// ... 11개 항목 (모두 visual/checkbox)
|
||
],
|
||
],
|
||
],
|
||
|
||
// columns는 자동 파생 (Phase 5.0 방안1)
|
||
// checkbox → [NO, 검사항목, 검사기준, 판정(select)]
|
||
]
|
||
```
|
||
|
||
---
|
||
|
||
## 5. 개소별 문서 일괄생성 로직
|
||
|
||
### 5.1 API 엔드포인트 (계획)
|
||
|
||
```
|
||
POST /api/v1/orders/{orderId}/create-fqc
|
||
Request: { template_id: number }
|
||
Response: { documents: Document[], created_count: number }
|
||
```
|
||
|
||
### 5.2 생성 로직
|
||
|
||
```php
|
||
// 1. Order + OrderItems 조회
|
||
$order = Order::with('items')->findOrFail($orderId);
|
||
|
||
// 2. 개소별 Document 생성
|
||
foreach ($order->items as $index => $orderItem) {
|
||
$document = Document::create([
|
||
'template_id' => $templateId,
|
||
'document_no' => "FQC-" . date('ymd') . "-" . str_pad($index + 1, 2, '0', STR_PAD_LEFT),
|
||
'title' => "제품검사 - {$orderItem->floor_code}-{$orderItem->symbol_code} ({$orderItem->specification})",
|
||
'status' => DocumentStatus::DRAFT,
|
||
'linkable_type' => OrderItem::class,
|
||
'linkable_id' => $orderItem->id,
|
||
]);
|
||
|
||
// 3. 기본필드 자동매핑
|
||
$autoFillData = [
|
||
'납품명' => $order->title,
|
||
'제품명' => $orderItem->item_name,
|
||
'발주처' => $order->client_name,
|
||
'LOT NO' => $order->order_no,
|
||
'로트크기' => "1 EA",
|
||
];
|
||
|
||
// 4. document_data에 기본필드 저장
|
||
foreach ($autoFillData as $key => $value) {
|
||
DocumentData::create([
|
||
'document_id' => $document->id,
|
||
'field_key' => Str::slug($key),
|
||
'field_value' => $value,
|
||
]);
|
||
}
|
||
|
||
// 5. document_links 연결
|
||
DocumentLink::create([
|
||
'document_id' => $document->id,
|
||
'link_key' => 'order',
|
||
'linkable_type' => Order::class,
|
||
'linkable_id' => $order->id,
|
||
]);
|
||
|
||
// 6. 결재라인 초기화
|
||
// ... (기존 패턴 재사용)
|
||
}
|
||
```
|
||
|
||
### 5.3 개소 진행현황 조회
|
||
|
||
```
|
||
GET /api/v1/orders/{orderId}/fqc-status
|
||
Response: {
|
||
total: 50,
|
||
inspected: 30,
|
||
passed: 28,
|
||
failed: 2,
|
||
pending: 20,
|
||
items: [
|
||
{ order_item_id: 1, floor_code: "1F", symbol_code: "A", document_id: 101, status: "APPROVED", result: "합격" },
|
||
{ order_item_id: 2, floor_code: "1F", symbol_code: "B", document_id: 102, status: "DRAFT", result: null },
|
||
...
|
||
]
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 6. 핵심 파일 경로
|
||
|
||
### mng
|
||
| 파일 | 용도 | 상태 |
|
||
|------|------|:----:|
|
||
| `mng/database/seeders/ProductInspectionTemplateSeeder.php` | 제품검사 양식 시더 | 🔄 작성 중 |
|
||
| `mng/database/seeders/MidInspectionTemplateSeeder.php` | 참조 패턴 (중간검사) | ✅ |
|
||
|
||
### api
|
||
| 파일 | 용도 | 상태 |
|
||
|------|------|:----:|
|
||
| `api/app/Models/Order.php` | 수주 모델 | ✅ |
|
||
| `api/app/Models/OrderItem.php` | 수주 상세(개소) 모델 | ✅ |
|
||
| `api/app/Models/Documents/Document.php` | 문서 모델 | ✅ |
|
||
| `api/app/Models/Qualitys/Inspection.php` | 기존 검사 모델 (IQC/PQC/FQC) | ✅ |
|
||
| `api/app/Http/Controllers/Api/V1/OrderController.php` | 수주 컨트롤러 (createFqc 추가 필요) | ⏳ |
|
||
| `api/app/Services/DocumentService.php` | 문서 생성 서비스 | ✅ |
|
||
|
||
### react
|
||
| 파일 | 용도 | 상태 |
|
||
|------|------|:----:|
|
||
| `react/src/components/quality/InspectionManagement/` | 품질검사 요청관리 (15+ 파일) | ✅ 유지 |
|
||
| `react/src/components/quality/InspectionManagement/InspectionList.tsx` | 검사 목록 | ✅ 유지 |
|
||
| `react/src/components/quality/InspectionManagement/InspectionDetail.tsx` | 검사 상세 | 🔄 수정 필요 |
|
||
| `react/src/components/quality/InspectionManagement/modals/InspectionReportModal.tsx` | 성적서 모달 | 🔄 전환 필요 |
|
||
| `react/src/components/quality/InspectionManagement/modals/ProductInspectionInputModal.tsx` | 입력 모달 | 🔄 전환 필요 |
|
||
| `react/src/components/document-system/viewer/DocumentViewer.tsx` | 문서 뷰어 | ✅ |
|
||
| `react/src/components/document-system/content/TemplateInspectionContent.tsx` | 양식 기반 렌더링 | ✅ |
|
||
| `react/src/app/[locale]/(protected)/quality/qms/components/documents/ProductInspectionDocument.tsx` | 하드코딩 문서 | ❌ 대체 예정 |
|
||
|
||
---
|
||
|
||
## 7. 기존 Inspection 모델과의 관계 (통합 전략)
|
||
|
||
### 7.1 현재 구조
|
||
|
||
```
|
||
inspections 테이블 (JSON 기반)
|
||
├─ inspection_type: IQC/PQC/FQC
|
||
├─ status: waiting → in_progress → completed
|
||
├─ meta: { ... } (JSON)
|
||
├─ items: { ... } (JSON - 검사 결과)
|
||
└─ extra: { ... } (JSON)
|
||
|
||
documents 테이블 (EAV 정규화)
|
||
├─ template_id → document_templates
|
||
├─ status: DRAFT → PENDING → APPROVED/REJECTED
|
||
├─ linkable_type + linkable_id (다형성)
|
||
├─ document_data (EAV - 섹션/컬럼/행 기반)
|
||
└─ document_approvals (결재 이력)
|
||
```
|
||
|
||
### 7.2 통합 후 구조
|
||
|
||
```
|
||
InspectionManagement (요청관리 레이어) - 유지
|
||
├─ 검사 목록/등록/상세/캘린더
|
||
├─ inspections 테이블 (요청/일정/상태)
|
||
└─ API: /api/v1/inspections (CRUD)
|
||
|
||
Document System (성적서 레이어) - 신규 연동
|
||
├─ 양식 기반 검사 데이터 입력
|
||
├─ documents 테이블 (EAV + 결재)
|
||
├─ linkable → OrderItem (개소별)
|
||
└─ document_links → Order, Inspection
|
||
|
||
연결 포인트:
|
||
├─ InspectionDetail에서 "성적서 작성/조회" 시 → Document System 호출
|
||
├─ InspectionReportModal → TemplateInspectionContent 기반 전환
|
||
└─ ProductInspectionInputModal → 양식 기반 입력으로 전환
|
||
```
|
||
|
||
---
|
||
|
||
## 8. 변경 이력
|
||
|
||
| 날짜 | 내용 |
|
||
|------|------|
|
||
| 2026-02-10 | Phase 5.2 계획 문서 신규 생성 |
|
||
| 2026-02-10 | 방안1 반영: 시더에 section_fields 필수, columns 자동 파생. 선행조건 Phase 5.0 추가 |
|
||
| 2026-02-12 | 코드베이스 분석 반영: InspectionManagement 발견, 3개 검사항목 세트 정리, 통합 전략 확정 |
|
||
| 2026-02-12 | 설치 후 최종검사 11항목 확정, documents 기반 통합 방향 확정 |
|
||
| 2026-02-12 | 5.2.1 ProductInspectionTemplateSeeder 작성 완료 (template_id: 65) |
|
||
| 2026-02-12 | 5.2.2 mng 양식 편집/미리보기 검증 완료 |
|
||
| 2026-02-12 | 5.2.3 API bulk-create-fqc + fqc-status 엔드포인트 구현 완료 |
|
||
| 2026-02-12 | 5.2.4 React fqcActions.ts + FqcDocumentContent + 모달 듀얼모드 전환 완료 |
|
||
| 2026-02-12 | 5.2.5 InspectionDetail FQC 진행현황 통계 바 + 개소별 상태/조회 UI 완료 |
|
||
| 2026-02-12 | **Phase 5.2 전체 완료 (5/5)** |
|
||
|
||
---
|
||
|
||
*이 문서는 /plan 스킬로 생성되었습니다.* |