From 75a025aca475e351ee606bdd01966d8e61cd3c0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Wed, 18 Mar 2026 20:11:45 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20[bending]=20=EC=9E=AC=EA=B3=A0=EC=83=9D?= =?UTF-8?q?=EC=82=B0=20LOT=20=EC=9E=90=EB=8F=99=20=EC=B1=84=EB=B2=88=20?= =?UTF-8?q?=EA=B8=B0=ED=9A=8D=EC=84=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 품종+종류+길이 선택 시 LOT 자동 생성 흐름 설계 - 일련번호 제거, 같은 날 같은 조합 = 동일 LOT - API/React 수정 범위 정리 --- plans/bending-lot-auto-generation-plan.md | 176 ++++++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 plans/bending-lot-auto-generation-plan.md diff --git a/plans/bending-lot-auto-generation-plan.md b/plans/bending-lot-auto-generation-plan.md new file mode 100644 index 0000000..f9be6df --- /dev/null +++ b/plans/bending-lot-auto-generation-plan.md @@ -0,0 +1,176 @@ +# 절곡품 재고생산 LOT 자동 채번 기획 + +> **작성일**: 2026-03-18 +> **상태**: 기획 확정 +> **관련**: `rules/bending-lot-numbering-policy.md` + +--- + +## 1. 목표 + +재고생산 등록 화면에서 **품종 + 종류 + 모양&길이** 3가지를 선택하면: + +1. 매핑된 **품목이 자동 식별**됨 +2. 제조일과 결합하여 **LOT 번호가 자동 채번**되어 프리뷰에 표시됨 +3. **일련번호 없음** — 같은 날 같은 조합은 동일 LOT 번호 + +--- + +## 2. LOT 번호 생성 규칙 + +``` +{제품코드}{종류코드}{날짜코드4자리}-{길이코드} +``` + +| 입력 | 예시 값 | 코드 | +|------|---------|------| +| 제조일 | 2026-03-18 | `6318` | +| 품종 | 케이스 | `C` | +| 종류 | 린텔부 | `L` | +| 모양&길이 | 3000mm | `30` | +| **결과** | | **`CL6318-30`** | + +> 같은 날(03-18) 케이스 린텔부 3000mm를 2번 생산하면, 두 건 모두 LOT `CL6318-30`이다. + +--- + +## 3. 화면 흐름 + +``` +┌──────────────────────────────────────────────────────┐ +│ 절곡품 재고생산 등록 │ +├──────────────────────────────────────────────────────┤ +│ │ +│ ① 기본 정보 │ +│ ┌─────────────────┬─────────────────┐ │ +│ │ 제조일: 2026-03-18│ 수량: 50 │ │ +│ └─────────────────┴─────────────────┘ │ +│ │ +│ ② 품목 선택 (3개 드롭다운) │ +│ ┌─────────────┬──────────────┬──────────────┐ │ +│ │ 품종 * │ 분류(종류) * │ 모양&길이 * │ │ +│ │ [케이스 ▾]│ [린텔부 ▾] │ [3000 ▾] │ │ +│ └─────────────┴──────────────┴──────────────┘ │ +│ │ +│ ┌──────────────────────────────────────────┐ │ +│ │ ✅ 매핑 품목: BD-CL-30 케이스 린텔부 3000mm │ │ +│ └──────────────────────────────────────────┘ │ +│ │ +│ ③ LOT 정보 (자동 채번) │ +│ ┌─────────────────────────────────────────┐ │ +│ │ 생산품 LOT: CL6318-30 │ ← 자동 │ +│ │ 원자재 재질: EGI 1.55T │ ← 자동 │ +│ └─────────────────────────────────────────┘ │ +│ ┌─────────────────────────────────────────┐ │ +│ │ 원자재 LOT: [🔍 선택] │ ← 수동 │ +│ └─────────────────────────────────────────┘ │ +│ │ +│ ╔══════════════════════════════════════════╗ │ +│ ║ ✕ 취소 💾 저장 ║ │ +│ ╚══════════════════════════════════════════╝ │ +└──────────────────────────────────────────────────────┘ +``` + +### 3.1 자동 채번 트리거 + +| 조건 | 동작 | +|------|------| +| 품종 선택 | 종류 드롭다운 필터링 (해당 제품의 종류만 표시) | +| 종류 선택 | 길이 드롭다운 필터링 (연기차단재면 연기차단재 길이, 그 외 일반 길이) | +| 모양&길이 선택 | ① `resolveItem` API 호출 → 매핑 품목 표시 ② LOT 프리뷰 자동 생성 | +| 제조일 변경 | LOT 프리뷰의 날짜 코드 부분 갱신 | + +### 3.2 에러 상태 + +| 상태 | 표시 | +|------|------| +| 3가지 미선택 | LOT 프리뷰 비어있음 | +| 매핑 품목 없음 | ⚠️ "해당 조합에 매핑된 품목이 없습니다" (저장 가능 — 품목 없이도 LOT 생성) | +| 매핑 품목 있음 | ✅ "BD-CL-30 케이스 린텔부 3000mm" 표시 | + +--- + +## 4. 수정 범위 + +### 4.1 API 수정 (`BendingCodeService`) + +**현재 문제**: `generateLotNumber()`이 일련번호(-001)를 추가함 + +```php +// 변경 전 +public function generateLotNumber(string $lotBase): string +{ + // ... 기존 LOT 수 조회 → -001 suffix 추가 + return "{$lotBase}-{$seq}"; +} + +// 변경 후 +public function generateLotNumber( + string $prodCode, + string $specCode, + string $lengthCode, + string $date +): string { + $dateCode = self::generateDateCode($date); + return "{$prodCode}{$specCode}{$dateCode}-{$lengthCode}"; +} +``` + +> 일련번호 로직 제거. 같은 날 같은 조합은 동일 LOT. + +### 4.2 API 엔드포인트 수정 (`BendingController`) + +**`POST /api/v1/bending/generate-lot`** 응답 변경: + +```json +// 변경 전 +{ "lot_number": "CL6318-30-001", "material": "EGI 1.55T" } + +// 변경 후 +{ "lot_number": "CL6318-30", "material": "EGI 1.55T" } +``` + +### 4.3 React 수정 (`BendingLotForm.tsx`) + +**현재 LOT 프리뷰** (270~276행): 이미 올바른 형태로 동작함 + +```tsx +// 이미 올바름 — 일련번호 없이 {prod}{spec}{dateCode}-{length} +const lotPreview = useMemo(() => { + const dateCode = generateDateCode(form.regDate); + const base = `${form.prodCode}${form.specCode}${dateCode}`; + return form.lengthCode ? `${base}-${form.lengthCode}` : base; +}, [form.prodCode, form.specCode, form.lengthCode, form.regDate]); +``` + +**저장 시** (348~362행): `generateBendingLot()` API 호출 결과가 달라지므로 연동 확인 필요 + +### 4.4 수정 파일 목록 + +| 파일 | 변경 내용 | 프로젝트 | +|------|----------|---------| +| `app/Services/BendingCodeService.php` | `generateLotNumber()` 일련번호 제거 | API | +| `app/Http/Controllers/Api/V1/BendingController.php` | generate-lot 응답 수정 | API | +| `src/components/stocks/BendingLotForm.tsx` | 저장 로직에서 API 응답 연동 확인 | React | + +--- + +## 5. 테스트 체크리스트 + +- [ ] 품종+종류+길이 선택 시 LOT 프리뷰 자동 표시 +- [ ] 제조일 변경 시 LOT 프리뷰 갱신 +- [ ] 같은 날 같은 조합 2건 저장 → 동일 LOT 번호 확인 +- [ ] 매핑 품목 있는 조합 → 품목명 자동 표시 +- [ ] 매핑 품목 없는 조합 → 경고 표시, 저장은 가능 +- [ ] 연기차단재(G) 선택 시 연기차단재 전용 길이 표시 + +--- + +## 관련 문서 + +- `rules/bending-lot-numbering-policy.md` — LOT 채번 규칙 (일련번호 없음 확정) +- `plans/bending-item-registration-plan.md` — 품목 등록 계획 (완료) + +--- + +**최종 업데이트**: 2026-03-18