|
|
from typing import Optional |
|
|
import re |
|
|
|
|
|
def extract_plugs_max_current(spec: str) -> Optional[int]: |
|
|
"""Extract max current for plugs product in Ampe""" |
|
|
try: |
|
|
if not spec: |
|
|
return None |
|
|
|
|
|
|
|
|
current_patterns = [ |
|
|
r'dòng điện ổ cắm tối đa:\s*(\d+)\s*A', |
|
|
r'dòng điện ổ cắm tối đa:\s*(\d+)A', |
|
|
] |
|
|
|
|
|
for pattern in current_patterns: |
|
|
current_match = re.search(pattern, spec, re.IGNORECASE) |
|
|
if current_match: |
|
|
return int(current_match.group(1)) |
|
|
|
|
|
return None |
|
|
except Exception: |
|
|
return None |
|
|
|
|
|
def extract_power(spec: str) -> Optional[int]: |
|
|
"""Extract power consumption in watts""" |
|
|
try: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
power_pattern = r'(?:Công suất danh định|công suất danh định|Công suất|công suất)(?!.*(?:tối đa|chịu tải|đầu ra)).*?[:]\s*(\d+)\s*[Ww]' |
|
|
power_match = re.search(power_pattern, spec, re.IGNORECASE) |
|
|
if power_match: |
|
|
return int(power_match.group(1)) |
|
|
except: |
|
|
return None |
|
|
|
|
|
|
|
|
def extract_ceiling_hole_diameter2(spec: str) -> Optional[int]: |
|
|
"""Extract ceiling hole diameter in mm for sp chieu sang""" |
|
|
hole_patterns = [ |
|
|
r'(?:[đĐ]ường kính lỗ khoét trần|đường kính lỗ khoét trần).*?(\d+)', |
|
|
r'(?:lỗ khoét|Lỗ khoét).*?(\d+)', |
|
|
r'(?:lỗ khoét trần).*?(\d+)', |
|
|
r"[kK]ích\s*thước\s*lỗ\s*khoét\s*trần\s*:\s*(\d+)\s*mm" |
|
|
] |
|
|
|
|
|
for pattern in hole_patterns: |
|
|
hole_match = re.search(pattern, spec, re.IGNORECASE) |
|
|
if hole_match: |
|
|
return int(hole_match.group(1)) |
|
|
|
|
|
def extract_dong_danh_dinh(spec: str): |
|
|
try: |
|
|
patterns = [ |
|
|
r"[dD]òng\s*(?:ngắn\s*mạch\s*)?danh\s*định\s*:\s*(\d+)A", |
|
|
r'(?:Dòng điện định mức|dòng điện định mức).*?(\d+(?:[.,]\d+)?)\s*(?:A|Ampe|Amp)' |
|
|
] |
|
|
for p in patterns: |
|
|
match = re.search(p, spec, re.IGNORECASE) |
|
|
|
|
|
if match: |
|
|
return int(match.group(1)) |
|
|
return None |
|
|
except: |
|
|
return None |
|
|
|
|
|
def extract_cable_length(spec: str) -> Optional[float]: |
|
|
"""Lấy chiều dài dây""" |
|
|
try: |
|
|
length_patterns = [ |
|
|
r'(?:Chiều dài dây|chiều dài dây).*?:?\s*([\d\.,]+)\s*(?:m|mét|meter)', |
|
|
r'(?:Dây dài|dây dài).*?:?\s*([\d\.,]+)\s*(?:m|mét|meter)', |
|
|
r'(?:Chiều dài|chiều dài).*?dây.*?:?\s*([\d\.,]+)\s*(?:m|mét|meter)', |
|
|
r'(?:Dây|dây).*?(?:dài|chiều dài).*?:?\s*([\d\.,]+)\s*(?:m|mét|meter)' |
|
|
] |
|
|
|
|
|
for pattern in length_patterns: |
|
|
length_match = re.search(pattern, spec, re.IGNORECASE) |
|
|
if length_match: |
|
|
|
|
|
length_str = length_match.group(1).replace(',', '.') |
|
|
return float(length_str) |
|
|
return None |
|
|
except: |
|
|
return None |
|
|
|
|
|
def extract_voltage(model: str) -> Optional[int]: |
|
|
"""Trích xuất thông tin điện áp từ Mã Sản Phẩm""" |
|
|
try: |
|
|
if not model: |
|
|
return None |
|
|
|
|
|
voltage_patterns = [ |
|
|
r'(\d+)V', |
|
|
] |
|
|
|
|
|
for pattern in voltage_patterns: |
|
|
voltage_match = re.search(pattern, model, re.IGNORECASE) |
|
|
if voltage_match: |
|
|
return int(voltage_match.group(1)) |
|
|
|
|
|
return None |
|
|
except Exception: |
|
|
return None |
|
|
|
|
|
def extract_tinh_nang(model : str, name : str) -> Optional[str]: |
|
|
"""Trích xuất thông tin về tính năng: đổi màu/xoay góc""" |
|
|
try: |
|
|
if not model or not name: |
|
|
return None |
|
|
|
|
|
model_upper = model.upper() |
|
|
name_lower = name.lower() |
|
|
|
|
|
if "ĐM" in model_upper: |
|
|
return "đổi màu" |
|
|
|
|
|
if "xoay góc" in name_lower: |
|
|
return "xoay góc" |
|
|
|
|
|
return None |
|
|
|
|
|
except: |
|
|
return None |
|
|
|
|
|
def extract_he_thong_hoa_luoi_pha(name: str) -> Optional[str]: |
|
|
"""Trích xuất thông tin hệ thống hoa luợi""" |
|
|
try: |
|
|
if not name: |
|
|
return None |
|
|
|
|
|
name_lower = name.lower() |
|
|
|
|
|
if "1 pha" in name_lower: |
|
|
return "1 pha" |
|
|
|
|
|
if "3 pha" in name_lower: |
|
|
return "3 pha" |
|
|
|
|
|
return None |
|
|
|
|
|
except: |
|
|
return None |
|
|
|
|
|
|
|
|
|