docs: [plans] Phase 2A 절곡 검사 분석/설계 완료 기록

- dynamic_bom 발견, 5130 갭 대조, inspection-config API 재설계
- 마스터 플랜 Phase 2A  상태 반영, 진행률 3/7
This commit is contained in:
2026-02-27 15:46:37 +09:00
parent a81d3ed0e5
commit 123e670faa
2 changed files with 169 additions and 26 deletions

View File

@@ -2,7 +2,7 @@
> **작성일**: 2026-02-27
> **목적**: 두 개선 계획(제품코드 추적성, 검사 단위 구조)을 하나의 순차적 실행 계획으로 통합
> **상태**: 🔄 Phase 0+1 완료, Phase 2 실행 대기
> **상태**: 🔄 Phase 0+1 완료, Phase 2A 완료, Phase 2B 실행 대기
> **원본 문서**:
> - [`product-code-traceability-plan.md`](./product-code-traceability-plan.md) (아카이브 참조)
> - [`document-system-improvement-plan.md`](./document-system-improvement-plan.md) (아카이브 참조)
@@ -15,9 +15,9 @@
| 항목 | 내용 |
|------|------|
| **마지막 완료 작업** | Phase 1 - product_code 전파 버그 수정 완료 |
| **다음 작업** | Phase 2A (절곡 검사 분석) + Phase 2B (견적/수주 정합성) |
| **진행률** | 2/7 Phase (Phase 0+1 완료) |
| **마지막 완료 작업** | Phase 2A - 절곡 검사 분석/설계 완료 (dynamic_bom 발견, 5130 대조) |
| **다음 작업** | Phase 2B (견적/수주 정합성 + 품질 FK) |
| **진행률** | 3/7 Phase (Phase 0+1+2A 완료) |
| **마지막 업데이트** | 2026-02-27 |
---
@@ -43,7 +43,7 @@
|:-----:|------|------|--------|:----:|------|
| **0** | 사전 데이터 조사 | product-code P0 | 없음 | ✅ | [Phase 0-1 상세](./integrated-phase-0-1.md) |
| **1** | product_code 전파 버그 수정 | product-code P1 | Phase 0 | ✅ | [Phase 0-1 상세](./integrated-phase-0-1.md) |
| **2A** | 절곡 검사 분석/설계 | document-system P1 | 없음 (**Phase 1과 병렬**) | | [Phase 2 상세](./integrated-phase-2.md) |
| **2A** | 절곡 검사 분석/설계 | document-system P1 | 없음 (**Phase 1과 병렬**) | | [Phase 2 상세](./integrated-phase-2.md) |
| **2B** | 견적/수주 정합성 + 품질 FK | product-code P2+P3 | Phase 1 | ⏳ | [Phase 2 상세](./integrated-phase-2.md) |
| **3** | 절곡 검사 동적 구현 | document-system P2 | Phase 1 + 2A | ⏳ | [Phase 3 상세](./integrated-phase-3.md) |
| **4** | 절곡 재공품 + 결재 워크플로우 | document-system P3 | Phase 3 | ⏭️ | 마스터 요약만 |
@@ -353,6 +353,7 @@ Phase 2A ──────────────┼── Phase 3 ───
| 날짜 | 항목 | 변경 내용 |
|------|------|----------|
| 2026-02-27 | 통합 문서 작성 | product-code + document-system 2개 계획을 7 Phase 통합 계획으로 병합 |
| 2026-02-27 | Phase 2A 완료 | 절곡 검사 분석/설계 완료. dynamic_bom 발견, 5130 대조 완료, inspection-config API 재설계 |
---

View File

