docs: [bending] 코드체계 변경 문서 업데이트 + kkk 폴더 git 추적 제외

This commit is contained in:
2026-03-21 19:36:30 +09:00
parent 1763a6123a
commit 96de724bf5
5 changed files with 634 additions and 38 deletions

View File

@@ -4,7 +4,7 @@
> **위치**: MNG 생산관리 > 절곡품 관리 (신규 메뉴)
> **목표**: 경동기업(5130) 수준의 절곡품 마스터 관리 + 전개도 데이터 + 이미지 관리
> **원칙**: 기존 BendingInfoBuilder/PrefixResolver 보존, **전용 테이블 분리 방식**
> **최종수정**: 2026-03-19 (테이블 분리 완료, 데이터 이관 완료)
> **최종수정**: 2026-03-21 (code/lot_no 분리 완료, bending_models lot_no 제거)
---
@@ -56,8 +56,9 @@ CREATE TABLE bending_items (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
tenant_id BIGINT UNSIGNED NOT NULL,
-- 코드 체계 (LOT 코드 = 제품Code + 종류Code + YYMMDD)
code VARCHAR(50) NOT NULL, -- LOT: {제품}{종류}{YYMMDD} (예: CP260319 = 케이스 점검구)
-- 코드 체계 (code/lot_no 분리 — 2026-03-21)
code VARCHAR(50) NOT NULL DEFAULT 'BD', -- 고정값 'BD' (절곡품 타입 식별)
lot_no VARCHAR(50) NULL, -- LOT 번호: {제품}{종류}{YYMMDD}-{길이} (예: CP6321-30)
legacy_code VARCHAR(50) NULL, -- 이전 BD-LEGACY-* / BD-{품명}-* 코드
legacy_bending_id INT UNSIGNED NULL, -- chandj.bending.id 참조
@@ -96,11 +97,47 @@ CREATE TABLE bending_items (
INDEX idx_material (material),
INDEX idx_model_name (model_name),
INDEX idx_code (code),
INDEX idx_lot_no (lot_no),
INDEX idx_legacy_code (legacy_code),
UNIQUE KEY uk_tenant_code (tenant_id, code, deleted_at)
UNIQUE KEY uk_tenant_lot_no (tenant_id, lot_no, deleted_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```
## ⚠️ 아키텍처 변경 2: code/lot_no 분리 (2026-03-21)
### 변경 결정 배경
초기 설계는 `code` 컬럼에 LOT 코드(`CP260319`)를 저장했으나, 다음 문제로 **code/lot_no 분리**:
| 문제 | 설명 |
|------|------|
| **역할 혼재** | code가 "타입 식별"과 "LOT 번호" 두 역할을 겸함 |
| **bending_models 불일치** | models는 GR/SB/BB 접두사인데 items는 CP260319 등 가변 |
| **검색 비효율** | code 앞 2자리 파싱이 필요 → lot_no로 분리하면 직접 검색 가능 |
### 최종 구조
| 테이블 | code | lot_no | legacy_code |
|--------|------|--------|-------------|
| **bending_items** | `'BD'` (고정) | `'CP6321-30'` (LOT 번호) | `'BD-CP-30'` (이전 코드) |
| **bending_models** | `'GR'`/`'SB'`/`'BB'` (타입별) | **없음** (DROP) | `'GR-KSS01-벽면형-SUS'` (전체 코드) |
### 검색 로직 변경 (BendingCodeService.resolveItem)
```
이전: WHERE code LIKE 'CP%' AND length_code = '30'
현재: WHERE lot_no LIKE 'CP%' AND length_code = '30'
폴백: WHERE legacy_code = 'BD-CP-30'
```
### 마이그레이션
`2026_03_21_100000_separate_code_and_lot_no.php`:
1. bending_items: lot_no 컬럼 추가 → 기존 code 값 이관 → code를 'BD'로 통일
2. bending_models: 기존 code 값을 legacy_code로 이관 → code를 접두사(GR/SB/BB)만 유지 → lot_no DROP
---
### 전개도 데이터: `bending_items.bending_data` (JSON 컬럼)
> **변경 이력**: 초기 설계는 별도 `bending_data` 테이블이었으나, JSON 통합으로 최종 결정.
@@ -115,7 +152,7 @@ CREATE TABLE bending_items (
]
```
### 테이블 관계도 (최종)
### 테이블 관계도 (최종 — 2026-03-21)
```
┌──────────────────────────┐ ┌──────────────────────┐
@@ -124,11 +161,12 @@ CREATE TABLE bending_items (
│ 기초관리 마스터 │ │ 가이드레일/케이스/ │
│ 품명/재질/규격 (정규컬럼) │◄···│ 하단마감재 모델 │
│ bending_data: JSON (내장) │ │ components JSON │
│ code: RM260319 등 │ │ (sam_item_id 참조)
│ code: 'BD' (고정) │ │ code: 'GR'/'SB'/'BB'
│ lot_no: CP6321-30 (LOT) │ │ legacy_code: 전체코드 │
└──────────┬───────────────┘ └──────────────────────┘
│ 코드 매핑 (FK 없음)
code 앞 2자리로 items.code 패턴 매칭
lot_no 앞 2자리로 items.code 패턴 매칭
┌──────────────────────┐
│ items (기존 무변경) │
@@ -148,15 +186,16 @@ CREATE TABLE bending_items (
│ 기초관리 마스터 전용 │ 코드 │ BD-{prod}{spec}-{length} │
│ 품명/재질/규격 정규 컬럼 │ ·····→ │ 재고/BOM/작업지시서 연결 │
│ 전개도 데이터 │ 매핑 │ item_category='BENDING' │
│ code: CP260319 등 │ │ 재고관리용 (무변경) │
bending_item_mappings 흡수│ │ │
│ code: 'BD' (고정) │ │ 재고관리용 (무변경) │
lot_no: CP6321-30 (LOT) │ │ │
└──────────────────────────┘ └──────────────────────────┘
연결 방식: FK 없음
- 재고 조회 필요 시: code 앞 2자리(제품+종류)로 items.code 패턴 매칭
- 재고 조회 필요 시: lot_no 앞 2자리(제품+종류)로 items.code 패턴 매칭
- resolveItem(): lot_no LIKE '{prod}{spec}%' AND length_code = '{len}'
- items 테이블의 재고/BOM 기능은 완전히 독립 유지
- BendingInfoBuilder는 items 테이블 계속 참조 (무변경)
- bending_item_mappings 테이블 → 제거 (code에 흡수)
- bending_item_mappings 테이블 → 제거 (lot_no에 흡수)
```
### 영향도 분석 — 변경 / 무변경 구분
@@ -209,6 +248,7 @@ CREATE TABLE bending_items (
2026_03_19_100005_add_length_columns_to_bending_items.php
2026_03_19_100006_create_bending_models_table.php
2026_03_19_100007_move_bending_data_back_to_json.php
2026_03_21_100000_separate_code_and_lot_no.php ← 🆕 code/lot_no 분리 + BD 통일 + models lot_no 제거
✅ 제거:
app/Models/Production/BendingItemMapping.php ← 삭제됨
@@ -305,31 +345,24 @@ docker cp /home/kkk/sam/5130/bottombar docker-api-1:/tmp/legacy_5130/bottombar
MNG2 editPartOriginal() → sam_item_id로 기초관리 편집 페이지 연결
```
### LOT 코드 체계
### LOT 코드 체계 (2026-03-21 최종)
```
형식: {제품Code}{종류Code}{YYMMDD}
유니크: (tenant_id, code, length_code, deleted_at)
code/lot_no 분리:
code = 'BD' (고정, 절곡품 타입 식별)
lot_no = {제품Code}{종류Code}{DateCode}-{LengthCode}
형식: {ProdCode 1자}{SpecCode 1자}{YYMDD 4자}-{LengthCode 2자}
유니크: (tenant_id, lot_no, deleted_at)
예시:
RS260319 + length_code=30 → 가이드레일(벽면) SUS마감 3000mm
CF260319 → 케이스 전면부
BS260319 + length_code=40 → 하단마감재(스크린) SUS 4000mm
lot_no = CP6321-30 → 케이스(C) 점검구(P) 2026-03-21 길이3000mm
lot_no = RS6319-30 → 가이드레일벽면(R) SUS마감(S) 2026-03-19 길이3000mm
lot_no = BS6319-40 → 하단마감재스크린(B) SUS(S) 2026-03-19 길이4000mm
변환 완료: BD-PREFIX-LEN 112건 → LOT 코드
미변환: BD-한글 58건, BD-LEGACY 40건 (legacy_code 유지, 향후 변환)
```
### LOT 코드 체계 (레거시 형태 유지)
```
형식: {제품Code}{종류Code}{YYMMDD}
예시:
RM260319 → 가이드레일(벽면형) 본체, 2026-03-19
RS260319 → 가이드레일(벽면형) SUS마감재, 2026-03-19
CF260319 → 케이스 전면부, 2026-03-19
BS260319 → 하단마감재(스크린) SUS, 2026-03-19
검색 로직 (BendingCodeService.resolveItem):
1차: WHERE lot_no LIKE '{prod}{spec}%' AND length_code = '{len}'
2차: WHERE legacy_code = 'BD-{prod}{spec}-{len}' (폴백)
```
**LOT 코드 테이블 (정본)**:
@@ -366,7 +399,7 @@ docker cp /home/kkk/sam/5130/bottombar docker-api-1:/tmp/legacy_5130/bottombar
| **bending_items** (전용 테이블) | **266건** | ✅ 전건 bending_data JSON 포함 |
| **bending_models** (전용 테이블) | **62건** | ✅ guiderail 21 + shutterbox 30 + bottombar 11 |
| items BENDING (기존, 무변경) | 215건 | 재고/BOM용 독립 유지 |
| bending_item_mappings | **DROP 완료** | bending_items.code에 흡수 |
| bending_item_mappings | **DROP 완료** | bending_items.lot_no에 흡수 |
| 하장바 (bending_items) | **10건** | ✅ chandj 유효건과 일치 |
| 이미지 (R2) | **미업로드** | 레거시 파일 docker 복사 후 커맨드 실행 필요 |
@@ -443,6 +476,12 @@ Step 1 (DB분석) → Step 2 (API) → Step 3 (MNG 화면) → Step 4 (React
- 파일: FileViewController (API R2 프록시) + 이미지 업로드/표시
- DB 메뉴: 기초관리 + 절곡품 + 케이스 + 하단마감재 (4개)
**Step 1 추가 완료 (2026-03-21 code/lot_no 분리):**
- `2026_03_21_100000_separate_code_and_lot_no` 마이그레이션
- bending_items: code → 'BD' 고정, lot_no 신규 컬럼 (기존 code 값 이관)
- bending_models: code → 접두사만(GR/SB/BB), legacy_code에 전체코드 이관, lot_no DROP
- BendingCodeService.resolveItem(): lot_no 기반 검색으로 변경
**미완료:**
- ⬜ 이미지 R2 업로드 — 레거시 파일 docker 복사 후 커맨드 재실행 필요
- ⬜ Step 4 React 연동 — 미착수
@@ -517,7 +556,8 @@ Step 1 (DB분석) → Step 2 (API) → Step 3 (MNG 화면) → Step 4 (React
│ bending_items (266건) │
│ ┌──────────────────────────────────────────────────┐ │
│ │ id: 100 │ │
│ │ code: RM260319LOT 코드 (제품+종류+날짜)│ │
│ │ code: 'BD' 고정값 (절곡품 타입) │ │
│ │ lot_no: CP6321-30 ← LOT 번호 (제품+종류+날짜-길이)│ │
│ │ legacy_code: BD-LEGACY-042 ← 이전 코드 보존 │ │
│ │ item_name: "마감재" ← 정규 컬럼 (인덱스) │ │
│ │ item_sep: "스크린" ← 정규 컬럼 (인덱스) │ │
@@ -770,7 +810,7 @@ fetch_guiderail_detail.php → React GuiderailPreview
drawingTool.js (Canvas) → 2차 구현 (1차는 이미지 업로드만)
inputList[] (별도 배열 5개) → bending_data JSON [{no, input, rate, sum, color, aAngle}]
items (BENDING) + options → items 유지 (재고/BOM용, BendingInfoBuilder 무변경)
bending_item_mappings → DROP 완료 (bending_items.code에 흡수)
bending_item_mappings → DROP 완료 (bending_items.lot_no에 흡수)
```
---