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
package com.zhitan.util;
 
import com.zhitan.model.entity.DeviceData;
import com.zhitan.model.entity.PowerEntity;
 
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
 
public class PowerDataMapper {
    
    public static List<PowerEntity> mapToEntities(DeviceData deviceData) {
        List<PowerEntity> meters = IntStream.rangeClosed(1, 8)
                .mapToObj(i -> createBaseEntity(deviceData, i))
                .collect(Collectors.toList());
 
        for (DeviceData.RDataItem item : deviceData.getParams().getRData()) {
            // 示例:将 "Ia1" 拆分为 "Ia" 和 "1"
            String[] parts = item.getName().split("(?<=\\D)(?=\\d)");
            if (parts.length != 2) continue;
 
            String fieldCode = parts[0]; // 如 "Ia"
            int meterIndex = Integer.parseInt(parts[1]) - 1; // 转数组下标
 
            if (meterIndex >= 0 && meterIndex < 8) {
                setMeterField(meters.get(meterIndex), fieldCode, item.getValue());
            }
            // Uab1 Ubc1 Uca1是8个电表共用的字段,如果item.getName是Uab1 Ubc1 Uca1则遍历所有电表并赋值
            if ("Uab Ubc Uca Ua Ub Uc".contains(fieldCode)) {
                for (int i = 0; i < 8; i++) {
                    setMeterField(meters.get(i), fieldCode, item.getValue());
                }
            }
        }
        return meters;
    }
 
    private static PowerEntity createBaseEntity(DeviceData data, int meterNumber) {
        PowerEntity entity = new PowerEntity();
        entity.setSn(data.getParams().getSysSn() + "_" + meterNumber);
        entity.setImei(data.getParams().getSysImei());
        entity.setTime(data.getParams().getSysTime());
        return entity;
    }
 
    private static void setMeterField(PowerEntity entity, String fieldCode, String value) {
        try {
            switch (fieldCode.toUpperCase()) {
                case "UAB":
                    entity.setUab(parseDouble(value));
                    break;
                case "UBC":
                    entity.setUbc(parseDouble(value));
                    break;
                case "UCA":
                    entity.setUca(parseDouble(value));
                    break;
                case "UA":
                    entity.setUa(parseDouble(value));
                    break;
                case "UB":
                    entity.setUb(parseDouble(value));
                    break;
                case "UC":
                    entity.setUc(parseDouble(value));
                    break;
                case "IA":
                    entity.setIa(parseDouble(value));
                    break;
                case "IB":
                    entity.setIb(parseDouble(value));
                    break;
                case "IC":
                    entity.setIc(parseDouble(value));
                    break;
                case "IO":
                    entity.setIo(parseDouble(value));
                    break;
                case "PF":
                    entity.setPf(parseDouble(value));
                    break;
                case "PSUM":
                    entity.setPsum(parseDouble(value));
                    break;
                case "EPS":
                    entity.setEps(parseDouble(value));
                    break;
                case "EQS":
                    entity.setEqs(parseDouble(value));
                    break;
                case "EPSP":
                    entity.setEpsp(parseDouble(value));
                    break;
                case "EPSN":
                    entity.setEpsn(parseDouble(value));
                    break;
                case "EQSP":
                    entity.setEqsp(parseDouble(value));
                    break;
                case "EQSN":
                    entity.setEqsn(parseDouble(value));
                    break;
 
 
            }
        } catch (NumberFormatException e) {
            // 处理数值转换异常
        }
    }
 
    private static Double parseDouble(String s) {
        return s != null ? Double.parseDouble(s) : null;
    }
}