File size: 5,084 Bytes
2959ef9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
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