From a9fd1ff69f751df54fe39c53e18971b7ff1214d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EC=98=81=EB=B3=B4?= Date: Thu, 19 Mar 2026 20:23:35 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20[bending]=20step1-=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=EB=B6=84=EC=84=9D=20=ED=85=8C=EC=9D=B4=EB=B8=94=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - items.options 방식 → bending_items 전용 테이블 구조로 갱신 - SAM 데이터 현황: bending_items 266건 + bending_models 62건 - artisan 커맨드: clean-reimport/model-import (구 커맨드 폐기 표시) - 산출물: 운영 서버 복사 완료 반영 --- .../bending-management/step1-데이터분석.md | 260 +++++++----------- 1 file changed, 103 insertions(+), 157 deletions(-) diff --git a/dev/dev_plans/bending-management/step1-데이터분석.md b/dev/dev_plans/bending-management/step1-데이터분석.md index e0d33f9..225d6ff 100644 --- a/dev/dev_plans/bending-management/step1-데이터분석.md +++ b/dev/dev_plans/bending-management/step1-데이터분석.md @@ -1,8 +1,9 @@ -# Step 1: 데이터 분석 + options 확장 +# Step 1: 데이터 분석 + 전용 테이블 분리 > **프로젝트**: API (`sam/api`) > **선행 조건**: 없음 > **참조**: `standards/options-column-policy.md`, `rules/item-policy.md` +> **최종수정**: 2026-03-19 (items.options → bending_items 전용 테이블 분리 완료) --- @@ -156,99 +157,81 @@ str_starts_with($code, 'BD-보강평철') → detail_reinforce - **컬럼**: prodcode, railtype, boxsize, boxexit, frontbottom, railwidth, search_tag - **SAM 연동**: 1차 제외 (그룹화는 options.item_bending으로 대체) -### 1-2. SAM BD 품목 현황 (170건) +### 1-2. SAM 데이터 현황 -**패턴별 분류**: +#### ✅ 현재 (전용 테이블 분리 후 — 2026-03-19) -| 패턴 | 건수 | 예시 | 파싱 | -|------|------|------|------| -| A) `BD-PREFIX-LEN` | 112 | BD-RS-30, BD-CF-35 | prefix/length 자동 추출 | -| B) `BD-L-BAR-모델-규격` | 5 | BD-L-BAR-KSS01-17*60 | 모델+규격 추출 가능 | -| C) `BD-가이드레일-모델-재질-규격` | 21 | BD-가이드레일-KSS01-SUS-120*70 | 모델+재질+규격 추출 가능 | -| D) `BD-마구리-규격` | 10 | BD-마구리-655*505 | 규격 추출 가능 | -| E) `BD-케이스-규격` | 11 | BD-케이스-650*550 | 규격 추출 가능 | -| F) `BD-하단마감재-모델-재질-규격` | 10 | BD-하단마감재-KSS01-SUS-60*40 | 모델+재질+규격 추출 가능 | -| G) `BD-보강평철-규격` | 1 | BD-보강평철-50 | 규격 추출 가능 | +| 테이블 | 건수 | 소스 | 상태 | +|--------|------|------|------| +| **bending_items** | **266건** | chandj.bending 직접 이관 | ✅ 전건 bending_data JSON 포함 | +| **bending_models** | **62건** | guiderail 21 + shutterbox 30 + bottombar 11 | ✅ 이관 완료 | +| items (BENDING) | 215건 | 기존 재고/BOM용 — 무변경 | ✅ 독립 유지 | +| bending_item_mappings | — | **DROP 완료** | ✅ bending_items.code에 흡수 | -**A) PREFIX-LEN 112건 상세**: +| 검증 항목 | 결과 | +|----------|------| +| 하장바 검색 | **10건** (chandj 유효건 일치) ✅ | +| bending_data JSON | **266건 전건** 포함 ✅ | +| 이미지 R2 | ⬜ 미업로드 (레거시 파일 docker 복사 후 커맨드 필요) | -| PREFIX | 용도 | 길이 종류 | 건수 | -|--------|------|----------|------| -| RS | 가이드레일 마감재(벽면) SUS | 24,30,35,40,43 | 5 | -| SS | 가이드레일 마감재(측면) SUS | 30,35,40,43 | 4 | -| SU | 가이드레일 마감재(측면) SUS2 | 30,35,40,43 | 4 | -| RM | 가이드레일 본체(벽면) | 12,24,30,35,40,42,43 | 7 | -| SM | 가이드레일 본체(측면) | 02,24,30,35,40,43 | 6 | -| RC | 가이드레일 C형(벽면) | 12,24,30,35,40,42,43 | 7 | -| RD | 가이드레일 D형(벽면) | 12,24,30,35,40,42,43 | 7 | -| SC | 가이드레일 C형(측면) | 24,30,35,40,43 | 5 | -| SD | 가이드레일 D형(측면) | 24,30,35,40,43 | 5 | -| RT | 가이드레일 본체(벽면/철재) | 30,43 | 2 | -| ST | 가이드레일 본체(측면/철재) | 43 | 1 | -| BS | 하단마감재(스크린) SUS | 12,24,30,35,40,42,43 | 7 | -| BE | 하단마감재(스크린) EGI | 30,40 | 2 | -| TS | 하단마감재(철재) SUS | 40,43 | 2 | -| CF | 케이스 전면부 | 12,24,30,35,40,41 | 6 | -| CL | 케이스 린텔부 | 12,24,30,35,40,41 | 6 | -| CP | 케이스 점검구 | 12,24,30,35,40,41 | 6 | -| CB | 케이스 후면코너부 | 12,24,30,35,40,41 | 6 | -| GI | 연기차단재 | 24,30,35,40,43,53,54,83,84 | 9 | -| HH | 보강평철 | 30,40 | 2 | -| LA | L-Bar | 30,40 | 2 | -| XX | 하부BASE/상부덮개/마구리(공용) | 12,24,30,35,40,41,43 | 7 | -| YY | 별도마감 | 30,35,40,43 | 4 | +#### 참고: 이전 items 방식 (170건, 폐기됨) -**options 채워진 상태**: - -| 상태 | 건수 | 비고 | +| 패턴 | 건수 | 예시 | |------|------|------| -| options 완전 (prefix+length) | 22 | 13% | -| options 있지만 불완전 | 90 | PREFIX-LEN 중 일부 | -| options 비어있음 (`{}`) | 58 | 한글 패턴 전부 | +| A) `BD-PREFIX-LEN` | 112 | BD-RS-30, BD-CF-35 | +| B) `BD-L-BAR-모델-규격` | 5 | BD-L-BAR-KSS01-17*60 | +| C) `BD-가이드레일-모델-재질-규격` | 21 | BD-가이드레일-KSS01-SUS-120*70 | +| D) `BD-마구리-규격` | 10 | BD-마구리-655*505 | +| E) `BD-케이스-규격` | 11 | BD-케이스-650*550 | +| F) `BD-하단마감재-모델-재질-규격` | 10 | BD-하단마감재-KSS01-SUS-60*40 | +| G) `BD-보강평철-규격` | 1 | BD-보강평철-50 | -### 1-3. 매핑 테이블 작성 +> items 테이블의 BD-* 215건은 **재고/BOM용으로 무변경 유지**. 기초관리는 bending_items 전용 테이블 사용. + +### 1-3. 매핑 관계 ``` -레거시 bending (부품 단위) SAM items (품목 단위) -───────────────────────── ───────────────────── -num:100 마감재 SUS 120*70 ↔ BD-가이드레일-KSS01-SUS-120*70 (한글 패턴) -num:101 본체 EGI 120*70 ↔ BD-RM-30 (PREFIX-LEN — 길이 기준) - ※ 부품 단위 vs 길이 단위 구조 차이 +레거시 chandj.bending (부품 단위) SAM (테이블 분리 후) +───────────────────────── ───────────────────── +num:100 마감재 SUS 120*70 → bending_items (기초관리, 정규 컬럼) + legacy_bending_id=100으로 추적 + +SAM items (재고/BOM용) 역할 분리 +───────────────────── +BD-RS-30 (길이별 재고) → items 테이블 무변경 (BendingInfoBuilder 참조) +BD-가이드레일-KSS01-SUS-120*70 → items 테이블 무변경 (categorizeBomItem 참조) ``` -**핵심 결정사항**: -- ~~BD-한글 패턴(58건)을 BD-PREFIX 으로 통일~~ **취소** — BendingInfoBuilder.categorizeBomItem()이 한글 코드 의존 -- **BD-한글 패턴(58건)은 코드 유지, `options`에 속성만 추가** -- BD-PREFIX-LEN(112건)도 options 속성 보강 (item_sep, item_bending 등) -- 레거시 265건 중 SAM에 없는 항목 → 신규 생성 범위 확인 필요 +**최종 결정사항**: +- ~~items.options 방식~~ → **bending_items 전용 테이블 분리** (검색 불가 문제 해결) +- items 테이블의 BD-* 코드는 **무변경 유지** (BendingInfoBuilder/PrefixResolver 의존) +- chandj.bending 266건 → bending_items 직접 이관 (`bending:clean-reimport`) -### 🔴 chandj 265건 vs SAM 170건 차이 설명 - -**구조가 다르지만 데이터는 동일**: +### 🔴 chandj 265건 vs SAM 데이터 관계 (테이블 분리 후) ``` -chandj 265건 = 절곡 "형상" (규격별 1건) - 예: 마감재 SUS 120*70 → 전개도 [10,11,110,30,15,15,15] ← 1건 +[테이블 분리 후 — 현재 구조] -SAM 170건 = 절곡 "제품" (길이별 확장) - 예: BD-RS-24 (2438mm) ┐ - BD-RS-30 (3000mm) │ 모두 같은 전개도 - BD-RS-35 (3500mm) │ (chandj 1건의 형상을 공유) - BD-RS-40 (4000mm) │ - BD-RS-43 (4300mm) ┘ ← 5건 +chandj.bending 265건 → bending_items 266건 (1:1 직접 이관 + 1건 추가) + ├── 정규 컬럼: item_name, item_sep, material 등 (인덱스) + ├── bending_data: JSON [{no, input, rate, sum, color, aAngle}] + └── legacy_bending_id: chandj.bending.num 참조 + +items (BENDING) 215건 → 무변경 유지 (재고/BOM/작업지시서 전용) + ├── BD-PREFIX-LEN 112건 (길이별 확장) + └── BD-한글 58건 (BendingInfoBuilder 의존) ``` -| 항목 | chandj | SAM | 관계 | -|------|:---:|:---:|------| -| 가이드레일 부품 | 71건 (규격별) | 74건 (길이별) | 1:N (형상 1 → 길이 여러 개) | -| 케이스 부품 | 160건 (규격×크기별) | 34건 (PREFIX-LEN) | N:1 (여러 규격 → 모델 components로 통합) | -| 하단마감재 부품 | 11건 | 21건 | 1:N | -| 마구리/기타 | 23건 | 41건 | 1:N | +| 테이블 | 역할 | 건수 | +|--------|------|------| +| bending_items | 기초관리 마스터 (품명/재질/전개도) | 266건 | +| bending_models | 절곡품 모델 (부품 조합) | 62건 | +| items (BENDING) | 재고/BOM/작업지시서 | 215건 (무변경) | -**누락 없는 이유**: -- chandj 265건의 **전개도 데이터**는 SAM 170건의 `options.bendingData`에 포함 (139건 매핑) -- chandj에서 SAM에 직접 없는 부품들은 **모델(GR/SB/BB)의 components**에서 `legacy_bending_num`으로 참조 -- 추가 임포트 **불필요** +**이전 문제 해결**: +- ~~chandj 265건 vs SAM 170건 불일치~~ → bending_items 266건으로 전건 이관 완료 +- ~~options.bendingData 누락~~ → bending_items.bending_data JSON 전건 포함 +- ~~하장바 검색 2건~~ → bending_items.item_name 정규 컬럼으로 10건 정상 검색 --- @@ -278,93 +261,53 @@ BD-PREFIX-LEN 코드(BD-RS-30 등)도 `PrefixResolver` + LOT 재고에서 참조 --- -## 2. options 확장 +## 2. 전용 테이블 구조 (items.options → bending_items 정규 컬럼) -### 2-1. 확장 스키마 +### 2-1. bending_items 스키마 (최종) -**기존 키 (보존)**: -```json -{ - "source": "bending_item_seeder", - "lot_managed": true, - "consumption_method": "auto", - "production_source": "self_produced", - "input_tracking": true, - "prefix": "RS", - "length_code": "30", - "length_mm": 3000 -} +```sql +bending_items +├── id, tenant_id +├── code -- LOT: {제품Code}{종류Code}{YYMMDD} (예: RM260319) +├── legacy_code -- 이전 BD-LEGACY-* / BD-{품명}-* 코드 +├── legacy_bending_id -- chandj.bending.num 참조 +├── item_name -- 품명 (정규 컬럼, 인덱스) ← 검색 문제 해결 핵심 +├── item_sep -- 대분류: 스크린/철재 (인덱스) +├── item_bending -- 중분류: 가이드레일/케이스/하단마감재 (인덱스) +├── material -- 재질: SUS 1.2T / EGI 1.55T (인덱스) +├── item_spec -- 규격: 120*70 +├── model_name -- 소속 모델: KSS01 (인덱스) +├── model_UA -- 인정여부: 인정/비인정 +├── rail_width -- 레일폭 +├── exit_direction -- 출구방향 (케이스 전용) +├── box_width/height -- 박스 크기 (케이스 전용) +├── front_bottom -- 전면밑 (케이스 전용) +├── inspection_door -- 점검구 (케이스 전용) +├── bending_data -- JSON [{no, input, rate, sum, color, aAngle}] ← 전개도 +├── length_code -- 원자재 길이코드 (24,30,35,40 등) +├── length_mm -- 원자재 길이(mm) +├── options -- 비정형만: memo, author, search_keyword 등 +└── is_active, created_by, timestamps, soft_delete ``` -**추가 키**: -```json -{ - // --- 기본 속성 --- - "item_name": "마감재", // 품명 (레거시 itemName — items.name과 별도 보존) - "item_sep": "스크린", // 대분류 (스크린/철재) - "item_bending": "가이드레일", // 중분류 (가이드레일/케이스/하단마감재/마구리/L-BAR) - "item_spec": "120*70", // 규격 - "material": "SUS 1.2T", // 재질 - "model_name": "KSS01", // 모델명 - "model_UA": "인정", // 인정여부 - "search_keyword": "", // 검색 키워드 - "rail_width": 70, // 레일폭 - "registration_date": "2025-07-19", // 등록일 - "author": "개발자", // 작성자 - "memo": "", // 비고 - "parent_num": null, // 부모 절곡품 참조 (조합 관계) +> **변경 경위**: items.options JSON → 정규 컬럼 승격. 인덱싱/검색/정렬 가능해짐. - // --- 케이스 전용 --- - "exit_direction": "후면 점검구", // 점검구 방향 (후면/양면/밑면) - "front_bottom_width": 50, // 전면부 밑 치수 (mm) - "box_width": 650, // 케이스 너비 (mm) - "box_height": 550, // 케이스 높이 (mm) - - // --- 전개도 데이터 (인덱스 기반 객체 배열) --- - "bendingData": [ - { "no": 1, "input": 10, "rate": "", "sum": 10, "color": true, "aAngle": false }, - { "no": 2, "input": 11, "rate": "", "sum": 21, "color": false, "aAngle": false } - // ... 열 단위로 모든 속성을 하나의 객체에 통합 - ], - - // --- 이미지/추적 --- - "image_path": "", // 전개도 이미지 경로 - "legacy_bending_num": null // 레거시 추적용 -} -``` - -### 2-2. 마이그레이션 순서 - -``` -1단계: 기존 148건 prefix/length 채우기 - → BD-PREFIX-LEN 패턴에서 자동 추출 - -2단계: 레거시 속성 입력 - → 매핑 테이블 기반 item_sep/item_bending/material 등 - -3단계: 전개도 JSON 입력 - → 레거시 inputList/bendingrateList/sumList/colorList -``` - -### 2-3. artisan command (✅ 전체 실행 완료) +### 2-2. artisan command (✅ 전체 실행 완료) ```bash -# 1단계: prefix/분류 속성 보강 (170건) -php artisan bending:fill-options # ✅ 완료 +# 기초관리 클린 재이관 (chandj.bending 266건 + bending_data JSON + 이미지) +php artisan bending:clean-reimport --legacy-img-path=/tmp/bending_img # ✅ 완료 -# 2단계+3단계: 전개도(bendingData) + 속성 임포트 (139/170건) -php artisan bending:import-legacy # ✅ 완료 (31건 chandj 원본 없음) +# 절곡품 모델 이관 (62건 + 조립도 + component 이미지 복사) +php artisan bending:model-import --legacy-path=/tmp/legacy_5130 # ✅ 완료 +``` -# 가이드레일 모델 임포트 (20건) -php artisan guiderail:import-legacy # ✅ 완료 - -# 케이스+하단마감재 모델 임포트 (30+10건) -php artisan bending-product:import-legacy # ✅ 완료 - -# 이미지 마이그레이션 -php artisan bending:import-images # ✅ 기초관리 부품 이미지 138건 -php artisan bending-model:import-images # ✅ 모델 부품별 이미지 275건 -php artisan bending-model:import-assembly-images # ✅ 결합형태 이미지 60건 +**폐기된 커맨드** (구 items 방식): +```bash +# php artisan bending:fill-options ← 구 items.options 보강 (대체됨) +# php artisan bending:import-legacy ← 구 items 방식 이관 (대체됨) +# php artisan guiderail:import-legacy ← bending:model-import로 통합 +# php artisan bending-product:import-legacy ← bending:model-import로 통합 ``` --- @@ -384,10 +327,13 @@ php artisan bending-model:import-assembly-images # ✅ 결합형태 이미지 6 ## 4. 산출물 -- [x] 매핑 테이블 (legacy_bending_num으로 chandj↔SAM 연결) -- [x] artisan command 7개 (위 목록 참조) +- [x] bending_items 전용 테이블 (266건, 정규 컬럼 + bending_data JSON) +- [x] bending_models 전용 테이블 (62건, components JSON) +- [x] bending_item_mappings DROP (bending_items.code에 흡수) +- [x] artisan command 2개 (bending:clean-reimport, bending:model-import) - [x] CRUD 검증 완료 -- [x] 이미지 마이그레이션 완료 (총 473건 R2 업로드) +- [x] 운영 서버(114.203.209.83) 데이터 복사 + 마이그레이션 이력 등록 +- [ ] 이미지 R2 업로드 (레거시 파일 docker 복사 후 커맨드 재실행 필요)