docs: [bending] step1-데이터분석 테이블 분리 반영

- items.options 방식 → bending_items 전용 테이블 구조로 갱신
- SAM 데이터 현황: bending_items 266건 + bending_models 62건
- artisan 커맨드: clean-reimport/model-import (구 커맨드 폐기 표시)
- 산출물: 운영 서버 복사 완료 반영
This commit is contained in:
강영보
2026-03-19 20:23:35 +09:00
parent 220ab78041
commit a9fd1ff69f

View File

@@ -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 복사 후 커맨드 재실행 필요)