docs: [bending] step1-데이터분석 테이블 분리 반영
- items.options 방식 → bending_items 전용 테이블 구조로 갱신 - SAM 데이터 현황: bending_items 266건 + bending_models 62건 - artisan 커맨드: clean-reimport/model-import (구 커맨드 폐기 표시) - 산출물: 운영 서버 복사 완료 반영
This commit is contained in:
@@ -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 복사 후 커맨드 재실행 필요)
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user