From 76b30c715c9e83dc9cb08ecfe21299a4e30602a6 Mon Sep 17 00:00:00 2001 From: mashili Date: Tue, 21 Oct 2025 15:12:14 +0800 Subject: [PATCH] =?UTF-8?q?0918=E4=BC=98=E5=8C=96-=E7=BB=BC=E5=90=88?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=9C=80=E5=A4=A7=E6=9C=80=E5=B0=8F=E5=8A=A0?= =?UTF-8?q?=E6=97=A5=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ems/domain/vo/DevicePointDataList.java | 27 ++++++++- .../service/impl/GeneralQueryServiceImpl.java | 56 +++++++++++++------ 2 files changed, 64 insertions(+), 19 deletions(-) diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicePointDataList.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicePointDataList.java index 3f768f2..ac2f356 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicePointDataList.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicePointDataList.java @@ -14,10 +14,12 @@ public class DevicePointDataList private String parentDeviceId; // 该设备点位数据list private List 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 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; } diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/GeneralQueryServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/GeneralQueryServiceImpl.java index c8b53ab..6d99ba0 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/impl/GeneralQueryServiceImpl.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/GeneralQueryServiceImpl.java @@ -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 deviceDataList) { - // 提取有效数值(过滤null) - List values = deviceDataList.stream() - .map(vo -> convertToBigDecimal(vo.getPointValue())) - .filter(value -> value != null) // 过滤null值 + // 转换并过滤数据,封装数值和对应的时间 + List 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 maxPair = validPairs.stream().max((p1, p2) -> p1.value.compareTo(p2.value)); + Optional 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; + } + } + }