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

1
.gitignore vendored
View File

@@ -17,3 +17,4 @@ _to_notion/
# 백업 파일
contracts/docx/backup/
kkk/

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에 흡수)
```
---

View File

@@ -0,0 +1,553 @@
# 절곡품 관리 시스템 — 전체 다이어그램 (2026-03-21)
---
## 1. 시스템 아키텍처
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ SAM 절곡품 관리 시스템 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ MNG2 │ │ API │ │ React │ │
│ │ (본사관리) │───→│ (핵심) │←───│ (사용자) │ │
│ │ Blade+HTMX │ │ Laravel 12 │ │ Next.js │ │
│ │ CRUD 프록시 │ │ REST API │ │ 생산/견적 │ │
│ └──────────────┘ └──────┬───────┘ └──────────────┘ │
│ │ │
│ ┌──────────────┼──────────────┐ │
│ ▼ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ bending_items│ │bending_models│ │ items │ │
│ │ (기초관리) │ │ (절곡품모델) │ │ (재고/BOM) │ │
│ │ 268건 │ │ 62건 │ │ 215건(BD) │ │
│ └──────┬───────┘ └──────────────┘ └──────────────┘ │
│ │ │
│ │ 이미지 │
│ ▼ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ files │───→│ Cloudflare │ │
│ │ (메타데이터) │ │ R2 │ │
│ └──────────────┘ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
## 2. 코드 체계 (2026-03-21 최종)
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ 코드 체계 3계층 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ [1] bending_items — 기초관리 마스터 │ │
│ │ │ │
│ │ code = 'BD' ← 고정값 (타입 식별) │ │
│ │ lot_no = 'BD-CP.001' ← 자동채번 (분류+순번) │ │
│ │ legacy_code = 'CHANDJ-18' ← 레거시 참조 │ │
│ │ │ │
│ │ 자동채번 규칙: │ │
│ │ BD-{접두사2자}.{순번3자} │ │
│ │ 예: BD-CP.001, BD-RS.003, BD-LE.001 │ │
│ │ .001 = 대표(표준) 형상 │ │
│ │ .002~ = 변형 형상 (최대 999종) │ │
│ │ │ │
│ │ Unique: (tenant_id, lot_no, deleted_at) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ [2] bending_models — 절곡품 모델 (가이드레일/케이스/..)│ │
│ │ │ │
│ │ code = 'GR' / 'SB' / 'BB' ← 타입별 고정 접두사 │ │
│ │ legacy_code = 'GR-3' ← 레거시 참조 │ │
│ │ lot_no = (없음, DROP됨) │ │
│ │ │ │
│ │ 타입 구분: │ │
│ │ GR = GUIDERAIL_MODEL (가이드레일 21건) │ │
│ │ SB = SHUTTERBOX_MODEL (케이스 30건) │ │
│ │ BB = BOTTOMBAR_MODEL (하단마감재 11건) │ │
│ │ │ │
│ │ Unique: (tenant_id, code, deleted_at) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ [3] items — 재고/BOM용 (기존 무변경) │ │
│ │ │ │
│ │ code = 'BD-{prod}{spec}-{length}' │ │
│ │ 예: BD-RS-30, BD-CF-40, BD-TE-24 │ │
│ │ item_category = 'BENDING' │ │
│ │ │ │
│ │ 용도: 작업지시서, LOT 채번, 재고관리, BOM │ │
│ │ BendingInfoBuilder가 직접 참조 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
## 3. 테이블 관계도
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ DB 테이블 관계도 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────┐ ┌──────────────────────────┐ │
│ │ bending_items (268건) │ │ bending_models (62건) │ │
│ │ ─────────────────────────── │ │ ──────────────────────── │ │
│ │ PK: id │ │ PK: id │ │
│ │ code: 'BD' (고정) │ │ code: 'GR'/'SB'/'BB' │ │
│ │ lot_no: 'BD-CP.001' │ │ legacy_code: 'GR-3' │ │
│ │ legacy_code: 'CHANDJ-18' │ │ model_type: ENUM │ │
│ │ item_name: 품명 (인덱스) │◄····│ model_name: 'KSS01' │ │
│ │ item_sep: 대분류 (인덱스) │ 참조│ check_type: 벽면형/측면형│ │
│ │ item_bending: 중분류 │ │ components: JSON[] │ │
│ │ material: 재질 (인덱스) │ │ └─ legacy_bending_num │ │
│ │ bending_data: JSON (전개도) │ │ └─ sam_item_id ──────→ │ │
│ │ length_code: '30' │ │ material_summary: JSON │ │
│ │ length_mm: 3000 │ │ │ │
│ │ options: JSON (memo 등) │ │ options: JSON │ │
│ └──────────┬──────────────────┘ └──────────┬───────────────┘ │
│ │ │ │
│ │ lot_no 앞 2자리 매칭 │ │
│ │ (FK 없음, 코드 패턴 매핑) │ │
│ ▼ │ │
│ ┌─────────────────────────────┐ │ │
│ │ items (215건, BENDING) │ │ │
│ │ ─────────────────────────── │ │ │
│ │ code: 'BD-RS-30' │ │ │
│ │ item_category: 'BENDING' │ │ │
│ │ 재고/BOM/작업지시서 연결 │ │ │
│ │ BendingInfoBuilder 참조 │ │ │
│ └─────────────────────────────┘ │ │
│ │ │
│ ┌─────────────────────────────┐ │ │
│ │ files (이미지) │◄─────────────────┘ │
│ │ ─────────────────────────── │ │
│ │ document_type: │ │
│ │ 'bending_item' / 'bending_model' │
│ │ field_key: │ │
│ │ 'bending_diagram' / 'assembly_image' │
│ │ file_path → R2 저장 │ │
│ └─────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
## 4. API 엔드포인트 흐름
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ API 엔드포인트 맵 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ MNG2 / React │
│ │ │
│ ├── 기초관리 (bending_items) ──────────────────────────────────────── │
│ │ GET /api/v1/bending-items ← 목록 (필터/검색/페이지)│
│ │ GET /api/v1/bending-items/filters ← 필터 옵션 (distinct) │
│ │ GET /api/v1/bending-items/{id} ← 상세 │
│ │ POST /api/v1/bending-items ← 등록 (자동채번) │
│ │ POST /api/v1/bending-items/{id}/duplicate ← 복사 (R2 이미지 포함)│
│ │ PUT /api/v1/bending-items/{id} ← 수정 │
│ │ DELETE /api/v1/bending-items/{id} ← 삭제 (soft) │
│ │ │
│ ├── 절곡품 모델 (bending_models) ──────────────────────────────────── │
│ │ GET /api/v1/guiderail-models ← 목록 (?item_category=)│
│ │ GET /api/v1/guiderail-models/filters ← 필터 옵션 │
│ │ GET /api/v1/guiderail-models/{id} ← 상세 (부품 조합) │
│ │ POST /api/v1/guiderail-models ← 등록 │
│ │ PUT /api/v1/guiderail-models/{id} ← 수정 │
│ │ DELETE /api/v1/guiderail-models/{id} ← 삭제 (soft) │
│ │ │
│ ├── LOT/코드 관리 (React 전용) ───────────────────────────────────── │
│ │ POST /api/v1/bending/code-map ← 코드맵 (드롭다운) │
│ │ GET /api/v1/bending/resolve-item ← 품목 매핑 조회 │
│ │ POST /api/v1/bending/generate-lot ← LOT 번호 생성 │
│ │ GET /api/v1/bending/material-lots ← 원자재 LOT 조회 │
│ │ │
│ └── 이미지 (공용) ────────────────────────────────────────────────── │
│ POST /api/v1/items/{id}/files ← 업로드 │
│ GET /api/v1/items/{id}/files ← 목록 │
│ GET /api/v1/files/{id}/view ← 표시 (R2 presigned) │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
## 5. 데이터 흐름 — CRUD
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ 기초관리 CRUD 흐름 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ [CREATE] 등록 │
│ ───────────────────────────────────────────────────────── │
│ MNG2 폼 → POST /api/v1/bending-items │
│ → BendingItemService.create() │
│ ├─ code: 'BD-{접두사}.{순번}' 자동채번 │
│ │ (BD-XX → generateCode('XX') → BD-XX.001) │
│ ├─ lot_no: 전달값 또는 null │
│ ├─ bending_data: JSON 저장 │
│ └─ 이미지: handleImageUpload → R2 │
│ │
│ [READ] 조회 │
│ ───────────────────────────────────────────────────────── │
│ MNG2 목록 → GET /api/v1/bending-items?search=&item_sep= │
│ → BendingItemService.list() │
│ └─ 검색: item_name, code, lot_no, item_spec, legacy_code │
│ MNG2 상세 → GET /api/v1/bending-items/{id} │
│ → BendingItemResource (정규컬럼 + bending_data + 이미지URL) │
│ │
│ [UPDATE] 수정 │
│ ───────────────────────────────────────────────────────── │
│ MNG2 폼 → PUT /api/v1/bending-items/{id} │
│ → BendingItemService.update() │
│ ├─ code 변경 시 중복 검사 (422) │
│ ├─ lot_no 업데이트 가능 │
│ ├─ bending_data JSON 교체 │
│ └─ 이미지: 기존 교체 또는 신규 업로드 │
│ │
│ [DELETE] 삭제 │
│ ───────────────────────────────────────────────────────── │
│ MNG2 → DELETE /api/v1/bending-items/{id} │
│ → SoftDelete (deleted_at, deleted_by 기록) │
│ │
│ [DUPLICATE] 복사 │
│ ───────────────────────────────────────────────────────── │
│ MNG2 → POST /api/v1/bending-items/{id}/duplicate │
│ → BendingItemService.duplicate() │
│ ├─ 같은 접두사 다음 순번 채번 (BD-CP.001 → BD-CP.002) │
│ └─ R2 이미지 파일 복사 (독립 복사본) │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
## 6. 검색/매핑 흐름 — resolveItem
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ BendingCodeService.resolveItem() 흐름 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ React (LOT 채번 화면) │
│ │ │
│ │ GET /api/v1/bending/resolve-item?prod=C&spec=P&length=30 │
│ ▼ │
│ BendingCodeService.resolveItem('C', 'P', '30') │
│ │ │
│ ├─ [1차] bending_items 검색 │
│ │ WHERE lot_no LIKE 'CP%' │
│ │ AND length_code = '30' │
│ │ AND is_active = true │
│ │ │
│ ├─ [2차] legacy_code 폴백 (1차 실패 시) │
│ │ WHERE legacy_code = 'BD-CP-30' │
│ │ AND is_active = true │
│ │ │
│ └─ 응답: │
│ { │
│ item_id: 1900, │
│ item_code: 'BD-CP.001', ← lot_no ?? code │
│ item_name: '점검구', │
│ specification: '650*550', │
│ unit: 'EA' │
│ } │
│ │
│ React (작업일지) │
│ │ │
│ │ items 테이블에서 BD-* 필터 │
│ │ lot.item_code.startsWith('BD-') │
│ │ lotNoMap['BD-CP-30'] = 'INIT-260221-BDCP30' │
│ │ │
│ └─ items 테이블 (무변경) — bending_items와 독립 │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
## 7. 3가지 모델 타입 비교
```
┌─────────────────────┬─────────────────────┬─────────────────────┐
│ 가이드레일 │ 케이스 │ 하단마감재 │
│ (GUIDERAIL_MODEL) │ (SHUTTERBOX_MODEL) │ (BOTTOMBAR_MODEL) │
├─────────────────────┼─────────────────────┼─────────────────────┤
│ code: 'GR' │ code: 'SB' │ code: 'BB' │
│ 건수: 21건 │ 건수: 30건 │ 건수: 11건 │
├─────────────────────┼─────────────────────┼─────────────────────┤
│ 모델: KSS01 │ 모델: ❌ 없음 │ 모델: KSS01 │
│ 마감: SUS/EGI │ 마감: ❌ 없음 │ 마감: SUS/EGI │
│ 형상: 벽면/측면 │ 형상: ❌ 없음 │ 형상: ❌ 없음 │
│ 대분류: 스크린/철재 │ 대분류: ❌ │ 대분류: 스크린/철재 │
│ 인정: 인정/비인정 │ 인정: ❌ │ 인정: 인정/비인정 │
├─────────────────────┼─────────────────────┼─────────────────────┤
│ 필수 필드: │ 필수 필드: │ 필수 필드: │
│ item_sep │ exit_direction │ item_sep │
│ model_name │ box_width │ model_name │
│ check_type │ box_height │ │
│ rail_width │ front_bottom_width │ │
├─────────────────────┼─────────────────────┼─────────────────────┤
│ 파트: 3~5개 │ 파트: 5개 │ 파트: 1개 │
│ ┌─────────────────┐ │ ┌─────────────────┐ │ ┌─────────────────┐ │
│ │ 본체 │ │ │ 상부덮개 │ │ │ 하단마감 │ │
│ │ 마감재 │ │ │ 전면부 │ │ │ (단일 파트) │ │
│ │ C형/D형 │ │ │ 점검구 │ │ └─────────────────┘ │
│ │ (+보강) │ │ │ 린텔부 │ │ │
│ └─────────────────┘ │ │ 후면코너부 │ │ │
│ │ └─────────────────┘ │ │
├─────────────────────┼─────────────────────┼─────────────────────┤
│ 재질별 폭합: │ 재질별 폭합: │ 재질별 폭합: │
│ SUS: 406 │ EGI: 2652 │ SUS: 193 │
│ EGI: 398 │ │ │
└─────────────────────┴─────────────────────┴─────────────────────┘
```
---
## 8. 접두사 코드맵 (기초관리)
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ 기초관리 접두사 (PREFIX_LABELS) │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 가이드레일 계열 케이스 계열 │
│ ────────────────── ────────────────── │
│ RS: SUS마감재 lot_no 예: CP: 밑면판/점검구 lot_no 예: │
│ RM: 본체/보강 BD-RS.001 CF: 전면판 BD-CP.001 │
│ RC: C형 CB: 후면코너/후면부 BD-CF.001 │
│ RD: D형 CL: 린텔 BD-CB.001 │
│ RE: 측면마감 CX: 상부덮개 BD-CL.001 │
│ RT: 절단판 BD-CX.001 │
│ RH: 뒷보강 │
│ RN: 비인정 │
│ │
│ 하단마감재 계열 기타 │
│ ────────────────── ────────────────── │
│ BS: 스크린 SUS lot_no 예: LE: L-BAR lot_no 예: │
│ BE: 스크린 EGI BD-BS.001 XE: 마구리 BD-LE.001 │
│ BH: 보강평철 BD-BE.001 ZP: 특수 밑면/점검구 │
│ TS: 철재 SUS ZF: 특수 전면판 │
│ TE: 철재 EGI ZB: 특수 후면 │
│ │
│ 자동채번: BD-{접두사}.{3자리순번} │
│ 예: BD-RS.001 → BD-RS.002 → BD-RS.003 ... │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
## 9. LOT 채번 흐름 (React → items 테이블)
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ LOT 채번 흐름 (React 생산관리) │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ React LOT 채번 화면 │
│ ┌─────────────────────────────────────────┐ │
│ │ [제품] 가이드레일(벽면형) ▼ (prodCode: R)│ │
│ │ [종류] SUS마감재 ▼ (specCode: S)│ │
│ │ [길이] 3000mm ▼ (lengthCode: 30) │
│ └───────────────┬─────────────────────────┘ │
│ │ │
│ ▼ │
│ API: GET /bending/resolve-item?prod=R&spec=S&length=30 │
│ │ │
│ ▼ │
│ BendingCodeService.resolveItem('R', 'S', '30') │
│ ┌───────────────────────────────────────────────┐ │
│ │ 1차: bending_items WHERE lot_no LIKE 'RS%' │ │
│ │ AND length_code = '30' │ │
│ │ 2차: legacy_code = 'BD-RS-30' (폴백) │ │
│ │ │ │
│ │ → item_code: 'BD-RS.001' │ │
│ └───────────────┬───────────────────────────────┘ │
│ │ │
│ ▼ │
│ API: POST /bending/generate-lot │
│ ┌───────────────────────────────────────────────┐ │
│ │ BendingCodeService.generateLotNumber() │ │
│ │ prod='R', spec='S', length='30', date='260321' │ │
│ │ → lot_no: 'RS6321-30' │ │
│ └───────────────┬───────────────────────────────┘ │
│ │ │
│ ▼ │
│ items 테이블에 LOT 등록 (재고 관리용) │
│ ┌───────────────────────────────────────────────┐ │
│ │ code: 'BD-RS-30' │ │
│ │ lot_no: 'RS6321-30' │ │
│ │ item_category: 'BENDING' │ │
│ └───────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
## 10. MNG2 화면 흐름
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ MNG2 화면 구조 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 사이드바 (DB menus) │
│ ├─ 생산 관리 │
│ │ ├─ 품목기준 필드 관리 ✅ │
│ │ ├─ 견적수식 관리 ✅ │
│ │ └─ 절곡품 관리 │
│ │ ├─ 기초관리 (/bending/base) │
│ │ ├─ 절곡품 (/bending/products) ← 가이드레일 │
│ │ ├─ 케이스 (/bending/cases) ← 케이스 │
│ │ └─ 하단마감재 (/bending/bottombars) ← 하단마감재 │
│ │ │
│ │ │
│ ▼ │
│ ┌────────────────────┐ ┌────────────────────┐ │
│ │ 기초관리 목록 │ │ 절곡품 목록 │ │
│ │ /bending/base │ │ /bending/products │ │
│ │ │ │ /bending/cases │ │
│ │ 필터: 대분류/인정/ │ │ /bending/bottombars │ │
│ │ 분류/품명/검색 │ │ │ │
│ │ 268건 테이블 │ │ 필터+테이블 │ │
│ │ │ │ │ │
│ │ [+등록] [복사] │ │ [+등록] │ │
│ │ 행 클릭 → 상세 │ │ 행 클릭 → 상세 │ │
│ └────────┬───────────┘ └────────┬───────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌────────────────────┐ ┌────────────────────┐ │
│ │ 기초관리 폼 │ │ 절곡품 폼 │ │
│ │ ┌────────┬───────┐ │ │ ┌────────┬───────┐ │ │
│ │ │기본정보│ 이미지 │ │ │ │기본정보│ 이미지 │ │ │
│ │ │ 12필드 │ 업로드 │ │ │ │타입별 │ 업로드 │ │ │
│ │ │+케이스 │ 그리기 │ │ │ │+파트탭 │ 그리기 │ │ │
│ │ │ 전용 │ Ctrl+V │ │ │ │절곡테이블│ │ │ │
│ │ ├────────┤ │ │ │ ├────────┤ │ │ │
│ │ │절곡테이블│ │ │ │ │재질별 │ │ │ │
│ │ │ (단일) │ │ │ │ │ 폭합 │ │ │ │
│ │ ├────────┤ │ │ │ └────────┴───────┘ │ │
│ │ │폭합계 │ │ │ │ [저장] [인쇄] │ │
│ │ └────────┴───────┘ │ └────────────────────┘ │
│ │ [등록/저장] [삭제] │ │
│ └────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
## 11. 전개도 JSON 구조
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ 전개도 데이터 (bending_data JSON) │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 레거시 (별도 배열 5개) SAM (객체 배열 1개) │
│ ───────────────────── ────────────────────── │
│ inputList: [10,11,110...] bending_data: [ │
│ bendingrateList: ["","","-1"...] { no:1, input:10, rate:"", │
│ sumList: [10,21,130...] sum:10, color:true, aAngle:false },│
│ colorList: [true,false,false...] { no:2, input:11, rate:"", │
│ AList: [false,false,false...] sum:21, color:false, aAngle:false },│
│ { no:3, input:110, rate:"-1", │
│ → 5개 배열 동기화 필요 sum:130, color:false, aAngle:false },│
│ → 열 추가/삭제 시 5개 다 조작 ... │
│ ] │
│ → 1개 배열만 관리 │
│ → 열 추가 = 객체 1개 push │
│ │
│ 화면 렌더링: │
│ ┌────────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │
│ │ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ │
│ ├────────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ │
│ │ 입력 │ 10 │ 11 │ 110 │ 30 │ 15 │ 15 │ 15 │ │
│ │ │[색]│ │ │ │ │[색]│ │ │
│ ├────────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ │
│ │ 연신율 │ │ │ -1 │ -1 │ -1 │ │ │ │
│ ├────────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ │
│ │ 합계 │ 10 │ 21 │ 130 │ 159 │ 173 │ 188 │ 203 │ ← 폭합계=203 │
│ ├────────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ │
│ │ 음영 │ ■■ │ │ │ │ │ ■■ │ │ │
│ │ A각 │ │ │ │ A각 │ │ │ │ │
│ └────────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ │
│ │
│ 연신율 보정: rate="" → 보정없음 / rate="-1" → -1mm / rate="1" → +1mm │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
## 12. 마이그레이션 이력
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ 마이그레이션 타임라인 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 2026-03-19 │
│ ├─ 100000: bending_items 테이블 생성 │
│ ├─ 100001~100003: bending_data 별도 테이블 → JSON 통합 과정 │
│ ├─ 100004: bending_item_mappings DROP │
│ ├─ 100005: length_code, length_mm 컬럼 추가 │
│ ├─ 100006: bending_models 테이블 생성 │
│ └─ 100007: bending_data 테이블 DROP (JSON 통합 완료) │
│ │
│ 2026-03-21 │
│ └─ 100000: code/lot_no 분리 마이그레이션 ← 최신 │
│ ├─ bending_items: lot_no 컬럼 추가, 기존 code → lot_no 이관 │
│ │ code → 'BD' 고정 │
│ ├─ bending_models: 기존 code → legacy_code 이관 │
│ │ code → 접두사만 (GR/SB/BB) │
│ │ lot_no 컬럼 DROP │
│ └─ 개발서버 적용 완료 ✅ │
│ │
│ 이관 커맨드: │
│ ├─ bending:clean-reimport ← 기초관리 266건 + bending_data + 이미지 │
│ └─ bending:model-import ← 모델 62건 + 조립도 + 부품이미지 │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
## 13. 프로젝트별 영향도 요약
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ 코드 체계 변경 영향도 매트릭스 │
├──────────┬──────────┬──────────────────────────────┬────────┬──────────────┤
│ 프로젝트 │ 상태 │ 사유 │ 수정 │ 비고 │
├──────────┼──────────┼──────────────────────────────┼────────┼──────────────┤
│ API │ ✅ 완료 │ 마이그레이션 + 코드 merge │ 13파일 │ 개발서버 반영 │
├──────────┼──────────┼──────────────────────────────┼────────┼──────────────┤
│ MNG2 │ ✅ 이상없음│ API 프록시, id 기반 CRUD │ 0파일 │ code 표시만 │
│ │ │ code는 표시용 │ │ 'BD' 고정 │
├──────────┼──────────┼──────────────────────────────┼────────┼──────────────┤
│ React │ ✅ 이상없음│ BD-XX-YY는 items 테이블 참조 │ 0파일 │ items 무변경 │
│ │ │ resolveItem 응답 필드 동일 │ │ │
├──────────┼──────────┼──────────────────────────────┼────────┼──────────────┤
│ items │ ✅ 무변경 │ 재고/BOM/작업지시서 독립 유지 │ 0파일 │ BD-XX-YY 유지│
│ 테이블 │ │ BendingInfoBuilder 무변경 │ │ │
├──────────┼──────────┼──────────────────────────────┼────────┼──────────────┤
│ DB │ ✅ 완료 │ 마이그레이션 실행 완료 │ 1파일 │ 로컬+개발서버│
│ │ │ 데이터 restore 완료 │ │ 268+62건 │
└──────────┴──────────┴──────────────────────────────┴────────┴──────────────┘
```

