- 5130 레거시 시스템 분석 (00_OVERVIEW ~ 08_SAM_COMPARISON) - MES 프로젝트 문서 - API/프론트엔드 스펙 문서 - 가이드 및 레퍼런스 문서
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()` - 모델 선택 헬퍼 함수
|