- v1-analysis: 5130 레거시 기반 견적 분석 추가 - v2-analysis: 기존 MES 분석 문서들 이동 - customer, master-data, order, price - production, production-userflow, quote, site
8.2 KiB
8.2 KiB
App.jsx 수주 섹션 분석
분석 일시: 2024-12-18 소스: design/mes기획서_리액트/src/App.jsx (52768~56357줄)
컴포넌트 위치
| 컴포넌트 | 라인 | 설명 |
|---|---|---|
| OrderList | 52768 | 수주 목록 |
| OrderDetail | 53479 | 수주 상세 |
| OrderCreate | 55280 | 수주 등록 |
| OrderEdit | 56357 | 수주 수정 |
1. OrderList (수주 목록)
Props
{
orders, // 수주 배열
shipments, // 출하 배열 (연결용)
workOrders, // 작업지시 배열 (연결용)
onNavigate, // 화면 이동
onCreateWorkOrders, // 작업지시 생성
onDeleteOrders // 수주 삭제
}
탭 필터
| 탭 ID | 라벨 | 필터 조건 |
|---|---|---|
| all | 전체 | - |
| registered | 수주등록 | status === '수주등록' |
| confirmed | 수주확정 | status === '수주확정' |
| production-complete | 생산지시완료 | status === '생산지시완료' |
리포트 카드 (4개)
| 항목 | 계산 |
|---|---|
| 이번 달 수주 | orders.reduce(sum + totalAmount) |
| 분할 대기 | 수주확정 && splits 없음 |
| 생산지시 대기 | splits 있으나 productionStatus 미지시 |
| 출하 대기 | 출하진행률 0% |
테이블 컬럼
체크박스 | 번호 | 로트번호 | 견적번호 | 발주처 | 현장명 | 상태 | 출고예정일 | 배송방식 | (작업)
검색 필드
- 로트번호 (orderNo)
- 견적번호 (quoteNo)
- 발주처 (customerName)
- 현장명 (siteName)
정렬
.sort((a, b) => b.id - a.id) // ID 기준 내림차순 (최신 등록 최상단)
2. OrderDetail (수주 상세)
Props
{
order, // 수주 데이터
productionOrders, // 생산지시 배열
customers, // 거래처 배열 (결제조건 확인)
onNavigate,
onBack,
onUpdate, // 수주 업데이트
onCreateWorkOrder, // 작업지시 생성
onCreateProductionOrder
}
문서 탭
| 탭 ID | 라벨 | 용도 |
|---|---|---|
| contract | 계약서 | 수주 계약 문서 |
| statement | 거래명세서 | 납품 시 발행 |
| purchaseOrder | 발주서 | 발주처 제출용 |
분할(Split) 관리
분할 데이터 구조:
{
id: number,
splitNo: string, // "{orderNo}-{순번2자리}"
splitOrder: number,
splitType: string, // '개소별'
dueDate: string,
itemIds: number[], // 분할 품목 ID 배열
productionStatus: string, // '작업대기', '작업지시'
shipmentStatus: string, // '출고대기', ...
productionOrderNo: string,
totalQty: number,
completedQty: number,
remainingQty: number
}
생산지시 생성 로직
공정별 작업지시 자동 분리:
- 스크린 공정: 스크린 카테고리 품목
- 슬랫 공정: 슬랫/철재 카테고리 품목
- 절곡 공정: BOM 데이터 기반 절곡물
작업지시 번호 생성:
const woNo = `KD-PL-${dateCode}-${순번2자리}`;
// 예: KD-PL-241218-01
공정별 작업 단계:
{
'스크린': ['원단절단', '미싱', '앤드락작업', '중간검사', '포장'],
'슬랫': ['코일절단', '중간검사', '미미작업', '포장'],
'절곡': ['절단', '절곡', '중간검사', '포장'],
}
팀 자동 배정:
{
'스크린': { assignee: '스크린팀', assignees: ['김스크린', '이스크린', '박스크린'] },
'슬랫': { assignee: '슬랫팀', assignees: ['김슬랫', '이슬랫', '박슬랫'] },
'절곡': { assignee: '절곡팀', assignees: ['김절곡', '이절곡'] },
}
3. OrderCreate (수주 등록)
Props
{
quotes, // 견적 배열 (선택용)
fromQuote, // 전환된 견적
additionalItems, // 추가분 품목
relatedOrders, // 관련 수주 (추가분용)
isAdditional, // 추가분 여부
onNavigate,
onBack,
onSave
}
수주 유형
| 유형 | orderType | 설명 |
|---|---|---|
| 견적전환 | from-quote | 견적에서 수주 전환 |
| 직접입력 | direct | 견적 없이 직접 등록 |
| 추가분 | additional | 기존 수주에 추가 |
수주번호 생성 규칙
// 신규: KD-SO-YYMMDD-순번
const orderNo = `KD-SO-${dateCode}-${seq}`;
// 예: KD-SO-241218-01
// 추가분: 원수주번호-A, B, C...
const additionalOrderNo = `${baseOrderNo}-${suffix}`;
// 예: KD-SO-241218-01-A
폼 필드
기본 정보:
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
| orderDate | date | - | 수주일 (기본: 오늘) |
| customerName | text | ✅ | 발주처 |
| customerId | text | - | 거래처 ID |
| siteName | text | ✅ | 현장명 |
| manager | text | - | 담당자 |
| contact | text | - | 연락처 |
납품 정보:
| 필드 | 타입 | 필수 | 옵션 |
|---|---|---|---|
| dueDate | date | ✅ | 납기일 |
| deliveryMethod | select | - | 배송방법 (12종) |
| deliveryAddress | text | - | 납품주소 |
| receiverName | text | - | 수령자명 |
| receiverPhone | text | - | 수령자연락처 |
배송방법 옵션 (12종):
상차(선불), 상차(착불), 직접배차, 직접수령,
경동화물(선불/착불), 경동택배(선불/착불),
대신화물(선불/착불), 대신택배(선불/착불)
품목 추가/수정 폼
품목 필드:
| 필드 | 타입 | 설명 |
|---|---|---|
| productCode | text | 품목코드 |
| productName | select | 품목명 |
| floor | text | 층 |
| location | text | 위치 |
| openWidth | number | 개구폭(mm) |
| openHeight | number | 개구높이(mm) |
| qty | number | 수량 |
| unitPrice | number | 단가 |
| guideRailType | select | 가이드레일형태 |
| guideRailSpec | select | 가이드레일규격 |
| finish | select | 마감 |
제작 스펙 자동 계산
const prodWidth = openWidth + 140;
const prodHeight = Math.max(openHeight + 400, 2950);
const shaft = openWidth > 6000 ? 5 : 4;
const capacity = openWidth > 6000 ? 300 : 160;
저장 시 생성되는 데이터
const newOrder = {
id,
orderNo,
orderDate,
quoteId, quoteNo,
orderType, // 'from-quote' | 'direct' | 'additional'
parentOrderNo, // 추가분일 경우
customerId, customerName,
creditGrade, // 거래처 신용등급
siteName, siteCode,
manager, contact,
dueDate,
status: '수주등록',
paymentStatus: '미입금',
accountingStatus: '미확인',
deliveryMethod,
totalAmount,
deliveryAddress,
receiverName, receiverPhone,
items, // 품목 배열
motorSpec, // 모터/전장품 스펙
bomData, // 절곡물 BOM
calculatedItems, // 견적 산출 품목
splits: [],
documentHistory: [],
changeHistory: [],
createdAt, createdBy,
note
};
4. 수주 상태 흐름
수주등록 → 수주확정 → 생산중 → 생산완료 → 출하완료
↓
분할 관리
↓
생산지시 (공정별)
↓
작업지시 생성
5. 관련 API 추정
수주 CRUD
GET /api/orders - 수주 목록
GET /api/orders/{id} - 수주 상세
POST /api/orders - 수주 등록
PUT /api/orders/{id} - 수주 수정
DELETE /api/orders/{id} - 수주 삭제
DELETE /api/orders (bulk) - 수주 일괄 삭제
분할 관리
POST /api/orders/{id}/splits - 분할 추가
PUT /api/orders/{id}/splits/{splitId} - 분할 수정
DELETE /api/orders/{id}/splits/{splitId} - 분할 삭제
생산지시
POST /api/orders/{id}/production-order - 전체 생산지시
POST /api/orders/{id}/splits/{splitId}/production-order - 분할 생산지시
작업지시
POST /api/work-orders - 작업지시 생성
GET /api/work-orders?orderNo={orderNo} - 수주별 작업지시 조회
문서 출력
GET /api/orders/{id}/documents/contract - 계약서
GET /api/orders/{id}/documents/statement - 거래명세서
GET /api/orders/{id}/documents/purchase-order - 발주서