yuan
3 天以前 1a21433e0babfa7cafc5a4d86609442ec9f150a4
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
package com.ruoyi.http.util;
 
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.http.pojo.TqdianbiaoEleRecord;
import com.ruoyi.http.vo.StatisticEleRecordVo;
 
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
 
public final class StatisticEleParseUtil {
 
    private StatisticEleParseUtil() {
    }
 
    public static List<TqdianbiaoEleRecord> parseToEntities(String raw, String dimension) {
        JSONObject root = JSON.parseObject(raw);
        if (root == null) {
            throw new ServiceException("电表接口返回为空");
        }
        if (root.getIntValue("status") != 1) {
            String msg = root.getString("msg");
            throw new ServiceException("电表接口返回异常: " + (msg != null ? msg : raw));
        }
        JSONObject data = root.getJSONObject("data");
        if (data == null || data.isEmpty()) {
            return new ArrayList<>();
        }
        LocalDateTime now = LocalDateTime.now();
        List<TqdianbiaoEleRecord> list = new ArrayList<>();
        for (String timeKey : data.keySet()) {
            JSONArray records = data.getJSONArray(timeKey);
            if (records == null) {
                continue;
            }
            for (int i = 0; i < records.size(); i++) {
                JSONObject rec = records.getJSONObject(i);
                TqdianbiaoEleRecord entity = new TqdianbiaoEleRecord();
                entity.setMeterId(rec.getLong("mid"));
                entity.setDimension(dimension);
                entity.setTimeKey(timeKey);
                entity.setReadingMethod("sync");
                Integer ratio = rec.getInteger("r");
                entity.setRatio(ratio);
                entity.setStartTime(rec.getString("st"));
                entity.setEndTime(rec.getString("et"));
 
                JSONArray sArr = rec.getJSONArray("s");
                JSONArray eArr = rec.getJSONArray("e");
                JSONArray dArr = rec.getJSONArray("d");
                entity.setStartReading(StatisticEleReadingUtil.formatReadingArray(sArr));
                entity.setEndReading(StatisticEleReadingUtil.formatReadingArray(eArr));
                entity.setPrevReading(StatisticEleReadingUtil.firstReading(sArr));
                entity.setCurrReading(StatisticEleReadingUtil.firstReading(eArr));
 
                fillConsumption(entity, dArr, ratio, sArr, eArr);
                entity.setSyncTime(now);
                list.add(entity);
            }
        }
        list.sort(Comparator.comparing(TqdianbiaoEleRecord::getTimeKey));
        return list;
    }
 
    public static List<StatisticEleRecordVo> toVoList(List<TqdianbiaoEleRecord> entities) {
        List<StatisticEleRecordVo> list = new ArrayList<>();
        for (TqdianbiaoEleRecord entity : entities) {
            list.add(toVo(entity));
        }
        return list;
    }
 
    public static StatisticEleRecordVo toVo(TqdianbiaoEleRecord entity) {
        StatisticEleRecordVo vo = new StatisticEleRecordVo();
        vo.setId(entity.getId());
        vo.setTimeKey(entity.getTimeKey());
        vo.setMeterId(entity.getMeterId());
        vo.setMeterName(entity.getMeterName());
        vo.setRatio(entity.getRatio());
        vo.setReadingMethod(entity.getReadingMethod());
        vo.setPrevReading(toDouble(entity.getPrevReading()));
        vo.setCurrReading(toDouble(entity.getCurrReading()));
        vo.setStartTime(entity.getStartTime());
        vo.setEndTime(entity.getEndTime());
        vo.setTotalConsumption(toDouble(entity.getTotalConsumption()));
        vo.setSharpConsumption(toDouble(entity.getSharpConsumption()));
        vo.setPeakConsumption(toDouble(entity.getPeakConsumption()));
        vo.setFlatConsumption(toDouble(entity.getFlatConsumption()));
        vo.setValleyConsumption(toDouble(entity.getValleyConsumption()));
        vo.setStartReading(entity.getStartReading());
        vo.setEndReading(entity.getEndReading());
        return vo;
    }
 
    private static void fillConsumption(TqdianbiaoEleRecord entity, JSONArray d, Integer ratio,
                                        JSONArray sArr, JSONArray eArr) {
        BigDecimal rawTotal = null;
        if (d != null && !d.isEmpty()) {
            rawTotal = d.getBigDecimal(0);
            entity.setSharpConsumption(d.size() >= 2 ? d.getBigDecimal(1) : null);
            entity.setPeakConsumption(d.size() >= 3 ? d.getBigDecimal(2) : null);
            entity.setFlatConsumption(d.size() >= 4 ? d.getBigDecimal(3) : null);
            entity.setValleyConsumption(d.size() >= 5 ? d.getBigDecimal(4) : null);
            entity.setDeepValleyConsumption(d.size() >= 6 ? d.getBigDecimal(5) : null);
        } else {
            rawTotal = StatisticEleReadingUtil.calcConsumption(
                    StatisticEleReadingUtil.firstReading(sArr),
                    StatisticEleReadingUtil.firstReading(eArr),
                    1);
        }
        entity.setTotalConsumption(StatisticEleReadingUtil.calcConsumptionFromRaw(rawTotal, ratio));
    }
 
    private static Double toDouble(BigDecimal value) {
        return value == null ? null : value.doubleValue();
    }
}