cjl
3 days ago 4a6be2249798d618ddb3b46c4a14504906ceb415
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
package com.moral.api.service.impl;
 
import com.fasterxml.jackson.databind.ObjectMapper;
import com.moral.api.entity.HistorySecondRadar;
import com.moral.api.mapper.HistorySecondRadarMapper;
import com.moral.api.pojo.query.radar.RadarListCond;
import com.moral.api.pojo.vo.radar.HistorySecondRadarListVo;
import com.moral.api.pojo.vo.radar.RadarListVo;
import com.moral.api.service.HistorySecondRadarService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
 
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
 
/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author moral
 * @since 2026-05-14
 */
@Service
public class HistorySecondRadarServiceImpl extends ServiceImpl<HistorySecondRadarMapper, HistorySecondRadar> implements HistorySecondRadarService {
    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
    private static final double HEIGHT_INTERVAL = 7.5;
    @Override
    public RadarListVo radarList(RadarListCond cond) {
        RadarListVo radarListVo = new RadarListVo();
        List<String> time = new ArrayList<>();
        List<HistorySecondRadarListVo> list = this.baseMapper.listRadar(cond);
        List<List<double[]>> pm25 = new ArrayList<>();
        List<List<double[]>> pm10 = new ArrayList<>();
        for(HistorySecondRadarListVo ot : list){
            pm10.add(convertSingleRecordToJson(ot.getRadarDataPm10(),cond.getHigh1(),cond.getHigh2()));
            pm25.add(convertSingleRecordToJson(ot.getRadarDataPm25(),cond.getHigh1(),cond.getHigh2()));
            time.add(ot.getTimeStr());
        }
        radarListVo.setPm25(pm25);
        radarListVo.setTime(time);
        radarListVo.setPm10(pm10);
        return radarListVo;
    }
 
    private List<double[]> convertSingleRecordToJson(String rawData,int high1,int high2){
        if (rawData == null || rawData.isEmpty()) {
            return new ArrayList<>();
        }
        try {
            // 3. 分割字符串
            String[] valuesStr = rawData.split("\\*");
 
            // 4. 预分配列表大小,假设约2000个数据,减少扩容
            List<double[]> seriesData = new ArrayList<>(valuesStr.length);
 
            for (int i = 10; i < valuesStr.length; i++) {
                // 简单的空值检查,避免 NumberFormatException
                if (valuesStr[i].isEmpty()) continue;
                double height = (i + 1) * HEIGHT_INTERVAL;
                if(height> high1 && height < high2){
                    double pm25Value = Double.parseDouble(valuesStr[i]);
                    pm25Value = new BigDecimal(Double.toString(pm25Value))
                            .setScale(1, RoundingMode.HALF_UP)
                            .doubleValue();
                    // 使用 double 数组存储 [浓度, 高度],比对象更节省内存
                    seriesData.add(new double[]{pm25Value, height});
                }
            }
            // 5. 序列化为 JSON
            return seriesData;
 
        } catch (Exception e) {
            // 生产环境中建议记录日志,而不是打印堆栈
            System.err.println("处理数据出错: " + e.getMessage());
            return new ArrayList<>();
        }
    }
}