Files
sam-docs/dev/dev_plans/bending-management/README.md
강영보 fbd0510cc1 docs: [bending] 절곡품 관리 개발 완료 상태 업데이트
- step1: 데이터 임포트 완료 (170+60건), artisan 커맨드 7개 실행 결과
- step2: API 12개 엔드포인트 완료, item_category 필수 필터 추가
- step3: MNG 샘플 완료 (4개 메뉴, 이미지 473건)
- step4: React 구현 가이드 전면 작성 (API 응답 구조, 컴포넌트 설계, 실무 노트)
- 코드 체계 변경 불가 사유, 265vs170 차이 설명, 운영 전 정리 항목 추가
2026-03-17 11:33:47 +09:00

411 lines
26 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 절곡품 관리 기능 개발 계획서
> **시작일**: 2026-03-16
> **위치**: MNG 생산관리 > 절곡품 관리 (신규 메뉴)
> **목표**: 경동기업(5130) 수준의 절곡품 마스터 관리 + 전개도 데이터 + 이미지 관리
> **원칙**: 기존 BendingInfoBuilder/PrefixResolver 보존, items.options 확장 방식
---
## 배경
SAM은 절곡품의 "계산과 조합"(BendingInfoBuilder/PrefixResolver)은 잘 되어 있지만,
"관리와 시각화"가 빠져 있다. 경동기업(5130) `guiderail/list.php` 수준의 관리 화면을 MNG에 구현한다.
**갭 분석**: `docs/dev/dev_plans/bending-parts-analysis.md` 참조
---
## MNG 현재 구조
### 생산관리 메뉴 (sidebar-static.blade.php)
```
생산 관리 (production-group)
├─ 품목기준 필드 관리 ✅ (구현됨)
├─ 견적수식 관리 ✅ (구현됨)
├─ 제품 관리 (준비중)
├─ 자재 관리 (준비중)
├─ BOM 관리 (준비중)
├─ 카테고리 관리 (준비중)
└─ 절곡품 관리 ← 🆕 추가 대상
├─ 기초관리 (개별 부품 CRUD)
└─ 절곡품 (모델별 조합 관리)
```
### 기존 절곡 관련 코드 (MNG)
| 파일 | 역할 | 변경 여부 |
|------|------|----------|
| `views/documents/partials/bending-worklog.blade.php` | 절곡 작업일지 렌더링 | 무변경 |
| `views/documents/partials/bending-inspection-data.blade.php` | 절곡 중간검사 | 무변경 |
---
## 작업 순서 및 진행 상태
```
Step 1 (DB분석) → Step 2 (API) → Step 3 (MNG 화면) → Step 4 (React 연동)
✅ 완료 ✅ 완료 ✅ 완료 (샘플용) ⬜ 미착수
```
| 문서 | 내용 | 상태 |
|------|------|:---:|
| `step1-데이터분석.md` | 레거시 매핑 + options 확장 | ✅ 완료 |
| `step2-API.md` | API 엔드포인트 + 컨트롤러 설계 | ✅ 완료 |
| `step3-MNG화면.md` | Blade 뷰 + HTMX + 메뉴 등록 | ✅ 완료 |
| `step4-React연동.md` | React 운영 화면 구현 | ⬜ 미착수 |
### 완료된 작업 (2026-03-16~17)
**Step 1 완료:**
- `bending:fill-options` — BD-* prefix/분류 속성 자동 보강 (170건)
- `bending:import-legacy` — chandj 전개도(bendingData) 임포트 (139/170건)
- `guiderail:import-legacy` — chandj guiderail 20건 임포트
- `bending-product:import-legacy` — chandj shutterbox 30건 + bottombar 10건 임포트
**Step 2 완료:**
- `BendingItemController` — CRUD + filters + pagination (6 엔드포인트)
- `GuiderailModelController` — CRUD + filters (6 엔드포인트, 3개 카테고리 통합)
- `BendingItemResource` / `GuiderailModelResource` — API 응답 포맷
- `FormRequest` — Index/Store/Update 유효성 검증
- `ApiKeyMiddleware` — bending/guiderail/files 화이트리스트
**Step 3 완료 (MNG 샘플용):**
- 기초관리: 목록(13컬럼) + 폼(기본정보12필드 + 케이스전용5필드 + 절곡테이블 + 이미지업로드)
- 절곡품: 가이드레일/케이스/하단마감재 별도 메뉴 + 타입별 헤더 분기
- 절곡품 폼: 부품 추가(기초관리 검색 모달) + 삭제 + 수량/품명/재질 편집 + 절곡테이블 inline 편집
- 작업지시서: 레거시 포맷 인쇄 페이지 (`/print`)
- 파일: FileViewController (API R2 프록시) + 이미지 업로드/표시
- DB 메뉴: 기초관리 + 절곡품 + 케이스 + 하단마감재 (4개)
---
## 참조 문서
| 문서 | 경로 | 용도 |
|------|------|------|
| 갭 분석 | `dev_plans/bending-parts-analysis.md` | 요구사항 기준 |
| API 규칙 | `standards/api-rules.md` | API 네이밍/응답 |
| options 정책 | `standards/options-column-policy.md` | JSON 컬럼 설계 |
| 품목 정책 | `rules/item-policy.md` | BD 코드 체계 |
| Phase 2 | `dev_plans/integrated-phase-2.md` | 절곡 설계 |
| Phase 3 | `dev_plans/integrated-phase-3.md` | 절곡 검사 |
## 프로토타입
| 위치 | 설명 |
|------|------|
| `SAM/work/절곡/index.html` | 사이드바 + iframe 전체 구조 |
| `SAM/work/절곡/base.html` | 기초관리 목록 (참고용) |
| `SAM/work/절곡/base-form.html` | 등록/수정 폼 + 절곡 테이블 (참고용) |
| `SAM/work/절곡/products.html` | 절곡품 탭 목록 (참고용) |
| `SAM/work/절곡/product-form.html` | 절곡품 등록/수정 (참고용) |
# 절곡품 관리 — 전체 흐름도
---
## 1. 시스템 전체 구조
```
┌─────────────────────────────────────────────────────────────────────┐
│ SAM 절곡품 관리 시스템 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ MNG │ │ API │ │ React │ │
│ │ (샘플용) │────→│ (핵심) │←────│ (운영용) │ │
│ │ Blade │ │ Laravel │ │ Next.js │ │
│ └──────────┘ └─────┬────┘ └──────────┘ │
│ │ │
│ ┌────┴────┐ │
│ │ samdb │ │
│ │ items │ ← item_category = 'BENDING' │
│ │ files │ ← field_key = 'bending_diagram' │
│ └─────────┘ │
│ │ │
│ ┌────┴────┐ │
│ │ R2 │ ← Cloudflare (이미지 저장) │
│ └─────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
```
---
## 2. 데이터 구조 (2계층)
```
┌─────────────────────────────────────────────────────────────────┐
│ │
│ [1계층] 기초관리 — 개별 부품 (items 테이블) │
│ ════════════════════════════════════════ │
│ │
│ items (item_category = 'BENDING') │
│ ┌──────────────────────────────────────────────────┐ │
│ │ id: 100 │ │
│ │ code: BD-가이드레일-KSS01-SUS-120*70 │ │
│ │ name: 가이드레일 KSS01 SUS 120*70 │ │
│ │ options: { │ │
│ │ item_name: "마감재" ← 부품 품명 │ │
│ │ item_sep: "스크린" ← 대분류 │ │
│ │ item_bending: "가이드레일" ← 중분류 │ │
│ │ material: "SUS 1.2T" ← 재질 │ │
│ │ model_name: "KSS01" ← 소속 모델 │ │
│ │ model_UA: "인정" ← 인정여부 │ │
│ │ item_spec: "120*70" ← 규격 │ │
│ │ rail_width: 70 ← 레일폭 │ │
│ │ bendingData: [ ← 전개도 데이터 │ │
│ │ {no:1, input:10, rate:"", sum:10, ...}, │ │
│ │ {no:2, input:11, rate:"", sum:21, ...}, │ │
│ │ ... │ │
│ │ ] │ │
│ │ + 케이스전용: exit_direction, box_width, ... │ │
│ │ } │ │
│ └──────────────────────────────────────────────────┘ │
│ ↑ 265건 (레거시) + α
│ │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ │
│ [2계층] 절곡품 — 모델별 부품 조합 │
│ ════════════════════════════════ │
│ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ 가이드레일 모델: KSS01 벽면형 SUS마감 │ │
│ │ │ │
│ │ components (부품 조합): │ │
│ │ ┌─────┬───────────┬──────────┬────┬────────┐ │ │
│ │ │순서 │ 부품명 │ 재질 │수량│전개폭합│ │ │
│ │ ├─────┼───────────┼──────────┼────┼────────┤ │ │
│ │ │ 1 │ 마감재 │ SUS 1.2T│ 2 │ 203 │ ──→ item:100│
│ │ │ 2 │ 본체 │ EGI 1.55│ 1 │ 296 │ ──→ item:101│
│ │ │ 3 │ 벽면형-C │ EGI 1.55│ 1 │ 144 │ ──→ item:102│
│ │ │ 4 │ 벽면형-D │ EGI 1.55│ 1 │ 144 │ ──→ item:103│
│ │ └─────┴───────────┴──────────┴────┴────────┘ │ │
│ │ │ │
│ │ 재질별 폭합: SUS 1.2T → 406 | EGI 1.55T → 398 │ │
│ └────────────────────────────────────────────────────────┘ │
│ ↑ 가이드레일 20건 + 케이스 + 하단마감재 │
│ │
└─────────────────────────────────────────────────────────────────┘
```
---
## 3. 3가지 타입 비교
```
┌─────────────────┬─────────────────┬─────────────────┐
│ 가이드레일 │ 케이스 │ 하단마감재 │
├─────────────────┼─────────────────┼─────────────────┤
│ │ │ │
│ 모델: KSS01 │ 모델: ❌ 없음 │ 모델: KSS01 │
│ 마감: SUS/EGI │ 마감: ❌ 없음 │ 마감: SUS/EGI │
│ 형상: 벽면/측면 │ 형상: ❌ 없음 │ 형상: ❌ 없음 │
│ 대분류: 스크린/철재│ 대분류: ❌ │ 대분류: 스크린/철재│
│ 인정: 인정/비인정 │ 인정: ❌ │ 인정: 인정/비인정 │
│ │ │ │
│ 규격: 120×70 │ 규격: 650×550 │ 규격: 60×40 │
│ 레일폭: 70 │ 전면밑: 50 │ │
│ │ 레일폭: 75 │ │
│ │ 점검구: 후면 │ │
│ │ │ │
│ 파트: 3~5개 │ 파트: 5개 │ 파트: 1개 │
│ ┌─────────────┐│ ┌─────────────┐│ ┌─────────────┐│
│ │본체상부 ││ │상부덮개 ││ │하단마감 ││
│ │본체하부 ││ │전면 ││ │(단일 파트) ││
│ │마감재 ││ │점검구 ││ └─────────────┘│
│ │(+C형,D형) ││ │린텔 ││ │
│ └─────────────┘│ │후면코너 ││ │
│ │ └─────────────┘│ │
├─────────────────┼─────────────────┼─────────────────┤
│ 재질별 폭합 │ 재질별 폭합 │ 재질별 폭합 │
│ SUS: 406 │ EGI: 2652 │ SUS: 193 │
│ EGI: 398 │ │ │
└─────────────────┴─────────────────┴─────────────────┘
```
---
## 4. 전개도 테이블 구조 (1개 부품)
```
레거시 5130 화면과 동일한 구조:
┌────────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │
├────────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│ 번호 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │
├────────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│ 입력 │ 10 │ 11 │ 110 │ 30 │ 15 │ 15 │ 15 │ ← 치수 입력
│ │[색상]│ │ │ │ │[색상]│ │ ← 파란 배경
├────────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│ 연신율 │ │ │ -1 │ -1 │ -1 │ │ │ ← 절곡 방향
├────────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│연신율후 │ 10 │ 11 │ 109 │ 29 │ 14 │ 15 │ 15 │ ← input + rate
│ │ │ │(-1) │(-1) │(-1) │ │ │ (rate=-1 → -1mm)
├────────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│ 합계 │ 10 │ 21 │ 130 │ 159 │ 173 │ 188 │ 203 │ ← 보정후 누적합
│ │[색상]│ │ │ │ │[색상]│ │ ← 노란 배경
├────────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│ 음영 │ ■■ │ │ │ │ │ ■■ │ │ ← 색상 마킹
├────────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│ A각 │ │ │ │ A각 │ │ │ │ ← A각 표시
└────────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
연신율 보정 규칙:
rate = "" → 보정 없음 (input 그대로)
rate = "-1" → input - 1mm (하향 절곡)
rate = "1" → input + 1mm (상향 절곡)
합계 = 보정후 값의 누적합
폭합계 = 마지막 합계값 (이 예시: 203)
```
---
## 5. JSON 저장 구조 (options.bendingData)
```
레거시 (별도 배열 5개) SAM (객체 배열 1개)
──────────────────── ────────────────────
inputList: [10,11,110...] bendingData: [
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
```
---
## 6. 화면 흐름도
```
┌──────────────────────────────────────────────────────────────┐
│ MNG │
│ │
│ 생산 관리 │
│ ├─ 품목기준 필드 관리 │
│ ├─ 견적수식 관리 │
│ └─ 🆕 절곡품 관리 │
│ ├─ 기초관리 ─────────────────┐ │
│ └─ 절곡품 ──────────────┐ │ │
│ │ │ │
└─────────────────────────────┼────┼───────────────────────────┘
│ │
┌───────────────────┘ └───────────────────┐
▼ ▼
┌──────────────────────┐ ┌──────────────────────┐
│ 절곡품 목록 │ │ 기초관리 목록 │
│ │ │ │
│ [가이드레일] [케이스] │ │ 265건 테이블 │
│ [하단마감재] │ │ 필터: 대분류/인정/ │
│ │ │ 그룹/품명/검색 │
│ 필터 + 테이블 │ │ │
│ │ │ 행 클릭 ──→ 상세 │
│ 행 클릭 ──→ 상세 │ │ [+등록] ──→ 등록 │
│ [+등록] ──→ 등록 │ └───────────┬──────────┘
└───────────┬──────────┘ │
│ │
▼ ▼
┌──────────────────────┐ ┌──────────────────────┐
│ 절곡품 등록/수정 │ │ 기초관리 등록/수정 │
│ │ │ │
│ ┌──────────┬───────┐ │ │ ┌──────────┬───────┐ │
│ │ 기본정보 │ 이미지 │ │ │ │ 기본정보 │ 이미지 │ │
│ │ (타입별) │ 업로드 │ │ │ │ 대분류 │ 업로드 │ │
│ ├──────────┤ 검색어 │ │ │ │ 그룹/품명 │ 검색어 │ │
│ │ 파트 탭 │ │ │ │ │ 재질/규격 │ │ │
│ │ [1][2][3] │ │ │ │ ├──────────┤ │ │
│ │ │ │ │ │ │ 절곡 테이블│ │ │
│ │ 절곡테이블│ │ │ │ │ (단일) │ │ │
│ │ (파트별) │ │ │ │ ├──────────┤ │ │
│ ├──────────┤ │ │ │ │ 재질별폭합│ │ │
│ │ 재질별폭합│ │ │ │ └──────────┴───────┘ │
│ └──────────┴───────┘ │ └──────────────────────┘
└──────────────────────┘
```
---
## 7. API 엔드포인트 흐름
```
MNG / React
├── GET /api/v1/bending-items ← 기초관리 목록
├── GET /api/v1/bending-items/filters ← 필터 옵션
├── GET /api/v1/bending-items/{id} ← 상세
├── POST /api/v1/bending-items ← 등록
├── PUT /api/v1/bending-items/{id} ← 수정
├── DELETE /api/v1/bending-items/{id} ← 삭제
├── GET /api/v1/guiderail-models ← 절곡품 모델 목록
├── GET /api/v1/guiderail-models/{id} ← 모델 상세 (부품조합)
├── POST /api/v1/guiderail-models ← 모델 등록
├── PUT /api/v1/guiderail-models/{id} ← 모델 수정
├── DELETE /api/v1/guiderail-models/{id} ← 모델 삭제
├── POST /api/v1/items/{id}/files ← 이미지 업로드 (기존)
├── GET /api/v1/items/{id}/files ← 이미지 목록 (기존)
└── GET /api/v1/files/{id}/view ← 이미지 표시 (기존)
※ 이미지는 기존 ItemsFileController 재사용
※ field_key: 'bending_diagram'
```
---
## 8. 작업 순서
```
Step 1 Step 2 Step 3 Step 4
데이터 분석 API 구현 MNG 화면 React 화면
━━━━━━━━ ━━━━━━━━ ━━━━━━━━ ━━━━━━━━
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│레거시 265건│ │Controller│ │기초관리 │ │견적 이미지│
│SAM 170건 │──→ │Service │──→ │ 목록/등록 │──→ │GuiderailP│
│매핑 테이블 │ │FormReq │ │절곡품 │ │review │
│ │ │Resource │ │ 목록/등록 │ │ │
│options 확장│ │ │ │ │ │절곡품 │
│artisan cmd│ │이미지: │ │메뉴 등록 │ │관리 화면 │
│ │ │기존 재사용│ │(tinker) │ │(본 화면) │
│회귀 테스트 │ │ │ │ │ │ │
└──────────┘ └──────────┘ └──────────┘ └──────────┘
API 프로젝트 API 프로젝트 MNG 프로젝트 React 프로젝트
(샘플 확인용) (운영용)
```
---
## 9. 레거시 → SAM 대응표
```
레거시 (5130) SAM
━━━━━━━━━━━━━ ━━━━━
chandj.bending (265건) → items (item_category='BENDING') + options
chandj.guiderail (20건) → guiderail-models API (신규 저장 구조)
guiderail/list.php → MNG /bending/products (절곡품 목록)
bending CRUD → MNG /bending/base (기초관리)
put_guiderail_image.php → 기존 ItemsFileController (R2)
fetch_guiderail_detail.php → React GuiderailPreview
drawingTool.js (Canvas) → 2차 구현 (1차는 이미지 업로드만)
inputList[] (별도 배열) → bendingData[] (객체 배열)
bendingrateList[] → bendingData[].rate
sumList[] → bendingData[].sum
colorList[] → bendingData[].color
AList[] → bendingData[].aAngle
```