insertGetId([ 'tenant_id' => self::TENANT_ID, 'parent_id' => null, 'code_group' => 'bp_mes', 'code' => 'bp_mes_products', 'name' => 'BP-MES 품목 관리', 'description' => 'BP-MES 품목 기준관리 시스템 루트 카테고리', 'sort_order' => 1, 'profile_code' => 'bp_mes_root', 'is_active' => 1, 'created_at' => now(), 'updated_at' => now(), ]); // 2. 완제품(FG) 카테고리 생성 $fgCategoryId = DB::table('categories')->insertGetId([ 'tenant_id' => self::TENANT_ID, 'parent_id' => $rootCategoryId, 'code_group' => 'bp_mes', 'code' => 'fg_products', 'name' => '완제품(FG)', 'description' => '판매 가능한 완제품 카테고리 (마진율, 비용 관리)', 'sort_order' => 1, 'profile_code' => 'fg_category', 'is_active' => 1, 'created_at' => now(), 'updated_at' => now(), ]); // 3. 부품(PT) 카테고리 생성 $ptCategoryId = DB::table('categories')->insertGetId([ 'tenant_id' => self::TENANT_ID, 'parent_id' => $rootCategoryId, 'code_group' => 'bp_mes', 'code' => 'pt_products', 'name' => '부품(PT)', 'description' => '조립용 부품 카테고리 (용도, 설치방식, 규격)', 'sort_order' => 2, 'profile_code' => 'pt_category', 'is_active' => 1, 'created_at' => now(), 'updated_at' => now(), ]); // 4. 절곡품 카테고리 생성 $bendingCategoryId = DB::table('categories')->insertGetId([ 'tenant_id' => self::TENANT_ID, 'parent_id' => $rootCategoryId, 'code_group' => 'bp_mes', 'code' => 'bending_products', 'name' => '절곡품', 'description' => '금속 절곡 가공품 카테고리 (절곡도, 재질, 길이)', 'sort_order' => 3, 'profile_code' => 'bending_category', 'is_active' => 1, 'created_at' => now(), 'updated_at' => now(), ]); // 5. 완제품(FG) 동적 필드 정의 $fgFields = [ // 비용 관리 (통계 필요) ['key' => 'margin_rate', 'name' => '마진율(%)', 'type' => 'decimal', 'required' => false, 'order' => 10, 'desc' => '제품 마진율 (통계 대상)'], ['key' => 'processing_cost', 'name' => '가공비(원)', 'type' => 'decimal', 'required' => false, 'order' => 11, 'desc' => '가공 비용 (통계 대상)'], ['key' => 'labor_cost', 'name' => '인건비(원)', 'type' => 'decimal', 'required' => false, 'order' => 12, 'desc' => '인건비 (통계 대상)'], ['key' => 'install_cost', 'name' => '설치비(원)', 'type' => 'decimal', 'required' => false, 'order' => 13, 'desc' => '설치 비용 (통계 대상)'], // LOT 관리 ['key' => 'lot_abbreviation', 'name' => 'LOT 약어', 'type' => 'text', 'required' => false, 'order' => 20, 'desc' => 'LOT 번호 생성용 약어'], ['key' => 'note', 'name' => '비고', 'type' => 'textarea', 'required' => false, 'order' => 21, 'desc' => '제품 관련 메모 및 특이사항'], // 인증 정보 ['key' => 'certification_number', 'name' => '인증번호', 'type' => 'text', 'required' => false, 'order' => 30, 'desc' => '제품 인증번호'], ['key' => 'certification_start_date', 'name' => '인증시작일', 'type' => 'date', 'required' => false, 'order' => 31, 'desc' => '인증 유효기간 시작일'], ['key' => 'certification_end_date', 'name' => '인증종료일', 'type' => 'date', 'required' => false, 'order' => 32, 'desc' => '인증 유효기간 종료일'], // 파일 관리 ['key' => 'specification_file', 'name' => '규격파일', 'type' => 'file', 'required' => false, 'order' => 40, 'desc' => '제품 규격서 파일 경로'], ['key' => 'specification_file_name', 'name' => '규격파일명', 'type' => 'text', 'required' => false, 'order' => 41, 'desc' => '규격서 파일 원본명'], ['key' => 'certification_file', 'name' => '인증파일', 'type' => 'file', 'required' => false, 'order' => 42, 'desc' => '인증서 파일 경로'], ['key' => 'certification_file_name', 'name' => '인증파일명', 'type' => 'text', 'required' => false, 'order' => 43, 'desc' => '인증서 파일 원본명'], // 확장 옵션 ['key' => 'options', 'name' => '옵션정보', 'type' => 'json', 'required' => false, 'order' => 50, 'desc' => '추가 옵션 정보 (JSON 형태)'], ]; // 6. 부품(PT) 동적 필드 정의 $ptFields = [ // 부품 분류 및 용도 ['key' => 'part_usage', 'name' => '용도', 'type' => 'text', 'required' => false, 'order' => 10, 'desc' => '부품 사용 용도'], ['key' => 'installation_type', 'name' => '설치방식', 'type' => 'select', 'required' => false, 'order' => 11, 'options' => ['CEILING', 'WALL', 'FLOOR', 'HANGING'], 'desc' => '설치 방식 (천장형, 벽면형, 바닥형, 현가형)'], ['key' => 'assembly_type', 'name' => '조립타입', 'type' => 'select', 'required' => false, 'order' => 12, 'options' => ['WELDING', 'BOLT', 'RIVET', 'ADHESIVE'], 'desc' => '조립 방식 (용접, 볼트, 리벳, 접착)'], // 치수 정보 ['key' => 'side_spec_width', 'name' => '측면규격_폭(mm)', 'type' => 'decimal', 'required' => false, 'order' => 20, 'desc' => '측면 규격 폭'], ['key' => 'side_spec_height', 'name' => '측면규격_높이(mm)', 'type' => 'decimal', 'required' => false, 'order' => 21, 'desc' => '측면 규격 높이'], ['key' => 'assembly_length', 'name' => '조립길이(mm)', 'type' => 'decimal', 'required' => false, 'order' => 22, 'desc' => '조립 시 길이'], // 가이드레일 정보 ['key' => 'guide_rail_model_type', 'name' => '가이드레일모델타입', 'type' => 'select', 'required' => false, 'order' => 30, 'options' => ['TYPE_A', 'TYPE_B', 'TYPE_C', 'CUSTOM'], 'desc' => '가이드레일 모델 타입'], ['key' => 'guide_rail_model', 'name' => '가이드레일모델', 'type' => 'text', 'required' => false, 'order' => 31, 'desc' => '가이드레일 모델명'], ]; // 7. 절곡품 동적 필드 정의 $bendingFields = [ // 절곡 정보 ['key' => 'bending_diagram', 'name' => '절곡도', 'type' => 'file', 'required' => false, 'order' => 10, 'desc' => '절곡 도면 파일 경로'], ['key' => 'bending_details', 'name' => '절곡상세', 'type' => 'json', 'required' => false, 'order' => 11, 'desc' => '절곡 상세 정보 (각도, 위치 등 JSON)'], // 재질 및 치수 ['key' => 'material', 'name' => '재질', 'type' => 'select', 'required' => true, 'order' => 20, 'options' => ['STEEL', 'STAINLESS', 'ALUMINUM', 'GALVANIZED'], 'desc' => '금속 재질 (강판, 스텐, 알루미늄, 아연도금)'], ['key' => 'length', 'name' => '길이(mm)', 'type' => 'decimal', 'required' => true, 'order' => 21, 'desc' => '절곡품 길이'], ['key' => 'bending_length', 'name' => '절곡길이(mm)', 'type' => 'decimal', 'required' => false, 'order' => 22, 'desc' => '절곡 부분 길이'], ]; // 8. 완제품(FG) 카테고리 필드 생성 foreach ($fgFields as $field) { $this->insertCategoryField($fgCategoryId, $field); } // 9. 부품(PT) 카테고리 필드 생성 foreach ($ptFields as $field) { $this->insertCategoryField($ptCategoryId, $field); } // 10. 절곡품 카테고리 필드 생성 foreach ($bendingFields as $field) { $this->insertCategoryField($bendingCategoryId, $field); } } /** * category_fields 테이블에 필드 삽입 */ private function insertCategoryField(int $categoryId, array $field): void { DB::table('category_fields')->insert([ 'tenant_id' => self::TENANT_ID, 'category_id' => $categoryId, 'field_key' => $field['key'], 'field_name' => $field['name'], 'field_type' => $field['type'], 'is_required' => $field['required'], 'sort_order' => $field['order'], 'default_value' => $field['default'] ?? null, 'options' => isset($field['options']) ? json_encode($field['options']) : null, 'description' => $field['desc'], 'created_at' => now(), 'updated_at' => now(), ]); } }