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,