View File

@@ -3,7 +3,7 @@
> **프로젝트**: API (`sam/api`)
> **선행 조건**: 없음
> **참조**: `standards/options-column-policy.md`, `rules/item-policy.md`
> **최종수정**: 2026-03-19 (items.options → bending_items 전용 테이블 분리 완료)
> **최종수정**: 2026-03-21 (code/lot_no 분리 완료, bending_models lot_no 제거)
---

View File

@@ -2,7 +2,7 @@
> **프로젝트**: API (`sam/api`)
> **선행 조건**: Step 1 완료
> **상태**: ✅ 구현 완료 (2026-03-16~17)
> **상태**: ✅ 구현 완료 (2026-03-16~17, 2026-03-21 code/lot_no 분리 반영)
> **참조**: `standards/api-rules.md`, `standards/options-column-policy.md`, `rules/item-policy.md`
---
@@ -32,9 +32,11 @@
item_type: FG(완제품), PT(부품), SM(부자재), RM(원자재), CS(소모품)
item_category: 'BENDING' (절곡품 구분)
절곡품 API 방향:
절곡품 API 방향 (2026-03-21 최종):
→ 기존 ItemsController 무변경
→ 별도 BendingItemController 생성 (items 테이블을 item_category='BENDING'으로 필터)
→ 별도 BendingItemController → bending_items 전용 테이블 사용
→ bending_items.code = 'BD' (고정), lot_no = LOT 번호
→ BendingCodeService.resolveItem(): lot_no 기반 검색
→ 절곡품 전용 필터/검색/전개도 데이터 관리
```