diff --git a/plans/integrated-master-plan.md b/plans/integrated-master-plan.md index 1323ada..4e79c46 100644 --- a/plans/integrated-master-plan.md +++ b/plans/integrated-master-plan.md @@ -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 재설계 | --- diff --git a/plans/integrated-phase-2.md b/plans/integrated-phase-2.md index 607f640..7e9bdec 100644 --- a/plans/integrated-phase-2.md +++ b/plans/integrated-phase-2.md @@ -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절 추가 |