Files
sam-docs/projects/legacy-5130/02_PRODUCT.md

251 lines
6.8 KiB
Markdown
Raw Normal View History

# 품목/모델 (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()` - 모델 선택 헬퍼 함수