From 96de724bf5c8491776fcbc82a2eab7df6a843c83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EC=98=81=EB=B3=B4?= Date: Sat, 21 Mar 2026 19:36:30 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20[bending]=20=EC=BD=94=EB=93=9C=EC=B2=B4?= =?UTF-8?q?=EA=B3=84=20=EB=B3=80=EA=B2=BD=20=EB=AC=B8=EC=84=9C=20=EC=97=85?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=8A=B8=20+=20kkk=20=ED=8F=B4=EB=8D=94=20gi?= =?UTF-8?q?t=20=EC=B6=94=EC=A0=81=20=EC=A0=9C=EC=99=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + dev/dev_plans/bending-management/README.md | 108 ++-- .../bending-management/diagram-전체구조.md | 553 ++++++++++++++++++ .../bending-management/step1-데이터분석.md | 2 +- dev/dev_plans/bending-management/step2-API.md | 8 +- 5 files changed, 634 insertions(+), 38 deletions(-) create mode 100644 dev/dev_plans/bending-management/diagram-전체구조.md diff --git a/.gitignore b/.gitignore index f9e7597..d5d6d55 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ _to_notion/ # 백업 파일 contracts/docx/backup/ +kkk/ diff --git a/dev/dev_plans/bending-management/README.md b/dev/dev_plans/bending-management/README.md index 3ff722c..980145e 100644 --- a/dev/dev_plans/bending-management/README.md +++ b/dev/dev_plans/bending-management/README.md @@ -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: RM260319 ← LOT 코드 (제품+종류+날짜)│ │ +│ │ 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에 흡수) ``` --- diff --git a/dev/dev_plans/bending-management/diagram-전체구조.md b/dev/dev_plans/bending-management/diagram-전체구조.md new file mode 100644 index 0000000..72df48f --- /dev/null +++ b/dev/dev_plans/bending-management/diagram-전체구조.md @@ -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건 │ +└──────────┴──────────┴──────────────────────────────┴────────┴──────────────┘ +``` diff --git a/dev/dev_plans/bending-management/step1-데이터분석.md b/dev/dev_plans/bending-management/step1-데이터분석.md index 225d6ff..a0db05e 100644 --- a/dev/dev_plans/bending-management/step1-데이터분석.md +++ b/dev/dev_plans/bending-management/step1-데이터분석.md @@ -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 제거) --- diff --git a/dev/dev_plans/bending-management/step2-API.md b/dev/dev_plans/bending-management/step2-API.md index b4ea16d..2fdd19a 100644 --- a/dev/dev_plans/bending-management/step2-API.md +++ b/dev/dev_plans/bending-management/step2-API.md @@ -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 기반 검색 → 절곡품 전용 필터/검색/전개도 데이터 관리 ```