|
|
@ -2,12 +2,11 @@ package com.dongjian.dashboard.back.service.common; |
|
|
|
|
|
|
|
|
import com.dongjian.dashboard.back.vo.device.LineData; |
|
|
import com.dongjian.dashboard.back.vo.device.LineData; |
|
|
|
|
|
|
|
|
|
|
|
import java.time.LocalDate; |
|
|
import java.time.LocalDateTime; |
|
|
import java.time.LocalDateTime; |
|
|
|
|
|
import java.time.ZoneId; |
|
|
import java.time.format.DateTimeFormatter; |
|
|
import java.time.format.DateTimeFormatter; |
|
|
import java.util.ArrayList; |
|
|
import java.util.*; |
|
|
import java.util.List; |
|
|
|
|
|
import java.util.Map; |
|
|
|
|
|
import java.util.TreeMap; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* 给计测设备,按小时聚合数据,求平均值 |
|
|
* 给计测设备,按小时聚合数据,求平均值 |
|
|
@ -65,5 +64,124 @@ public class LineDataHourAggregator { |
|
|
lineData.setXData(newX); |
|
|
lineData.setXData(newX); |
|
|
lineData.setYData(newY); |
|
|
lineData.setYData(newY); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 给计测设备,按半小时聚合数据,求平均值 |
|
|
|
|
|
* 00~29 分 → HH:00:00 |
|
|
|
|
|
* 30~59 分 → HH:30:00 |
|
|
|
|
|
*/ |
|
|
|
|
|
public static void aggregateAverageByHalfHour(LineData lineData) { |
|
|
|
|
|
|
|
|
|
|
|
List<Object> xData = lineData.getXData(); |
|
|
|
|
|
List<Object> yData = lineData.getYData(); |
|
|
|
|
|
|
|
|
|
|
|
if (xData == null || yData == null || xData.size() != yData.size()) { |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// halfHour -> List<Double>
|
|
|
|
|
|
Map<String, List<Double>> halfHourMap = new TreeMap<>(); |
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < xData.size(); i++) { |
|
|
|
|
|
String timeStr = String.valueOf(xData.get(i)); |
|
|
|
|
|
Object yVal = yData.get(i); |
|
|
|
|
|
|
|
|
|
|
|
if (yVal == null) { |
|
|
|
|
|
continue; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
LocalDateTime time = LocalDateTime.parse(timeStr, INPUT_FMT); |
|
|
|
|
|
|
|
|
|
|
|
int minute = time.getMinute(); |
|
|
|
|
|
int halfHourMinute = minute < 30 ? 0 : 30; |
|
|
|
|
|
|
|
|
|
|
|
LocalDateTime halfHourTime = time |
|
|
|
|
|
.withMinute(halfHourMinute) |
|
|
|
|
|
.withSecond(0) |
|
|
|
|
|
.withNano(0); |
|
|
|
|
|
|
|
|
|
|
|
String halfHourKey = halfHourTime.format(INPUT_FMT); |
|
|
|
|
|
|
|
|
|
|
|
halfHourMap |
|
|
|
|
|
.computeIfAbsent(halfHourKey, k -> new ArrayList<>()) |
|
|
|
|
|
.add(Double.parseDouble(String.valueOf(yVal))); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 重新构建 xData / yData
|
|
|
|
|
|
List<Object> newX = new ArrayList<>(); |
|
|
|
|
|
List<Object> newY = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
|
|
for (Map.Entry<String, List<Double>> entry : halfHourMap.entrySet()) { |
|
|
|
|
|
newX.add(entry.getKey()); |
|
|
|
|
|
|
|
|
|
|
|
double avg = entry.getValue() |
|
|
|
|
|
.stream() |
|
|
|
|
|
.mapToDouble(Double::doubleValue) |
|
|
|
|
|
.average() |
|
|
|
|
|
.orElse(0); |
|
|
|
|
|
|
|
|
|
|
|
newY.add(avg); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
lineData.setXData(newX); |
|
|
|
|
|
lineData.setYData(newY); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 按半小时聚合,只保留每个半小时内的最后一条数据 |
|
|
|
|
|
*/ |
|
|
|
|
|
public static void aggregateLastByHalfHour(LineData lineData) { |
|
|
|
|
|
|
|
|
|
|
|
List<Object> xData = lineData.getXData(); |
|
|
|
|
|
List<Object> yData = lineData.getYData(); |
|
|
|
|
|
|
|
|
|
|
|
if (xData == null || yData == null || xData.size() != yData.size()) { |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// halfHour -> lastValue
|
|
|
|
|
|
Map<String, Double> halfHourLastMap = new TreeMap<>(); |
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < xData.size(); i++) { |
|
|
|
|
|
String timeStr = String.valueOf(xData.get(i)); |
|
|
|
|
|
Object yVal = yData.get(i); |
|
|
|
|
|
|
|
|
|
|
|
if (yVal == null) { |
|
|
|
|
|
continue; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
LocalDateTime time = LocalDateTime.parse(timeStr, INPUT_FMT); |
|
|
|
|
|
|
|
|
|
|
|
int minute = time.getMinute(); |
|
|
|
|
|
int halfHourMinute = minute < 30 ? 0 : 30; |
|
|
|
|
|
|
|
|
|
|
|
LocalDateTime halfHourTime = time |
|
|
|
|
|
.withMinute(halfHourMinute) |
|
|
|
|
|
.withSecond(0) |
|
|
|
|
|
.withNano(0); |
|
|
|
|
|
|
|
|
|
|
|
String halfHourKey = halfHourTime.format(INPUT_FMT); |
|
|
|
|
|
|
|
|
|
|
|
// 同一个半小时,后面的会覆盖前面的 → 自然就是“最后一条”
|
|
|
|
|
|
halfHourLastMap.put( |
|
|
|
|
|
halfHourKey, |
|
|
|
|
|
Double.parseDouble(String.valueOf(yVal)) |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 重新构建 xData / yData
|
|
|
|
|
|
List<Object> newX = new ArrayList<>(); |
|
|
|
|
|
List<Object> newY = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
|
|
for (Map.Entry<String, Double> entry : halfHourLastMap.entrySet()) { |
|
|
|
|
|
newX.add(entry.getKey()); |
|
|
|
|
|
newY.add(entry.getValue()); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
lineData.setXData(newX); |
|
|
|
|
|
lineData.setYData(newY); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|