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<>();
|
}
|
}
|
}
|