From 3984fbe95369358df46494e9e0c14446370e474c Mon Sep 17 00:00:00 2001 From: liutao <790864623@qq.com> Date: Fri, 15 May 2026 15:26:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=98=A8=E6=97=A5=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=AF=B9=E6=AF=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DeviceOperationRecordServiceImpl.java | 50 +++++++++++++++++-- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/deviceoperationrecord/DeviceOperationRecordServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/deviceoperationrecord/DeviceOperationRecordServiceImpl.java index 5050a3a2a..000d28799 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/deviceoperationrecord/DeviceOperationRecordServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/deviceoperationrecord/DeviceOperationRecordServiceImpl.java @@ -431,6 +431,24 @@ public class DeviceOperationRecordServiceImpl implements DeviceOperationRecordSe double faultRate = calculatePercent(totalFaultSeconds, onlineSeconds); double standbyRate = calculatePercent(totalStandbySeconds, onlineSeconds); + DeviceTotalTimeRecordReqVO previousReqVO = buildPreviousPeriodReqVO(pageReqVO); + List previousRecords = queryDeviceStatsRaw(previousReqVO); + double previousTotalRunningSeconds = previousRecords.stream().mapToDouble(DeviceTotalTimeRecordRespVO::getTotalRunningTime).sum(); + double previousTotalStandbySeconds = previousRecords.stream().mapToDouble(DeviceTotalTimeRecordRespVO::getTotalStandbyTime).sum(); + double previousTotalFaultSeconds = previousRecords.stream().mapToDouble(DeviceTotalTimeRecordRespVO::getTotalFaultTime).sum(); + double previousTotalOfflineSeconds = previousRecords.stream().mapToDouble(DeviceTotalTimeRecordRespVO::getTotalOfflineTime).sum(); + double previousOnlineSeconds = previousTotalRunningSeconds + previousTotalStandbySeconds + previousTotalFaultSeconds; + double previousTotalSeconds = previousOnlineSeconds + previousTotalOfflineSeconds; + double previousUtilizationRate = calculatePercent(previousTotalRunningSeconds, previousOnlineSeconds); + double previousPowerOnRate = calculatePercent(previousOnlineSeconds, previousTotalSeconds); + double previousFaultRate = calculatePercent(previousTotalFaultSeconds, previousOnlineSeconds); + double previousStandbyRate = calculatePercent(previousTotalStandbySeconds, previousOnlineSeconds); + + double utilizationRateChange = calculateMetricChange(utilizationRate, previousUtilizationRate); + double powerOnRateChange = calculateMetricChange(powerOnRate, previousPowerOnRate); + double faultRateChange = calculateMetricChange(faultRate, previousFaultRate); + double standbyRateChange = calculateMetricChange(standbyRate, previousStandbyRate); + double totalRunningHours = secondsToHours(totalRunningSeconds); double totalStandbyHours = secondsToHours(totalStandbySeconds); double totalFaultHours = secondsToHours(totalFaultSeconds); @@ -438,10 +456,10 @@ public class DeviceOperationRecordServiceImpl implements DeviceOperationRecordSe double totalHours = secondsToHours(totalSeconds); respVO.setMetrics(Arrays.asList( - DeviceOperationOverviewRespVO.MetricItem.builder().key("utilizationRate").icon("ep:pie-chart").value(round2(utilizationRate)).unit("%").change(0D).build(), - DeviceOperationOverviewRespVO.MetricItem.builder().key("powerOnRate").icon("ep:video-play").value(round2(powerOnRate)).unit("%").change(0D).build(), - DeviceOperationOverviewRespVO.MetricItem.builder().key("faultRate").icon("ep:warning").value(round2(faultRate)).unit("%").change(0D).build(), - DeviceOperationOverviewRespVO.MetricItem.builder().key("standbyRate").icon("ep:timer").value(round2(standbyRate)).unit("%").change(0D).build() + DeviceOperationOverviewRespVO.MetricItem.builder().key("utilizationRate").icon("ep:pie-chart").value(round2(utilizationRate)).unit("%").change(utilizationRateChange).build(), + DeviceOperationOverviewRespVO.MetricItem.builder().key("powerOnRate").icon("ep:video-play").value(round2(powerOnRate)).unit("%").change(powerOnRateChange).build(), + DeviceOperationOverviewRespVO.MetricItem.builder().key("faultRate").icon("ep:warning").value(round2(faultRate)).unit("%").change(faultRateChange).build(), + DeviceOperationOverviewRespVO.MetricItem.builder().key("standbyRate").icon("ep:timer").value(round2(standbyRate)).unit("%").change(standbyRateChange).build() )); respVO.setSummary(Arrays.asList( @@ -542,6 +560,30 @@ public class DeviceOperationRecordServiceImpl implements DeviceOperationRecordSe return Math.round(value * 100D) / 100D; } + private DeviceTotalTimeRecordReqVO buildPreviousPeriodReqVO(DeviceTotalTimeRecordReqVO reqVO) { + DeviceTotalTimeRecordReqVO previousReqVO = new DeviceTotalTimeRecordReqVO(); + previousReqVO.setIds(reqVO.getIds()); + previousReqVO.setDeviceCode(reqVO.getDeviceCode()); + previousReqVO.setDeviceName(reqVO.getDeviceName()); + previousReqVO.setTimelinePageNo(reqVO.getTimelinePageNo()); + previousReqVO.setTimelinePageSize(reqVO.getTimelinePageSize()); + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND); + LocalDateTime start = LocalDateTime.parse(reqVO.getStartTime(), formatter); + LocalDateTime end = LocalDateTime.parse(reqVO.getEndTime(), formatter); + Duration duration = Duration.between(start, end); + LocalDateTime previousStart = start.minusDays(1); + LocalDateTime previousEnd = previousStart.plus(duration); + + previousReqVO.setStartTime(previousStart.format(formatter)); + previousReqVO.setEndTime(previousEnd.format(formatter)); + return previousReqVO; + } + + private double calculateMetricChange(double current, double previous) { + return round2(current - previous); + } + private List buildTimelineRows(List records, List deviceIds, String startTime,