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