111
hxb
2022-11-24 0a3e07f10937484145f33c7560607b4b2353cb81
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
package com.mm.android.deviceaddmodule.mobilecommon.AppConsume;
 
import android.text.TextUtils;
 
import com.mm.android.deviceaddmodule.mobilecommon.common.LCConfiguration;
 
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
/**
 * <p>
 * 根据二维码扫描结果生成相应的类
 * </p>
 */
public class ScanResultFactory {
    // 工厂方法.注意 返回类型为抽象产品角色
    private static String tag = "www.hsview.com";
    private static String tag_lc = "www.lechange.cn";
 
    public static ScanResult scanResult(String scanString) {
        if (ProviderManager.getAppProvider().getAppType() == LCConfiguration.APP_LECHANGE_OVERSEA) {//海外二维码规则
            // 带NC标签的
            final String[] NC_ARRAYS = new String[]{"NC:", "nC:", "Nc:", "nc:", "NC:", "nC:", "Nc:", "nc:"};
            // 带SC标签的
            final String[] SC_ARRAYS = new String[]{"SC:", "sC:", "Sc:", "Sc:", "SC:", "sC:", "Sc:", "sc:"};
            boolean hasNc = hasTag(scanString, NC_ARRAYS);
            boolean hasSc = hasTag(scanString, SC_ARRAYS);
            if((hasNc || hasSc) && scanString.contains("{")) {
                return new PseudoJsonNcScanResult(scanString);
            } else {
                String deviceSN = "";
                String deviceSerial = "";
                if (scanString.contains(",")) {  //逗号分割,{SN:2J021B3PAK00120,DT:IPC-HFW1120SP-W-0280B,RC:564897}
                    scanString = scanString.substring(1, scanString.length() - 1); //去掉收尾花括号
                    String[] array = scanString.split(",");
                    for (String strArray : array) {
                        if (strArray.contains("SN:")) {
                            deviceSN = strArray.substring(strArray.indexOf("SN:") + 3, strArray.length());
                        }
                        if (strArray.contains("DT:")) {
                            deviceSerial = strArray.substring(strArray.indexOf("DT:") + 3, strArray.length());
                        }
                    }
                } else if (scanString.contains(";")) {//分号分割,{SN:2J021B3PAK00120;DT:IPC-HFW1120SP-W-0280B;RC:564897}
                    scanString = scanString.substring(1, scanString.length() - 1); //去掉收尾花括号
                    String[] array = scanString.split(";");
                    for (String strArray : array) {
                        if (strArray.contains("SN:")) {
                            deviceSN = strArray.substring(strArray.indexOf("SN:") + 3, strArray.length());
                        }
                        if (strArray.contains("DT:")) {
                            deviceSerial = strArray.substring(strArray.indexOf("DT:") + 3, strArray.length());
                        }
                    }
                } else if (scanString.contains(":")) {   //2M047C9PAN00005:DHI-ARD1611-W:PJ0V46
                    String[] array = scanString.split(":");
                    deviceSN = array[0];
                    deviceSerial = array[1];
                } else {
                    deviceSN = scanString;
                }
                // 兼容 俄语区Q4的订单采用标签二维码内容异常 格式为:DH-IPC-C35P,4K002C6PAJA49A7
                if(TextUtils.isEmpty(deviceSN)) {
                    String[] array = scanString.split(",");
                    if(array != null && array.length == 2) {
                        deviceSN = array[1];
                    }
                }
 
                ScanResult scanResult = new ScanResult();
                scanResult.setSn(deviceSN);
                scanResult.setMode(deviceSerial);
                return scanResult;
            }
        } else {//国内二维码规则
            if(scanString.contains(tag) || scanString.contains(tag_lc)){
                if(scanString.contains("{")){
                    // 兼容TC1
                    ScanResult scanResult = new PseudoJsonScanResult(scanString);
                    return scanResult;
                }
                // 兼容老乐橙设备
                int index = scanString.indexOf('=');
                String sn = scanString.substring(index + 1, scanString.length());
                ScanResult scanResult = new ScanResult();
                scanResult.setSn(sn);
                return scanResult;
            } else if (scanString.contains("{")) {
                ScanResult result = new PseudoJsonNcScanResult(scanString);
                return result;
            } else if (!scanString.contains("SN:") || !scanString.contains("SN=") || !scanString.contains("SN =") ||
                    !scanString.contains("sn:") || !scanString.contains("sn=") || !scanString.contains("sn =")) {
                if (!checkString(scanString)) {
                    String[] strings = scanString.split(":");
                    if (strings != null && !scanString.startsWith("http://") && strings.length == 3) {
                        return new TwoColonsScanResult(scanString);
 
                    } else if (strings != null && !scanString.startsWith("http://") && strings.length == 2) {
                        return new OneColonScanResult(scanString);
                    }
                } else {
                    ScanResult scanResult = new ScanResult();
                    scanResult.setSn(scanString);
                    return scanResult;
                }
            }
        }
        return new ScanResult();
    }
 
    // 判断是否有tag
    private static boolean hasTag(String scanString, String[] tagArrays) {
        boolean hasTag = false;
        for (String tag : tagArrays) {
            if (scanString.contains(tag)) {
                hasTag = true;
                break;
            }
        }
        return hasTag;
    }
 
    /**
     * 判断是否只包含数字或大小写字母
     *
     * @param str
     * @return
     */
    public static boolean checkString(String str) {
        String regEx = "[0-9A-Za-z]*"; // 只能是数字以及个别字符
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(str);
        if (m.matches()) {
            return true;
        } else {
            return false;
        }
    }
 
}