0918优化-综合查询最大最小加日期

This commit is contained in:
2025-10-21 15:12:14 +08:00
parent e1fb6e30ac
commit 76b30c715c
2 changed files with 64 additions and 19 deletions

View File

@ -14,10 +14,12 @@ public class DevicePointDataList
private String parentDeviceId;
// 该设备点位数据list
private List<GeneralQueryDataVo> pointValueList;
// 最大值
// 最大值&时间
private BigDecimal maxValue;
// 最小值
private String maxDate;
// 最小值&时间
private BigDecimal minValue;
private String minDate;
// 平均值保留4位小数
private BigDecimal avgValue;
// 差值max - min
@ -25,7 +27,8 @@ public class DevicePointDataList
public DevicePointDataList(String deviceId, List<GeneralQueryDataVo> pointValueList,String parentDeviceId,
BigDecimal maxValue, BigDecimal minValue,
BigDecimal avgValue, BigDecimal diffValue) {
BigDecimal avgValue, BigDecimal diffValue,
String maxDate, String minDate) {
this.deviceId = deviceId;
this.pointValueList = pointValueList;
this.parentDeviceId = parentDeviceId;
@ -33,12 +36,30 @@ public class DevicePointDataList
this.minValue = minValue;
this.avgValue = avgValue;
this.diffValue = diffValue;
this.maxDate = maxDate;
this.minDate = minDate;
}
public DevicePointDataList() {
}
public String getMaxDate() {
return maxDate;
}
public void setMaxDate(String maxDate) {
this.maxDate = maxDate;
}
public String getMinDate() {
return minDate;
}
public void setMinDate(String minDate) {
this.minDate = minDate;
}
public String getDeviceId() {
return deviceId;
}

View File

@ -222,7 +222,7 @@ public class GeneralQueryServiceImpl implements IGeneralQueryService
// 4. 构建DeviceItem
return new DevicePointDataList(deviceId, pointValueList,parentDeviceId,
stats.max, stats.min,stats.avg,stats.diff);
stats.max, stats.min,stats.avg,stats.diff,stats.maxDate,stats.minDate);
})// 关键排序步骤先按deviceId升序再按parentDeviceId升序
.sorted(
Comparator.comparing(DevicePointDataList::getDeviceId) // 第一排序键deviceId
@ -258,7 +258,7 @@ public class GeneralQueryServiceImpl implements IGeneralQueryService
Stats stats = clacStats(deviceDataList);
return new DevicePointDataList(deviceId, deviceDataList,null,
stats.max, stats.min,stats.avg,stats.diff);
stats.max, stats.min,stats.avg,stats.diff,stats.maxDate,stats.minDate);
})
.collect(Collectors.toList());
@ -269,25 +269,30 @@ public class GeneralQueryServiceImpl implements IGeneralQueryService
}
private Stats clacStats(List<GeneralQueryDataVo> deviceDataList) {
// 提取有效数值过滤null
List<BigDecimal> values = deviceDataList.stream()
.map(vo -> convertToBigDecimal(vo.getPointValue()))
.filter(value -> value != null) // 过滤null值
// 转换并过滤数据,封装数值和对应的时间
List<ValueTimePair> validPairs = deviceDataList.stream()
.map(vo -> {
BigDecimal value = convertToBigDecimal(vo.getPointValue());
return value != null ?
new ValueTimePair(value, vo.getValueDate()) :
null;
})
.filter(pair -> pair != null) // 过滤无效数据
.collect(Collectors.toList());
if (values.isEmpty()) {
return new Stats(null, null, null, null);
if (validPairs.isEmpty()) {
return new Stats(null, null, null, null, null, null);
}
// 计算最大最小值
BigDecimal maxValue = values.stream().max(BigDecimal::compareTo).get();
BigDecimal minValue = values.stream().min(BigDecimal::compareTo).get();
Optional<ValueTimePair> maxPair = validPairs.stream().max((p1, p2) -> p1.value.compareTo(p2.value));
Optional<ValueTimePair> minPair = validPairs.stream().min((p1, p2) -> p1.value.compareTo(p2.value));
// 计算平均值,四舍五入保留4为小数
BigDecimal sum = values.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal avgValue = sum.divide(BigDecimal.valueOf(values.size()), 4, BigDecimal.ROUND_HALF_UP);
BigDecimal sum = validPairs.stream() .map(pair -> pair.value).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal avgValue = sum.divide(BigDecimal.valueOf(validPairs.size()), 4, BigDecimal.ROUND_HALF_UP);
// 增量数据,计算差值
BigDecimal diff = maxValue.subtract(minValue);
BigDecimal diff = maxPair.get().value.subtract(minPair.get().value);
return new Stats(maxValue,minValue,avgValue,diff);
return new Stats(maxPair.get().value,minPair.get().value,avgValue,diff,maxPair.get().time,minPair.get().time);
}
private BigDecimal convertToBigDecimal(Object pointValue) {
@ -492,15 +497,34 @@ public class GeneralQueryServiceImpl implements IGeneralQueryService
*/
private static class Stats {
private final BigDecimal max;
private final String maxDate;
private final BigDecimal min;
private final String minDate;
private final BigDecimal avg;
private final BigDecimal diff;
public Stats(BigDecimal max, BigDecimal min, BigDecimal avg, BigDecimal diff) {
public Stats(BigDecimal max, BigDecimal min, BigDecimal avg, BigDecimal diff,
String maxDate, String minDate) {
this.max = max;
this.maxDate = maxDate;
this.min = min;
this.minDate = minDate;
this.avg = avg;
this.diff = diff;
}
}
/**
* 辅助类:关联数值和对应的时间
*/
private static class ValueTimePair {
final BigDecimal value;
final String time;
ValueTimePair(BigDecimal value, String time) {
this.value = value;
this.time = time;
}
}
}