@@ -4,7 +4,7 @@
> **원본**:
> - [`document-system-improvement-plan.md`](./document-system-improvement-plan.md) Phase 1
> - [`product-code-traceability-plan.md`](./product-code-traceability-plan.md) Phase 2, 3
> **상태**: 실행 대기
> **상태**: 🔄 Phase 2A 분석 완료, Phase 2B 실행 대기
> **의존성**: Phase 2A는 독립 (Phase 1과 병렬 가능), Phase 2B는 Phase 1 완료 필수
---
@@ -18,23 +18,62 @@
| # | 작업 항목 | 상태 | 비고 |
|---|----------|:----:|------|
| 2A.1 | 절곡 제품코드별 구성품(BOM) 데이터 구조 분석 | | `items`/BOM 테이블에서 KWE01/KSS01/KSS02 확인 |
| 2A.2 | 마감유형(S1/S2/S3)별 차이 분석 | | 5130 레거시 참조 |
| 2A.3 | `inspection-config` 범용 API 설계 | | `GET /api/v1/work-orders/{id}/inspection-config` (I5 정책) |
| 2A.4 | `DEFAULT_GAP_PROFILES` 기준치 5130 대조 | | I1: Single Source of Truth 보정 |
| 2A.1 | 절곡 제품코드별 구성품(BOM) 데이터 구조 분석 | | 7개 모델 18종 FG, 150+ BD 구성품, `dynamic_bom` 발견 |
| 2A.2 | 마감유형(S1/S2/S3)별 차이 분석 | | 5130에서 S1/S2/S3별 갭 포인트 수·값 차이 확인 |
| 2A.3 | `inspection-config` 범용 API 설계 | | `dynamic_bom` 활용으로 설계 단순화. 상세 1.6절 참조 |
| 2A.4 | `DEFAULT_GAP_PROFILES` 기준치 5130 대조 | | Template 3값 오류, 측면형 전면 불일치. 상세 1.7절 참조 |
### 1.2 구성품 데이터 소스 분석 대상
### 1.2 구성품 데이터 소스 분석 결과
```
분석 대상:
1. items 테이블 — type='finished_goods' 또는 'component'인 항목
2. bom_items 테이블 — 제품→구성품 관계
3. order_nodes.options.bending_info — 수주 시 절곡 정보
4. 5130/estimate/common/common_addrowJS.php — 레거시 구성품 정의
5. mng 절곡 양식(ID:13)의 section_items — 검사기준서 항목
6. TemplateInspectionContent DEFAULT_GAP_PROFILES — 현재 기준치
분석 대상 → 결과:
1. items 테이블 — FG 18종, BD 150+ 종 등록 확인 ✅
2. bom_templates — 1건만 존재 (MATERIAL 참조). 제품별 BOM은 미등록
3. order_nodes.options.bending_info — 데이터 없음 (0건)
4. work_order_items.options.dynamic_bom — ✅ 핵심 발견! BOM 기반 구성품이 이미 저장됨
5. 5130/output/viewMidInspectBending.php — 갭 기준치 원본 (S1/S2/S3별)
6. TemplateInspectionContent DEFAULT_GAP_PROFILES — 일부 오류 확인 (1.7절)
```
### 1.2.1 핵심 발견: `dynamic_bom`
`work_order_items.options`에 BOM 기반 구성품이 **카테고리별로 이미 저장**되어 있음:
```json
{
"dynamic_bom": [
{ "category": "guideRail", "part_type": "마감재", "child_item_code": "BD-SS-35", "length_mm": 3500, "qty": 6 },
{ "category": "guideRail", "part_type": "본체", "child_item_code": "BD-SM-35", "length_mm": 3500, "qty": 6 },
{ "category": "bottomBar", "part_type": "메인", "child_item_code": "BD-BS-40", "length_mm": 4000, "qty": 3 },
{ "category": "bottomBar", "part_type": "L-Bar", "child_item_code": "BD-LA-40", "length_mm": 4000, "qty": 3 },
{ "category": "shutterBox", "part_type": "전면부", "child_item_code": "BD-XX-35", "length_mm": 3500, "qty": 3 },
{ "category": "smokeBarrier", "part_type": "연기차단재(W50)", "child_item_code": "BD-GI-54", "length_mm": 4000, "qty": 6 },
{ "category": "smokeBarrier", "part_type": "연기차단재(W80)", "child_item_code": "BD-GI-83", "length_mm": 3000, "qty": 9 }
]
}
```
**카테고리 매핑**:
| dynamic_bom category | 검사 대상 구성품 | part_type 예시 |
|---------------------|----------------|---------------|
| `guideRail` | 가이드레일 | 마감재, 본체, C형, D형, 하부BASE |
| `bottomBar` | 하단마감재 | 메인, L-Bar, 보강평철 |
| `shutterBox` | 케이스 | 전면부, 린텔부, 점검구, 후면코너부, 상부덮개, 마구리 |
| `smokeBarrier` | 연기차단재 | W50, W80 |
### 1.2.2 완제품(FG) 품목 현황
| 모델 | 설치형 | 마감 | FG 코드 | 절곡 구성품 규격 |
|------|--------|------|---------|----------------|
| KWE01 | 벽면/측면 | SUS, EGI | FG-KWE01-* | 가이드레일 120×120/70, 하단마감재 64×43/60×40, L-BAR 17×60 |
| KSS01 | 벽면/측면 | SUS | FG-KSS01-* | 가이드레일 120×120/70, 하단마감재 60×40, L-BAR 17×60 |
| KSS02 | 벽면/측면 | SUS | FG-KSS02-* | 가이드레일 120×120/70, 하단마감재 60×40, L-BAR 17×60 |
| KQTS01 | 벽면/측면 | SUS | FG-KQTS01-* | 가이드레일 130×125/75, 하단마감재 60×30 |
| KTE01 | 벽면/측면 | SUS, EGI | FG-KTE01-* | 가이드레일 130×125/75, 하단마감재 64×34/60×30 |
| KSE01 | 벽면/측면 | SUS, EGI | FG-KSE01-* | 가이드레일 120×120/70, 하단마감재 64×43/60×40, L-BAR 17×60 |
| KDSS01 | — | SUS | — | 가이드레일 150×150/212, 하단마감재 140×78, L-BAR 17×100 |
### 1.3 구성품 결정 로직 (설계안)
```
@@ -125,7 +164,105 @@ GET /api/v1/work-orders/{id}/inspection-config
| `items[].width_design` | `string` | 설계 폭 (`N/A` 가능) |
| `items[].gap_points` | `array` | 갭 측정 포인트 목록 |
### 1.5 현재 하드코딩 현황 (레거시 동결 -- C3)
### 1.6 inspection-config API 설계 (수정안)
`dynamic_bom` 발견으로 기존 설계안 대비 단순화됨:
```
입력: work_order_id
1차: work_order → process 자동 판별 (bending/screen/slat)
↓ (비절곡이면 빈 items 반환)
2차: work_order_items.options.dynamic_bom → 카테고리별 구성품 추출
3차: 카테고리 + 마감유형(S타입) → 갭 기준치 매핑 (GAP_PROFILES 테이블 or 상수)
↓ (dynamic_bom 없으면)
4차: DEFAULT_GAP_PROFILES fallback
↓ (템플릿 미설정 = 레거시)
5차: INITIAL_PRODUCTS fallback (BendingInspectionContent)
```
**기존 설계 대비 변경점**:
- 2차에서 BOM 테이블 조회 → `dynamic_bom` JSON 직접 사용 (DB 조회 불필요)
- 케이스 갭 포인트: 고정값 → `dynamic_bom``length_mm` 기반 동적 계산
### 1.7 DEFAULT_GAP_PROFILES 5130 대조 결과
**원본 소스**: `5130/output/viewMidInspectBending.php` (L170-786)
#### 가이드레일 벽면형
| 포인트 | 5130 S1 | 5130 S2 | 5130 S3 | Template (신규) | Bending (레거시) | 판정 |
|:------:|:-------:|:-------:|:-------:|:---------------:|:---------------:|:----:|
| (1) | 30 | 30 | 30 | 30 | 30 | ✅ |
| (2) | **80** | **80** | **80** | **78** | **80** | ❌ Template |
| (3) | **45** | **45** | **45** | **25** | **45** | ❌ Template |
| (4) | **40** | — | **40** | **45** | **40** | ❌ Template |
| (5) | — | — | 34 | — | 34 | S3 전용 |
**Bending(레거시)이 5130과 일치**, Template에 3개 값 오류
#### 가이드레일 측면형
| 포인트 | 5130 S1 | Template | Bending | 판정 |
|:------:|:-------:|:--------:|:-------:|:----:|
| (1) | **30** | 28 | 28 | ❌ 둘 다 |
| (2) | **70** | 75 | 75 | ❌ 둘 다 |
| (3) | **45** | 42 | 42 | ❌ 둘 다 |
| (4) | **35** | 38 | 38 | ❌ 둘 다 |
| (5) | **95** | 32 | 32 | ❌ 둘 다 |
| (6) | 90 | — | — | 누락 |
**Template과 Bending 모두 5130 S1과 불일치** — 별도 근거 확인 필요 (다른 S타입 or 버전)
#### 케이스
| 포인트 | 5130 | Template | Bending | 판정 |
|:------:|:----:|:--------:|:-------:|:----:|
| (1) | boxheight (동적) | 550 | 380 | 5130=동적계산 |
| (2) | frontbottom/50 (동적) | 50 | 50 | — |
| (3) | 계산식 (동적) | 385 | 240 | 5130=동적계산 |
| (4) | frontbottom/boxheight | 50 | 50 | — |
| (5) | boxheight-140 | 410 | — | 5130=동적계산 |
**5130은 주문 정보(boxwidth/boxheight)에서 동적 계산** — 두 컴포넌트 모두 특정 사이즈 고정값
#### 하단마감재
| 포인트 | 5130 S1/S2 | 5130 S3 | Template | Bending | 판정 |
|:------:|:----------:|:-------:|:--------:|:-------:|:----:|
| (1) | 60 | 60 | 60 | 60 | ✅ |
| (2) | — | 64 | — | 64 | S3 전용 |
→ Bending이 S3까지 커버, Template은 S1/S2만
#### 하단 L-BAR / 연기차단재
| 항목 | 5130 | Template | Bending | 판정 |
|------|:----:|:--------:|:-------:|:----:|
| L-BAR (1) | 17 | — | 17 | ✅ (Template에 없음) |
| 연기차단재 W50 | 50, 12 | 50, 12 | 50, 12 | ✅ 3자 일치 |
| 연기차단재 W80 | 80, 12 | 80, 12 | 80, 12 | ✅ 3자 일치 |
#### 5130 마감유형별 갭 포인트 수 정리
| 구성품 | S1 | S2 (KSS02형) | S3 (별도마감형) |
|--------|:--:|:--:|:--:|
| 가이드레일 벽면 | 4점 | 3점 | 5점 |
| 가이드레일 측면 | 6점 | 5점 | 7점 |
| 하단마감재 | 1점 | 1점 | 2점 |
| L-BAR | 1점 | 1점 | 1점 |
| 케이스 | 동적 (점검구 방향별) | 동적 | 동적 |
| 연기차단재 | 2점 | 2점 | 2점 |
#### Phase 3 대응 방향 (I1: Single Source of Truth)
1. **DEFAULT_GAP_PROFILES 수정 필요**: 벽면형 3값 오류 → 5130 기준으로 보정
2. **측면형 재검토**: Template/Bending 모두 5130 S1과 다름 → 사용 중인 실제 버전 확인 필요
3. **케이스 동적 계산**: `dynamic_bom`의 치수 정보 활용하여 동적 계산 구현
4. **마감유형 분기**: S1/S2/S3별 갭 포인트 수 차이 → inspection-config API에서 처리
### 1.8 현재 하드코딩 현황 (레거시 동결 — C3)
`BendingInspectionContent.tsx``INITIAL_PRODUCTS` (7개, KWE01 전용):
@@ -253,11 +390,15 @@ NO_MATCH: null 유지 (수동 보정 대상)
| 조사 항목 | 결과 | 판단 |
|----------|------|------|
| KWE01 BOM 구성품 | | ⏳ |
| KSS01 BOM 구성품 수 | | ⏳ |
| KSS02 BOM 구성품 수 | | ⏳ |
| 마감유형별 차이점 | | ⏳ |
| `DEFAULT_GAP_PROFILES` 5130 대조 | | ⏳ |
| KWE01 구성품 | 가이드레일(SUS/EGI 120×120/70), 하단마감재(SUS 64×43, EGI 60×40), L-BAR 17×60 | ✅ items 등록 확인 |
| KSS01 구성품 | 가이드레일(SUS 120×120/70), 하단마감재(SUS 60×40), L-BAR 17×60 | ✅ items 등록 확인 |
| KSS02 구성품 | 가이드레일(SUS 120×120/70), 하단마감재(SUS 60×40), L-BAR 17×60 | ✅ items 등록 확인 |
| KQTS01 구성품 | 가이드레일(SUS 130×125/75), 하단마감재(SUS 60×30) | ✅ L-BAR 없음 |
| `dynamic_bom` 존재 | `work_order_items.options`에 카테고리별 BOM 저장됨 (1건 확인) | ✅ 핵심 발견 |
| 마감유형(S1/S2/S3)별 차이 | 갭 포인트 수·값 차이. 벽면 S1=4점, S2=3점, S3=5점 | ✅ 상세 1.7절 |
| DEFAULT_GAP_PROFILES 5130 대조 | 벽면형 3값 오류, 측면형 전면 불일치, 케이스 동적계산 | ✅ 상세 1.7절 |
| inspections 테이블 | 0건 (데이터 없음), `work_order_id` 컬럼 미존재 | ✅ 2B.4 FK 추가 필요 |
| quotes.product_code | 컬럼 존재, 49건 중 0건 채워짐 | ✅ 2B.1 저장 로직 + 2B.3 보정 필요 |
### 3.2 Phase 2B 검증
@@ -278,10 +419,10 @@ NO_MATCH: null 유지 (수동 보정 대상)
| 파일 | 역할 |
|------|------|
| `react/.../documents/TemplateInspectionContent.tsx` | `DEFAULT_GAP_PROFILES` (L176-206), `buildBendingProducts` (L209-274) |
| `react/.../documents/TemplateInspectionContent.tsx` | `DEFAULT_GAP_PROFILES` (L184-214), `buildBendingProducts` (L217-282) |
| `react/.../documents/BendingInspectionContent.tsx` | `INITIAL_PRODUCTS` (L71-135, 레거시 동결) |
| `5130/output/viewMidInspectBending.php` | 절곡 중간검사 성적서 원본 (L170-786, 갭 기준치) |
| `5130/estimate/common/common_addrowJS.php` | 레거시 구성품 정의 |
| `5130/output/view_inspection_bending.php` | 절곡 중간검사 성적서 |
### 4.2 Phase 2B 관련
@@ -298,3 +439,4 @@ NO_MATCH: null 유지 (수동 보정 대상)
| 날짜 | 항목 | 변경 내용 |
|------|------|----------|
| 2026-02-27 | 문서 작성 | 통합 계획 Phase 2 상세 문서 작성 |
| 2026-02-27 | 2A 분석 완료 | BOM 구조 분석(dynamic_bom 발견), 마감유형 S1/S2/S3 차이 분석, inspection-config API 재설계, DEFAULT_GAP_PROFILES 5130 대조 완료. 1.2~1.7절 추가 |