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 # Pattern to match "Dòng điện ổ cắm tối đa: XA" where X is the current value 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: # # Pattern 1: XW/Ym format - return floor(X/Y) # power_per_meter_pattern = r'(?:Công suất danh định|công suất danh định|Công suất|công suất).*?[:]\s*(\d+)[Ww]/(\d+)m' # per_meter_match = re.search(power_per_meter_pattern, spec, re.IGNORECASE) # if per_meter_match: # watts = int(per_meter_match.group(1)) # meters = int(per_meter_match.group(2)) # return watts // meters # Pattern 2: XW format - return X (exclude tối đa, chịu tải, etc.) 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: # Convert comma to dot for decimal values 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