- dev/changes/20260316_stock_production_order.md: 변경이력 - plans/stock-production-react-request.md: 프론트 개발자 전달 문서 - INDEX.md 등록
342 lines
11 KiB
Markdown
342 lines
11 KiB
Markdown
# 재고생산관리 React 구현 요청서
|
|
|
|
> **작성일**: 2026-03-16
|
|
> **요청자**: R&D 실장
|
|
> **대상**: 프론트엔드 개발자
|
|
> **우선순위**: 🟡 중요
|
|
> **API 상태**: ✅ 구현 완료 (개발서버 배포됨)
|
|
|
|
---
|
|
|
|
## 1. 개요
|
|
|
|
수주 없이 **재고 목적으로 생산**하는 경우를 관리하는 메뉴를 추가한다.
|
|
기존 수주관리 API를 그대로 사용하며, `order_type_code = 'STOCK'`으로 구분한다.
|
|
|
|
### 1.1 구현 대상
|
|
|
|
| 메뉴 | 위치 | 설명 | 난이도 |
|
|
|------|------|------|:------:|
|
|
| **재고생산관리** | 판매관리 > 재고생산관리 | 재고생산 등록/목록/상세/수정/삭제 | **낮음** (수주 화면 복제 후 단순화) |
|
|
|
|
### 1.2 참고 문서
|
|
|
|
| 문서 | 경로 | 용도 |
|
|
|------|------|------|
|
|
| **API 명세** (필독) | `docs/frontend/api-specs/stock-production-api.md` | 전체 엔드포인트, 요청/응답 형식 |
|
|
| 기능 설명 | `docs/features/sales/stock-production.md` | 비즈니스 개념, 수주와의 관계 |
|
|
|
|
### 1.3 핵심 원칙
|
|
|
|
```
|
|
✅ 수주관리 화면을 복제한 뒤 불필요한 필드 제거
|
|
✅ API는 기존 /api/v1/orders 그대로 사용 (order_type=STOCK 필터)
|
|
✅ 생성 시 order_type_code: 'STOCK' 필수 전송
|
|
❌ 별도 API 엔드포인트 없음
|
|
❌ 거래처, 견적, 배송, 할인, 개소(Node) 관련 UI 불필요
|
|
```
|
|
|
|
---
|
|
|
|
## 2. 파일 구조 (제안)
|
|
|
|
기존 수주관리 구조를 따른다.
|
|
|
|
```
|
|
src/
|
|
├── app/[locale]/(protected)/sales/order-management-sales/
|
|
│ └── stocks/ # 재고생산관리 (신규)
|
|
│ ├── page.tsx # 목록 페이지
|
|
│ └── [id]/
|
|
│ ├── page.tsx # 상세 페이지
|
|
│ └── production-order/
|
|
│ └── page.tsx # 생산지시 생성 페이지
|
|
│
|
|
├── components/orders/
|
|
│ └── StockProductionRegistration.tsx # 재고생산 등록/수정 폼 (신규)
|
|
│ └── (기존 actions.ts에 함수 추가 또는 별도 stockActions.ts)
|
|
```
|
|
|
|
> **대안**: `stocks/` 대신 기존 수주관리 페이지에서 `order_type` 탭으로 분리하는 방식도 가능. 실장 판단에 따름.
|
|
|
|
---
|
|
|
|
## 3. 화면별 구현 가이드
|
|
|
|
### 3.1 재고생산 목록 페이지
|
|
|
|
**경로**: `/sales/order-management-sales/stocks`
|
|
|
|
**수주관리 목록 페이지를 복제**한 뒤 다음을 변경:
|
|
|
|
| 항목 | 수주관리 (현재) | 재고생산 (변경) |
|
|
|------|---------------|---------------|
|
|
| 페이지 제목 | 수주관리 | **재고생산관리** |
|
|
| API 호출 | `getOrders()` | `getOrders({ order_type: 'STOCK' })` |
|
|
| 통계 API | `getOrderStats()` | `getOrderStats({ order_type: 'STOCK' })` → `GET /api/v1/orders/stats?order_type=STOCK` |
|
|
| 표시 컬럼 | 수주번호, 거래처, 현장명, 수량, 납기, 금액... | **생산번호, 품목, 수량, 생산사유, 등록일, 상태** |
|
|
| 통계 카드 | 이번달 수주금액, 분할대기... | 전체, 등록, 확정, 진행중, 완료 (또는 간소화) |
|
|
|
|
**목록 테이블 컬럼**:
|
|
|
|
| 컬럼 | 데이터 | 비고 |
|
|
|------|--------|------|
|
|
| 번호 | 글로벌 인덱스 | |
|
|
| 생산번호 | `order_no` (STK...) | 배지 스타일 |
|
|
| 품목 | 대표 `items[0].item_name` + (외 N건) | |
|
|
| 수량 | 총 수량 | |
|
|
| 생산 사유 | `options.production_reason` | 없으면 `-` |
|
|
| 등록일 | `created_at` | YYYY-MM-DD |
|
|
| 상태 | `status_code` | 배지 (수주와 동일 색상) |
|
|
| 작업 | 상세보기, 삭제 | |
|
|
|
|
**제거할 컬럼**: 거래처, 현장명, 납기, 금액
|
|
|
|
### 3.2 재고생산 등록/수정 폼
|
|
|
|
**수주 등록 폼(`OrderRegistration.tsx`)을 복제**한 뒤 다음을 변경:
|
|
|
|
#### 제거할 섹션
|
|
|
|
```
|
|
❌ 거래처 선택 (client_id, client_name, client_contact)
|
|
❌ 현장명 (site_name) — API가 '재고생산'으로 자동 설정
|
|
❌ 견적 선택 (quote_id) / 견적에서 가져오기
|
|
❌ 배송 정보 (delivery_date, delivery_method_code)
|
|
❌ 운임비용 (options.shipping_cost_code)
|
|
❌ 수신자 정보 (options.receiver, receiver_contact, shipping_address)
|
|
❌ 할인 (discount_rate, discount_amount)
|
|
❌ 금액 계산 (supply_amount, tax_amount, total_amount)
|
|
❌ 매출 인식 (sales_recognition)
|
|
❌ 개소/구역 (OrderNode) 트리 구조
|
|
```
|
|
|
|
#### 유지할 섹션
|
|
|
|
```
|
|
✅ 생산 사유 (options.production_reason) — 텍스트 입력
|
|
✅ 목표 재고 수량 (options.target_stock_qty) — 숫자 입력
|
|
✅ 비고 (memo) — 텍스트 입력
|
|
✅ 품목 목록 (items[]) — 품목 선택 + 수량 입력
|
|
```
|
|
|
|
#### 품목 입력 테이블
|
|
|
|
| 필드 | 타입 | 필수 | 비고 |
|
|
|------|------|:----:|------|
|
|
| 품목 | 품목 선택 (ItemAddDialog) | ✅ | item_id, item_name, item_code |
|
|
| 규격 | 텍스트 | - | specification |
|
|
| 수량 | 숫자 | ✅ | quantity |
|
|
| 단위 | 텍스트 | - | unit (기본: EA) |
|
|
|
|
> **단가/금액은 불필요**하지만, API validation에서 `unit_price`가 required이므로 `0`을 전송
|
|
|
|
#### API 요청 예시
|
|
|
|
```json
|
|
{
|
|
"order_type_code": "STOCK",
|
|
"memo": "봄 시즌 대비 재고 확보",
|
|
"options": {
|
|
"production_reason": "시즌 대비",
|
|
"target_stock_qty": 500
|
|
},
|
|
"items": [
|
|
{
|
|
"item_id": 10,
|
|
"item_name": "25mm 알루미늄 블라인드",
|
|
"specification": "W1000 x H2000",
|
|
"quantity": 100,
|
|
"unit_price": 0,
|
|
"unit": "EA"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
### 3.3 재고생산 상세 페이지
|
|
|
|
**수주 상세(`OrderSalesDetailView.tsx`)를 복제**한 뒤 단순화:
|
|
|
|
| 섹션 | 표시 |
|
|
|------|------|
|
|
| 생산번호 (order_no) | ✅ |
|
|
| 상태 (status_code) | ✅ 배지 |
|
|
| 생산 사유 | ✅ `options.production_reason` |
|
|
| 목표 재고 수량 | ✅ `options.target_stock_qty` |
|
|
| 비고 | ✅ `memo` |
|
|
| 품목 목록 | ✅ 테이블 (품목명, 규격, 수량) |
|
|
| 거래처/현장/납기/금액 | ❌ 제거 |
|
|
| 개소/구역 트리 | ❌ 제거 |
|
|
|
|
**액션 버튼**:
|
|
- 수정 (DRAFT 상태만)
|
|
- 삭제 (DRAFT 상태만)
|
|
- 확정 (`PATCH /api/v1/orders/{id}/status` → `{ "status": "CONFIRMED" }`)
|
|
- 생산지시 생성 (CONFIRMED 상태만) → 기존 생산지시 생성 페이지 재사용
|
|
|
|
### 3.4 생산지시 생성 페이지
|
|
|
|
**기존 `[id]/production-order/page.tsx`를 재사용** 가능.
|
|
|
|
STOCK 수주의 생산지시는 API가 자동 처리하므로 프론트에서 특별한 분기 불필요:
|
|
|
|
| 항목 | API 자동 처리 |
|
|
|------|-------------|
|
|
| 공정 선택 | 절곡 공정 자동 선택 (process_ids 전달 불필요) |
|
|
| 현장명 | `'재고생산'` 고정 |
|
|
| 작업예정일 | `now()` 자동 (scheduled_date 전달 불필요) |
|
|
|
|
> 단, 공정 매칭 미리보기 UI에서 STOCK 수주가 BOM 없이도 "절곡" 공정으로 표시되도록 조건 분기 필요할 수 있음.
|
|
|
|
### 3.5 생산지시 목록 — STOCK 건 표시 (기존 페이지 수정)
|
|
|
|
**경로**: `/sales/order-management-sales/production-orders/page.tsx`
|
|
|
|
STOCK 타입 재고생산의 생산지시도 이 목록에 표시된다. 변경 필요 사항:
|
|
|
|
| 컬럼 | 현재 | STOCK 건 표시 |
|
|
|------|------|-------------|
|
|
| 현장명 | `siteName` | `'재고생산'` (API가 자동 설정하므로 변경 불필요) |
|
|
| 거래처 | `clientName` | 빈 값 또는 `-` |
|
|
| 납기 | `deliveryDate` | `-` 표시 (STOCK은 delivery_date 없음) |
|
|
| 생산지시일 | `productionOrderedAt` | 정상 표시 |
|
|
|
|
**구현 방법**: API 응답에 `order_type_code`가 이미 포함됨. 프론트 types에 추가:
|
|
|
|
```typescript
|
|
// types.ts 수정
|
|
interface ApiProductionOrder {
|
|
// ... 기존 필드
|
|
order_type_code?: string; // 추가
|
|
}
|
|
|
|
// transform 함수에서
|
|
orderTypeCode: data.order_type_code || 'ORDER',
|
|
```
|
|
|
|
테이블 렌더링에서:
|
|
|
|
```typescript
|
|
// 납기 컬럼
|
|
{item.orderTypeCode === 'STOCK' ? '-' : item.deliveryDate}
|
|
|
|
// 거래처 컬럼
|
|
{item.orderTypeCode === 'STOCK' ? '-' : item.clientName}
|
|
```
|
|
|
|
---
|
|
|
|
## 4. 메뉴 등록
|
|
|
|
메뉴 위치:
|
|
|
|
```
|
|
판매관리
|
|
├── 거래처관리
|
|
├── 견적관리
|
|
├── 수주관리
|
|
├── 재고생산관리 ← 신규 (수주관리 아래)
|
|
└── 단가관리
|
|
```
|
|
|
|
> 메뉴 등록은 MNG 메뉴 동기화 기능으로 별도 처리. 프론트에서는 라우트만 구현.
|
|
|
|
---
|
|
|
|
## 5. 수주관리와의 차이 요약
|
|
|
|
```
|
|
┌─ 수주관리 ──────────────────┐ ┌─ 재고생산관리 ───────────────┐
|
|
│ │ │ │
|
|
│ 거래처 선택 │ │ 생산 사유 (텍스트) │
|
|
│ 현장명 │ │ 목표 재고 수량 │
|
|
│ 견적 연결 │ │ 비고 │
|
|
│ 배송/납기/운임 │ │ │
|
|
│ 할인/금액 계산 │ ├──────────────────────────────┤
|
|
│ 매출 인식 방식 │ │ 품목 목록 │
|
|
│ │ │ - 품목 선택 │
|
|
│ 개소/구역 트리 (OrderNode) │ │ - 수량만 입력 │
|
|
│ 품목 목록 (상세) │ │ (단가/금액/할인 불필요) │
|
|
│ - 단가, 할인, 금액 계산 │ │ (개소/구역 불필요) │
|
|
│ - floor_code, symbol_code │ │ │
|
|
│ │ └──────────────────────────────┘
|
|
└──────────────────────────────┘
|
|
```
|
|
|
|
---
|
|
|
|
## 6. API 빠른 참조
|
|
|
|
### 6.1 목록 조회
|
|
|
|
```
|
|
GET /api/v1/orders?order_type=STOCK&page=1&size=20
|
|
```
|
|
|
|
### 6.2 통계
|
|
|
|
```
|
|
GET /api/v1/orders/stats?order_type=STOCK
|
|
```
|
|
|
|
### 6.3 생성
|
|
|
|
```
|
|
POST /api/v1/orders
|
|
Content-Type: application/json
|
|
|
|
{
|
|
"order_type_code": "STOCK",
|
|
"memo": "...",
|
|
"options": { "production_reason": "...", "target_stock_qty": 500 },
|
|
"items": [{ "item_name": "...", "quantity": 100, "unit_price": 0 }]
|
|
}
|
|
```
|
|
|
|
### 6.4 상태 변경
|
|
|
|
```
|
|
PATCH /api/v1/orders/{id}/status
|
|
{ "status": "CONFIRMED" }
|
|
```
|
|
|
|
### 6.5 생산지시 생성
|
|
|
|
```
|
|
POST /api/v1/orders/{id}/production-order
|
|
{ "priority": "normal" }
|
|
```
|
|
|
|
> 공정/예정일은 API가 자동 처리 (절곡 공정, scheduled_date=now())
|
|
|
|
### 6.6 수정/삭제
|
|
|
|
```
|
|
PUT /api/v1/orders/{id} — 수정
|
|
DELETE /api/v1/orders/{id} — 삭제
|
|
```
|
|
|
|
---
|
|
|
|
## 7. 구현 체크리스트
|
|
|
|
- [ ] `stocks/page.tsx` — 재고생산 목록 페이지
|
|
- [ ] `stocks/[id]/page.tsx` — 재고생산 상세 페이지
|
|
- [ ] `StockProductionRegistration.tsx` — 등록/수정 폼 (수주 폼 단순화)
|
|
- [ ] Server Actions — `getOrders({ order_type: 'STOCK' })` 등 (기존 actions.ts 활용)
|
|
- [ ] 생산지시 목록 — STOCK 건 납기 `-` 표시, `order_type_code` 타입 추가
|
|
- [ ] 메뉴 라우트 등록
|
|
|
|
---
|
|
|
|
## 관련 문서
|
|
|
|
- [API 명세 (상세)](../frontend/api-specs/stock-production-api.md)
|
|
- [기능 설명](../features/sales/stock-production.md)
|
|
- [개발 변경이력](../dev/changes/20260316_stock_production_order.md)
|
|
|
|
---
|
|
|
|
**최종 업데이트**: 2026-03-16
|