feat: 자재 분류 시스템 개선 및 상세 테이블 추가
- 모든 자재 카테고리별 상세 테이블 생성 (fitting, valve, flange, bolt, gasket, instrument) - PIPE, FITTING, VALVE 분류 결과를 각 상세 테이블에 저장하는 로직 구현 - 프론트엔드 라우팅 정리 및 BOM 현황 페이지 기능 개선 - 자재확인 페이지 에러 처리 개선 TODO: FLANGE, BOLT, GASKET, INSTRUMENT 저장 로직 추가 필요
This commit is contained in:
5
backend/scripts/05_add_length_to_materials.sql
Normal file
5
backend/scripts/05_add_length_to_materials.sql
Normal file
@@ -0,0 +1,5 @@
|
||||
-- materials 테이블에 length 컬럼 추가
|
||||
ALTER TABLE materials ADD COLUMN length NUMERIC(10, 3);
|
||||
|
||||
-- 기존 데이터의 length 컬럼을 NULL로 초기화
|
||||
UPDATE materials SET length = NULL;
|
||||
137
backend/scripts/05_create_material_standards_tables.sql
Normal file
137
backend/scripts/05_create_material_standards_tables.sql
Normal file
@@ -0,0 +1,137 @@
|
||||
-- 자재 규격/재질 기준표 테이블 생성 스크립트
|
||||
-- 실행 순서: 1) material_standards, 2) material_categories, 3) material_specifications, 4) material_grades, 5) material_patterns
|
||||
-- 특수 재질: 6) special_materials, 7) special_material_grades, 8) special_material_patterns
|
||||
|
||||
-- 1. 자재 규격 표준 테이블
|
||||
CREATE TABLE IF NOT EXISTS material_standards (
|
||||
id SERIAL PRIMARY KEY,
|
||||
standard_code VARCHAR(20) UNIQUE NOT NULL,
|
||||
standard_name VARCHAR(100) NOT NULL,
|
||||
description TEXT,
|
||||
country VARCHAR(50),
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 2. 제조방식별 카테고리 테이블
|
||||
CREATE TABLE IF NOT EXISTS material_categories (
|
||||
id SERIAL PRIMARY KEY,
|
||||
standard_id INTEGER REFERENCES material_standards(id),
|
||||
category_code VARCHAR(50) NOT NULL,
|
||||
category_name VARCHAR(100) NOT NULL,
|
||||
description TEXT,
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 3. 구체적인 규격 테이블
|
||||
CREATE TABLE IF NOT EXISTS material_specifications (
|
||||
id SERIAL PRIMARY KEY,
|
||||
category_id INTEGER REFERENCES material_categories(id),
|
||||
spec_code VARCHAR(20) NOT NULL,
|
||||
spec_name VARCHAR(100) NOT NULL,
|
||||
description TEXT,
|
||||
material_type VARCHAR(50),
|
||||
manufacturing VARCHAR(50),
|
||||
pressure_rating VARCHAR(100),
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 4. 등급별 상세 정보 테이블
|
||||
CREATE TABLE IF NOT EXISTS material_grades (
|
||||
id SERIAL PRIMARY KEY,
|
||||
specification_id INTEGER REFERENCES material_specifications(id),
|
||||
grade_code VARCHAR(20) NOT NULL,
|
||||
grade_name VARCHAR(100),
|
||||
composition VARCHAR(200),
|
||||
applications VARCHAR(200),
|
||||
temp_max VARCHAR(50),
|
||||
temp_range VARCHAR(100),
|
||||
yield_strength VARCHAR(50),
|
||||
tensile_strength VARCHAR(50),
|
||||
corrosion_resistance VARCHAR(50),
|
||||
stabilizer VARCHAR(50),
|
||||
base_grade VARCHAR(20),
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 5. 정규식 패턴 테이블
|
||||
CREATE TABLE IF NOT EXISTS material_patterns (
|
||||
id SERIAL PRIMARY KEY,
|
||||
specification_id INTEGER REFERENCES material_specifications(id),
|
||||
pattern TEXT NOT NULL,
|
||||
description VARCHAR(200),
|
||||
priority INTEGER DEFAULT 1,
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 6. 특수 재질 테이블
|
||||
CREATE TABLE IF NOT EXISTS special_materials (
|
||||
id SERIAL PRIMARY KEY,
|
||||
material_type VARCHAR(50) NOT NULL,
|
||||
material_name VARCHAR(100) NOT NULL,
|
||||
description TEXT,
|
||||
composition VARCHAR(200),
|
||||
applications TEXT,
|
||||
temp_max VARCHAR(50),
|
||||
manufacturing VARCHAR(50),
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 7. 특수 재질 등급 테이블
|
||||
CREATE TABLE IF NOT EXISTS special_material_grades (
|
||||
id SERIAL PRIMARY KEY,
|
||||
material_id INTEGER REFERENCES special_materials(id),
|
||||
grade_code VARCHAR(20) NOT NULL,
|
||||
composition VARCHAR(200),
|
||||
applications VARCHAR(200),
|
||||
temp_max VARCHAR(50),
|
||||
strength VARCHAR(50),
|
||||
purity VARCHAR(100),
|
||||
corrosion VARCHAR(50),
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 8. 특수 재질 정규식 패턴 테이블
|
||||
CREATE TABLE IF NOT EXISTS special_material_patterns (
|
||||
id SERIAL PRIMARY KEY,
|
||||
material_id INTEGER REFERENCES special_materials(id),
|
||||
pattern TEXT NOT NULL,
|
||||
description VARCHAR(200),
|
||||
priority INTEGER DEFAULT 1,
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 인덱스 생성
|
||||
CREATE INDEX IF NOT EXISTS idx_material_standards_code ON material_standards(standard_code);
|
||||
CREATE INDEX IF NOT EXISTS idx_material_categories_standard ON material_categories(standard_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_material_specifications_category ON material_specifications(category_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_material_grades_specification ON material_grades(specification_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_material_patterns_specification ON material_patterns(specification_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_special_materials_type ON special_materials(material_type);
|
||||
CREATE INDEX IF NOT EXISTS idx_special_material_grades_material ON special_material_grades(material_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_special_material_patterns_material ON special_material_patterns(material_id);
|
||||
|
||||
-- 활성 상태 인덱스
|
||||
CREATE INDEX IF NOT EXISTS idx_material_standards_active ON material_standards(is_active);
|
||||
CREATE INDEX IF NOT EXISTS idx_material_categories_active ON material_categories(is_active);
|
||||
CREATE INDEX IF NOT EXISTS idx_material_specifications_active ON material_specifications(is_active);
|
||||
CREATE INDEX IF NOT EXISTS idx_material_grades_active ON material_grades(is_active);
|
||||
CREATE INDEX IF NOT EXISTS idx_material_patterns_active ON material_patterns(is_active);
|
||||
CREATE INDEX IF NOT EXISTS idx_special_materials_active ON special_materials(is_active);
|
||||
CREATE INDEX IF NOT EXISTS idx_special_material_grades_active ON special_material_grades(is_active);
|
||||
CREATE INDEX IF NOT EXISTS idx_special_material_patterns_active ON special_material_patterns(is_active);
|
||||
109
backend/scripts/05_create_pipe_details_and_requirements.sql
Normal file
109
backend/scripts/05_create_pipe_details_and_requirements.sql
Normal file
@@ -0,0 +1,109 @@
|
||||
-- 파이프 상세 정보 및 사용자 요구사항 테이블 생성
|
||||
-- 2024-01-XX
|
||||
|
||||
-- 파이프 상세 정보 테이블
|
||||
CREATE TABLE IF NOT EXISTS pipe_details (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
file_id INTEGER NOT NULL,
|
||||
|
||||
-- 재질 정보
|
||||
material_standard TEXT, -- ASTM, KS, JIS 등
|
||||
material_grade TEXT, -- A106, A53, STPG370 등
|
||||
material_type TEXT, -- CARBON, STAINLESS 등
|
||||
|
||||
-- 파이프 특화 정보
|
||||
manufacturing_method TEXT, -- SEAMLESS, WELDED, CAST
|
||||
end_preparation TEXT, -- BOTH_ENDS_BEVELED, ONE_END_BEVELED, NO_BEVEL
|
||||
schedule TEXT, -- SCH 10, 20, 40, 80 등
|
||||
wall_thickness TEXT, -- 벽두께 정보
|
||||
|
||||
-- 치수 정보
|
||||
nominal_size TEXT, -- MAIN_NOM (인치, 직경)
|
||||
length_mm REAL, -- LENGTH (길이)
|
||||
|
||||
-- 신뢰도
|
||||
material_confidence REAL,
|
||||
manufacturing_confidence REAL,
|
||||
end_prep_confidence REAL,
|
||||
schedule_confidence REAL,
|
||||
|
||||
-- 메타데이터
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
FOREIGN KEY (file_id) REFERENCES files(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
-- 요구사항 타입 마스터 테이블
|
||||
CREATE TABLE IF NOT EXISTS requirement_types (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
type_code TEXT UNIQUE NOT NULL, -- 'IMPACT_TEST', 'HEAT_TREATMENT' 등
|
||||
type_name TEXT NOT NULL, -- '임팩테스트', '열처리' 등
|
||||
category TEXT NOT NULL, -- 'TEST', 'TREATMENT', 'CERTIFICATION', 'CUSTOM' 등
|
||||
description TEXT, -- 타입 설명
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 사용자 추가 요구사항 테이블
|
||||
CREATE TABLE IF NOT EXISTS user_requirements (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
file_id INTEGER NOT NULL,
|
||||
|
||||
-- 요구사항 타입
|
||||
requirement_type TEXT NOT NULL, -- 'IMPACT_TEST', 'HEAT_TREATMENT', 'CUSTOM_SPEC', 'CERTIFICATION' 등
|
||||
|
||||
-- 요구사항 내용
|
||||
requirement_title TEXT NOT NULL, -- '임팩테스트', '열처리', '인증서' 등
|
||||
requirement_description TEXT, -- 상세 설명
|
||||
requirement_spec TEXT, -- 구체적 스펙 (예: "Charpy V-notch -20°C")
|
||||
|
||||
-- 상태 관리
|
||||
status TEXT DEFAULT 'PENDING', -- 'PENDING', 'IN_PROGRESS', 'COMPLETED', 'CANCELLED'
|
||||
priority TEXT DEFAULT 'NORMAL', -- 'LOW', 'NORMAL', 'HIGH', 'URGENT'
|
||||
|
||||
-- 담당자 정보
|
||||
assigned_to TEXT, -- 담당자명
|
||||
due_date DATE, -- 완료 예정일
|
||||
|
||||
-- 메타데이터
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
FOREIGN KEY (file_id) REFERENCES files(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
-- 인덱스 생성
|
||||
CREATE INDEX IF NOT EXISTS idx_pipe_details_file_id ON pipe_details(file_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_user_requirements_file_id ON user_requirements(file_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_user_requirements_status ON user_requirements(status);
|
||||
CREATE INDEX IF NOT EXISTS idx_user_requirements_type ON user_requirements(requirement_type);
|
||||
|
||||
-- 기본 요구사항 타입 데이터 삽입
|
||||
INSERT OR IGNORE INTO requirement_types (type_code, type_name, category, description) VALUES
|
||||
('IMPACT_TEST', '임팩테스트', 'TEST', 'Charpy V-notch, Izod 등의 충격 시험'),
|
||||
('HEAT_TREATMENT', '열처리', 'TREATMENT', '정규화, 어닐링, 템퍼링 등의 열처리'),
|
||||
('CERTIFICATION', '인증서', 'CERTIFICATION', '재질증명서, 시험성적서 등'),
|
||||
('CUSTOM_SPEC', '특수사양', 'CUSTOM', '고객 특별 요구사항'),
|
||||
('NDT_TEST', '비파괴검사', 'TEST', '초음파, 방사선, 자분탐상 등'),
|
||||
('CHEMICAL_ANALYSIS', '화학분석', 'TEST', '화학성분 분석'),
|
||||
('MECHANICAL_TEST', '기계적성질', 'TEST', '인장, 압축, 굽힘 시험'),
|
||||
('SURFACE_TREATMENT', '표면처리', 'TREATMENT', '도금, 도장, 패시베이션 등'),
|
||||
('DIMENSIONAL_CHECK', '치수검사', 'INSPECTION', '치수, 형상 검사'),
|
||||
('WELDING_SPEC', '용접사양', 'SPEC', '용접 방법, 용접재 등');
|
||||
|
||||
-- 트리거 생성 (updated_at 자동 업데이트)
|
||||
CREATE TRIGGER IF NOT EXISTS update_pipe_details_timestamp
|
||||
AFTER UPDATE ON pipe_details
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
UPDATE pipe_details SET updated_at = CURRENT_TIMESTAMP WHERE id = NEW.id;
|
||||
END;
|
||||
|
||||
CREATE TRIGGER IF NOT EXISTS update_user_requirements_timestamp
|
||||
AFTER UPDATE ON user_requirements
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
UPDATE user_requirements SET updated_at = CURRENT_TIMESTAMP WHERE id = NEW.id;
|
||||
END;
|
||||
@@ -0,0 +1,115 @@
|
||||
-- 파이프 상세 정보 및 사용자 요구사항 테이블 생성 (PostgreSQL)
|
||||
-- 2024-01-XX
|
||||
|
||||
-- 파이프 상세 정보 테이블
|
||||
CREATE TABLE IF NOT EXISTS pipe_details (
|
||||
id SERIAL PRIMARY KEY,
|
||||
file_id INTEGER NOT NULL,
|
||||
|
||||
-- 재질 정보
|
||||
material_standard VARCHAR(50), -- ASTM, KS, JIS 등
|
||||
material_grade VARCHAR(50), -- A106, A53, STPG370 등
|
||||
material_type VARCHAR(50), -- CARBON, STAINLESS 등
|
||||
|
||||
-- 파이프 특화 정보
|
||||
manufacturing_method VARCHAR(50), -- SEAMLESS, WELDED, CAST
|
||||
end_preparation VARCHAR(50), -- BOTH_ENDS_BEVELED, ONE_END_BEVELED, NO_BEVEL
|
||||
schedule VARCHAR(50), -- SCH 10, 20, 40, 80 등
|
||||
wall_thickness VARCHAR(50), -- 벽두께 정보
|
||||
|
||||
-- 치수 정보
|
||||
nominal_size VARCHAR(50), -- MAIN_NOM (인치, 직경)
|
||||
length_mm DECIMAL(10, 3), -- LENGTH (길이)
|
||||
|
||||
-- 신뢰도
|
||||
material_confidence DECIMAL(3, 2),
|
||||
manufacturing_confidence DECIMAL(3, 2),
|
||||
end_prep_confidence DECIMAL(3, 2),
|
||||
schedule_confidence DECIMAL(3, 2),
|
||||
|
||||
-- 메타데이터
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
FOREIGN KEY (file_id) REFERENCES files(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
-- 요구사항 타입 마스터 테이블
|
||||
CREATE TABLE IF NOT EXISTS requirement_types (
|
||||
id SERIAL PRIMARY KEY,
|
||||
type_code VARCHAR(50) UNIQUE NOT NULL, -- 'IMPACT_TEST', 'HEAT_TREATMENT' 등
|
||||
type_name VARCHAR(100) NOT NULL, -- '임팩테스트', '열처리' 등
|
||||
category VARCHAR(50) NOT NULL, -- 'TEST', 'TREATMENT', 'CERTIFICATION', 'CUSTOM' 등
|
||||
description TEXT, -- 타입 설명
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 사용자 추가 요구사항 테이블
|
||||
CREATE TABLE IF NOT EXISTS user_requirements (
|
||||
id SERIAL PRIMARY KEY,
|
||||
file_id INTEGER NOT NULL,
|
||||
|
||||
-- 요구사항 타입
|
||||
requirement_type VARCHAR(50) NOT NULL, -- 'IMPACT_TEST', 'HEAT_TREATMENT', 'CUSTOM_SPEC', 'CERTIFICATION' 등
|
||||
|
||||
-- 요구사항 내용
|
||||
requirement_title VARCHAR(200) NOT NULL, -- '임팩테스트', '열처리', '인증서' 등
|
||||
requirement_description TEXT, -- 상세 설명
|
||||
requirement_spec TEXT, -- 구체적 스펙 (예: "Charpy V-notch -20°C")
|
||||
|
||||
-- 상태 관리
|
||||
status VARCHAR(20) DEFAULT 'PENDING', -- 'PENDING', 'IN_PROGRESS', 'COMPLETED', 'CANCELLED'
|
||||
priority VARCHAR(20) DEFAULT 'NORMAL', -- 'LOW', 'NORMAL', 'HIGH', 'URGENT'
|
||||
|
||||
-- 담당자 정보
|
||||
assigned_to VARCHAR(100), -- 담당자명
|
||||
due_date DATE, -- 완료 예정일
|
||||
|
||||
-- 메타데이터
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
FOREIGN KEY (file_id) REFERENCES files(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
-- 인덱스 생성
|
||||
CREATE INDEX IF NOT EXISTS idx_pipe_details_file_id ON pipe_details(file_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_user_requirements_file_id ON user_requirements(file_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_user_requirements_status ON user_requirements(status);
|
||||
CREATE INDEX IF NOT EXISTS idx_user_requirements_type ON user_requirements(requirement_type);
|
||||
|
||||
-- 기본 요구사항 타입 데이터 삽입
|
||||
INSERT INTO requirement_types (type_code, type_name, category, description) VALUES
|
||||
('IMPACT_TEST', '임팩테스트', 'TEST', 'Charpy V-notch, Izod 등의 충격 시험'),
|
||||
('HEAT_TREATMENT', '열처리', 'TREATMENT', '정규화, 어닐링, 템퍼링 등의 열처리'),
|
||||
('CERTIFICATION', '인증서', 'CERTIFICATION', '재질증명서, 시험성적서 등'),
|
||||
('CUSTOM_SPEC', '특수사양', 'CUSTOM', '고객 특별 요구사항'),
|
||||
('NDT_TEST', '비파괴검사', 'TEST', '초음파, 방사선, 자분탐상 등'),
|
||||
('CHEMICAL_ANALYSIS', '화학분석', 'TEST', '화학성분 분석'),
|
||||
('MECHANICAL_TEST', '기계적성질', 'TEST', '인장, 압축, 굽힘 시험'),
|
||||
('SURFACE_TREATMENT', '표면처리', 'TREATMENT', '도금, 도장, 패시베이션 등'),
|
||||
('DIMENSIONAL_CHECK', '치수검사', 'INSPECTION', '치수, 형상 검사'),
|
||||
('WELDING_SPEC', '용접사양', 'SPEC', '용접 방법, 용접재 등')
|
||||
ON CONFLICT (type_code) DO NOTHING;
|
||||
|
||||
-- 트리거 함수 생성 (updated_at 자동 업데이트)
|
||||
CREATE OR REPLACE FUNCTION update_updated_at_column()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
NEW.updated_at = CURRENT_TIMESTAMP;
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ language 'plpgsql';
|
||||
|
||||
-- 트리거 생성
|
||||
CREATE TRIGGER update_pipe_details_timestamp
|
||||
BEFORE UPDATE ON pipe_details
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION update_updated_at_column();
|
||||
|
||||
CREATE TRIGGER update_user_requirements_timestamp
|
||||
BEFORE UPDATE ON user_requirements
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION update_updated_at_column();
|
||||
462
backend/scripts/06_insert_material_standards_data.py
Normal file
462
backend/scripts/06_insert_material_standards_data.py
Normal file
@@ -0,0 +1,462 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
자재 규격/재질 기준표 데이터를 DB에 삽입하는 스크립트
|
||||
기존 materials_schema.py의 딕셔너리 데이터를 DB 테이블로 변환
|
||||
"""
|
||||
|
||||
import sys
|
||||
import os
|
||||
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
|
||||
from sqlalchemy import create_engine, text
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
from app.database import DATABASE_URL
|
||||
from app.models import (
|
||||
MaterialStandard, MaterialCategory, MaterialSpecification,
|
||||
MaterialGrade, MaterialPattern, SpecialMaterial,
|
||||
SpecialMaterialGrade, SpecialMaterialPattern
|
||||
)
|
||||
|
||||
# 기존 materials_schema.py의 데이터 (일부만 예시로 포함)
|
||||
MATERIAL_STANDARDS_DATA = {
|
||||
"ASTM_ASME": {
|
||||
"name": "미국재질학회",
|
||||
"country": "USA",
|
||||
"categories": {
|
||||
"FORGED_GRADES": {
|
||||
"name": "단조품",
|
||||
"specifications": {
|
||||
"A182": {
|
||||
"name": "탄소강 단조품",
|
||||
"material_type": "carbon_alloy",
|
||||
"manufacturing": "FORGED",
|
||||
"subtypes": {
|
||||
"carbon_alloy": {
|
||||
"manufacturing": "FORGED",
|
||||
"grades": {
|
||||
"F1": {
|
||||
"composition": "0.5Mo",
|
||||
"temp_max": "482°C",
|
||||
"applications": "중온용"
|
||||
},
|
||||
"F5": {
|
||||
"composition": "5Cr-0.5Mo",
|
||||
"temp_max": "649°C",
|
||||
"applications": "고온용"
|
||||
},
|
||||
"F11": {
|
||||
"composition": "1.25Cr-0.5Mo",
|
||||
"temp_max": "593°C",
|
||||
"applications": "일반 고온용"
|
||||
},
|
||||
"F22": {
|
||||
"composition": "2.25Cr-1Mo",
|
||||
"temp_max": "649°C",
|
||||
"applications": "고온 고압용"
|
||||
},
|
||||
"F91": {
|
||||
"composition": "9Cr-1Mo-V",
|
||||
"temp_max": "649°C",
|
||||
"applications": "초고온용"
|
||||
}
|
||||
},
|
||||
"patterns": [
|
||||
r"ASTM\s+A182\s+(?:GR\s*)?F(\d+)",
|
||||
r"A182\s+(?:GR\s*)?F(\d+)",
|
||||
r"ASME\s+SA182\s+(?:GR\s*)?F(\d+)"
|
||||
]
|
||||
},
|
||||
"stainless": {
|
||||
"manufacturing": "FORGED",
|
||||
"grades": {
|
||||
"F304": {
|
||||
"composition": "18Cr-8Ni",
|
||||
"applications": "일반용",
|
||||
"corrosion_resistance": "보통"
|
||||
},
|
||||
"F304L": {
|
||||
"composition": "18Cr-8Ni-저탄소",
|
||||
"applications": "용접용",
|
||||
"corrosion_resistance": "보통"
|
||||
},
|
||||
"F316": {
|
||||
"composition": "18Cr-10Ni-2Mo",
|
||||
"applications": "내식성",
|
||||
"corrosion_resistance": "우수"
|
||||
},
|
||||
"F316L": {
|
||||
"composition": "18Cr-10Ni-2Mo-저탄소",
|
||||
"applications": "용접+내식성",
|
||||
"corrosion_resistance": "우수"
|
||||
},
|
||||
"F321": {
|
||||
"composition": "18Cr-8Ni-Ti",
|
||||
"applications": "고온안정화",
|
||||
"stabilizer": "Titanium"
|
||||
},
|
||||
"F347": {
|
||||
"composition": "18Cr-8Ni-Nb",
|
||||
"applications": "고온안정화",
|
||||
"stabilizer": "Niobium"
|
||||
}
|
||||
},
|
||||
"patterns": [
|
||||
r"ASTM\s+A182\s+F(\d{3}[LH]*)",
|
||||
r"A182\s+F(\d{3}[LH]*)",
|
||||
r"ASME\s+SA182\s+F(\d{3}[LH]*)"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"A105": {
|
||||
"name": "탄소강 단조품",
|
||||
"description": "탄소강 단조품",
|
||||
"composition": "탄소강",
|
||||
"applications": "일반 압력용 단조품",
|
||||
"manufacturing": "FORGED",
|
||||
"pressure_rating": "150LB ~ 9000LB",
|
||||
"patterns": [
|
||||
r"ASTM\s+A105(?:\s+(?:GR\s*)?([ABC]))?",
|
||||
r"A105(?:\s+(?:GR\s*)?([ABC]))?",
|
||||
r"ASME\s+SA105"
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"WELDED_GRADES": {
|
||||
"name": "용접품",
|
||||
"specifications": {
|
||||
"A234": {
|
||||
"name": "탄소강 용접 피팅",
|
||||
"material_type": "carbon",
|
||||
"manufacturing": "WELDED_FABRICATED",
|
||||
"subtypes": {
|
||||
"carbon": {
|
||||
"manufacturing": "WELDED_FABRICATED",
|
||||
"grades": {
|
||||
"WPA": {
|
||||
"yield_strength": "30 ksi",
|
||||
"applications": "저압용",
|
||||
"temp_range": "-29°C ~ 400°C"
|
||||
},
|
||||
"WPB": {
|
||||
"yield_strength": "35 ksi",
|
||||
"applications": "일반용",
|
||||
"temp_range": "-29°C ~ 400°C"
|
||||
},
|
||||
"WPC": {
|
||||
"yield_strength": "40 ksi",
|
||||
"applications": "고압용",
|
||||
"temp_range": "-29°C ~ 400°C"
|
||||
}
|
||||
},
|
||||
"patterns": [
|
||||
r"ASTM\s+A234\s+(?:GR\s*)?WP([ABC])",
|
||||
r"A234\s+(?:GR\s*)?WP([ABC])",
|
||||
r"ASME\s+SA234\s+(?:GR\s*)?WP([ABC])"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"KS": {
|
||||
"name": "한국산업표준",
|
||||
"country": "KOREA",
|
||||
"categories": {
|
||||
"PIPE_GRADES": {
|
||||
"name": "배관용",
|
||||
"specifications": {
|
||||
"D3507": {
|
||||
"name": "배관용 탄소강관",
|
||||
"description": "배관용 탄소강관",
|
||||
"manufacturing": "SEAMLESS",
|
||||
"patterns": [
|
||||
r"KS\s+D\s*3507\s+SPPS\s*(\d+)"
|
||||
]
|
||||
},
|
||||
"D3583": {
|
||||
"name": "압력배관용 탄소강관",
|
||||
"description": "압력배관용 탄소강관",
|
||||
"manufacturing": "SEAMLESS",
|
||||
"patterns": [
|
||||
r"KS\s+D\s*3583\s+STPG\s*(\d+)"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"JIS": {
|
||||
"name": "일본공업규격",
|
||||
"country": "JAPAN",
|
||||
"categories": {
|
||||
"PIPE_GRADES": {
|
||||
"name": "배관용",
|
||||
"specifications": {
|
||||
"G3452": {
|
||||
"name": "배관용 탄소강관",
|
||||
"description": "배관용 탄소강관",
|
||||
"manufacturing": "WELDED",
|
||||
"patterns": [
|
||||
r"JIS\s+G\s*3452\s+SGP"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SPECIAL_MATERIALS_DATA = {
|
||||
"SUPER_ALLOYS": {
|
||||
"INCONEL": {
|
||||
"description": "니켈 기반 초합금",
|
||||
"composition": "Ni-Cr",
|
||||
"applications": "고온 산화 환경",
|
||||
"temp_max": "1177°C",
|
||||
"manufacturing": "FORGED_OR_CAST",
|
||||
"grades": {
|
||||
"600": {
|
||||
"composition": "Ni-Cr",
|
||||
"temp_max": "1177°C",
|
||||
"applications": "고온 산화 환경"
|
||||
},
|
||||
"625": {
|
||||
"composition": "Ni-Cr-Mo",
|
||||
"temp_max": "982°C",
|
||||
"applications": "고온 부식 환경"
|
||||
}
|
||||
},
|
||||
"patterns": [
|
||||
r"INCONEL\s*(\d+)"
|
||||
]
|
||||
}
|
||||
},
|
||||
"TITANIUM": {
|
||||
"TITANIUM": {
|
||||
"description": "티타늄 및 티타늄 합금",
|
||||
"composition": "Ti",
|
||||
"applications": "화학공정, 항공우주",
|
||||
"temp_max": "1177°C",
|
||||
"manufacturing": "FORGED_OR_SEAMLESS",
|
||||
"grades": {
|
||||
"1": {
|
||||
"purity": "상업용 순티타늄",
|
||||
"strength": "낮음",
|
||||
"applications": "화학공정"
|
||||
},
|
||||
"2": {
|
||||
"purity": "상업용 순티타늄 (일반)",
|
||||
"strength": "보통",
|
||||
"applications": "일반용"
|
||||
},
|
||||
"5": {
|
||||
"composition": "Ti-6Al-4V",
|
||||
"strength": "고강도",
|
||||
"applications": "항공우주"
|
||||
}
|
||||
},
|
||||
"patterns": [
|
||||
r"TITANIUM(?:\s+(?:GR|GRADE)\s*(\d+))?",
|
||||
r"Ti(?:\s+(?:GR|GRADE)\s*(\d+))?",
|
||||
r"ASTM\s+B\d+\s+(?:GR|GRADE)\s*(\d+)"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
def insert_material_standards():
|
||||
"""자재 규격 데이터를 DB에 삽입"""
|
||||
engine = create_engine(DATABASE_URL)
|
||||
Session = sessionmaker(bind=engine)
|
||||
session = Session()
|
||||
|
||||
try:
|
||||
print("자재 규격 데이터 삽입 시작...")
|
||||
|
||||
# 1. 자재 규격 표준 삽입
|
||||
for standard_code, standard_data in MATERIAL_STANDARDS_DATA.items():
|
||||
standard = MaterialStandard(
|
||||
standard_code=standard_code,
|
||||
standard_name=standard_data["name"],
|
||||
country=standard_data["country"],
|
||||
description=f"{standard_data['name']} 규격"
|
||||
)
|
||||
session.add(standard)
|
||||
session.flush() # ID 생성
|
||||
|
||||
print(f" - {standard_code} ({standard_data['name']}) 추가됨")
|
||||
|
||||
# 2. 카테고리 삽입
|
||||
for category_code, category_data in standard_data["categories"].items():
|
||||
category = MaterialCategory(
|
||||
standard_id=standard.id,
|
||||
category_code=category_code,
|
||||
category_name=category_data["name"],
|
||||
description=f"{category_data['name']} 분류"
|
||||
)
|
||||
session.add(category)
|
||||
session.flush()
|
||||
|
||||
print(f" - {category_code} ({category_data['name']}) 추가됨")
|
||||
|
||||
# 3. 규격 삽입
|
||||
for spec_code, spec_data in category_data["specifications"].items():
|
||||
specification = MaterialSpecification(
|
||||
category_id=category.id,
|
||||
spec_code=spec_code,
|
||||
spec_name=spec_data["name"],
|
||||
description=spec_data.get("description", ""),
|
||||
material_type=spec_data.get("material_type"),
|
||||
manufacturing=spec_data.get("manufacturing"),
|
||||
pressure_rating=spec_data.get("pressure_rating")
|
||||
)
|
||||
session.add(specification)
|
||||
session.flush()
|
||||
|
||||
print(f" - {spec_code} ({spec_data['name']}) 추가됨")
|
||||
|
||||
# 4. 패턴 삽입
|
||||
if "patterns" in spec_data:
|
||||
for i, pattern in enumerate(spec_data["patterns"]):
|
||||
pattern_obj = MaterialPattern(
|
||||
specification_id=specification.id,
|
||||
pattern=pattern,
|
||||
description=f"{spec_code} 패턴 {i+1}",
|
||||
priority=i+1
|
||||
)
|
||||
session.add(pattern_obj)
|
||||
|
||||
# 5. 등급 삽입 (subtypes가 있는 경우)
|
||||
if "subtypes" in spec_data:
|
||||
for subtype_name, subtype_data in spec_data["subtypes"].items():
|
||||
# subtypes의 grades 처리
|
||||
if "grades" in subtype_data:
|
||||
for grade_code, grade_data in subtype_data["grades"].items():
|
||||
grade = MaterialGrade(
|
||||
specification_id=specification.id,
|
||||
grade_code=grade_code,
|
||||
composition=grade_data.get("composition"),
|
||||
applications=grade_data.get("applications"),
|
||||
temp_max=grade_data.get("temp_max"),
|
||||
temp_range=grade_data.get("temp_range"),
|
||||
yield_strength=grade_data.get("yield_strength"),
|
||||
corrosion_resistance=grade_data.get("corrosion_resistance"),
|
||||
stabilizer=grade_data.get("stabilizer"),
|
||||
base_grade=grade_data.get("base_grade")
|
||||
)
|
||||
session.add(grade)
|
||||
print(f" - {grade_code} 등급 추가됨")
|
||||
|
||||
# 5. 등급 삽입 (직접 grades가 있는 경우)
|
||||
elif "grades" in spec_data:
|
||||
for grade_code, grade_data in spec_data["grades"].items():
|
||||
grade = MaterialGrade(
|
||||
specification_id=specification.id,
|
||||
grade_code=grade_code,
|
||||
composition=grade_data.get("composition"),
|
||||
applications=grade_data.get("applications"),
|
||||
temp_max=grade_data.get("temp_max"),
|
||||
temp_range=grade_data.get("temp_range"),
|
||||
yield_strength=grade_data.get("yield_strength"),
|
||||
corrosion_resistance=grade_data.get("corrosion_resistance"),
|
||||
stabilizer=grade_data.get("stabilizer"),
|
||||
base_grade=grade_data.get("base_grade")
|
||||
)
|
||||
session.add(grade)
|
||||
print(f" - {grade_code} 등급 추가됨")
|
||||
|
||||
session.commit()
|
||||
print("자재 규격 데이터 삽입 완료!")
|
||||
|
||||
except Exception as e:
|
||||
session.rollback()
|
||||
print(f"오류 발생: {e}")
|
||||
raise
|
||||
finally:
|
||||
session.close()
|
||||
|
||||
def insert_special_materials():
|
||||
"""특수 재질 데이터를 DB에 삽입"""
|
||||
engine = create_engine(DATABASE_URL)
|
||||
Session = sessionmaker(bind=engine)
|
||||
session = Session()
|
||||
|
||||
try:
|
||||
print("특수 재질 데이터 삽입 시작...")
|
||||
|
||||
for material_type, materials in SPECIAL_MATERIALS_DATA.items():
|
||||
for material_name, material_data in materials.items():
|
||||
# 특수 재질 추가
|
||||
special_material = SpecialMaterial(
|
||||
material_type=material_type,
|
||||
material_name=material_name,
|
||||
description=material_data.get("description", ""),
|
||||
composition=material_data.get("composition"),
|
||||
applications=material_data.get("applications"),
|
||||
temp_max=material_data.get("temp_max"),
|
||||
manufacturing=material_data.get("manufacturing")
|
||||
)
|
||||
session.add(special_material)
|
||||
session.flush()
|
||||
|
||||
print(f" - {material_name} ({material_type}) 추가됨")
|
||||
|
||||
# 등급 추가
|
||||
if "grades" in material_data:
|
||||
for grade_code, grade_data in material_data["grades"].items():
|
||||
grade = SpecialMaterialGrade(
|
||||
material_id=special_material.id,
|
||||
grade_code=grade_code,
|
||||
composition=grade_data.get("composition"),
|
||||
applications=grade_data.get("applications"),
|
||||
temp_max=grade_data.get("temp_max"),
|
||||
strength=grade_data.get("strength"),
|
||||
purity=grade_data.get("purity"),
|
||||
corrosion=grade_data.get("corrosion")
|
||||
)
|
||||
session.add(grade)
|
||||
print(f" - {grade_code} 등급 추가됨")
|
||||
|
||||
# 패턴 추가
|
||||
if "patterns" in material_data:
|
||||
for i, pattern in enumerate(material_data["patterns"]):
|
||||
pattern_obj = SpecialMaterialPattern(
|
||||
material_id=special_material.id,
|
||||
pattern=pattern,
|
||||
description=f"{material_name} 패턴 {i+1}",
|
||||
priority=i+1
|
||||
)
|
||||
session.add(pattern_obj)
|
||||
|
||||
session.commit()
|
||||
print("특수 재질 데이터 삽입 완료!")
|
||||
|
||||
except Exception as e:
|
||||
session.rollback()
|
||||
print(f"오류 발생: {e}")
|
||||
raise
|
||||
finally:
|
||||
session.close()
|
||||
|
||||
def main():
|
||||
"""메인 실행 함수"""
|
||||
print("자재 규격/재질 기준표 DB 데이터 삽입 시작")
|
||||
print("=" * 50)
|
||||
|
||||
# 1. 자재 규격 데이터 삽입
|
||||
insert_material_standards()
|
||||
|
||||
print("\n" + "=" * 50)
|
||||
|
||||
# 2. 특수 재질 데이터 삽입
|
||||
insert_special_materials()
|
||||
|
||||
print("\n" + "=" * 50)
|
||||
print("모든 데이터 삽입 완료!")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
193
backend/scripts/07_execute_material_standards_migration.py
Normal file
193
backend/scripts/07_execute_material_standards_migration.py
Normal file
@@ -0,0 +1,193 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
자재 규격/재질 기준표 테이블 생성 및 데이터 삽입 스크립트
|
||||
"""
|
||||
|
||||
import sys
|
||||
import os
|
||||
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
|
||||
from sqlalchemy import create_engine, text
|
||||
from app.database import DATABASE_URL
|
||||
|
||||
def create_tables():
|
||||
"""테이블 생성"""
|
||||
engine = create_engine(DATABASE_URL)
|
||||
|
||||
with engine.connect() as conn:
|
||||
print("자재 규격/재질 기준표 테이블 생성 시작...")
|
||||
|
||||
# 1. 자재 규격 표준 테이블
|
||||
conn.execute(text("""
|
||||
CREATE TABLE IF NOT EXISTS material_standards (
|
||||
id SERIAL PRIMARY KEY,
|
||||
standard_code VARCHAR(20) UNIQUE NOT NULL,
|
||||
standard_name VARCHAR(100) NOT NULL,
|
||||
description TEXT,
|
||||
country VARCHAR(50),
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
"""))
|
||||
print(" - material_standards 테이블 생성됨")
|
||||
|
||||
# 2. 제조방식별 카테고리 테이블
|
||||
conn.execute(text("""
|
||||
CREATE TABLE IF NOT EXISTS material_categories (
|
||||
id SERIAL PRIMARY KEY,
|
||||
standard_id INTEGER REFERENCES material_standards(id),
|
||||
category_code VARCHAR(50) NOT NULL,
|
||||
category_name VARCHAR(100) NOT NULL,
|
||||
description TEXT,
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
"""))
|
||||
print(" - material_categories 테이블 생성됨")
|
||||
|
||||
# 3. 구체적인 규격 테이블
|
||||
conn.execute(text("""
|
||||
CREATE TABLE IF NOT EXISTS material_specifications (
|
||||
id SERIAL PRIMARY KEY,
|
||||
category_id INTEGER REFERENCES material_categories(id),
|
||||
spec_code VARCHAR(20) NOT NULL,
|
||||
spec_name VARCHAR(100) NOT NULL,
|
||||
description TEXT,
|
||||
material_type VARCHAR(50),
|
||||
manufacturing VARCHAR(50),
|
||||
pressure_rating VARCHAR(100),
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
"""))
|
||||
print(" - material_specifications 테이블 생성됨")
|
||||
|
||||
# 4. 등급별 상세 정보 테이블
|
||||
conn.execute(text("""
|
||||
CREATE TABLE IF NOT EXISTS material_grades (
|
||||
id SERIAL PRIMARY KEY,
|
||||
specification_id INTEGER REFERENCES material_specifications(id),
|
||||
grade_code VARCHAR(20) NOT NULL,
|
||||
grade_name VARCHAR(100),
|
||||
composition VARCHAR(200),
|
||||
applications VARCHAR(200),
|
||||
temp_max VARCHAR(50),
|
||||
temp_range VARCHAR(100),
|
||||
yield_strength VARCHAR(50),
|
||||
tensile_strength VARCHAR(50),
|
||||
corrosion_resistance VARCHAR(50),
|
||||
stabilizer VARCHAR(50),
|
||||
base_grade VARCHAR(20),
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
"""))
|
||||
print(" - material_grades 테이블 생성됨")
|
||||
|
||||
# 5. 정규식 패턴 테이블
|
||||
conn.execute(text("""
|
||||
CREATE TABLE IF NOT EXISTS material_patterns (
|
||||
id SERIAL PRIMARY KEY,
|
||||
specification_id INTEGER REFERENCES material_specifications(id),
|
||||
pattern TEXT NOT NULL,
|
||||
description VARCHAR(200),
|
||||
priority INTEGER DEFAULT 1,
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
"""))
|
||||
print(" - material_patterns 테이블 생성됨")
|
||||
|
||||
# 6. 특수 재질 테이블
|
||||
conn.execute(text("""
|
||||
CREATE TABLE IF NOT EXISTS special_materials (
|
||||
id SERIAL PRIMARY KEY,
|
||||
material_type VARCHAR(50) NOT NULL,
|
||||
material_name VARCHAR(100) NOT NULL,
|
||||
description TEXT,
|
||||
composition VARCHAR(200),
|
||||
applications TEXT,
|
||||
temp_max VARCHAR(50),
|
||||
manufacturing VARCHAR(50),
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
"""))
|
||||
print(" - special_materials 테이블 생성됨")
|
||||
|
||||
# 7. 특수 재질 등급 테이블
|
||||
conn.execute(text("""
|
||||
CREATE TABLE IF NOT EXISTS special_material_grades (
|
||||
id SERIAL PRIMARY KEY,
|
||||
material_id INTEGER REFERENCES special_materials(id),
|
||||
grade_code VARCHAR(20) NOT NULL,
|
||||
composition VARCHAR(200),
|
||||
applications VARCHAR(200),
|
||||
temp_max VARCHAR(50),
|
||||
strength VARCHAR(50),
|
||||
purity VARCHAR(100),
|
||||
corrosion VARCHAR(50),
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
"""))
|
||||
print(" - special_material_grades 테이블 생성됨")
|
||||
|
||||
# 8. 특수 재질 정규식 패턴 테이블
|
||||
conn.execute(text("""
|
||||
CREATE TABLE IF NOT EXISTS special_material_patterns (
|
||||
id SERIAL PRIMARY KEY,
|
||||
material_id INTEGER REFERENCES special_materials(id),
|
||||
pattern TEXT NOT NULL,
|
||||
description VARCHAR(200),
|
||||
priority INTEGER DEFAULT 1,
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
"""))
|
||||
print(" - special_material_patterns 테이블 생성됨")
|
||||
|
||||
# 인덱스 생성
|
||||
conn.execute(text("CREATE INDEX IF NOT EXISTS idx_material_standards_code ON material_standards(standard_code);"))
|
||||
conn.execute(text("CREATE INDEX IF NOT EXISTS idx_material_categories_standard ON material_categories(standard_id);"))
|
||||
conn.execute(text("CREATE INDEX IF NOT EXISTS idx_material_specifications_category ON material_specifications(category_id);"))
|
||||
conn.execute(text("CREATE INDEX IF NOT EXISTS idx_material_grades_specification ON material_grades(specification_id);"))
|
||||
conn.execute(text("CREATE INDEX IF NOT EXISTS idx_material_patterns_specification ON material_patterns(specification_id);"))
|
||||
conn.execute(text("CREATE INDEX IF NOT EXISTS idx_special_materials_type ON special_materials(material_type);"))
|
||||
conn.execute(text("CREATE INDEX IF NOT EXISTS idx_special_material_grades_material ON special_material_grades(material_id);"))
|
||||
conn.execute(text("CREATE INDEX IF NOT EXISTS idx_special_material_patterns_material ON special_material_patterns(material_id);"))
|
||||
|
||||
# 활성 상태 인덱스
|
||||
conn.execute(text("CREATE INDEX IF NOT EXISTS idx_material_standards_active ON material_standards(is_active);"))
|
||||
conn.execute(text("CREATE INDEX IF NOT EXISTS idx_material_categories_active ON material_categories(is_active);"))
|
||||
conn.execute(text("CREATE INDEX IF NOT EXISTS idx_material_specifications_active ON material_specifications(is_active);"))
|
||||
conn.execute(text("CREATE INDEX IF NOT EXISTS idx_material_grades_active ON material_grades(is_active);"))
|
||||
conn.execute(text("CREATE INDEX IF NOT EXISTS idx_material_patterns_active ON material_patterns(is_active);"))
|
||||
conn.execute(text("CREATE INDEX IF NOT EXISTS idx_special_materials_active ON special_materials(is_active);"))
|
||||
conn.execute(text("CREATE INDEX IF NOT EXISTS idx_special_material_grades_active ON special_material_grades(is_active);"))
|
||||
conn.execute(text("CREATE INDEX IF NOT EXISTS idx_special_material_patterns_active ON special_material_patterns(is_active);"))
|
||||
|
||||
conn.commit()
|
||||
print("모든 테이블 및 인덱스 생성 완료!")
|
||||
|
||||
def main():
|
||||
"""메인 실행 함수"""
|
||||
print("자재 규격/재질 기준표 DB 마이그레이션 시작")
|
||||
print("=" * 50)
|
||||
|
||||
create_tables()
|
||||
|
||||
print("\n" + "=" * 50)
|
||||
print("마이그레이션 완료!")
|
||||
print("\n다음 단계: python scripts/06_insert_material_standards_data.py")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
237
backend/scripts/create_material_detail_tables.sql
Normal file
237
backend/scripts/create_material_detail_tables.sql
Normal file
@@ -0,0 +1,237 @@
|
||||
-- 1. FITTING 상세 테이블
|
||||
CREATE TABLE IF NOT EXISTS fitting_details (
|
||||
id SERIAL PRIMARY KEY,
|
||||
material_id INTEGER REFERENCES materials(id) ON DELETE CASCADE,
|
||||
file_id INTEGER REFERENCES files(id) ON DELETE CASCADE,
|
||||
|
||||
-- 피팅 타입 정보
|
||||
fitting_type VARCHAR(50),
|
||||
fitting_subtype VARCHAR(50),
|
||||
|
||||
-- 연결 방식
|
||||
connection_method VARCHAR(50),
|
||||
connection_code VARCHAR(50),
|
||||
|
||||
-- 압력 등급
|
||||
pressure_rating VARCHAR(50),
|
||||
max_pressure VARCHAR(50),
|
||||
|
||||
-- 제작 방법
|
||||
manufacturing_method VARCHAR(50),
|
||||
|
||||
-- 재질 정보
|
||||
material_standard VARCHAR(100),
|
||||
material_grade VARCHAR(100),
|
||||
material_type VARCHAR(50),
|
||||
|
||||
-- 사이즈 정보
|
||||
main_size VARCHAR(50),
|
||||
reduced_size VARCHAR(50),
|
||||
|
||||
-- 신뢰도
|
||||
classification_confidence FLOAT,
|
||||
|
||||
-- 추가 정보
|
||||
additional_info JSONB,
|
||||
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 2. VALVE 상세 테이블
|
||||
CREATE TABLE IF NOT EXISTS valve_details (
|
||||
id SERIAL PRIMARY KEY,
|
||||
material_id INTEGER REFERENCES materials(id) ON DELETE CASCADE,
|
||||
file_id INTEGER REFERENCES files(id) ON DELETE CASCADE,
|
||||
|
||||
-- 밸브 타입 정보
|
||||
valve_type VARCHAR(50),
|
||||
valve_subtype VARCHAR(50),
|
||||
actuator_type VARCHAR(50),
|
||||
|
||||
-- 연결 방식
|
||||
connection_method VARCHAR(50),
|
||||
|
||||
-- 압력 등급
|
||||
pressure_rating VARCHAR(50),
|
||||
pressure_class VARCHAR(50),
|
||||
|
||||
-- 재질 정보
|
||||
body_material VARCHAR(100),
|
||||
trim_material VARCHAR(100),
|
||||
|
||||
-- 사이즈 정보
|
||||
size_inches VARCHAR(50),
|
||||
|
||||
-- 특수 사양
|
||||
fire_safe BOOLEAN,
|
||||
low_temp_service BOOLEAN,
|
||||
special_features JSONB,
|
||||
|
||||
-- 신뢰도
|
||||
classification_confidence FLOAT,
|
||||
|
||||
-- 추가 정보
|
||||
additional_info JSONB,
|
||||
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 3. FLANGE 상세 테이블
|
||||
CREATE TABLE IF NOT EXISTS flange_details (
|
||||
id SERIAL PRIMARY KEY,
|
||||
material_id INTEGER REFERENCES materials(id) ON DELETE CASCADE,
|
||||
file_id INTEGER REFERENCES files(id) ON DELETE CASCADE,
|
||||
|
||||
-- 플랜지 타입
|
||||
flange_type VARCHAR(50),
|
||||
facing_type VARCHAR(50),
|
||||
|
||||
-- 압력 등급
|
||||
pressure_rating VARCHAR(50),
|
||||
|
||||
-- 재질 정보
|
||||
material_standard VARCHAR(100),
|
||||
material_grade VARCHAR(100),
|
||||
|
||||
-- 사이즈 정보
|
||||
size_inches VARCHAR(50),
|
||||
bolt_hole_count INTEGER,
|
||||
bolt_hole_size VARCHAR(50),
|
||||
|
||||
-- 신뢰도
|
||||
classification_confidence FLOAT,
|
||||
|
||||
-- 추가 정보
|
||||
additional_info JSONB,
|
||||
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 4. BOLT 상세 테이블
|
||||
CREATE TABLE IF NOT EXISTS bolt_details (
|
||||
id SERIAL PRIMARY KEY,
|
||||
material_id INTEGER REFERENCES materials(id) ON DELETE CASCADE,
|
||||
file_id INTEGER REFERENCES files(id) ON DELETE CASCADE,
|
||||
|
||||
-- 볼트 타입
|
||||
bolt_type VARCHAR(50),
|
||||
thread_type VARCHAR(50),
|
||||
|
||||
-- 사양 정보
|
||||
diameter VARCHAR(50),
|
||||
length VARCHAR(50),
|
||||
|
||||
-- 재질 정보
|
||||
material_standard VARCHAR(100),
|
||||
material_grade VARCHAR(100),
|
||||
coating_type VARCHAR(100),
|
||||
|
||||
-- 너트/와셔 정보
|
||||
includes_nut BOOLEAN,
|
||||
includes_washer BOOLEAN,
|
||||
nut_type VARCHAR(50),
|
||||
washer_type VARCHAR(50),
|
||||
|
||||
-- 신뢰도
|
||||
classification_confidence FLOAT,
|
||||
|
||||
-- 추가 정보
|
||||
additional_info JSONB,
|
||||
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 5. GASKET 상세 테이블
|
||||
CREATE TABLE IF NOT EXISTS gasket_details (
|
||||
id SERIAL PRIMARY KEY,
|
||||
material_id INTEGER REFERENCES materials(id) ON DELETE CASCADE,
|
||||
file_id INTEGER REFERENCES files(id) ON DELETE CASCADE,
|
||||
|
||||
-- 가스켓 타입
|
||||
gasket_type VARCHAR(50),
|
||||
gasket_subtype VARCHAR(50),
|
||||
|
||||
-- 재질 정보
|
||||
material_type VARCHAR(100),
|
||||
filler_material VARCHAR(100),
|
||||
|
||||
-- 사이즈 및 등급
|
||||
size_inches VARCHAR(50),
|
||||
pressure_rating VARCHAR(50),
|
||||
thickness VARCHAR(50),
|
||||
|
||||
-- 특수 사양
|
||||
temperature_range VARCHAR(100),
|
||||
fire_safe BOOLEAN,
|
||||
|
||||
-- 신뢰도
|
||||
classification_confidence FLOAT,
|
||||
|
||||
-- 추가 정보
|
||||
additional_info JSONB,
|
||||
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 6. INSTRUMENT 상세 테이블
|
||||
CREATE TABLE IF NOT EXISTS instrument_details (
|
||||
id SERIAL PRIMARY KEY,
|
||||
material_id INTEGER REFERENCES materials(id) ON DELETE CASCADE,
|
||||
file_id INTEGER REFERENCES files(id) ON DELETE CASCADE,
|
||||
|
||||
-- 계장품 타입
|
||||
instrument_type VARCHAR(50),
|
||||
instrument_subtype VARCHAR(50),
|
||||
|
||||
-- 측정 사양
|
||||
measurement_type VARCHAR(50),
|
||||
measurement_range VARCHAR(100),
|
||||
accuracy VARCHAR(50),
|
||||
|
||||
-- 연결 정보
|
||||
connection_type VARCHAR(50),
|
||||
connection_size VARCHAR(50),
|
||||
|
||||
-- 재질 정보
|
||||
body_material VARCHAR(100),
|
||||
wetted_parts_material VARCHAR(100),
|
||||
|
||||
-- 전기 사양
|
||||
electrical_rating VARCHAR(100),
|
||||
output_signal VARCHAR(50),
|
||||
|
||||
-- 신뢰도
|
||||
classification_confidence FLOAT,
|
||||
|
||||
-- 추가 정보
|
||||
additional_info JSONB,
|
||||
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 인덱스 생성
|
||||
CREATE INDEX idx_fitting_details_material_id ON fitting_details(material_id);
|
||||
CREATE INDEX idx_fitting_details_file_id ON fitting_details(file_id);
|
||||
CREATE INDEX idx_fitting_details_type ON fitting_details(fitting_type);
|
||||
|
||||
CREATE INDEX idx_valve_details_material_id ON valve_details(material_id);
|
||||
CREATE INDEX idx_valve_details_file_id ON valve_details(file_id);
|
||||
CREATE INDEX idx_valve_details_type ON valve_details(valve_type);
|
||||
|
||||
CREATE INDEX idx_flange_details_material_id ON flange_details(material_id);
|
||||
CREATE INDEX idx_flange_details_file_id ON flange_details(file_id);
|
||||
|
||||
CREATE INDEX idx_bolt_details_material_id ON bolt_details(material_id);
|
||||
CREATE INDEX idx_bolt_details_file_id ON bolt_details(file_id);
|
||||
|
||||
CREATE INDEX idx_gasket_details_material_id ON gasket_details(material_id);
|
||||
CREATE INDEX idx_gasket_details_file_id ON gasket_details(file_id);
|
||||
|
||||
CREATE INDEX idx_instrument_details_material_id ON instrument_details(material_id);
|
||||
CREATE INDEX idx_instrument_details_file_id ON instrument_details(file_id);
|
||||
Reference in New Issue
Block a user