Files
TK-BOM-Project/backend/app/services/test_flange_classifier.py
Hyungi Ahn 12ecb93741 feat: 완전한 자재 분류 시스템 구현 (v1.0)
🎯 주요 기능:
- 재질 분류 모듈 (ASTM/ASME 규격 자동 인식)
- PIPE 분류 시스템 (제조방법, 끝가공, 스케줄, 절단계획)
- FITTING 분류 시스템 (10가지 타입, 연결방식, 압력등급)
- FLANGE 분류 시스템 (SPECIAL/STANDARD 구분, 면가공)
- 스풀 관리 시스템 (도면별 A,B,C 넘버링, 에리어 관리)

📁 새로 추가된 파일들:
- app/services/materials_schema.py (재질 규격 데이터베이스)
- app/services/material_classifier.py (공통 재질 분류 엔진)
- app/services/pipe_classifier.py (파이프 전용 분류기)
- app/services/fitting_classifier.py (피팅 전용 분류기)
- app/services/flange_classifier.py (플랜지 전용 분류기)
- app/services/spool_manager_v2.py (수정된 스풀 관리)
- app/services/test_*.py (각 시스템별 테스트 파일)

🔧 기술적 특징:
- 정규표현식 기반 패턴 매칭
- 신뢰도 점수 시스템 (0.0-1.0)
- 증거 기반 분류 (evidence tracking)
- 모듈화된 구조 (재사용 가능)

🎯 분류 정확도:
- 재질 분류: 90-95% 신뢰도
- PIPE 분류: 85-95% 신뢰도
- FITTING 분류: 85-95% 신뢰도
- FLANGE 분류: 85-95% 신뢰도

💾 데이터베이스 연동:
- 모든 분석 결과 자동 저장
- 프로젝트/도면 정보 자동 연결
- 스풀 정보 사용자 입력 대기

🧪 테스트 커버리지:
- 실제 BOM 데이터 기반 테스트
- 예외 케이스 처리
- 10+ 개 테스트 시나리오

Version: v1.0
Date: 2024-07-15
Author: hyungiahn
2025-07-15 09:43:39 +09:00

127 lines
4.8 KiB
Python

"""
FLANGE 분류 테스트
"""
from .flange_classifier import classify_flange, get_flange_purchase_info
def test_flange_classification():
"""FLANGE 분류 테스트"""
test_cases = [
{
"name": "웰드넥 플랜지 (일반)",
"dat_file": "FLG_WN_150",
"description": "FLG WELD NECK RF SCH 40, 150LB, ASTM A105",
"main_nom": "4\"",
"red_nom": None
},
{
"name": "슬립온 플랜지 (일반)",
"dat_file": "FLG_SO_300",
"description": "FLG SLIP ON RF, 300LB, ASTM A105",
"main_nom": "3\"",
"red_nom": None
},
{
"name": "블라인드 플랜지 (일반)",
"dat_file": "FLG_BL_150",
"description": "FLG BLIND RF, 150LB, ASTM A105",
"main_nom": "6\"",
"red_nom": None
},
{
"name": "소켓웰드 플랜지 (고압)",
"dat_file": "FLG_SW_3000",
"description": "FLG SW, 3000LB, ASTM A105",
"main_nom": "1\"",
"red_nom": None
},
{
"name": "오리피스 플랜지 (SPECIAL)",
"dat_file": "FLG_ORI_150",
"description": "FLG ORIFICE RF, 150LB, 0.5 INCH BORE, ASTM A105",
"main_nom": "4\"",
"red_nom": None
},
{
"name": "스펙터클 블라인드 (SPECIAL)",
"dat_file": "FLG_SPB_300",
"description": "FLG SPECTACLE BLIND, 300LB, ASTM A105",
"main_nom": "6\"",
"red_nom": None
},
{
"name": "리듀싱 플랜지 (SPECIAL)",
"dat_file": "FLG_RED_300",
"description": "FLG REDUCING, 300LB, ASTM A105",
"main_nom": "6\"",
"red_nom": "4\""
},
{
"name": "스페이서 플랜지 (SPECIAL)",
"dat_file": "FLG_SPC_600",
"description": "FLG SPACER, 600LB, 2 INCH THK, ASTM A105",
"main_nom": "3\"",
"red_nom": None
}
]
print("🔩 FLANGE 분류 테스트 시작\n")
print("=" * 80)
for i, test in enumerate(test_cases, 1):
print(f"\n테스트 {i}: {test['name']}")
print("-" * 60)
result = classify_flange(
test["dat_file"],
test["description"],
test["main_nom"],
test["red_nom"]
)
purchase_info = get_flange_purchase_info(result)
print(f"📋 입력:")
print(f" DAT_FILE: {test['dat_file']}")
print(f" DESCRIPTION: {test['description']}")
print(f" SIZE: {result['size_info']['size_description']}")
print(f"\n🔩 분류 결과:")
print(f" 재질: {result['material']['standard']} | {result['material']['grade']}")
print(f" 카테고리: {'🌟 SPECIAL' if result['flange_category']['is_special'] else '📋 STANDARD'}")
print(f" 플랜지타입: {result['flange_type']['type']}")
print(f" 특성: {result['flange_type']['characteristics']}")
print(f" 면가공: {result['face_finish']['finish']}")
print(f" 압력등급: {result['pressure_rating']['rating']} ({result['pressure_rating']['common_use']})")
print(f" 제작방법: {result['manufacturing']['method']} ({result['manufacturing']['characteristics']})")
if result['flange_type']['special_features']:
print(f" 특수기능: {', '.join(result['flange_type']['special_features'])}")
print(f"\n📊 신뢰도:")
print(f" 전체신뢰도: {result['overall_confidence']}")
print(f" 재질: {result['material']['confidence']}")
print(f" 플랜지타입: {result['flange_type']['confidence']}")
print(f" 면가공: {result['face_finish']['confidence']}")
print(f" 압력등급: {result['pressure_rating']['confidence']}")
print(f"\n🛒 구매 정보:")
print(f" 공급업체: {purchase_info['supplier_type']}")
print(f" 예상납기: {purchase_info['lead_time_estimate']}")
print(f" 구매카테고리: {purchase_info['purchase_category']}")
if purchase_info['special_requirements']:
print(f" 특수요구사항: {', '.join(purchase_info['special_requirements'])}")
print(f"\n💾 저장될 데이터:")
print(f" MAIN_NOM: {result['size_info']['main_size']}")
print(f" RED_NOM: {result['size_info']['reduced_size'] or 'NULL'}")
print(f" FLANGE_CATEGORY: {'SPECIAL' if result['flange_category']['is_special'] else 'STANDARD'}")
print(f" FLANGE_TYPE: {result['flange_type']['type']}")
if i < len(test_cases):
print("\n" + "=" * 80)
if __name__ == "__main__":
test_flange_classification()