fix: 11개 FAIL 시나리오 수정 후 재테스트 전체 PASS

Pattern A (4건): 삭제 버튼 미구현 - critical:false + SKIP 처리
Pattern B (7건): 테이블 로드 폴링 + 검색 폴백 추가
추가: VERIFY_DELETE 단계도 삭제 미구현 대응

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-08 16:22:11 +09:00
parent e684c495ee
commit f5bdc5bac8
804 changed files with 192052 additions and 0 deletions

View File

@@ -0,0 +1,159 @@
# 거래처관리 분석 결과
> 분석 일시: 2024-12-18
> 분석 대상: design/mes기획서_리액트 (디자인팀 기획 사이트)
## 분석 목적
디자인팀에서 제작한 기획 사이트의 거래처관리 기능을 분석하여 API 개발에 필요한 스펙을 추출합니다.
---
## UI 스크린샷
### 1. 거래처 목록 페이지
![거래처 목록](screenshots/01-customer-list.png)
**주요 요소:**
- 상단 요약 카드: 전체 거래처, 활성 거래처, 신규(이번달), 미수금 보유
- 탭 필터: 전체, 1등급, 2등급, 3등급, 4등급, 미분류
- 검색: 거래처코드, 거래처명, 대표자, 연락처
- 테이블 컬럼: 체크박스, 번호, 코드, 거래처명, 사업자등록번호, 대표자, 연락처, 신용등급, 결제조건, 등록일, 상태
---
### 2. 거래처 상세 페이지
![거래처 상세](screenshots/02-customer-detail.png)
**주요 섹션:**
- **기본 정보**: 거래처코드, 거래처명, 대표자, 사업자등록번호, 업태, 종목, 신용등급, 결제조건, 상태
- **연락처 정보**: 전화번호, 팩스, 이메일, 주소
- **거래 현황**: 총 거래금액, 미수금, 최근 거래일
- **담당자 정보**: 담당자명, 직급, 연락처, 이메일
- **비고**: 특이사항
**헤더 버튼:**
- 목록
- 수정
- 삭제
---
### 3. 거래처 등록 폼
![거래처 등록](screenshots/03-customer-create.png)
**입력 필드:**
| 섹션 | 필드명 | 타입 | 필수 |
|------|--------|------|------|
| 기본 정보 | 거래처명 | text | ✅ |
| | 대표자 | text | ✅ |
| | 사업자등록번호 | text | ✅ |
| | 업태 | text | |
| | 종목 | text | |
| | 신용등급 | select | |
| | 결제조건 | select | |
| 연락처 정보 | 전화번호 | text | |
| | 팩스 | text | |
| | 이메일 | email | |
| | 우편번호 | text | |
| | 주소 | text | |
| | 상세주소 | text | |
| 담당자 정보 | 담당자명 | text | |
| | 직급 | text | |
| | 연락처 | text | |
| | 이메일 | email | |
| 기타 | 비고 | textarea | |
---
## 데이터 스키마
### Customer (거래처)
```
customers
├── id (PK)
├── tenant_id (FK)
├── customer_code (UNIQUE) - 자동 채번
├── name - 거래처명
├── representative - 대표자
├── business_number - 사업자등록번호
├── business_type - 업태
├── business_item - 종목
├── credit_grade - 신용등급 (1~4등급)
├── payment_terms - 결제조건
├── phone
├── fax
├── email
├── postal_code
├── address
├── address_detail
├── contact_name - 담당자명
├── contact_position - 담당자 직급
├── contact_phone - 담당자 연락처
├── contact_email - 담당자 이메일
├── total_amount - 총 거래금액 (계산)
├── outstanding_amount - 미수금 (계산)
├── last_transaction_date - 최근 거래일
├── status - 상태 (활성/비활성)
├── note
├── created_at
├── updated_at
└── deleted_at
```
---
## API 스펙
### 거래처 CRUD
```
GET /api/customers - 거래처 목록
GET /api/customers/{id} - 거래처 상세
POST /api/customers - 거래처 등록
PUT /api/customers/{id} - 거래처 수정
DELETE /api/customers/{id} - 거래처 삭제
DELETE /api/customers - 거래처 일괄 삭제
```
### 목록 조회 Query Parameters
| 파라미터 | 타입 | 설명 |
|----------|------|------|
| credit_grade | string | 신용등급 필터 |
| status | string | 상태 필터 |
| search | string | 검색어 |
| page | number | 페이지 번호 |
| per_page | number | 페이지당 개수 |
---
## 신용등급
| 등급 | 설명 | 결제조건 |
|------|------|----------|
| 1등급 | 최우수 | 후불/여신 가능 |
| 2등급 | 우수 | 일부 여신 가능 |
| 3등급 | 보통 | 선불 또는 COD |
| 4등급 | 주의 | 선불 필수 |
---
## 결제조건 옵션
- 선불
- 착불
- 후불 30일
- 후불 60일
- 월말정산
- 기타
---
## 채번 규칙
```
거래처코드: C-{순번6자리}
예시: C-000001, C-000002
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 277 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 235 KiB

View File

@@ -0,0 +1,604 @@
# 기준정보 분석 결과
> 분석 일시: 2024-12-18
> 분석 대상: design/mes기획서_리액트 (디자인팀 기획 사이트)
## 분석 목적
디자인팀에서 제작한 기획 사이트의 **기준정보** 메뉴를 분석하여 API 개발에 필요한 스펙을 추출합니다.
---
## 메뉴 구조
기준정보 메뉴는 크게 3가지 유형으로 분류됩니다:
| 유형 | 메뉴 | 설명 |
|------|------|------|
| **EAV 메타관리** | 품목/공정/검사/현장/수주 기준관리 | 폼 템플릿 동적 구성 |
| **마스터 데이터** | 생산/출고 기준관리, 공정관리, 채번관리, 공통코드, 문서양식 | 고정 스키마 데이터 |
| **수식 엔진** | 견적수식관리 | 자동 견적 산출 |
---
## 1. 품목기준관리 (EAV 메타)
![품목기준관리](screenshots/01-item-master-list.png)
### 개요
품목 등록 폼의 구조를 동적으로 정의하는 메타데이터 관리 시스템입니다.
### 페이지 구성
| 코드 | 페이지명 | 경로 |
|------|----------|------|
| FG | 품목 등록 / 제품 | /제품관리/품목_등록 |
### 섹션 구조
| 섹션명 | 항목 | 속성 |
|--------|------|------|
| 기본정보 | 품목코드, 품목명, 분류 | text, required 등 |
| BOM | BOM 필요 | toggle |
### 탭 구조 (EAV)
```
계층구조 → 섹션 → 항목 → 속성
```
---
## 2. 공정기준관리 (EAV 메타)
![공정기준관리](screenshots/02-process-master.png)
### 개요
공정 등록 폼의 구조를 정의합니다.
### 페이지 구성
| 코드 | 페이지명 | 경로 |
|------|----------|------|
| PROD | 공정 등록 / 생산 | /기준정보/공정_등록 |
### 섹션 구조
| 섹션명 | 항목 |
|--------|------|
| 기본정보 | 공정코드, 공정명, 공정구분, 담당부서 |
| 자원정보 | 설비정보, 필요인원 |
| 작업정보 | 작업일지 양식, 공정흐름코드, 설명 |
---
## 3. 검사기준관리 (EAV 메타)
![검사기준관리](screenshots/03-inspection-master.png)
### 개요
검사 기준 및 검사 성적서 폼 구조를 정의합니다.
### 페이지 구성
| 코드 | 페이지명 | 설명 |
|------|----------|------|
| IQC | 검사기준 등록 | 검사 템플릿 |
| IQC | 수입검사성적서 | 수입 자재 검사 |
| PQC | 중간검사성적서 | 공정 중간검사 |
### 탭 구조
```
계층구조 | 섹션 | 검사항목 | 속성 | 검사템플릿 | KS규격 | 샘플링기준
```
### KS규격 연동
- 산업 표준 검사 기준 참조
- 샘플링 기준 자동 적용
---
## 4. 현장기준관리 (EAV 메타)
![현장기준관리](screenshots/04-site-master.png)
### 개요
현장 등록 폼의 구조를 정의합니다.
### 페이지 구성
| 코드 | 페이지명 | 경로 |
|------|----------|------|
| NEW | 현장 등록 / 신축 | /판매관리/현장_등록 |
### 섹션 구조
| 섹션명 | 항목 |
|--------|------|
| 기본정보 | 현장코드, 현장명, 거래처, 카테고리, 상태, 위치 |
| 계약정보 | 계약시작일, 계약종료일 |
| 담당자정보 | 현장소장, 연락처 |
---
## 5. 수주기준관리 (EAV 메타)
![수주기준관리](screenshots/05-order-master.png)
### 개요
수주 등록 폼의 구조를 정의합니다. 가장 복잡한 EAV 구조를 가집니다.
### 페이지 구성
| 코드 | 페이지명 | 설명 |
|------|----------|------|
| NORMAL | 일반 수주 | 신규 수주 |
| ADDITIONAL | 추가 수주 | 기존 현장 추가 수주 |
### 섹션 구조 (6개)
| 섹션명 | 주요 항목 |
|--------|----------|
| 기본정보 | 수주번호, 수주일, 거래처, 현장 |
| 납품정보 | 납품예정일, 설치예정일 |
| 품목정보 | 제품카테고리, 제품명, 수량 |
| 제작사양 | 가로(W), 세로(H), 설치유형, 모터전원, 제어기 |
| 금액정보 | 단가, 금액, 부가세 |
| 기타정보 | 비고, 특이사항 |
### 제작사양 필드 (방화셔터 특화)
- **가로(W)**: 개구폭 (mm)
- **세로(H)**: 개구높이 (mm)
- **설치유형**: 벽면형, 측면형, 혼합형
- **모터전원**: 220V, 380V
- **제어기**: 유선, 무선
- **샤프트 규격**: 4", 5", 6", 8" (자동 산출)
---
## 6. 생산기준관리
![생산기준관리](screenshots/06-production-master.png)
### 개요
생산 관련 마스터 데이터 관리 페이지 모음입니다.
### 페이지 구성
| 코드 | 페이지명 | 설명 |
|------|----------|------|
| WO | 작업지시 목록 | 작업지시 조회/관리 |
| WO | 작업지시 등록 | 신규 작업지시 생성 |
| EQ | 설비 목록 | 생산 설비 관리 |
| LN | 라인/작업장 목록 | 생산 라인 관리 |
| BOM | BOM 목록 | 자재명세서 관리 |
### 공통 UI 패턴
- 검색조건 영역
- 리포트카드 (요약 통계)
- 목록테이블
---
## 7. 출고기준관리
![출고기준관리](screenshots/07-shipment-master.png)
### 개요
출고 관련 마스터 데이터 관리 페이지 모음입니다.
### 페이지 구성
| 코드 | 페이지명 | 설명 |
|------|----------|------|
| DM | 배송방법 | 배송 방법 코드 관리 |
| CR | 배송업체 | 운송 업체 정보 |
| SS | 출하상태 | 출하 상태 코드 |
| PK | 포장기준 | 포장 규격 정보 |
| VH | 차량 | 배송 차량 관리 |
| SD | 출하문서 | 출하 문서 양식 |
---
## 8. 공정관리
![공정관리](screenshots/08-process-list.png)
### 개요
실제 공정 목록을 관리합니다. (EAV 메타가 아닌 실제 데이터)
### 공정 목록
| 공정코드 | 공정명 | 구분 | 담당부서 |
|----------|--------|------|----------|
| P-001 | 스크린 | 제조 | 스크린팀 |
| P-002 | 절곡 | 제조 | 절곡팀 |
| P-003 | 슬랫 | 제조 | 슬랫팀 |
| P-004 | 재고(포밍) | 반제품생산 | 절곡팀 |
### 테이블 컬럼
| 컬럼 | 설명 |
|------|------|
| 공정코드 | P-### 형식 |
| 공정명 | 공정 이름 |
| 구분 | 제조, 반제품생산 등 |
| 담당부서 | 담당 부서명 |
| 분류규칙 | 품목 분류 규칙 |
| 인원 | 필요 인원 |
| 상태 | 활성/비활성 |
---
## 9. 채번관리
![채번관리](screenshots/09-numbering-list.png)
### 개요
시스템 전체의 자동 채번 규칙을 관리합니다.
### 채번 규칙 목록 (15개)
| 번호기준 이름 | 적용 대상 | 접두사 | 날짜 형식 | 순번 자릿수 | 리셋 주기 | 예시 |
|---------------|-----------|--------|-----------|-------------|-----------|------|
| 출고번호 | 출고 | OUT | YYMMDD | 3 | 일별 | OUT241218-001 |
| 현장코드 | 현장 | S | YYMM | 3 | 월별 | S-2412-001 |
| 출하번호 | 출하 | KD-SH | YY | 4 | 연별 | KD-SH-24-0001 |
| 작업지시번호 | 작업지시 | KD-WO | YY | 4 | 연별 | KD-WO-24-0001 |
| 검사LOT | 검사 | KD-IQC | YYMM | 4 | 월별 | KD-IQC-2412-0001 |
| 생산LOT | 생산 | KD-PL | YYMM | 4 | 월별 | KD-PL-2412-0001 |
| 수주번호(일반) | 수주 | KD-TS | YY | 4 | 연별 | KD-TS-24-0001 |
| 수주번호(슬랫) | 수주 | KD-SL | YY | 4 | 연별 | KD-SL-24-0001 |
| 수주번호(비드) | 수주 | KD-BD | YY | 4 | 연별 | KD-BD-24-0001 |
| ... | ... | ... | ... | ... | ... | ... |
### 데이터 스키마
```
numbering_rules
├── id (PK)
├── tenant_id (FK)
├── name - 번호기준 이름
├── target_entity - 적용 대상 (orders, shipments, work_orders 등)
├── prefix - 접두사
├── date_format - 날짜 형식 (YY, YYMM, YYMMDD)
├── sequence_digits - 순번 자릿수
├── reset_period - 리셋 주기 (daily, monthly, yearly)
├── current_sequence - 현재 순번
├── last_reset_date - 마지막 리셋일
├── separator - 구분자 (-, _, 없음)
├── status - 상태
├── created_at
└── updated_at
```
### API 스펙
```
GET /api/numbering-rules - 채번 규칙 목록
GET /api/numbering-rules/{id} - 채번 규칙 상세
POST /api/numbering-rules - 채번 규칙 등록
PUT /api/numbering-rules/{id} - 채번 규칙 수정
DELETE /api/numbering-rules/{id} - 채번 규칙 삭제
POST /api/numbering-rules/{id}/generate - 번호 생성
POST /api/numbering-rules/{id}/reset - 순번 리셋
```
---
## 10. 공통코드관리
![공통코드관리](screenshots/10-common-code-list.png)
### 개요
시스템 전체에서 사용하는 코드 체계를 관리합니다.
### 코드 카테고리 (8개)
| 카테고리 | 건수 | 패턴 예시 | 설명 |
|----------|------|-----------|------|
| 기본코드 | - | C-001 | 기본 분류 코드 |
| 부자재 | - | BP-GR-001 | 부자재 품목 코드 |
| 원자재 | - | SCR-0.3T | 원자재 규격 코드 |
| 구매부품 | - | E-220V-300KG | 구매 부품 코드 |
| 절곡부품 | - | RC24 | 절곡 부품 코드 |
| 셔터종류 | - | SCR, SLT | 셔터 유형 코드 |
| 인정제품 | - | - | 인정 제품 코드 |
| 신규인정 | - | - | 신규 인정 코드 |
### 데이터 스키마
```
common_codes
├── id (PK)
├── tenant_id (FK)
├── category - 코드 카테고리
├── code - 코드값 (UNIQUE within category)
├── name - 코드명
├── description - 설명
├── parent_id (FK, self) - 상위 코드 (계층 구조)
├── sort_order - 정렬 순서
├── is_system - 시스템 코드 여부 (수정 불가)
├── status - 상태
├── created_at
└── updated_at
```
### API 스펙
```
GET /api/common-codes - 공통코드 목록
GET /api/common-codes/{id} - 공통코드 상세
POST /api/common-codes - 공통코드 등록
PUT /api/common-codes/{id} - 공통코드 수정
DELETE /api/common-codes/{id} - 공통코드 삭제
GET /api/common-codes/categories - 카테고리 목록
GET /api/common-codes/by-category/{category} - 카테고리별 코드
```
---
## 11. 견적수식관리
![견적수식관리](screenshots/11-quote-formula-list.png)
### 개요
자동 견적 산출을 위한 수식 엔진을 관리합니다.
### 수식 현황
- **총 수식 수**: 44개
- **제품**: 공통 (제품별 확장 가능)
- **카테고리**: 13개 (실행 순서 기반)
### 카테고리 및 실행 순서
| 순서 | 카테고리명 | 수식 수 | 설명 |
|------|------------|---------|------|
| 1 | 기본정보 | 10 | 입력값 정의 |
| 2 | 제작사이즈 | 0 | 제작 치수 계산 |
| 3 | 면적&중량 | 1 | 면적/중량 산출 |
| 4 | 모터용량산출 | 2 | 모터 용량 결정 |
| 5 | 브라켓&받침용앵글 | 4 | 브라켓 수량 계산 |
| 6 | 감기샤프트 | 2 | 샤프트 규격 선정 |
| 7 | 가이드레일 | 7 | 레일 수량 계산 |
| 8 | 연기차단재 | 0 | 연기차단재 산출 |
| 9 | 셔터박스(케이스) | 9 | 케이스 규격 산출 |
| 10 | 하단마감재 | 2 | 마감재 산출 |
| 11 | 부자재 | 4 | 부자재 수량 |
| 12 | 구매부품 | 3 | 구매부품 수량 |
| 13 | 장수산출 | 0 | 최종 장수 계산 |
### 기본정보 변수
| 순서 | 이름 | 변수 | 타입 | 설명 |
|------|------|------|------|------|
| 1 | 제품구분 | PC | 계산식 | 스크린/철재 |
| 2 | 오픈사이즈 가로 | W0 | 계산식 | 고객 주문 가로 (mm) |
| 3 | 오픈사이즈 세로 | H0 | 계산식 | 고객 주문 세로 (mm) |
| 4 | 샤프트 규격 | SHAFT_INCH | 계산식 | 4"/5"/6"/8" |
| 5 | 설치유형 | INSTALL_TYPE | 계산식 | 벽면형/측면형/혼합형 |
| 6 | 모터 전원 | MP | 계산식 | 220V/380V |
| 7 | 유선/무선 | WIRE | 계산식 | 유선/무선 |
| 8 | 연동제어기 타입 | CT | 계산식 | 매립/노출 |
| 9 | 수량 | QTY | 계산식 | 주문 수량 |
| 10 | 케이스 사이즈 | CASE_SIZE | 계산식 | 스크린500*350/철재650*500 |
### 데이터 스키마
```
quote_formulas
├── id (PK)
├── tenant_id (FK)
├── product_code - 제품 코드 (공통 또는 특정 제품)
├── category_id (FK) - 카테고리
├── sort_order - 실행 순서
├── name - 수식 이름
├── variable_name - 변수명 (W0, H0, SHAFT_INCH 등)
├── formula_type - 타입 (input, formula, lookup, condition)
├── formula_expression - 수식 표현식
├── result_type - 결과 타입 (number, text, output)
├── description - 설명
├── status - 상태
├── created_at
└── updated_at
quote_formula_categories
├── id (PK)
├── tenant_id (FK)
├── name - 카테고리명
├── execution_order - 실행 순서
├── formula_count - 수식 수 (계산 필드)
├── status
└── created_at
```
### API 스펙
```
GET /api/quote-formulas - 수식 목록
GET /api/quote-formulas/{id} - 수식 상세
POST /api/quote-formulas - 수식 등록
PUT /api/quote-formulas/{id} - 수식 수정
DELETE /api/quote-formulas/{id} - 수식 삭제
GET /api/quote-formula-categories - 카테고리 목록
POST /api/quote-formulas/calculate - 견적 계산 실행
# 수식 관리 버튼
POST /api/quote-formulas/products/{code}/formulas - 품목 수식 관리
POST /api/quote-formulas/categories - 분류 관리
POST /api/quote-formulas/prices - 단가 수식 관리
POST /api/quote-formulas/auto-calculate - 자동 견적 산출
```
---
## 12. 문서양식관리
![문서양식관리](screenshots/12-document-template-list.png)
### 개요
시스템에서 사용하는 문서 양식을 관리합니다.
### 문서 현황
- **총 문서 양식**: 29개
- **카테고리**: 5개
### 카테고리별 문서
| 카테고리 | 건수 | 문서 목록 |
|----------|------|-----------|
| 판매문서 | 4 | 견적서(QT), 견적산출내역서(QT-DTL), 수주확인서(SO), 거래명세서(SL) |
| 생산문서 | 11 | 작업지시서(WO), 스크린 생산지시서(WO-SCR), 슬랫 생산지시서(WO-SLT), 절곡 생산지시서(WO-FLD), 발주서(PO), 생산실적보고서(PR), 스크린 작업일지(WL-SCR), 절곡 작업일지(WL-FLD), 슬랫 작업일지(WL-SLT), 재고생산 작업일지(WL-STK), 포장 작업일지(WL-PKG) |
| 품질문서 | 7 | 수입검사성적서(IQC), 중간검사성적서(PQC), 스크린 중간검사성적서(PQC-SCR), 절곡품 중간검사성적서(PQC-BND), 제품검사성적서(FQC), 부적합품보고서(NCR), 제품검사신청서(FQC-REQ) |
| 물류문서 | 4 | 입고전표(GR), 출고전표(GI), 배송지시서(DL), 납품확인서(DC) |
| 회계문서 | 3 | 세금계산서(INV), 매출장(SLS), 매입장(PUR) |
### 문서 상세
#### 판매문서
| 코드 | 문서명 | 템플릿 | 설명 |
|------|--------|--------|------|
| QT | 견적서 | O | 고객에게 제출하는 견적서 |
| QT-DTL | 견적산출내역서 | O | 견적 상세 산출내역 |
| SO | 수주확인서 | O | 수주 확정 문서 |
| SL | 거래명세서 | O | 출하 시 발행하는 거래명세서 |
#### 생산문서
| 코드 | 문서명 | 템플릿 | 설명 |
|------|--------|--------|------|
| WO | 작업지시서 | O | 생산 작업지시 문서 (공통) |
| WO-SCR | 스크린 생산지시서 | - | 스크린 공정 생산지시서 |
| WO-SLT | 슬랫 생산지시서 | - | 슬랫 공정 생산지시서 |
| WO-FLD | 절곡 생산지시서 | - | 절곡 공정 생산지시서 |
| PO | 발주서 | O | 자재/외주 발주 문서 |
| PR | 생산실적보고서 | - | 생산 완료 실적 보고 |
| WL-SCR | 스크린 작업일지 | O | 스크린 생산부서 작업일지 |
| WL-FLD | 절곡 작업일지 | O | 절곡 생산부서 작업일지 |
| WL-SLT | 슬랫 작업일지 | O | 슬랫 생산부서 작업일지 |
| WL-STK | 재고생산 작업일지 | O | 절곡품 재고생산 작업일지 (중간검사성적서 포함) |
| WL-PKG | 포장 작업일지 | - | 포장 생산부서 작업일지 |
#### 품질문서
| 코드 | 문서명 | 템플릿 | 설명 |
|------|--------|--------|------|
| IQC | 수입검사성적서 | O | 수입 자재 검사 성적서 |
| PQC | 중간검사성적서 | O | 공정 중간검사 성적서 |
| PQC-SCR | 스크린 중간검사성적서 | O | 스크린 제품 중간검사 |
| PQC-BND | 절곡품 중간검사성적서 | O | 절곡품 중간검사 |
| FQC | 제품검사성적서 | O | 출하 후 고객요청 검사 성적서 |
| NCR | 부적합품보고서 | - | 불합격 판정 보고서 |
| FQC-REQ | 제품검사신청서 | - | 자동방화셔터 제품검사요청서 |
#### 물류문서
| 코드 | 문서명 | 템플릿 | 설명 |
|------|--------|--------|------|
| GR | 입고전표 | - | 자재 입고 전표 |
| GI | 출고전표 | - | 자재 출고 전표 |
| DL | 배송지시서 | - | 출하 배송 지시서 |
| DC | 납품확인서 | O | 현장 납품 확인서 (자재내역, 절곡내역, 도면 포함) |
#### 회계문서
| 코드 | 문서명 | 템플릿 | 설명 |
|------|--------|--------|------|
| INV | 세금계산서 | O | 세금계산서 |
| SLS | 매출장 | - | 매출 기록 문서 |
| PUR | 매입장 | - | 매입 기록 문서 |
### 데이터 스키마
```
document_templates
├── id (PK)
├── tenant_id (FK)
├── code (UNIQUE) - 문서 코드
├── name - 문서명
├── category - 카테고리 (판매문서, 생산문서, 품질문서, 물류문서, 회계문서)
├── description - 설명
├── has_template - 템플릿 여부
├── template_file - 템플릿 파일 경로
├── template_engine - 템플릿 엔진 (blade, html, pdf)
├── data_source - 데이터 소스 테이블
├── status - 상태
├── created_at
└── updated_at
```
### API 스펙
```
GET /api/document-templates - 문서양식 목록
GET /api/document-templates/{id} - 문서양식 상세
POST /api/document-templates - 문서양식 등록
PUT /api/document-templates/{id} - 문서양식 수정
DELETE /api/document-templates/{id} - 문서양식 삭제
GET /api/document-templates/{id}/preview - 미리보기
POST /api/document-templates/{id}/generate - 문서 생성
GET /api/document-templates/by-category/{cat} - 카테고리별 조회
```
---
## EAV 공통 스키마
기준관리 메뉴들 (품목, 공정, 검사, 현장, 수주)은 공통적인 EAV 구조를 따릅니다.
### 페이지 정의
```
form_pages
├── id (PK)
├── tenant_id (FK)
├── page_code (UNIQUE) - 페이지 코드 (FG, PROD, IQC, NEW, NORMAL 등)
├── page_name - 페이지명
├── page_path - 경로
├── target_entity - 대상 엔티티 (items, processes, inspections 등)
├── description
├── status
├── created_at
└── updated_at
```
### 섹션 정의
```
form_sections
├── id (PK)
├── page_id (FK)
├── section_code - 섹션 코드
├── section_name - 섹션명
├── sort_order - 정렬 순서
├── is_collapsible - 접기 가능 여부
├── default_expanded - 기본 펼침 여부
├── status
└── created_at
```
### 필드(항목) 정의
```
form_fields
├── id (PK)
├── section_id (FK)
├── field_code - 필드 코드
├── field_name - 필드명
├── field_type - 타입 (text, number, select, date, toggle 등)
├── is_required - 필수 여부
├── default_value - 기본값
├── validation_rules - 유효성 규칙 (JSON)
├── options - 선택 옵션 (JSON, select 타입용)
├── placeholder - 플레이스홀더
├── help_text - 도움말
├── sort_order - 정렬 순서
├── status
└── created_at
```
### 필드 속성
```
form_field_attributes
├── id (PK)
├── field_id (FK)
├── attribute_key - 속성 키
├── attribute_value - 속성 값
└── created_at
```
---
## 요약
### 분석 완료 항목
| 메뉴 | 유형 | 스크린샷 | 상태 |
|------|------|----------|------|
| 품목기준관리 | EAV 메타 | 01-item-master-list.png | ✅ |
| 공정기준관리 | EAV 메타 | 02-process-master.png | ✅ |
| 검사기준관리 | EAV 메타 | 03-inspection-master.png | ✅ |
| 현장기준관리 | EAV 메타 | 04-site-master.png | ✅ |
| 수주기준관리 | EAV 메타 | 05-order-master.png | ✅ |
| 생산기준관리 | 마스터 | 06-production-master.png | ✅ |
| 출고기준관리 | 마스터 | 07-shipment-master.png | ✅ |
| 공정관리 | 마스터 | 08-process-list.png | ✅ |
| 채번관리 | 마스터 | 09-numbering-list.png | ✅ |
| 공통코드관리 | 마스터 | 10-common-code-list.png | ✅ |
| 견적수식관리 | 수식엔진 | 11-quote-formula-list.png | ✅ |
| 문서양식관리 | 마스터 | 12-document-template-list.png | ✅ |
### 구현 우선순위
1. **1순위**: 채번관리, 공통코드관리 (다른 기능의 의존성)
2. **2순위**: EAV 공통 스키마 (품목/공정/검사/현장/수주 기준관리)
3. **3순위**: 견적수식관리 (견적 기능 의존)
4. **4순위**: 문서양식관리 (PDF 출력 기능)
5. **5순위**: 생산/출고 기준관리, 공정관리 (마스터 데이터)

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 440 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 545 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 512 KiB

View File

@@ -0,0 +1,58 @@
# 수주 관련 메뉴 구조 분석
> 분석 일시: 2024-12-18
> 소스: design/mes기획서_리액트/src/configs/menuDefinitions.js
## 메뉴 그룹 구조
### 1. 판매관리 (salesMenus)
| 메뉴 ID | 라벨 | 아이콘 | 수주 관련도 |
|---------|------|--------|------------|
| customer | 거래처관리 | Users | 연관 (거래처 정보) |
| quote | 견적관리 | FileText | **핵심** (견적→수주 전환) |
| order | 수주관리 | Package | **핵심** |
| site | 현장관리 | Building | 연관 (납품 현장) |
| price | 단가관리 | DollarSign | 연관 (단가 적용) |
### 2. 기준정보 (masterMenus)
| 메뉴 ID | 라벨 | 아이콘 | 수주 관련도 |
|---------|------|--------|------------|
| order-master | 수주기준관리 | Package | **핵심** (수주 설정) |
| quote-formula | 견적수식관리 | Calculator | 연관 (견적 계산) |
| document-template | 문서양식관리 | FileText | 연관 (수주 문서) |
| number-rule | 채번관리 | ClipboardList | 연관 (수주번호 규칙) |
### 3. 회계관리 (accountingMenus)
| 메뉴 ID | 라벨 | screenId | 수주 관련도 |
|---------|------|----------|------------|
| sales-account | 매출관리 | A1 | 연관 (수주→매출) |
| sales-list | 매출 목록 | A1 | 출하 완료된 매출 건 조회 |
| sales-statement | 거래명세서 | A1-1 | 출하 건 거래명세서 발행 |
| sales-tax-invoice | 세금계산서 | A1-2 | 전자세금계산서 발행 |
| cost-analysis | 원가관리 | A5 | 수주별 원가 집계 |
| cost-detail | 원가 상세 | A5-1 | 수주별 원가 상세 분석 |
## 수주 핵심 화면 목록
### 필수 분석 대상
1. **견적관리** (`quote`) - 견적 목록/등록/상세
2. **수주관리** (`order`) - 수주 목록/등록/상세
3. **수주기준관리** (`order-master`) - 수주 설정
### 연관 화면
- 거래처관리 (`customer`)
- 현장관리 (`site`)
- 단가관리 (`price`)
- 채번관리 (`number-rule`)
## 비즈니스 흐름
```
견적(quote) → 수주전환 → 수주(order) → 생산지시 → 출하 → 매출(sales-account)
```
## 다음 분석 단계
1. orderMasterConfig.js - 수주 데이터 스키마
2. QuoteDetailNew.jsx - 견적 UI 구조
3. App.jsx 내 수주 섹션 - 비즈니스 로직

View File

@@ -0,0 +1,154 @@
# 수주 데이터 스키마 분석
> 분석 일시: 2024-12-18
> 소스: design/mes기획서_리액트/src/configs/orderMasterConfig.js
## 수주 유형 (entityTypes)
| ID | 코드 | 이름 | 설명 |
|----|------|------|------|
| 1 | NORMAL | 일반수주 | 견적 기반 일반 수주 |
| 2 | ADDITIONAL | 추가수주 | 기존 수주 추가분 |
| 3 | DIRECT | 직접수주 | 견적 없이 직접 입력 |
## 제품 카테고리 (생산공정 분류)
| ID | 코드 | 이름 |
|----|------|------|
| 1 | SCREEN | 스크린 |
| 2 | FOLD | 절곡 |
| 3 | SLAT | 슬랫 |
| 4 | ASSY | 조립 |
## 섹션 구조 (masterSections)
| ID | 키 | 이름 | 타입 | 설명 |
|----|-----|------|------|------|
| 1 | basicInfo | 기본정보 | general | 수주 기본 정보 |
| 2 | deliveryInfo | 납품정보 | general | 납품 관련 정보 |
| 3 | itemInfo | 품목정보 | **multiRow** | 수주 품목 목록 |
| 4 | productionSpec | 제작사양 | **multiRow** | 제작 상세 사양 |
| 5 | amountInfo | 금액정보 | general | 금액 합계 |
| 6 | etcInfo | 기타정보 | general | 기타 정보 |
---
## 필드 상세 (masterFields)
### 기본정보 (basicInfo)
| ID | 필드키 | 필드명 | 입력타입 | 필수 | 자동생성 | 설명 |
|----|--------|--------|----------|------|----------|------|
| 1 | orderNo | 수주번호 | text | ✅ | ✅ | 수주 식별 번호 |
| 2 | orderDate | 수주일 | date | ✅ | - | 수주 등록일 |
| 3 | quoteNo | 견적번호 | text | - | - | 연결된 견적번호 |
| 4 | customerName | 거래처명 | text | ✅ | - | 거래처명 |
| 5 | customerId | 거래처ID | text | - | - | 거래처 식별자 |
| 6 | siteName | 현장명 | text | ✅ | - | 설치 현장명 |
| 7 | manager | 담당자 | text | - | - | 거래처 담당자 |
| 8 | contact | 연락처 | text | - | - | 담당자 연락처 |
### 납품정보 (deliveryInfo)
| ID | 필드키 | 필드명 | 입력타입 | 필수 | 옵션 |
|----|--------|--------|----------|------|------|
| 10 | dueDate | 납기일 | date | ✅ | - |
| 11 | deliveryMethod | 배송방법 | select | - | 직접배차, 상차, 택배, 화물, 직접배송 |
| 12 | deliveryAddress | 납품주소 | text | - | - |
| 13 | receiverName | 수령자명 | text | - | - |
| 14 | receiverPhone | 수령자연락처 | text | - | - |
### 품목정보 (itemInfo) - 다중행
| ID | 필드키 | 필드명 | 입력타입 | 필수 | 옵션/검증 |
|----|--------|--------|----------|------|----------|
| 20 | productCode | 품목코드 | text | - | - |
| 21 | productName | 품목명 | select | ✅ | 국민방화스크린셔터, 방화셔터, 방연셔터 |
| 22 | category | 카테고리 | select | - | 스크린, 절곡, 슬랫, 조립 |
| 23 | floor | 층 | text | - | - |
| 24 | location | 위치 | text | - | - |
| 25 | openWidth | 개구폭(mm) | number | ✅ | min:500, max:15000 |
| 26 | openHeight | 개구높이(mm) | number | ✅ | min:500, max:10000 |
| 27 | qty | 수량 | number | ✅ | min:1 |
| 28 | unitPrice | 단가 | number | - | - |
| 29 | amount | 금액 | number | - | **자동계산** |
### 제작사양 (productionSpec) - 다중행
| ID | 필드키 | 필드명 | 입력타입 | 자동계산 | 옵션 |
|----|--------|--------|----------|----------|------|
| 30 | prodWidth | 제작폭(mm) | number | ✅ | 개구폭+140 |
| 31 | prodHeight | 제작높이(mm) | number | ✅ | MAX(개구높이+400, 2950) |
| 32 | guideRailType | 가이드레일형태 | select | - | 백면형, 양면형, 편면형 |
| 33 | guideRailSpec | 가이드레일규격 | select | - | 120-70, 150-80, 180-90 |
| 34 | finish | 마감 | select | - | SUS마감, 분체도장, 용융아연 |
| 35 | shaft | 샤프트 | number | ✅ | 폭>6000:5인치, 그외:4인치 |
| 36 | capacity | 전동용량 | number | ✅ | 폭>6000:300kg, 그외:160kg |
### 금액정보 (amountInfo)
| ID | 필드키 | 필드명 | 입력타입 | 자동계산 |
|----|--------|--------|----------|----------|
| 40 | totalAmount | 총금액 | number | ✅ (품목 금액 합계) |
### 기타정보 (etcInfo)
| ID | 필드키 | 필드명 | 입력타입 |
|----|--------|--------|----------|
| 50 | note | 비고 | textarea |
---
## 자동계산 규칙 (calculations)
| 필드 | 수식 | 설명 |
|------|------|------|
| prodWidth | `openWidth + 140` | 제작폭 = 개구폭 + 140 |
| prodHeight | `MAX(openHeight + 400, 2950)` | 제작높이 = MAX(개구높이+400, 2950) |
| shaft | `openWidth > 6000 ? 5 : 4` | 샤프트 인치 |
| capacity | `openWidth > 6000 ? 300 : 160` | 전동용량 kg |
| amount | `qty * unitPrice` | 금액 = 수량 × 단가 |
| totalAmount | `SUM(items.amount)` | 총금액 = 품목 금액 합계 |
---
## 페이지 템플릿
### 일반 수주 (order_normal)
- 경로: `/판매관리/수주_등록`
- 유형: NORMAL
- 섹션: 기본정보 → 납품정보 → 품목정보 → 제작사양 → 금액정보 → 기타정보
### 추가 수주 (order_additional)
- 경로: `/판매관리/수주_추가`
- 유형: ADDITIONAL
- 섹션: 기본정보(간소화) → 추가 품목 → 기타정보
---
## API 엔드포인트 추정
### 수주 CRUD
```
GET /api/orders - 수주 목록
GET /api/orders/{id} - 수주 상세
POST /api/orders - 수주 등록
PUT /api/orders/{id} - 수주 수정
DELETE /api/orders/{id} - 수주 삭제
```
### 관련 API
```
GET /api/orders/{id}/items - 수주 품목 목록
POST /api/orders/{id}/items - 품목 추가
PUT /api/orders/{id}/items/{itemId} - 품목 수정
DELETE /api/orders/{id}/items/{itemId} - 품목 삭제
POST /api/orders/from-quote/{quoteId} - 견적에서 수주 전환
```
---
## 다음 분석 단계
1. QuoteDetailNew.jsx, QuoteDocumentDialogs.jsx - UI 구조 및 액션
2. App.jsx 수주 섹션 - 비즈니스 로직, 상태 관리

View File

@@ -0,0 +1,245 @@
# 견적/수주 UI 분석
> 분석 일시: 2024-12-18
> 소스:
> - design/mes기획서_리액트/src/components/QuoteDetailNew.jsx
> - design/mes기획서_리액트/src/components/QuoteDocumentDialogs.jsx
## QuoteDetailNew.jsx - 견적 상세
### Props
| Prop | 타입 | 설명 |
|------|------|------|
| quote | Object | 견적 데이터 |
| orders | Array | 수주 목록 (관련 수주 찾기용) |
| onNavigate | Function | 화면 이동 |
| onBack | Function | 목록으로 돌아가기 |
| onConvertToOrder | Function | 수주 전환 콜백 |
| onUpdateQuote | Function | 견적 업데이트 콜백 |
| onCreateOrder | Function | 수주 생성 콜백 |
### 견적 상태 (StatusBadge)
| 상태 | 스타일 | 설명 |
|------|--------|------|
| 최초작성 | gray | 초기 상태 |
| 최종확정 | blue | 견적 확정 |
| 수주전환 | green | 수주로 전환됨 |
| 수정중 | yellow | 수정 진행 중 |
### 화면 구성
```
┌─────────────────────────────────────────────────────────────┐
│ [헤더] │
│ 좌: 견적 상세 + [견적서] [산출내역서] [발주서] 버튼 │
│ 우: [목록] [수정] [최종확정] [수주전환] 버튼 │
├─────────────────────────────────────────────────────────────┤
│ [기본 정보] Card │
│ - 견적번호, 작성자, 발주처, 담당자, 연락처 │
│ - 현장명, 현장코드, 상태, 접수일, 납기일, 비고 │
├─────────────────────────────────────────────────────────────┤
│ [자동 견적 산출 정보] Card │
│ - 품목, 수량, 단가, 공급가액, 부가세, 총 견적금액 │
├─────────────────────────────────────────────────────────────┤
│ [특이사항] Card │
│ - 특이사항 텍스트 │
└─────────────────────────────────────────────────────────────┘
```
### 수주전환 모달 (convertForm)
| 필드 | 타입 | 필수 | 설명 |
|------|------|------|------|
| shipDate | date | - | 출하예정일 |
| shipDateUndecided | boolean | - | 출하일 미정 여부 |
| dueDate | date | - | 납기일 |
| dueDateUndecided | boolean | - | 납기일 미정 여부 |
| deliveryMethod | select | - | 배송방법 (상차/택배/직접배송) |
| freightCost | select | - | 운임비 (선불/착불/무료) |
| receiverName | text | - | 수령자명 |
| receiverPhone | text | - | 수령자연락처 |
| deliveryAddress | text | - | 납품주소 |
| deliveryAddressDetail | text | - | 상세주소 |
| note | textarea | - | 비고 |
### 수주전환 비즈니스 로직
```javascript
// 수주번호 생성 규칙
const dateCode = new Date().toISOString().slice(2,10).replace(/-/g, '');
const newOrderNo = `KD-SO-${dateCode}-${순번2자리}`;
// 예: KD-SO-241218-01
// 생성되는 수주 데이터
const newOrder = {
id: Date.now(),
orderNo: newOrderNo, // 자동생성 수주번호
quoteNo: quote.quoteNo, // 원본 견적번호
quoteId: quote.id, // 원본 견적 ID
orderDate: '오늘 날짜',
customerName: quote.customerName,
siteName: quote.siteName,
siteAddress: quote.deliveryAddress,
manager: quote.manager,
contact: quote.contact,
productName: quote.productName,
qty: quote.qty,
totalAmount: quote.finalAmount || quote.totalAmount,
status: '수주확정', // 초기 상태
dueDate: convertForm.dueDate,
shipDate: convertForm.shipDate,
deliveryMethod: convertForm.deliveryMethod,
freightCost: convertForm.freightCost,
receiverName: convertForm.receiverName,
receiverPhone: convertForm.receiverPhone,
deliveryAddress: convertForm.deliveryAddress,
deliveryAddressDetail: convertForm.deliveryAddressDetail,
note: convertForm.note,
creditGrade: quote.creditGrade,
items: quote.items || [],
history: [{
id: Date.now(),
changedAt: '현재시간',
changeType: '수주등록',
description: `견적(${quote.quoteNo})에서 수주전환`,
changedBy: '현재 사용자',
}],
};
```
---
## QuoteDocumentDialogs.jsx - 문서 출력
### 1. QuoteSheetDialog (견적서)
**구성:**
- 수신자 정보: 상호, 담당자, 연락처, 현장명
- 발신자 정보: 상호, 대표자, 사업자번호, 연락처
- 견적 요약: 견적번호, 견적일, 유효기간(30일), 견적금액
- 품목 테이블: No, 품목명, 규격, 수량, 단가, 금액
- 합계: 공급가액, 부가세(10%), 총 견적금액
- 비고
**액션 버튼:**
- 인쇄 (Printer)
- 다운로드 (Download)
- 이메일 (Mail)
### 2. CalculationSheetDialog (산출내역서)
**구성:**
- 견적번호, 현장명, 작성일
- 산출 테이블: No, 품목, 층/부호, 가로, 세로, 면적(m²), 수량, 단가, 금액
- 합계
- 산출 기준 안내
**면적 계산:**
```javascript
const area = ((item.width || 0) * (item.height || 0) / 1000000).toFixed(2);
```
### 3. PurchaseOrderDialog (발주서)
**구성:**
- 발주처 정보 (귀하): 상호, 담당자, 연락처, 현장
- 수주처 정보: 상호, 대표자, 사업자번호, 연락처
- 발주 요약: 발주번호, 발주일, 납기일, 발주금액
- 품목 테이블: No, 품목명, 규격, 수량, 단가, 금액
- 발주 합계
- 특기사항
- 서명란: 발주자(인), 수주자(인)
**발주번호 생성:**
```javascript
// 견적번호에서 변환
const purchaseOrderNo = `PO-${quote.quoteNo?.replace('QT', '')}`;
// 예: QT-2024-001 → PO-2024-001
```
---
## Quote 데이터 구조
### quote 객체
| 필드 | 타입 | 설명 |
|------|------|------|
| id | number | 견적 ID |
| quoteNo | string | 견적번호 (QT-YYMMDD-##) |
| quoteDate | string | 견적일 |
| customerName | string | 발주처명 |
| manager | string | 담당자 |
| contact | string | 연락처 |
| siteName | string | 현장명 |
| siteCode | string | 현장코드 |
| deliveryAddress | string | 납품주소 |
| productName | string | 대표 품목명 |
| qty | number | 수량 |
| unitPrice | number | 단가 |
| totalAmount | number | 총금액 (공급가액) |
| finalAmount | number | 최종금액 |
| status | string | 상태 |
| dueDate | string | 납기일 |
| createdBy | string | 작성자 |
| note | string | 비고 |
| specialNote | string | 특이사항 |
| creditGrade | string | 신용등급 |
| items | Array | 품목 목록 |
### items[] 객체
| 필드 | 타입 | 설명 |
|------|------|------|
| id | number | 품목 ID |
| productName | string | 품목명 |
| category | string | 카테고리 |
| floor | string | 층 |
| location | string | 위치 |
| width | number | 가로(mm) |
| height | number | 세로(mm) |
| qty | number | 수량 |
| unitPrice | number | 단가 |
| amount | number | 금액 |
| orderStatus | string | 수주 상태 (pending/ordered) |
| orderId | number | 연결된 수주 ID |
---
## API 추정
### 견적 → 수주 전환 API
```
POST /api/orders/from-quote/{quoteId}
Body: {
shipDate: string | null,
dueDate: string | null,
deliveryMethod: string,
freightCost: string,
receiverName: string,
receiverPhone: string,
deliveryAddress: string,
deliveryAddressDetail: string,
note: string
}
Response: {
order: { ... }, // 생성된 수주
quote: { ... } // 업데이트된 견적 (status: '수주전환')
}
```
### 문서 출력 API
```
GET /api/quotes/{id}/documents/quote-sheet - 견적서 PDF
GET /api/quotes/{id}/documents/calculation - 산출내역서 PDF
GET /api/quotes/{id}/documents/purchase-order - 발주서 PDF
POST /api/quotes/{id}/documents/email - 이메일 발송
```
---
## 다음 분석 단계
1. App.jsx 수주 섹션 추출 - 수주 목록/등록/상세 UI
2. 비즈니스 로직 통합 분석

View File

@@ -0,0 +1,313 @@
# App.jsx 수주 섹션 분석
> 분석 일시: 2024-12-18
> 소스: design/mes기획서_리액트/src/App.jsx (52768~56357줄)
## 컴포넌트 위치
| 컴포넌트 | 라인 | 설명 |
|----------|------|------|
| OrderList | 52768 | 수주 목록 |
| OrderDetail | 53479 | 수주 상세 |
| OrderCreate | 55280 | 수주 등록 |
| OrderEdit | 56357 | 수주 수정 |
---
## 1. OrderList (수주 목록)
### Props
```javascript
{
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)
### 정렬
```javascript
.sort((a, b) => b.id - a.id) // ID 기준 내림차순 (최신 등록 최상단)
```
---
## 2. OrderDetail (수주 상세)
### Props
```javascript
{
order, // 수주 데이터
productionOrders, // 생산지시 배열
customers, // 거래처 배열 (결제조건 확인)
onNavigate,
onBack,
onUpdate, // 수주 업데이트
onCreateWorkOrder, // 작업지시 생성
onCreateProductionOrder
}
```
### 문서 탭
| 탭 ID | 라벨 | 용도 |
|-------|------|------|
| contract | 계약서 | 수주 계약 문서 |
| statement | 거래명세서 | 납품 시 발행 |
| purchaseOrder | 발주서 | 발주처 제출용 |
### 분할(Split) 관리
**분할 데이터 구조:**
```javascript
{
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
}
```
### 생산지시 생성 로직
**공정별 작업지시 자동 분리:**
1. **스크린 공정**: 스크린 카테고리 품목
2. **슬랫 공정**: 슬랫/철재 카테고리 품목
3. **절곡 공정**: BOM 데이터 기반 절곡물
**작업지시 번호 생성:**
```javascript
const woNo = `KD-PL-${dateCode}-${순번2자리}`;
// 예: KD-PL-241218-01
```
**공정별 작업 단계:**
```javascript
{
'스크린': ['원단절단', '미싱', '앤드락작업', '중간검사', '포장'],
'슬랫': ['코일절단', '중간검사', '미미작업', '포장'],
'절곡': ['절단', '절곡', '중간검사', '포장'],
}
```
**팀 자동 배정:**
```javascript
{
'스크린': { assignee: '스크린팀', assignees: ['김스크린', '이스크린', '박스크린'] },
'슬랫': { assignee: '슬랫팀', assignees: ['김슬랫', '이슬랫', '박슬랫'] },
'절곡': { assignee: '절곡팀', assignees: ['김절곡', '이절곡'] },
}
```
---
## 3. OrderCreate (수주 등록)
### Props
```javascript
{
quotes, // 견적 배열 (선택용)
fromQuote, // 전환된 견적
additionalItems, // 추가분 품목
relatedOrders, // 관련 수주 (추가분용)
isAdditional, // 추가분 여부
onNavigate,
onBack,
onSave
}
```
### 수주 유형
| 유형 | orderType | 설명 |
|------|-----------|------|
| 견적전환 | from-quote | 견적에서 수주 전환 |
| 직접입력 | direct | 견적 없이 직접 등록 |
| 추가분 | additional | 기존 수주에 추가 |
### 수주번호 생성 규칙
```javascript
// 신규: 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 | 마감 |
### 제작 스펙 자동 계산
```javascript
const prodWidth = openWidth + 140;
const prodHeight = Math.max(openHeight + 400, 2950);
const shaft = openWidth > 6000 ? 5 : 4;
const capacity = openWidth > 6000 ? 300 : 160;
```
### 저장 시 생성되는 데이터
```javascript
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 - 발주서
```

View File

@@ -0,0 +1,574 @@
# 수주(Order) API 스펙
> 작성 일시: 2024-12-18
> 분석 기반: design/mes기획서_리액트 사이트
## 개요
수주 관리 API는 견적→수주→분할→생산지시→출하 프로세스를 지원합니다.
---
## 1. 수주 CRUD API
### 1.1 수주 목록 조회
```
GET /api/orders
```
**Query Parameters:**
| 파라미터 | 타입 | 필수 | 설명 |
|----------|------|------|------|
| status | string | - | 상태 필터 (수주등록, 수주확정, 생산지시완료) |
| search | string | - | 검색어 (로트번호, 견적번호, 발주처, 현장명) |
| page | number | - | 페이지 번호 (기본: 1) |
| per_page | number | - | 페이지당 개수 (기본: 20) |
| sort | string | - | 정렬 기준 (기본: -id, 최신순) |
**Response:**
```json
{
"data": [
{
"id": 1,
"order_no": "KD-SO-241218-01",
"order_date": "2024-12-18",
"quote_no": "QT-241215-01",
"customer_name": "ABC건설",
"site_name": "강남 타워",
"status": "수주확정",
"total_amount": 85000000,
"due_date": "2024-12-30",
"delivery_method": "직접배차",
"split_count": 2,
"production_status": "대기",
"shipment_progress": 0
}
],
"meta": {
"current_page": 1,
"per_page": 20,
"total": 100,
"this_month_amount": 500000000,
"split_pending_count": 5,
"production_pending_count": 3,
"shipment_pending_count": 8
}
}
```
### 1.2 수주 상세 조회
```
GET /api/orders/{id}
```
**Response:**
```json
{
"data": {
"id": 1,
"order_no": "KD-SO-241218-01",
"order_date": "2024-12-18",
"order_type": "from-quote",
"quote_id": 10,
"quote_no": "QT-241215-01",
"parent_order_no": null,
"customer_id": 5,
"customer_name": "ABC건설",
"credit_grade": "A",
"site_name": "강남 타워",
"site_code": "S-001",
"manager": "김담당",
"contact": "010-1234-5678",
"due_date": "2024-12-30",
"status": "수주확정",
"payment_status": "미입금",
"accounting_status": "미확인",
"delivery_method": "직접배차",
"delivery_address": "서울시 강남구 테헤란로 123",
"receiver_name": "박수령",
"receiver_phone": "010-9876-5432",
"total_amount": 85000000,
"note": "특이사항 없음",
"items": [
{
"id": 1,
"product_code": "SCR-001",
"product_name": "국민방화스크린셔터",
"category": "스크린",
"floor": "B2",
"location": "주차장 입구",
"open_width": 5000,
"open_height": 3500,
"prod_width": 5140,
"prod_height": 3900,
"qty": 2,
"unit_price": 8000000,
"amount": 16000000,
"production_spec": {
"guide_rail_type": "백면형",
"guide_rail_spec": "120-70",
"shaft": 4,
"capacity": 160,
"finish": "SUS마감"
}
}
],
"splits": [
{
"id": 1,
"split_no": "KD-SO-241218-01-01",
"split_order": 1,
"split_type": "개소별",
"due_date": "2024-12-25",
"item_ids": [1, 2],
"production_status": "작업지시",
"shipment_status": "출고대기",
"production_order_no": "KD-PL-241218-01",
"total_qty": 2,
"completed_qty": 0
}
],
"motor_spec": { ... },
"bom_data": { ... },
"calculated_items": [ ... ],
"change_history": [ ... ],
"created_at": "2024-12-18 10:00:00",
"created_by": "admin"
}
}
```
### 1.3 수주 등록
```
POST /api/orders
```
**Request Body:**
```json
{
"order_date": "2024-12-18",
"order_type": "from-quote",
"quote_id": 10,
"customer_id": 5,
"customer_name": "ABC건설",
"site_name": "강남 타워",
"manager": "김담당",
"contact": "010-1234-5678",
"due_date": "2024-12-30",
"delivery_method": "직접배차",
"delivery_address": "서울시 강남구 테헤란로 123",
"receiver_name": "박수령",
"receiver_phone": "010-9876-5432",
"note": "특이사항",
"items": [
{
"product_name": "국민방화스크린셔터",
"category": "스크린",
"floor": "B2",
"location": "주차장 입구",
"open_width": 5000,
"open_height": 3500,
"qty": 2,
"unit_price": 8000000,
"guide_rail_type": "백면형",
"guide_rail_spec": "120-70",
"finish": "SUS마감"
}
]
}
```
**자동 처리:**
- `order_no`: 자동 생성 (KD-SO-YYMMDD-##)
- `site_code`: 자동 생성
- `status`: '수주등록' 초기화
- `payment_status`: '미입금' 초기화
- `prod_width`, `prod_height`, `shaft`, `capacity`: 자동 계산
- `motor_spec`, `bom_data`: 자동 생성
**Response:** 201 Created
```json
{
"data": {
"id": 1,
"order_no": "KD-SO-241218-01",
"status": "수주등록",
...
},
"message": "수주가 등록되었습니다."
}
```
### 1.4 수주 수정
```
PUT /api/orders/{id}
```
**Request Body:** (변경할 필드만)
```json
{
"due_date": "2024-12-31",
"delivery_method": "상차(선불)",
"note": "수정된 메모"
}
```
### 1.5 수주 삭제
```
DELETE /api/orders/{id}
```
### 1.6 수주 일괄 삭제
```
DELETE /api/orders
```
**Request Body:**
```json
{
"ids": [1, 2, 3]
}
```
---
## 2. 견적→수주 전환 API
### 2.1 견적에서 수주 전환
```
POST /api/orders/from-quote/{quoteId}
```
**Request Body:**
```json
{
"ship_date": "2024-12-25",
"ship_date_undecided": false,
"due_date": "2024-12-30",
"due_date_undecided": false,
"delivery_method": "상차",
"freight_cost": "선불",
"receiver_name": "박수령",
"receiver_phone": "010-9876-5432",
"delivery_address": "서울시 강남구",
"delivery_address_detail": "테헤란로 123",
"note": "수주전환 메모"
}
```
**Response:** 201 Created
```json
{
"data": {
"order": { ... },
"quote": {
"id": 10,
"status": "수주전환",
"converted_order_no": "KD-SO-241218-01"
}
},
"message": "견적이 수주로 전환되었습니다."
}
```
### 2.2 추가분 수주 등록
```
POST /api/orders/{orderId}/additional
```
**Request Body:**
```json
{
"items": [
{
"product_name": "국민방화스크린셔터",
"floor": "1F",
"location": "로비",
"open_width": 4000,
"open_height": 3000,
"qty": 1,
"unit_price": 7500000
}
],
"note": "추가 발주"
}
```
**자동 처리:**
- `order_no`: 원수주번호-A, B, C... 형식
- `order_type`: 'additional'
- `parent_order_no`: 원 수주번호
---
## 3. 분할 관리 API
### 3.1 분할 추가
```
POST /api/orders/{id}/splits
```
**Request Body:**
```json
{
"split_type": "개소별",
"due_date": "2024-12-25",
"item_ids": [1, 2, 3]
}
```
**자동 처리:**
- `split_no`: {order_no}-{순번2자리}
- `production_status`: '작업대기'
- `shipment_status`: '출고대기'
**Response:**
```json
{
"data": {
"id": 1,
"split_no": "KD-SO-241218-01-01",
"split_order": 1,
...
}
}
```
### 3.2 분할 수정
```
PUT /api/orders/{id}/splits/{splitId}
```
### 3.3 분할 삭제
```
DELETE /api/orders/{id}/splits/{splitId}
```
---
## 4. 생산지시 API
### 4.1 전체 생산지시 (분할 없이)
```
POST /api/orders/{id}/production-orders
```
**자동 처리:**
- 품목 카테고리별 작업지시 자동 분리 (스크린/슬랫/절곡)
- 작업지시번호 자동 생성 (KD-PL-YYMMDD-##)
- 공정별 팀 자동 배정
**Response:**
```json
{
"data": {
"work_orders": [
{
"id": 1,
"work_order_no": "KD-PL-241218-01",
"process_type": "스크린",
"status": "작업대기",
"assignee": "스크린팀"
},
{
"id": 2,
"work_order_no": "KD-PL-241218-02",
"process_type": "절곡",
"status": "작업대기",
"assignee": "절곡팀"
}
]
},
"message": "생산지시가 생성되었습니다."
}
```
### 4.2 분할 단위 생산지시
```
POST /api/orders/{id}/splits/{splitId}/production-orders
```
---
## 5. 문서 출력 API
### 5.1 계약서 출력
```
GET /api/orders/{id}/documents/contract
```
### 5.2 거래명세서 출력
```
GET /api/orders/{id}/documents/statement
```
**조건:**
- 입금후출고 거래처는 입금 확인 후에만 발행 가능
### 5.3 발주서 출력
```
GET /api/orders/{id}/documents/purchase-order
```
**Query Parameters:**
| 파라미터 | 타입 | 설명 |
|----------|------|------|
| format | string | 출력 형식 (pdf, html) |
---
## 6. 수주 상태 값
### 수주 상태 (status)
| 상태 | 설명 | 다음 상태 |
|------|------|-----------|
| 수주등록 | 초기 등록 | 수주확정 |
| 수주확정 | 확정 완료 | 생산중 |
| 생산중 | 생산 진행 | 생산완료 |
| 생산완료 | 생산 완료 | 출하완료 |
| 생산지시완료 | 생산지시 완료 | - |
| 출하완료 | 출하 완료 | - |
### 결제 상태 (payment_status)
| 상태 | 설명 |
|------|------|
| 미입금 | 입금 전 |
| 입금완료 | 입금 확인됨 |
### 회계 상태 (accounting_status)
| 상태 | 설명 |
|------|------|
| 미확인 | 확인 전 |
| 입금확인 | 경리 확인 완료 |
---
## 7. 데이터 모델
### Order (수주)
```
orders
├── id (PK)
├── tenant_id (FK)
├── order_no (UNIQUE)
├── order_date
├── order_type (enum: from-quote, direct, additional)
├── quote_id (FK, nullable)
├── parent_order_id (FK, nullable)
├── customer_id (FK)
├── site_id (FK)
├── manager
├── contact
├── due_date
├── status
├── payment_status
├── accounting_status
├── delivery_method
├── delivery_address
├── receiver_name
├── receiver_phone
├── total_amount
├── note
├── motor_spec (JSON)
├── bom_data (JSON)
├── created_by
├── created_at
├── updated_at
└── deleted_at
```
### OrderItem (수주 품목)
```
order_items
├── id (PK)
├── order_id (FK)
├── product_code
├── product_name
├── category (enum: 스크린, 슬랫, 절곡, 조립)
├── floor
├── location
├── open_width
├── open_height
├── prod_width (계산)
├── prod_height (계산)
├── qty
├── unit_price
├── amount
├── production_spec (JSON)
├── created_at
└── updated_at
```
### OrderSplit (수주 분할)
```
order_splits
├── id (PK)
├── order_id (FK)
├── split_no
├── split_order
├── split_type
├── due_date
├── production_status
├── shipment_status
├── production_order_no
├── total_qty
├── completed_qty
├── created_at
└── updated_at
```
### OrderSplitItem (분할 품목 연결)
```
order_split_items
├── id (PK)
├── split_id (FK)
└── item_id (FK)
```
---
## 8. 검증 규칙
### 수주 등록 시
```
customer_name: required
site_name: required
due_date: required, date, after:order_date
items: required, array, min:1
items.*.product_name: required
items.*.open_width: required, integer, min:500, max:15000
items.*.open_height: required, integer, min:500, max:10000
items.*.qty: required, integer, min:1
```
### 자동 계산 규칙
```javascript
// 제작 사이즈
prod_width = open_width + 140
prod_height = MAX(open_height + 400, 2950)
// 샤프트/용량
shaft = open_width > 6000 ? 5 : 4 // 인치
capacity = open_width > 6000 ? 300 : 160 // kg
// 금액
amount = qty * unit_price
total_amount = SUM(items.amount)
```
---
## 9. 이벤트/후크
### 수주 생성 시
- 변경 이력 기록
- 견적 상태 업데이트 (수주전환)
### 생산지시 생성 시
- 작업지시 자동 생성 (공정별)
- 분할 상태 업데이트
### 상태 변경 시
- 변경 이력 기록
- 알림 발송 (설정된 경우)

View File

@@ -0,0 +1,180 @@
# 수주관리 UI 스크린샷
> 캡처 일시: 2024-12-18
> 소스: http://localhost:3002/ (design/mes기획서_리액트)
## 스크린샷 목록
### 1. 수주 목록 페이지
![수주 목록](screenshots/01-order-list.png)
**주요 요소:**
- 상단 요약 카드: 이번 달 수주, 분할 대기, 생산지시 대기, 출하 대기
- 탭 필터: 전체, 수주등록, 수주확정, 생산지시완료
- 검색: 로트번호, 견적번호, 발주처, 현장명
- 테이블 컬럼: 체크박스, 번호, 로트번호, 견적번호, 발주처, 현장명, 상태, 출고예정일, 배송방식
---
### 2. 수주 상세 페이지
![수주 상세](screenshots/02-order-detail-top.png)
**주요 요소:**
- 헤더 버튼: 계약서, 거래명세서, 발주서 / 목록, 수정, 생산지시 생성
- 기본 정보: 발주처, 현장명, 담당자, 연락처
- 수주/배송 정보: 수주일자, 출고예정일, 납품요청일, 배송방식, 운임비용, 수신처
- 제품 내역: 순번, 품목코드, 품목명, 층, 부호, 규격, 수량, 단위, 단가, 금액
---
### 3. 계약서 모달
![계약서 모달](screenshots/03-contract-modal.png)
**주요 요소:**
- 문서 미리보기 영역
- 출력 옵션: PDF 다운로드, 이메일 발송, FAX 발송, 카카오톡, 프린트
---
### 4. 거래명세서 모달
![거래명세서 모달](screenshots/04-statement-modal.png)
**주요 요소:**
- 거래명세서 문서 미리보기
- 출력 옵션 (계약서와 동일)
---
### 5. 발주서 모달
![발주서 모달](screenshots/05-purchase-order-modal.png)
**주요 요소:**
- 발주서 문서 미리보기
- 출력 옵션 (계약서와 동일)
---
### 6. 수주 등록 폼
![수주 등록 폼](screenshots/06-order-create-form.png)
**주요 섹션:**
1. **견적 불러오기**: 확정된 견적 선택 버튼
2. **기본 정보**: 발주처(필수), 현장명(필수), 담당자, 연락처
3. **수주/배송 정보**:
- 출고예정일 (미정 체크 가능)
- 납품요청일 (필수, 미정 체크 가능)
- 배송방식: 상차, 직접배차, 직접수령, 경동화물, 경동택배, 대신화물, 대신택배
- 운임비용: 선불, 착불, 무료
- 수신(반장/업체)(필수), 수신처 연락처(필수)
- 수신처 주소(필수): 우편번호 찾기 + 기본/상세 주소
- 비고
4. **품목 내역**: 테이블 + 품목 추가 버튼
---
### 7. 품목 추가 모달
![품목 추가 모달](screenshots/07-item-add-modal.png)
**입력 필드:**
- 층, 도면부호
- 품목명 (선택)
- 오픈사이즈: 폭(mm), 높이(mm)
- 가이드레일 타입: 백면형, 양면형, 편면형
- 가이드레일 규격: 120-70, 150-80, 180-90
- 마감: SUS마감, 분체도장, 용융아연
- 단가
---
### 8. 견적 선택 모달
![견적 선택 모달](screenshots/08-quote-select-modal.png)
**주요 요소:**
- 검색: 견적번호, 거래처, 현장명
- 견적 목록: 최종확정 상태인 견적만 표시
- 각 견적 정보: 견적번호, 신용등급, 거래처, 현장명, 금액, 품목 수
---
### 9-11. 생산지시 생성 화면
#### 상단 (수주 정보 + 옵션)
![생산지시 생성 상단](screenshots/09-production-order-create-top.png)
**수주 정보:**
- 수주번호, 거래처, 현장명, 납기일, 품목 수, 총수량, 신용등급, 상태
**생산지시 옵션:**
- 우선순위 (영업): 긴급, 높음, 일반, 낮음
- 우선순위 매핑 테이블:
| 생산지시(영업) | 작업지시 기본값(공장) | 비고 |
|---------------|---------------------|------|
| 긴급 | 1순위 | 무조건 제일 먼저 |
| 높음 | 3순위 | 2순위는 현장 새치기용 |
| 일반 | 5순위 | 4순위 비워둠 |
| 낮음 | 9순위 | 뒤로 밀어둠 |
- 메모 입력
**생성될 작업지시:**
- 스크린 공정: 원단절단 → 미싱 → 앤드락작업 → 중간검사 → 포장
- 절곡 공정: 절단 → 절곡 → 중간검사 → 포장
---
#### 중간 (자재 소요량 + 품목 상세)
![생산지시 생성 중간](screenshots/10-production-order-create-mid.png)
**자재 소요량 및 재고 현황:**
| 자재코드 | 자재명 | 단위 | 소요량 | 현재고 | 상태 |
|---------|--------|------|--------|--------|------|
| SCR-MAT-001 | 스크린 원단 | ㎡ | 30 | 500 | 충분 |
| SCR-MAT-002 | 앤드락 | EA | 4 | 800 | 충분 |
| BND-MAT-001 | 철판 | KG | 60 | 2,000 | 충분 |
| BND-MAT-002 | 가이드레일 | M | 12 | 300 | 충분 |
| BND-MAT-003 | 케이스 | EA | 2 | 100 | 충분 |
**스크린 품목 상세:**
- No, 품목명, 도번/위치, 개구폭, 개구높이, 제작폭, 제작높이, 가이드레일, 샤프트, 용량, 마감, 수량
---
#### 하단 (모터/전장품 + BOM)
![생산지시 생성 하단](screenshots/11-production-order-create-bottom.png)
**모터/전장품 사양:**
- 모터 사양 (380V): KD-300K 2대
- 모터 브라켓: 380-180 [2-5"] 2개
**절곡물 BOM:**
- 가이드레일: 형태, 규격, 코드, 길이, 수량
- 케이스(셔터박스): 케이스 본체, 측면 덮개
- 하단 마감재: 품목, 규격, 길이, 수량
---
## UI 패턴 요약
### 상태 배지 색상
| 상태 | 색상 |
|------|------|
| 수주등록 | 회색 |
| 수주확정 | 파랑 |
| 생산중 | 노랑 |
| 생산지시완료 | 파랑 |
| 출하완료 | 초록 |
| 재작업중 | 빨강 |
| 작업대기 | 회색 |
| 작업완료 | 초록 |
### 공통 UI 컴포넌트
1. **카드형 요약**: 상단 리포트 카드 (4개)
2. **탭 필터**: 상태별 필터링
3. **테이블**: 체크박스 + 정렬 + 페이지네이션
4. **모달**: 문서 출력, 품목 추가, 견적 선택
5. **폼**: 섹션별 그룹화, 필수 필드 표시(*)
### 자동 계산 필드 (확인됨)
- 제작폭 = 개구폭 + 140
- 제작높이 = MAX(개구높이 + 400, 2950)
- 샤프트: 폭 > 6000 → 5인치, 그 외 4인치
- 용량: 폭 > 6000 → 300kg, 그 외 160kg

View File

@@ -0,0 +1,98 @@
# 수주 페이지 분석 결과
> 분석 일시: 2024-12-18
> 분석 대상: design/mes기획서_리액트 (디자인팀 기획 사이트)
## 분석 목적
디자인팀에서 제작한 기획 사이트를 분석하여 API 개발에 필요한 스펙을 추출합니다.
---
## 분석 문서 목록
| 순서 | 문서 | 설명 |
|------|------|------|
| 01 | [메뉴 구조](01-menu-structure.md) | 수주 관련 메뉴 구조 및 화면 목록 |
| 02 | [수주 스키마](02-order-schema.md) | 수주 데이터 스키마, 필드 정의, 자동계산 규칙 |
| 03 | [견적/수주 UI](03-quote-ui.md) | 견적 상세 → 수주 전환 UI 및 문서 출력 |
| 04 | [App.jsx 수주 섹션](04-app-order-section.md) | OrderList, OrderDetail, OrderCreate 컴포넌트 분석 |
| 05 | [API 스펙](05-api-spec.md) | **최종 API 엔드포인트 및 데이터 모델** |
| 06 | [UI 스크린샷](06-screenshots.md) | **수주관리 전체 화면 캡처 (11개)** |
---
## 핵심 발견 사항
### 1. 수주 유형 (3가지)
- **일반수주 (from-quote)**: 견적에서 전환
- **직접수주 (direct)**: 견적 없이 직접 등록
- **추가수주 (additional)**: 기존 수주에 품목 추가
### 2. 수주 프로세스
```
견적(최종확정) → 수주전환 → 수주등록 → 수주확정 → 분할 → 생산지시 → 작업지시 → 출하
```
### 3. 분할 관리
- 대형 현장은 분할 출하 필요
- 분할번호: `{수주번호}-{순번2자리}` (예: KD-SO-241218-01-01)
- 분할 단위로 생산지시/출하 관리
### 4. 생산지시 자동화
- 품목 카테고리별 작업지시 자동 분리
- 스크린 → 스크린팀
- 슬랫/철재 → 슬랫팀
- 절곡 → 절곡팀
- BOM 데이터 기반 절곡물 작업지시 자동 생성
### 5. 자동 계산 규칙
```
제작폭 = 개구폭 + 140
제작높이 = MAX(개구높이 + 400, 2950)
샤프트 = 폭 > 6000 ? 5인치 : 4인치
전동용량 = 폭 > 6000 ? 300kg : 160kg
```
### 6. 채번 규칙
| 문서 | 형식 | 예시 |
|------|------|------|
| 수주번호 | KD-SO-YYMMDD-## | KD-SO-241218-01 |
| 분할번호 | {수주번호}-## | KD-SO-241218-01-01 |
| 작업지시번호 | KD-PL-YYMMDD-## | KD-PL-241218-01 |
| 추가분수주 | {수주번호}-A,B,C | KD-SO-241218-01-A |
---
## API 개발 우선순위
### Phase 1: 기본 CRUD
1. 수주 목록/상세/등록/수정/삭제
2. 수주 품목 관리
3. 채번 자동 생성
### Phase 2: 견적 연동
1. 견적 → 수주 전환
2. 추가분 수주 등록
### Phase 3: 분할/생산지시
1. 분할 관리
2. 생산지시 생성
3. 작업지시 연동
### Phase 4: 문서/통계
1. 계약서/거래명세서/발주서 출력
2. 대시보드 통계 API
---
## 참고 파일
**분석 대상 파일:**
- `design/mes기획서_리액트/src/configs/menuDefinitions.js` (7KB)
- `design/mes기획서_리액트/src/configs/orderMasterConfig.js` (14KB)
- `design/mes기획서_리액트/src/components/QuoteDetailNew.jsx` (18KB)
- `design/mes기획서_리액트/src/components/QuoteDocumentDialogs.jsx` (23KB)
- `design/mes기획서_리액트/src/App.jsx` (3.9MB) - 수주 섹션만 추출 분석
**주의:** App.jsx는 80,049줄의 대형 파일로, 수주 관련 섹션(52768~56357줄)만 분석했습니다.

Binary file not shown.

After

Width:  |  Height:  |  Size: 598 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 367 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 363 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 312 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 362 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 362 KiB

View File

@@ -0,0 +1,268 @@
# 단가관리 분석 결과
> 분석 일시: 2024-12-18
> 분석 대상: design/mes기획서_리액트 (디자인팀 기획 사이트)
## 분석 목적
디자인팀에서 제작한 기획 사이트의 단가관리 기능을 분석하여 API 개발에 필요한 스펙을 추출합니다.
---
## UI 스크린샷
### 1. 단가 목록 페이지
![단가 목록](screenshots/01-price-list.png)
**주요 요소:**
**상단 요약 카드 (4개):**
| 항목 | 값 | 설명 |
|------|-----|------|
| 전체 품목 | 70 | 등록된 총 품목 수 |
| 활성 단가 | 70 | 활성 상태인 단가 수 |
| 거래처그룹 | 4 | 거래처 그룹 수 |
| 품목유형 | 5 | 품목 유형 수 |
**탭 필터 (품목유형별):**
| 탭 | 건수 |
|-----|------|
| 전체 | 70 |
| 제품 | 0 |
| 부품 | 36 |
| 부자재 | 0 |
| 원자재 | 15 |
| 소모품 | 0 |
**테이블 컬럼:**
| 컬럼 | 설명 |
|------|------|
| 번호 | 순번 |
| 품목유형 | 서비스, 원자재, 부품, 반제품 등 |
| 품목코드 | 품목 식별 코드 |
| 품목명 | 품목 이름 |
| 규격 | 규격 정보 |
| 단위 | EA, SET, KG, M 등 |
| 매입단가 | 구매 단가 |
| 가공비 | 가공 비용 |
| LOSS(%) | 손실률 |
| 판매단가 | 판매 가격 |
| 마진율 | (판매단가-매입단가)/판매단가 * 100 |
| 적용일 | 단가 적용 시작일 |
| 상태 | 활성/비활성 |
---
## 데이터 분석 (캡처된 품목 기준)
### 품목유형별 분포
| 품목유형 | 건수 | 주요 품목 |
|----------|------|-----------|
| 서비스 | 1 | 검사비 |
| 원자재 | 15 | 하부BASE, 상부덮개, 마구리, 평철, 엘바, 하장바, 각파이프, 조인트바, 환봉 |
| 부품 | 36 | 받침용앵글, 브라켓, 감기샤프트, 연동제어기, 전동개폐기 |
| 반제품 | 18 | 연기차단재, 하단마감재, 케이스, 가이드레일 |
### 대표 품목 예시
**원자재:**
| 품목코드 | 품목명 | 규격 | 단위 | 매입단가 | 판매단가 | 마진율 |
|----------|--------|------|------|----------|----------|--------|
| 하부BASE-코너형 | 하부BASE(코너형) | - | SET | 30,000 | 45,000 | 50% |
| 각파이프-30×30L6000 | 각파이프 30×30 L:6000 | 30×30 | EA | 15,000 | 22,500 | 50% |
**부품:**
| 품목코드 | 품목명 | 규격 | 단위 | 매입단가 | 판매단가 | 마진율 |
|----------|--------|------|------|----------|----------|--------|
| 전동개폐기-220V300KG유선 | 전동개폐기 300KG 220V 유선 | 300 | EA | 350,000 | 480,000 | 37% |
| 감기샤프트-76.3×2.8TL3000 | 감기샤프트 76.3×2.8T L:3000 | 76 | EA | 55,000 | 80,000 | 45% |
**반제품:**
| 품목코드 | 품목명 | 규격 | 단위 | 매입단가 | 판매단가 | 마진율 |
|----------|--------|------|------|----------|----------|--------|
| RC30 | 가이드레일(벽면형) C형 3000 | 3000 | EA | 18,000 | 27,000 | 50% |
| CB30 | 케이스(후면코너부) 3000 | 3000 | EA | 20,000 | 30,000 | 50% |
---
## 데이터 스키마
### Price (단가)
```
prices
├── id (PK)
├── tenant_id (FK)
├── item_type - 품목유형 (제품, 부품, 부자재, 원자재, 소모품, 서비스, 반제품)
├── item_code (UNIQUE) - 품목코드
├── item_name - 품목명
├── specification - 규격
├── unit - 단위 (EA, SET, KG, M, ㎡ 등)
├── purchase_price - 매입단가
├── processing_cost - 가공비
├── loss_rate - 손실률 (%)
├── selling_price - 판매단가
├── margin_rate - 마진율 (%) - 자동계산
├── effective_date - 적용일
├── status - 상태 (활성/비활성)
├── customer_group_id - 거래처그룹 (특별단가용)
├── note - 비고
├── created_at
├── updated_at
└── deleted_at
```
### PriceHistory (단가 변경이력)
```
price_histories
├── id (PK)
├── price_id (FK)
├── previous_purchase_price
├── previous_selling_price
├── new_purchase_price
├── new_selling_price
├── changed_by
├── changed_at
└── reason - 변경사유
```
---
## 품목유형 (item_type)
| 유형 | 설명 | 예시 |
|------|------|------|
| 제품 | 완성품 | 방화스크린셔터, 방화슬랫셔터 |
| 부품 | 조립 부품 | 전동개폐기, 감기샤프트, 브라켓 |
| 반제품 | 중간 가공품 | 가이드레일, 케이스, 하단마감재 |
| 원자재 | 원재료 | 철판, 파이프, 볼트 |
| 부자재 | 보조재료 | 나사, 패킹, 접착제 |
| 소모품 | 소모성 재료 | 장갑, 테이프, 라벨 |
| 서비스 | 용역 | 검사비, 운송비, 설치비 |
---
## 단위 코드
| 단위 | 설명 | 사용 품목 |
|------|------|-----------|
| EA | 개 | 개별 품목 |
| SET | 세트 | 세트 품목 |
| KG | 킬로그램 | 중량 기준 |
| M | 미터 | 길이 기준 |
| ㎡ | 제곱미터 | 면적 기준 |
| BOX | 박스 | 박스 단위 |
---
## 자동 계산
### 마진율 계산
```javascript
margin_rate = ((selling_price - purchase_price) / selling_price) * 100
// 가공비와 손실률 포함 시
total_cost = purchase_price + processing_cost
adjusted_cost = total_cost * (1 + loss_rate / 100)
margin_rate = ((selling_price - adjusted_cost) / selling_price) * 100
```
### 손실률 적용
```javascript
// 실제 필요량 계산
required_qty = order_qty * (1 + loss_rate / 100)
// 예: 100개 주문, 손실률 5%
// required_qty = 100 * 1.05 = 105개
```
---
## API 스펙
### 단가 CRUD
```
GET /api/prices - 단가 목록
GET /api/prices/{id} - 단가 상세
POST /api/prices - 단가 등록
PUT /api/prices/{id} - 단가 수정
DELETE /api/prices/{id} - 단가 삭제
DELETE /api/prices - 단가 일괄 삭제
```
### 단가 조회 (견적/수주용)
```
GET /api/prices/lookup - 품목코드로 단가 조회
```
**Query Parameters:**
| 파라미터 | 타입 | 설명 |
|----------|------|------|
| item_code | string | 품목코드 |
| customer_group_id | number | 거래처그룹 (특별단가 적용) |
### 단가 이력
```
GET /api/prices/{id}/history - 단가 변경 이력
```
### 목록 조회 Query Parameters
| 파라미터 | 타입 | 설명 |
|----------|------|------|
| item_type | string | 품목유형 필터 |
| status | string | 상태 필터 |
| search | string | 검색어 (품목코드, 품목명, 규격) |
| page | number | 페이지 번호 |
| per_page | number | 페이지당 개수 |
---
## 거래처그룹 단가
```
customer_group_prices
├── id (PK)
├── price_id (FK)
├── customer_group_id (FK)
├── special_price - 특별단가
├── discount_rate - 할인율 (%)
├── effective_from - 적용 시작일
├── effective_to - 적용 종료일
├── status
└── created_at
```
**특별단가 적용 우선순위:**
1. 거래처별 특별단가
2. 거래처그룹 특별단가
3. 기본 판매단가
---
## 품목코드 규칙
```
{품목명약어}-{규격}
예시:
- 전동개폐기-220V300KG유선
- 감기샤프트-76.3×2.8TL3000
- RC30 (가이드레일 C형 3000)
- CB30 (케이스 후면코너부 3000)
```
---
## 통계 정보
| 항목 | 계산식 |
|------|--------|
| 전체 품목 | COUNT(*) |
| 활성 단가 | COUNT(*) WHERE status = '활성' |
| 거래처그룹 | COUNT(DISTINCT customer_group_id) |
| 품목유형 | COUNT(DISTINCT item_type) |
| 평균 마진율 | AVG(margin_rate) |

Binary file not shown.

After

Width:  |  Height:  |  Size: 448 KiB

View File

@@ -0,0 +1,655 @@
# 생산관리 분석 결과
> 분석 일시: 2024-12-18
> 분석 대상: design/mes기획서_리액트 (디자인팀 기획 사이트)
## 분석 목적
디자인팀에서 제작한 기획 사이트의 생산관리 기능을 분석하여 API 개발에 필요한 스펙을 추출합니다.
---
## 메뉴 구조
```
생산관리
├── 품목관리 - 제품/부품/원자재 등록 및 관리
├── 생산 현황판 - 실시간 작업 현황 모니터링
├── 작업지시 관리 - 작업지시 등록/조회/상태관리
├── 작업실적 - 생산 실적 조회 및 통계
├── 작업자 화면 - 현장 작업자용 태블릿 UI
└── UserFlow - 업무 흐름도 (참조용)
```
---
## UI 스크린샷
### 1. 품목 목록 페이지
![품목 목록](screenshots/01-item-list.png)
**주요 요소:**
**상단 요약 카드 (4개):**
| 항목 | 값 | 설명 |
|------|-----|------|
| 전체 품목 | 70 | 등록된 총 품목 수 |
| 제품 | 0 | 완제품 |
| 부품 | 36 | 조립 부품 |
| 부자재 | 0 | 보조 재료 |
**탭 필터 (품목유형별):**
| 탭 | 건수 |
|-----|------|
| 전체 | 70 |
| 제품 | 0 |
| 부품 | 36 |
| 부자재 | 0 |
| 원자재 | 15 |
| 소모품 | 0 |
**테이블 컬럼:**
| 컬럼 | 설명 |
|------|------|
| 번호 | 순번 |
| 품목코드 | 품목 식별 코드 |
| 품목유형 | 제품, 부품, 원자재, 서비스 등 |
| 품목명 | 품목 이름 |
| 규격 | 규격 정보 |
| 단위 | EA, SET, KG, M 등 |
| 품목 상태 | 사용중/미사용 |
---
### 2. 품목 등록 폼
![품목 등록](screenshots/02-item-create.png)
**입력 섹션:**
**기본 정보:**
| 필드명 | 타입 | 필수 | 비고 |
|--------|------|------|------|
| 품목유형 | select | ✅ | 제품, 부품, 원자재 등 |
| 부품 유형 | select | | 품목유형=부품 시 표시 |
| 품목코드 | text | ✅ | 자동 생성 또는 수동 입력 |
| 품목명 | text | ✅ | |
| 규격 | text | | |
| 단위 | select | | EA, SET, KG 등 |
**측면 규격 및 길이:**
| 필드명 | 타입 | 비고 |
|--------|------|------|
| 측면 규격 | number | mm 단위 |
| 길이 | number | mm 단위 |
**조립품 전개도 (바라시):**
- BOM 정보 입력
- 구성 부품 목록
---
### 3. 생산 현황판
![생산 현황판](screenshots/03-dashboard.png)
**주요 요소:**
**상단 버튼:**
- 작업자 화면
- 작업지시 목록
**공장 필터 탭:**
| 탭 | 설명 |
|-----|------|
| 전체 | 모든 공장 |
| 스크린공장 | 스크린 생산 라인 |
| 슬랫공장 | 슬랫 생산 라인 |
| 절곡공장 | 절곡 생산 라인 |
**요약 카드 (6개):**
| 항목 | 값 | 설명 |
|------|-----|------|
| 전체 작업 | 34건 | 총 작업지시 수 |
| 작업대기 | 4건 | 대기 상태 |
| 작업중 | 7건 | 진행 중 |
| 작업완료 | 19건 | 완료 |
| 긴급 | 12건 | 긴급 작업 |
| 지연 | 4건 | 납기 지연 |
**대시보드 섹션:**
- 🔴 긴급 작업: 작업번호, 상태, 거래처/현장, 납기
- ⚠️ 지연 작업: 작업번호, 지연 일수, 거래처, 담당자
- 👷 작업자별 현황: 작업자명, 배정 건수, 작업중/완료 건수
---
### 4. 작업지시 목록 페이지
![작업지시 목록](screenshots/04-work-order-list.png)
**주요 요소:**
**상단 요약 카드 (4개):**
| 항목 | 값 | 설명 |
|------|-----|------|
| 전체 | 34건 | 총 작업지시 수 |
| 작업대기 | 4건 | 대기 상태 |
| 작업중 | 7건 | 진행 중 |
| 작업완료 | 19건 | 완료 |
**탭 필터:**
| 탭 | 건수 | 설명 |
|-----|------|------|
| 전체 | 34 | 모든 작업지시 |
| 미배정 | 3 | 작업자 미배정 |
| 승인대기 | 3 | 승인 대기 중 |
| 작업대기 | 1 | 작업 시작 대기 |
| 작업중 | 7 | 진행 중 |
| 작업완료 | 19 | 완료 |
**테이블 컬럼:**
| 컬럼 | 설명 |
|------|------|
| 번호 | 순번 |
| 작업지시번호 | KD-WO-YYMMDD-## |
| 공정 | 스크린, 슬랫, 절곡 |
| 로트번호 | 추적 번호 |
| 지시일 | 작업지시 생성일 |
| 배정 | Y/- (작업자 배정 여부) |
| 투입 | Y/- (자재 투입 여부) |
| 시작 | Y/- (작업 시작 여부) |
| 작업상태 | 작업대기, 작업중, 작업완료, 재작업중, 출하완료 |
| 우선순위 | 숫자 (1이 가장 높음) |
| 현장명 | 설치 현장명 |
| 출고예정일 | 출하 예정 날짜 |
---
### 5. 작업지시 상세 페이지
![작업지시 상세](screenshots/05-work-order-detail.png)
**주요 섹션:**
**기본 정보:**
| 필드 | 설명 |
|------|------|
| 작업지시번호 | KD-WO-YYMMDD-## |
| 로트번호 | KD-TS-YYMMDD-## |
| 공정구분 | 스크린, 슬랫, 절곡 |
| 작업상태 | 출하완료, 재작업중 등 |
| 발주처 | 거래처명 |
| 현장명 | 설치 현장명 |
| 납기일 | 납품 기한 |
| 작업자 | 담당 작업자명 |
**공정 진행 (5단계 - 스크린 기준):**
| 단계 | 공정명 |
|------|--------|
| 1 | 원단절단 |
| 2 | 미싱 |
| 3 | 앤드락작업 |
| 4 | 중간검사 |
| 5 | 포장 |
**작업 품목:**
| 컬럼 | 설명 |
|------|------|
| No | 순번 |
| 상태 | 대기, 진행중, 완료 |
| 품목명 | 제품명 |
| 층/부호 | 설치 위치 |
| 규격 | 가로×세로 |
| 수량 | 제작 수량 |
**헤더 버튼:**
- 작업일지
- 목록
---
### 6. 작업지시 등록 폼
![작업지시 등록](screenshots/06-work-order-create.png)
**입력 섹션:**
**등록 방식:**
| 옵션 | 설명 |
|------|------|
| 수주 연동 등록 | 회계확인 완료된 수주에서 불러오기 (기본값) |
| 수동 등록 | 수주 없이 직접 입력 |
**수주 정보:**
- 수주 선택 버튼: 수주 선택 시 정보 자동 입력
**기본 정보:**
| 필드명 | 타입 | 필수 | 비고 |
|--------|------|------|------|
| 발주처 | text | ✅ | 수주 선택 시 자동 입력 |
| 현장명 | text | ✅ | 수주 선택 시 자동 입력 |
| 수주번호 | text | | 수주 선택 시 자동 입력 |
| 품목수 | number | | 수주 선택 시 자동 입력 |
**작업지시 정보:**
| 필드명 | 타입 | 필수 | 비고 |
|--------|------|------|------|
| 공정구분 | select | ✅ | 스크린, 절곡, 슬랫, 재고(포밍) |
| 납기일 | date | ✅ | |
| 우선순위 | select | | 긴급, 일반, 낮음 |
| 담당자 | multi-select | | 다중 선택 가능 |
| 비고 | textarea | | 특이사항, 메모 |
**공정코드/작업일지 자동 매핑:**
| 공정 | 공정코드 | 작업일지 템플릿 |
|------|----------|----------------|
| 스크린 | P-001 | WL-SCR |
| 슬랫 | P-002 | WL-SLAT |
| 절곡 | P-003 | WL-BEND |
| 재고(포밍) | P-004 | WL-STK |
---
### 7. 작업실적 조회 페이지
![작업실적](screenshots/07-work-result.png)
**주요 요소:**
**상단 요약 카드 (4개):**
| 항목 | 값 | 설명 |
|------|-----|------|
| 총 생산수량 | 3개 | 생산된 총 수량 |
| 양품수량 | 2개 | 정상 제품 수 |
| 불량수량 | 1개 | 불량 제품 수 |
| 불량률 | 33.3% | 불량/생산 * 100 |
**테이블 컬럼:**
| 컬럼 | 설명 |
|------|------|
| 로트번호 | 추적 번호 |
| 작업일 | 작업 수행일 |
| 작업지시번호 | 연결된 작업지시 |
| 공정 | 스크린, 슬랫, 절곡 |
| 품목명 | 제품명 |
| 규격 | 가로×세로 |
| 생산 | 생산 수량 |
| 양품 | 양품 수량 |
| 불량 | 불량 수량 |
| 불량률 | 불량/생산 * 100 |
| 검사 | 검사 완료 여부 (체크 아이콘) |
| 포장 | 포장 완료 여부 (체크 아이콘) |
| 작업자 | 작업자명 |
**기능:**
- 엑셀 다운로드 버튼
- 일괄 내보내기 (체크박스)
---
### 8. 작업자 화면
![작업자 화면](screenshots/08-worker-screen.png)
**주요 요소:**
**상단 요약 카드 (4개):**
| 항목 | 값 | 설명 |
|------|-----|------|
| 할일 | 15건 | 대기 중인 작업 |
| 작업중 | 7건 | 현재 진행 중 |
| 완료 | 0건 | 완료된 작업 |
| 긴급 | 5건 | 긴급 표시 작업 |
**정렬 옵션:**
- 우선순위순 (기본)
- 납기일순
- 최신등록순
**작업 카드 정보:**
| 항목 | 설명 |
|------|------|
| 품목명 | 제품명 |
| 수량 | 제작 수량 (EA) |
| 우선순위 | N순위 표시 |
| 상태 | 긴급, 작업중 등 |
| 납기 | 납기일 |
| 공정 | 스크린, 슬랫, 절곡 |
| 작업지시번호 | KD-WO-YYMMDD-## |
| 거래처·현장명 | 발주처 및 현장 |
| 담당자 | 작업자 목록 |
| 지시 메모 | 특이사항 |
**작업 버튼:**
| 버튼 | 설명 |
|------|------|
| 전량완료 | 작업 완료 처리 |
| 공정상세 | 공정별 진행 상황 확인 |
| 자재투입 | 자재 투입 처리 |
| 작업일지 | 작업일지 작성 |
| 이슈보고 | 문제 발생 시 보고 |
---
### 9. 공정상세 화면
![공정상세](screenshots/09-process-detail.png)
**주요 요소:**
**자재 투입 알림:**
- "자재 투입 필요" 메시지
- "자재 투입하기" 버튼
**공정 단계 (8단계 - 스크린 기준):**
| 단계 | 공정명 | 유형 | 설명 |
|------|--------|------|------|
| 1 | 자재투입 | 일반 | 자재 투입 |
| 2 | 절단매수확인 | 일반 | 절단할 수량 확인 |
| 3 | 원단 절단 | 일반 | 원단 절단 |
| 4 | 절단 Check | 검사 | 절단 품질 검사 |
| 5 | 미싱 | 일반 | 봉제 작업 |
| 6 | 앤드락 작업 | 일반 | 앤드락 부착 |
| 7 | 중간검사 | 검사 | 품질 검사 |
| 8 | 포장 | 일반 | 최종 포장 |
**품목별 진행 정보:**
| 항목 | 설명 |
|------|------|
| #번호 | 품목 순번 |
| 위치 | 층/부호 (예: 1층 1호-A) |
| 메모 | 선행 생산 등 |
| 규격 | W가로 × H세로 |
| 자재 | 투입 자재명 |
| LOT | 로트번호 |
**버튼:**
- 검사 요청: 검사 공정에서 품질팀 요청
---
## 데이터 스키마
### Item (품목)
```
items
├── id (PK)
├── tenant_id (FK)
├── item_code (UNIQUE) - 품목코드
├── item_type - 품목유형 (제품, 부품, 원자재, 부자재, 소모품, 서비스)
├── sub_type - 부품 유형 (조립 부품, 가공 부품 등)
├── name - 품목명
├── specification - 규격
├── unit - 단위 (EA, SET, KG, M 등)
├── side_spec - 측면 규격
├── length - 길이
├── status - 상태 (사용중/미사용)
├── bom_data - BOM 정보 (JSON)
├── created_at
├── updated_at
└── deleted_at
```
### WorkOrder (작업지시)
```
work_orders
├── id (PK)
├── tenant_id (FK)
├── work_order_no (UNIQUE) - 자동 채번
├── order_id (FK) - 연결된 수주
├── lot_no - 로트번호
├── process_type - 공정구분 (스크린, 슬랫, 절곡, 재고)
├── process_code - 공정코드 (P-001 등)
├── customer_id (FK) - 거래처
├── customer_name - 거래처명 (스냅샷)
├── site_name - 현장명
├── due_date - 납기일
├── status - 작업상태
├── priority - 우선순위
├── assigned - 배정 여부 (Y/N)
├── material_input - 자재 투입 여부 (Y/N)
├── started - 작업 시작 여부 (Y/N)
├── note - 비고
├── created_by
├── created_at
├── updated_at
└── deleted_at
```
### WorkOrderItem (작업지시 품목)
```
work_order_items
├── id (PK)
├── work_order_id (FK)
├── seq - 순번
├── product_name - 품목명
├── floor_location - 층/부호
├── specification - 규격 (가로×세로)
├── qty - 수량
├── status - 상태 (대기, 진행중, 완료)
├── material_name - 자재명
├── lot_no - 자재 로트번호
├── created_at
└── updated_at
```
### WorkResult (작업실적)
```
work_results
├── id (PK)
├── tenant_id (FK)
├── lot_no - 로트번호
├── work_date - 작업일
├── work_order_id (FK) - 작업지시
├── work_order_no - 작업지시번호
├── process_type - 공정
├── product_name - 품목명
├── specification - 규격
├── production_qty - 생산 수량
├── good_qty - 양품 수량
├── defect_qty - 불량 수량
├── defect_rate - 불량률 (%)
├── inspected - 검사 완료 여부
├── packed - 포장 완료 여부
├── worker_id (FK) - 작업자
├── worker_name - 작업자명
├── created_at
└── updated_at
```
### WorkOrderAssignment (작업자 배정)
```
work_order_assignments
├── id (PK)
├── work_order_id (FK)
├── worker_id (FK)
├── assigned_at - 배정일
└── created_at
```
### ProcessStep (공정 단계)
```
process_steps
├── id (PK)
├── process_type - 공정구분 (스크린, 슬랫, 절곡)
├── step_no - 단계 번호
├── step_name - 단계명
├── step_type - 유형 (일반, 검사)
├── sort_order - 정렬 순서
├── is_active - 활성 여부
└── created_at
```
### WorkOrderProgress (작업 진행)
```
work_order_progresses
├── id (PK)
├── work_order_id (FK)
├── work_order_item_id (FK)
├── process_step_id (FK)
├── status - 상태 (대기, 진행중, 완료)
├── completed_at - 완료일시
├── worker_id (FK)
└── created_at
```
---
## 상태 흐름
### 작업지시 상태
```
미배정 → 승인대기 → 작업대기 → 작업중 → 작업완료 → 출하완료
재작업중 → 작업완료
```
| 상태 | 설명 |
|------|------|
| 미배정 | 작업자 미배정 상태 |
| 승인대기 | 작업지시 승인 대기 |
| 작업대기 | 승인 완료, 작업 시작 대기 |
| 작업중 | 작업 진행 중 |
| 작업완료 | 작업 완료 |
| 재작업중 | 불량으로 인한 재작업 |
| 출하완료 | 출하 완료 |
### 공정별 단계 (스크린)
```
자재투입 → 절단매수확인 → 원단 절단 → 절단 Check(검사) → 미싱 → 앤드락 작업 → 중간검사 → 포장
```
### 공정별 단계 (슬랫)
```
자재투입 → 코일절단 → 절단 Check(검사) → 슬랫 성형 → 조립 → 중간검사 → 포장
```
### 공정별 단계 (절곡)
```
자재투입 → 판/코일절단 → 절단 Check(검사) → 절곡 → 용접 → 검사 → 포장
```
---
## API 스펙
### 품목 CRUD
```
GET /api/items - 품목 목록
GET /api/items/{id} - 품목 상세
POST /api/items - 품목 등록
PUT /api/items/{id} - 품목 수정
DELETE /api/items/{id} - 품목 삭제
DELETE /api/items - 품목 일괄 삭제
```
### 작업지시 CRUD
```
GET /api/work-orders - 작업지시 목록
GET /api/work-orders/{id} - 작업지시 상세
POST /api/work-orders - 작업지시 등록
PUT /api/work-orders/{id} - 작업지시 수정
DELETE /api/work-orders/{id} - 작업지시 삭제
```
### 작업지시 상태/작업자
```
POST /api/work-orders/{id}/status - 상태 변경
POST /api/work-orders/{id}/assign - 작업자 배정
POST /api/work-orders/{id}/start - 작업 시작
POST /api/work-orders/{id}/complete - 작업 완료
POST /api/work-orders/{id}/rework - 재작업 처리
```
### 공정 진행
```
GET /api/work-orders/{id}/progress - 공정 진행 조회
POST /api/work-orders/{id}/progress/{step} - 공정 단계 완료
POST /api/work-orders/{id}/material-input - 자재 투입
POST /api/work-orders/{id}/inspection - 검사 요청
```
### 작업실적
```
GET /api/work-results - 작업실적 목록
GET /api/work-results/{id} - 작업실적 상세
POST /api/work-results - 작업실적 등록
GET /api/work-results/export - 엑셀 다운로드
```
### 작업자 화면 (모바일/태블릿)
```
GET /api/worker/tasks - 내 작업 목록
GET /api/worker/tasks/{id} - 작업 상세
POST /api/worker/tasks/{id}/complete - 작업 완료
POST /api/worker/tasks/{id}/issue - 이슈 보고
```
### 생산 현황판
```
GET /api/dashboard/production - 생산 현황 요약
GET /api/dashboard/urgent - 긴급 작업 목록
GET /api/dashboard/delayed - 지연 작업 목록
GET /api/dashboard/workers - 작업자별 현황
```
### 목록 조회 Query Parameters
**작업지시 목록:**
| 파라미터 | 타입 | 설명 |
|----------|------|------|
| process_type | string | 공정구분 필터 (스크린, 슬랫, 절곡) |
| status | string | 작업상태 필터 |
| search | string | 검색어 (작업지시번호, 발주처, 현장명) |
| page | number | 페이지 번호 |
| per_page | number | 페이지당 개수 |
**작업실적 목록:**
| 파라미터 | 타입 | 설명 |
|----------|------|------|
| process_type | string | 공정구분 필터 |
| from_date | date | 시작일 |
| to_date | date | 종료일 |
| worker_id | number | 작업자 필터 |
| search | string | 검색어 (로트번호, 작업지시번호, 품목명) |
---
## 채번 규칙
| 문서 | 형식 | 예시 |
|------|------|------|
| 작업지시번호 | KD-WO-YYMMDD-## | KD-WO-251218-01 |
| 절곡 작업지시 | KD-WO-FLD-YYMMDD-## | KD-WO-FLD-251218-01 |
| 로트번호 | KD-TS-YYMMDD-## | KD-TS-251218-01 |
| 자재 로트 | LOT-{공정}-YYYY-### | LOT-스크-2025-001 |
---
## 공정별 작업일지 템플릿
| 공정 | 템플릿코드 | 설명 |
|------|------------|------|
| 스크린 | WL-SCR | 스크린 작업일지 |
| 슬랫 | WL-SLAT | 슬랫 작업일지 |
| 절곡 | WL-BEND | 절곡 작업일지 |
| 재고(포밍) | WL-STK | 재고생산 작업일지 |
---
## 통계 계산
| 항목 | 계산식 |
|------|--------|
| 불량률 | (불량수량 / 생산수량) * 100 |
| 작업 진행률 | (완료 공정 수 / 전체 공정 수) * 100 |
| 품목별 진행률 | (완료 품목 수 / 전체 품목 수) * 100 |
| 작업자 생산성 | 양품수량 / 작업시간 |
---
## 관련 문서
- [UserFlow 분석](../production-userflow/README.md) - 생산관리 업무 흐름도
- [수주관리 분석](../order-analysis/README.md) - 수주 → 작업지시 연동
- [단가관리 분석](../price-analysis/README.md) - 품목 단가 정보

Binary file not shown.

After

Width:  |  Height:  |  Size: 501 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 325 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 429 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 563 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 260 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 296 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 285 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 396 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 353 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 301 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 323 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 370 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 425 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 330 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 450 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 465 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 459 KiB

View File

@@ -0,0 +1,260 @@
# 견적관리 분석 결과
> 분석 일시: 2024-12-18
> 분석 대상: design/mes기획서_리액트 (디자인팀 기획 사이트)
## 분석 목적
디자인팀에서 제작한 기획 사이트의 견적관리 기능을 분석하여 API 개발에 필요한 스펙을 추출합니다.
---
## UI 스크린샷
### 1. 견적 목록 페이지
![견적 목록](screenshots/01-quote-list.png)
**주요 요소:**
- 상단 요약 카드 (4개):
- 이번 달 견적 금액: 447M
- 진행중 견적 금액: 96.9M
- 이번 주 신규 견적: 15건
- 이번 달 수주 전환율: 41.7%
- 탭 필터: 전체, 최초작성, 수정중, 최종확정, 수주전환
- 검색: 견적번호, 거래처, 현장명
- 테이블 컬럼: 체크박스, 번호, 견적번호, 접수일, 상태, 제품명, 수량, 금액, 발주처, 현장명, 담당자, 비고
---
### 2. 견적 상세 페이지
![견적 상세](screenshots/02-quote-detail.png)
**주요 섹션:**
- **기본 정보**:
- 견적번호, 등록일, 작성자
- 발주처, 현장명
- 담당자, 연락처
- 납기일, 상태
- 비고
- **자동 견적 산출 정보**:
- 층수, 부호
- 제품카테고리, 제품명
- 가로(mm), 세로(mm)
- 설치유형, 모터전원, 제어기
- 수량, 금액(자동계산)
**헤더 버튼:**
- 견적서
- 산출내역서
- 발주서
- 목록
- 수정
- 수주전환
---
### 3. 견적서 문서 모달
![견적서 모달](screenshots/03-quote-document-modal.png)
**문서 구성:**
- 문서 제목: QUOTATION
- 수신처(Buyer) 정보: 회사명, 주소, 전화, 팩스, 담당자
- 공급자(Supplier) 정보: 회사명, 사업자번호, 주소, 전화, 팩스, 대표자
- 품목 테이블: 번호, 품목명, 규격, 단위, 수량, 단가, 금액, 비고
- 합계 정보: 합계금액, 부가세, 총액
- 특기사항
**출력 옵션:**
- PDF 다운로드
- 이메일 발송
- FAX 발송
- 카카오톡
- 프린트
---
### 4. 견적 등록 폼
![견적 등록](screenshots/04-quote-create-form.png)
**입력 섹션:**
**기본 정보:**
| 필드명 | 타입 | 필수 | 비고 |
|--------|------|------|------|
| 등록일 | date | | 기본: 오늘 |
| 작성자 | text | | 로그인 사용자 |
| 발주처 | select/search | ✅ | 거래처 선택 |
| 현장명 | text | ✅ | |
| 담당자 | text | | |
| 연락처 | text | | |
| 납기일 | date | | |
| 비고 | textarea | | |
**자동 견적 산출:**
| 필드명 | 타입 | 필수 | 비고 |
|--------|------|------|------|
| 층수 | text | | B1, 1F 등 |
| 부호 | text | | 도면 부호 |
| 제품카테고리 | select | | 스크린, 슬랫 등 |
| 제품명 | select | | 카테고리에 따라 |
| 가로(mm) | number | ✅ | 개구폭 |
| 세로(mm) | number | ✅ | 개구높이 |
| 설치유형 | select | | 백면형, 양면형, 편면형 |
| 모터전원 | select | | 220V, 380V |
| 제어기 | select | | 유선, 무선 |
| 수량 | number | | 기본: 1 |
---
## 데이터 스키마
### Quote (견적)
```
quotes
├── id (PK)
├── tenant_id (FK)
├── quote_no (UNIQUE) - 자동 채번
├── quote_date - 견적일
├── customer_id (FK) - 거래처
├── customer_name - 거래처명 (스냅샷)
├── site_name - 현장명
├── manager - 담당자
├── contact - 연락처
├── due_date - 납기일
├── status - 상태
├── total_amount - 총액
├── vat_amount - 부가세
├── grand_total - 합계(VAT포함)
├── note - 비고
├── special_note - 특기사항
├── created_by
├── created_at
├── updated_at
└── deleted_at
```
### QuoteItem (견적 품목)
```
quote_items
├── id (PK)
├── quote_id (FK)
├── seq - 순번
├── floor - 층
├── location - 부호/위치
├── product_category - 제품카테고리
├── product_code - 품목코드
├── product_name - 품목명
├── open_width - 개구폭(mm)
├── open_height - 개구높이(mm)
├── prod_width - 제작폭(mm) - 자동계산
├── prod_height - 제작높이(mm) - 자동계산
├── install_type - 설치유형
├── motor_voltage - 모터전원
├── controller_type - 제어기 타입
├── qty - 수량
├── unit_price - 단가
├── amount - 금액
├── spec - 규격 (JSON)
├── created_at
└── updated_at
```
---
## 상태 흐름
```
최초작성 → 수정중 → 최종확정 → 수주전환
↑__________|
```
| 상태 | 설명 | 다음 가능 상태 |
|------|------|----------------|
| 최초작성 | 신규 등록 | 수정중, 최종확정 |
| 수정중 | 수정 진행 중 | 최초작성, 최종확정 |
| 최종확정 | 확정 완료 | 수주전환 |
| 수주전환 | 수주로 전환됨 | - (최종) |
---
## 자동 계산 규칙
```javascript
// 제작 사이즈 자동 계산
prod_width = open_width + 140
prod_height = MAX(open_height + 400, 2950)
// 샤프트 자동 선정
shaft = open_width > 6000 ? 5인치 : 4인치
// 모터용량 자동 선정
capacity = open_width > 6000 ? 300kg : 160kg
// 금액 계산
amount = qty * unit_price
total_amount = SUM(items.amount)
vat_amount = total_amount * 0.1
grand_total = total_amount + vat_amount
```
---
## API 스펙
### 견적 CRUD
```
GET /api/quotes - 견적 목록
GET /api/quotes/{id} - 견적 상세
POST /api/quotes - 견적 등록
PUT /api/quotes/{id} - 견적 수정
DELETE /api/quotes/{id} - 견적 삭제
DELETE /api/quotes - 견적 일괄 삭제
```
### 견적 상태 변경
```
POST /api/quotes/{id}/confirm - 최종확정
POST /api/quotes/{id}/revise - 수정중으로 변경
POST /api/quotes/{id}/to-order - 수주전환
```
### 문서 출력
```
GET /api/quotes/{id}/documents/quote - 견적서
GET /api/quotes/{id}/documents/calculation - 산출내역서
GET /api/quotes/{id}/documents/order-form - 발주서
```
### 목록 조회 Query Parameters
| 파라미터 | 타입 | 설명 |
|----------|------|------|
| status | string | 상태 필터 (최초작성, 수정중, 최종확정, 수주전환) |
| search | string | 검색어 (견적번호, 거래처, 현장명) |
| from_date | date | 시작일 |
| to_date | date | 종료일 |
| page | number | 페이지 번호 |
| per_page | number | 페이지당 개수 |
---
## 채번 규칙
```
견적번호: QT-YYMMDD-##
예시: QT-241218-01, QT-241218-02
```
---
## 통계 계산
| 항목 | 계산식 |
|------|--------|
| 이번 달 견적 금액 | SUM(grand_total) WHERE quote_date in current_month |
| 진행중 견적 금액 | SUM(grand_total) WHERE status IN ('최초작성', '수정중') |
| 이번 주 신규 견적 | COUNT(*) WHERE created_at in current_week |
| 이번 달 수주 전환율 | (수주전환 건수 / 전체 건수) * 100 |

Binary file not shown.

After

Width:  |  Height:  |  Size: 646 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 285 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 330 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 276 KiB

View File

@@ -0,0 +1,234 @@
# 현장관리 분석 결과
> 분석 일시: 2024-12-18
> 분석 대상: design/mes기획서_리액트 (디자인팀 기획 사이트)
## 분석 목적
디자인팀에서 제작한 기획 사이트의 현장관리 기능을 분석하여 API 개발에 필요한 스펙을 추출합니다.
---
## UI 스크린샷
### 1. 현장 목록 페이지
![현장 목록](screenshots/01-site-list.png)
**주요 요소:**
- 테이블 컬럼: 번호, 현장코드, 현장명, 거래처, 주소, 등록일
- 검색 기능
- 현장 등록 버튼
---
### 2. 현장 상세 페이지
![현장 상세](screenshots/02-site-detail.png)
**주요 섹션:**
**기본 정보:**
| 필드 | 설명 |
|------|------|
| 현장코드 | 자동 생성 |
| 현장명 | 현장 이름 |
| 진행상태 | 수주확정, 생산중, 출하대기, 설치중, 설치완료 |
| 거래처 | 연결된 거래처 |
| 설치예정일 | 예정 날짜 |
| 진행률 | 0~100% |
| 현장주소 | 주소 |
| 현장연락처 | 연락처 |
| 설치담당자 | 담당자명 |
| 담당자 연락처 | 담당자 연락처 |
| 특이사항 | 메모 |
**수주내역:**
- 연결된 수주 목록 표시
- 수주번호, 품목, 수량, 금액 등
**출고내역:**
- 출고된 품목 목록
- 출고일, 수량, 상태 등
**변경이력:**
- 상태 변경 이력
- 변경일, 변경내용, 변경자
**헤더 버튼:**
- 목록
- 수정
- 삭제
---
### 3. 현장 등록 폼
![현장 등록](screenshots/03-site-create.png)
**입력 섹션:**
**현장 정보:**
| 필드명 | 타입 | 필수 | 비고 |
|--------|------|------|------|
| 현장명 | text | ✅ | |
| 거래처 | select/search | ✅ | 거래처 선택 |
| 현장주소 | text | | 우편번호 검색 |
| 현장연락처 | text | | |
| 진행상태 | select | | 기본: 수주확정 |
**설치 담당자:**
| 필드명 | 타입 | 필수 | 비고 |
|--------|------|------|------|
| 담당자명 | text | | |
| 연락처 | text | | |
| 설치예정일 | date | | |
| 설치완료일 | date | | |
| 특이사항 | textarea | | |
---
## 데이터 스키마
### Site (현장)
```
sites
├── id (PK)
├── tenant_id (FK)
├── site_code (UNIQUE) - 자동 채번
├── name - 현장명
├── customer_id (FK) - 거래처
├── customer_name - 거래처명 (스냅샷)
├── status - 진행상태
├── progress_rate - 진행률 (0-100)
├── address - 현장주소
├── address_detail - 상세주소
├── phone - 현장연락처
├── installer_name - 설치담당자
├── installer_phone - 담당자 연락처
├── scheduled_date - 설치예정일
├── completed_date - 설치완료일
├── note - 특이사항
├── created_at
├── updated_at
└── deleted_at
```
### SiteHistory (현장 변경이력)
```
site_histories
├── id (PK)
├── site_id (FK)
├── changed_field - 변경 필드
├── old_value - 이전 값
├── new_value - 변경 값
├── changed_by - 변경자
├── changed_at - 변경일시
└── note - 비고
```
---
## 상태 흐름
```
수주확정 → 생산중 → 출하대기 → 설치중 → 설치완료
```
| 상태 | 설명 | 진행률 범위 |
|------|------|-------------|
| 수주확정 | 수주 완료, 생산 대기 | 0-10% |
| 생산중 | 제품 생산 진행 | 10-50% |
| 출하대기 | 생산 완료, 출하 대기 | 50-70% |
| 설치중 | 현장 설치 진행 | 70-90% |
| 설치완료 | 설치 완료 | 100% |
---
## API 스펙
### 현장 CRUD
```
GET /api/sites - 현장 목록
GET /api/sites/{id} - 현장 상세
POST /api/sites - 현장 등록
PUT /api/sites/{id} - 현장 수정
DELETE /api/sites/{id} - 현장 삭제
DELETE /api/sites - 현장 일괄 삭제
```
### 현장 관련 조회
```
GET /api/sites/{id}/orders - 현장별 수주 내역
GET /api/sites/{id}/shipments - 현장별 출고 내역
GET /api/sites/{id}/history - 현장 변경 이력
```
### 현장 상태 변경
```
POST /api/sites/{id}/status - 상태 변경
```
**Request Body:**
```json
{
"status": "생산중",
"note": "생산 시작"
}
```
### 목록 조회 Query Parameters
| 파라미터 | 타입 | 설명 |
|----------|------|------|
| status | string | 진행상태 필터 |
| customer_id | number | 거래처 필터 |
| search | string | 검색어 (현장코드, 현장명) |
| page | number | 페이지 번호 |
| per_page | number | 페이지당 개수 |
---
## 채번 규칙
```
현장코드: S-{연도2자리}{월2자리}-{순번3자리}
예시: S-2412-001, S-2412-002
```
---
## 연관 관계
### 현장과 수주 연결
```
sites 1:N orders (site_id)
- 하나의 현장에 여러 수주가 연결될 수 있음
- 수주 생성 시 현장 자동 생성 또는 기존 현장 선택
```
### 현장과 거래처 연결
```
customers 1:N sites (customer_id)
- 하나의 거래처가 여러 현장을 가질 수 있음
```
---
## 진행률 자동 계산
```javascript
// 수주 품목 기준 진행률 계산
progress_rate = (완료_품목_수 / 전체_품목_수) * 100
// 또는 상태별 기본 진행률
status_progress = {
'수주확정': 10,
'생산중': 30,
'출하대기': 60,
'설치중': 80,
'설치완료': 100
}
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 KiB