diff --git a/projects/mes/customer-analysis/README.md b/projects/mes/customer-analysis/README.md new file mode 100644 index 0000000..6b8b599 --- /dev/null +++ b/projects/mes/customer-analysis/README.md @@ -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 +``` \ No newline at end of file diff --git a/projects/mes/customer-analysis/screenshots/01-customer-list.png b/projects/mes/customer-analysis/screenshots/01-customer-list.png new file mode 100644 index 0000000..7e087a6 Binary files /dev/null and b/projects/mes/customer-analysis/screenshots/01-customer-list.png differ diff --git a/projects/mes/customer-analysis/screenshots/02-customer-detail.png b/projects/mes/customer-analysis/screenshots/02-customer-detail.png new file mode 100644 index 0000000..ccd3698 Binary files /dev/null and b/projects/mes/customer-analysis/screenshots/02-customer-detail.png differ diff --git a/projects/mes/customer-analysis/screenshots/03-customer-create.png b/projects/mes/customer-analysis/screenshots/03-customer-create.png new file mode 100644 index 0000000..86c6dc3 Binary files /dev/null and b/projects/mes/customer-analysis/screenshots/03-customer-create.png differ diff --git a/projects/mes/price-analysis/README.md b/projects/mes/price-analysis/README.md new file mode 100644 index 0000000..72f0c49 --- /dev/null +++ b/projects/mes/price-analysis/README.md @@ -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) | diff --git a/projects/mes/price-analysis/screenshots/01-price-list.png b/projects/mes/price-analysis/screenshots/01-price-list.png new file mode 100644 index 0000000..92edb60 Binary files /dev/null and b/projects/mes/price-analysis/screenshots/01-price-list.png differ diff --git a/projects/mes/quote-analysis/README.md b/projects/mes/quote-analysis/README.md new file mode 100644 index 0000000..d946b75 --- /dev/null +++ b/projects/mes/quote-analysis/README.md @@ -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 | \ No newline at end of file diff --git a/projects/mes/quote-analysis/screenshots/01-quote-list.png b/projects/mes/quote-analysis/screenshots/01-quote-list.png new file mode 100644 index 0000000..75e427c Binary files /dev/null and b/projects/mes/quote-analysis/screenshots/01-quote-list.png differ diff --git a/projects/mes/quote-analysis/screenshots/02-quote-detail.png b/projects/mes/quote-analysis/screenshots/02-quote-detail.png new file mode 100644 index 0000000..3ee5076 Binary files /dev/null and b/projects/mes/quote-analysis/screenshots/02-quote-detail.png differ diff --git a/projects/mes/quote-analysis/screenshots/03-quote-document-modal.png b/projects/mes/quote-analysis/screenshots/03-quote-document-modal.png new file mode 100644 index 0000000..f146d09 Binary files /dev/null and b/projects/mes/quote-analysis/screenshots/03-quote-document-modal.png differ diff --git a/projects/mes/quote-analysis/screenshots/04-quote-create-form.png b/projects/mes/quote-analysis/screenshots/04-quote-create-form.png new file mode 100644 index 0000000..e9bc307 Binary files /dev/null and b/projects/mes/quote-analysis/screenshots/04-quote-create-form.png differ diff --git a/projects/mes/site-analysis/README.md b/projects/mes/site-analysis/README.md new file mode 100644 index 0000000..b044536 --- /dev/null +++ b/projects/mes/site-analysis/README.md @@ -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 +} +``` \ No newline at end of file diff --git a/projects/mes/site-analysis/screenshots/01-site-list.png b/projects/mes/site-analysis/screenshots/01-site-list.png new file mode 100644 index 0000000..215c969 Binary files /dev/null and b/projects/mes/site-analysis/screenshots/01-site-list.png differ diff --git a/projects/mes/site-analysis/screenshots/02-site-detail.png b/projects/mes/site-analysis/screenshots/02-site-detail.png new file mode 100644 index 0000000..e8a43ea Binary files /dev/null and b/projects/mes/site-analysis/screenshots/02-site-detail.png differ diff --git a/projects/mes/site-analysis/screenshots/03-site-create.png b/projects/mes/site-analysis/screenshots/03-site-create.png new file mode 100644 index 0000000..4b3aee6 Binary files /dev/null and b/projects/mes/site-analysis/screenshots/03-site-create.png differ