# 품목/모델 (Product/Model) 분석 ## 개요 - **디렉토리**: `/models/` - **DB 테이블**: `models`, `parts`, `parts_sub` - **주요 기능**: 제품 모델 정의, BOM(Bill of Materials) 관리, 단가 계산 ## 디렉토리 구조 ``` /models/ ├── _request.php # 요청 파라미터 ├── _row.php # 행 렌더링 ├── _part_row.php # 부품 행 렌더링 ├── _part_sub_row.php # 하위 부품 행 렌더링 ├── insert.php # 모델/부품 저장 ├── list.php # 모델 목록 ├── write_form.php # 모델 등록/수정 폼 ├── modelslist.php # 모델 리스트 조회 ├── itemlist.php # 아이템 리스트 ├── sub_table.php # 하위 부품 테이블 ├── basic_model.php # 기본 모델 설정 ├── models.json # 모델 JSON 데이터 └── items.json # 아이템 JSON 데이터 ``` ## DB 스키마 ### 1. models 테이블 (모델 마스터) ```sql CREATE TABLE models ( model_id INT AUTO_INCREMENT PRIMARY KEY, model_name VARCHAR(100), -- 모델명 major_category VARCHAR(50), -- 대분류 (슬랫, 스크린 등) finishing_type VARCHAR(50), -- 마감 유형 description TEXT, -- 설명 guiderail_type VARCHAR(50), -- 가이드레일 유형 update_log TEXT, -- 수정이력 is_deleted TINYINT DEFAULT 0, -- 삭제플래그 INDEX idx_model_name (model_name), INDEX idx_major_category (major_category) ); ``` ### 2. parts 테이블 (부품 - 2단계) ```sql CREATE TABLE parts ( part_id INT AUTO_INCREMENT PRIMARY KEY, model_id INT, -- 부모 모델 ID part_name VARCHAR(100), -- 부품명 spec VARCHAR(100), -- 규격 unit VARCHAR(20), -- 단위 quantity DECIMAL(10,2), -- 수량 unitprice DECIMAL(15,0), -- 단가 memo TEXT, -- 메모 is_deleted TINYINT DEFAULT 0, -- 삭제플래그 FOREIGN KEY (model_id) REFERENCES models(model_id), INDEX idx_model_id (model_id) ); ``` ### 3. parts_sub 테이블 (하위 부품 - 3단계) ```sql CREATE TABLE parts_sub ( subpart_id INT AUTO_INCREMENT PRIMARY KEY, part_id INT, -- 부모 부품 ID subpart_name VARCHAR(100), -- 하위 부품명 material VARCHAR(100), -- 소재 -- 가격 계산 필드 bendSum DECIMAL(15,0), -- 벤딩 합계 plateSum DECIMAL(15,0), -- 판재 합계 finalSum DECIMAL(15,0), -- 최종 합계 unitPrice DECIMAL(15,0), -- 단가 computedPrice DECIMAL(15,0), -- 계산 가격 quantity DECIMAL(10,2), -- 수량 lineTotal DECIMAL(15,0), -- 행 합계 image_url VARCHAR(500), -- 이미지 URL is_deleted TINYINT DEFAULT 0, -- 삭제플래그 FOREIGN KEY (part_id) REFERENCES parts(part_id), INDEX idx_part_id (part_id) ); ``` ## 계층 구조 ``` models (모델) └── parts (부품) └── parts_sub (하위 부품) 예시: ├── KD-SLAT-001 (슬랫 모델) │ ├── 가이드레일 (부품) │ │ ├── 상부 브라켓 (하위 부품) │ │ ├── 하부 브라켓 (하위 부품) │ │ └── 레일 바디 (하위 부품) │ ├── 슬랫 본체 (부품) │ │ ├── 슬랫 코일 (하위 부품) │ │ └── 인터락 (하위 부품) │ └── 구동부 (부품) │ ├── 모터 (하위 부품) │ └── 샤프트 (하위 부품) ``` ## 비즈니스 로직 ### 모델 관리 (insert.php) ```php // 1단계: 모델 저장 if ($mode == "insert") { $sql = "INSERT INTO models (model_name, major_category, finishing_type, description, update_log, guiderail_type) VALUES (?, ?, ?, ?, ?, ?)"; } // 2단계: 부품 저장 (배열 처리) if(isset($_POST['part_name']) && is_array($_POST['part_name'])) { // 기존 부품과 비교하여 삭제된 부품 처리 // 신규 부품 INSERT, 기존 부품 UPDATE } // 3단계: 하위 부품 저장 if(isset($_POST['subpart_name']) && is_array($_POST['subpart_name'])) { // parent_part_id로 부모 부품과 연결 } ``` ### 복사 기능 ```php // 모델 복사 시 하위 구조 전체 복사 if ($mode == "copy") { // 1. 모델 복사 → 새 model_id // 2. 부품 복사 → partMapping (old_id → new_id) // 3. 하위 부품 복사 → partMapping 기반 parent_id 변환 } ``` ### 가격 계산 - `bendSum`: 벤딩 공정 비용 합계 - `plateSum`: 판재 비용 합계 - `finalSum`: bendSum + plateSum - `computedPrice`: 추가 가공비 포함 - `lineTotal`: unitPrice × quantity ## 관련 JSON 데이터 ### models.json ```json [ { "model_name": "KD-SLAT-001", "slatitem": "슬랫", "pair": "single" }, { "model_name": "KD-SCREEN-001", "slatitem": "스크린", "pair": "double" } ] ``` ### items.json ```json [ { "item_code": "ITM001", "item_name": "가이드레일 A형", "category": "가이드레일" } ] ``` ## 관련 디렉토리 ### 단가 관리 디렉토리 ``` /price_angle/ # 앵글 단가 /price_bend/ # 벤딩 단가 /price_motor/ # 모터 단가 /price_pipe/ # 파이프 단가 /price_pole/ # 폴 단가 /price_raw_materials/ # 원자재 단가 /price_screenplate/ # 스크린판 단가 /price_shaft/ # 샤프트 단가 /price_smokeban/ # 연기차단 단가 ``` ### 벤딩/가공 관련 ``` /bending/ # 벤딩 작업 /bendingfee/ # 벤딩 비용 /bendingmap/ # 벤딩 맵 /etcbending/ # 기타 벤딩 ``` ## SAM 마이그레이션 포인트 ### 1. BOM 구조 개선 ```sql -- SAM: 재귀적 BOM 구조 bom_items ( id, tenant_id, parent_id, -- NULL이면 최상위 모델 item_type, -- model, assembly, part, material item_code, item_name, quantity, unit_price, level, -- BOM 레벨 (1, 2, 3, ...) sort_order ) ``` ### 2. 가격 계산 분리 ```sql -- SAM: 가격 계산 이력 관리 price_calculations ( id, bom_item_id, calculation_type, -- bending, material, labor base_price, markup_rate, final_price, effective_from, effective_to ) ``` ### 3. 버전 관리 ```sql -- SAM: 모델 버전 관리 model_versions ( id, model_id, version, snapshot JSON, -- BOM 스냅샷 created_at, created_by ) ``` ## 참고 파일 - `/models/insert.php` - 3단계 계층 저장 로직 - `/models/write_form.php` - BOM 편집 UI - `/common.php:selectModel()` - 모델 선택 헬퍼 함수