Files
sam-docs/projects/legacy-5130/02_PRODUCT.md
hskwon 08a8259313 docs: 5130 레거시 분석 문서 및 기존 문서 초기 커밋
- 5130 레거시 시스템 분석 (00_OVERVIEW ~ 08_SAM_COMPARISON)
- MES 프로젝트 문서
- API/프론트엔드 스펙 문서
- 가이드 및 레퍼런스 문서
2025-12-04 18:47:19 +09:00

6.8 KiB
Raw Permalink Blame 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 테이블 (모델 마스터)

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단계)

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단계)

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)

// 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로 부모 부품과 연결
}

복사 기능

// 모델 복사 시 하위 구조 전체 복사
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

[
    {
        "model_name": "KD-SLAT-001",
        "slatitem": "슬랫",
        "pair": "single"
    },
    {
        "model_name": "KD-SCREEN-001",
        "slatitem": "스크린",
        "pair": "double"
    }
]

items.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 구조 개선

-- 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. 가격 계산 분리

-- SAM: 가격 계산 이력 관리
price_calculations (
    id,
    bom_item_id,
    calculation_type,    -- bending, material, labor
    base_price,
    markup_rate,
    final_price,
    effective_from,
    effective_to
)

3. 버전 관리

-- 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() - 모델 선택 헬퍼 함수