Files
sam-docs/changes/20260318_bending_lot_codemap_update.md

153 lines
4.7 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.

# 절곡품 LOT 채번 코드맵 최신화 + 품목 일괄 등록 + 일련번호 제거
**날짜:** 2026-03-18
**작업자:** Claude Code
---
## 변경 개요
경동기업 재공품 LOT 채번 규칙을 최신 기준으로 업데이트했다. 신규 종류/길이 코드 추가, 누락 품목 222건 일괄 등록, LOT 번호에서 일련번호(-001) 제거.
---
## 수정된 파일
| 파일 | 변경 내용 | 프로젝트 |
|------|----------|---------|
| `app/Services/BendingCodeService.php` | 코드맵 최신화 + generateLotNumber() 일련번호 제거 | API |
| `app/Http/Controllers/Api/V1/BendingController.php` | generate-lot 응답 단순화 | API |
| `scripts/register-bending-items.php` | 품목 일괄 등록 스크립트 | API |
---
## 상세 변경 사항
### 1. BendingCodeService 코드맵 최신화
**신규 종류 코드 3종:**
| 코드 | 종류 | 적용 제품 |
|------|------|----------|
| W | 본체(L120) | R(벽면형), S(측면형) |
| F | SUS마감재(L120) | R(벽면형), S(측면형) |
| H | 화이바원단(W80) | G(연기차단재) |
**신규 길이 코드 4종:**
| 길이 | 코드 |
|------|------|
| 610mm | 06 |
| 1750mm | 17 |
| 2000mm | 20 |
| 4500mm | 45 |
**명칭 변경:**
- R:M 본체 → S:M 본체디딤 (측면형만)
- SUS(마감) → SUS마감재 / SUS마감재(3)
- 화이바원단 → 화이바원단(W50)
- 가이드레일(R/S)에서 EGI(E) 종류 코드 제거
### 2. 품목 일괄 등록 (222건)
LOT 코드 기준 26개 제품+종류 조합 × 12개 길이 = 320개 조합 중 누락 222건을 `items` 테이블에 등록. `bending_item_mappings` 테이블에 320건 매핑 동시 등록.
| 구분 | 건수 |
|------|:----:|
| 기존 품목 유지 | 170건 |
| 신규 생성 | 222건 |
| bending_item_mappings | 320건 |
### 3. LOT 번호 일련번호 제거
```
변경 전: CL6318-30-001 (일련번호 포함)
변경 후: CL6318-30 (일련번호 없음)
```
같은 날 같은 조합은 동일 LOT 번호를 사용한다.
**API 응답 변경 (`POST /api/v1/bending/generate-lot`):**
```json
// 변경 전
{ "lot_base": "CL6318-30", "lot_number": "CL6318-30-001", "date_code": "6318", "material": "EGI 1.55T" }
// 변경 후
{ "lot_number": "CL6318-30", "material": "EGI 1.55T" }
```
> `lot_base`, `date_code` 필드 제거. `lot_number`에 일련번호 미포함.
### 4. resolve-item 응답에 expected_code 추가
품목 매핑 조회(`GET /api/v1/bending/resolve-item`) 응답에 `expected_code` 필드를 추가했다.
매핑 실패 시 어떤 품목 코드(`BD-XX-nn`)를 찾고 있는지 사용자가 확인할 수 있다.
**매핑 실패 응답:**
```json
{
"error": "NOT_MAPPED",
"message": "해당 조합에 매핑된 품목이 없습니다.",
"expected_code": "BD-BE-20"
}
```
**매핑 성공 응답:**
```json
{
"item_id": 16448,
"item_code": "BD-BE-20",
"item_name": "하단마감재(스크린) EGI 2000mm",
"expected_code": "BD-BE-20"
}
```
---
## React 영향 (프론트엔드 전달 필요)
### 호환성 (수정 불필요)
- `BendingLotForm.tsx`의 LOT 프리뷰(`lotPreview`)는 이미 올바르게 동작 (일련번호 없는 형태)
- 저장 시 `generateBendingLot()` API 응답에서 `lot_base`, `date_code` 필드 제거됨
- 현재 코드에서 `lotData.lot_number``lotData.material`만 사용하므로 **호환성 문제 없음**
### 구현 요청
1. **매핑 실패 경고에 품목 코드 표시** (`BendingLotForm.tsx` 320행):
```tsx
// 변경 전
setResolveError('해당 조합에 매핑된 품목이 없습니다.');
// 변경 후
const code = result.data?.expected_code || '';
setResolveError(`해당 조합에 매핑된 품목이 없습니다. (${code})`);
```
2. **매핑 성공 시 품목 코드 함께 표시** (권장)
### 원자재 LOT 조회 (`GET /api/v1/bending/material-lots`) 변경
| 항목 | 변경 전 | 변경 후 |
|------|---------|---------|
| status 필터 | `completed`만 | `completed` + `inspection_completed` |
| 재질 검색 | `LIKE "%EGI 1.55T%"` (전체 일치) | 키워드 분해: `"EGI" AND "1.55"` (공백/T 무관) |
**변경 이유**: 실제 입고 데이터의 품목명이 `"EGI1.55"`, `"egi1.55"` 등 공백/대소문자/T접미사가 불일치하여 검색 결과가 0건이었음. 또한 수입검사 완료(`inspection_completed`) 상태의 입고도 원자재 LOT으로 선택 가능해야 함.
**프론트엔드 영향**: 없음 (API 응답 구조 변경 없음, 결과 건수만 증가)
---
## 관련 문서
- `rules/bending-lot-numbering-policy.md` — LOT 채번 규칙 정책
- `plans/bending-item-registration-plan.md` — 품목 등록 계획 (완료)
- `plans/bending-lot-auto-generation-plan.md` — LOT 자동 채번 기획
---
**최종 업데이트**: 2026-03-18