diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java index d4d4cfa6d4..9c9bcad42f 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/DeviceController.java @@ -172,6 +172,16 @@ public class DeviceController { } + @GetMapping("/getDeviceOperationalStatus") + @Operation(summary = "获取首页设备运行状态") + @PreAuthorize("@ss.hasPermission('iot:device:query')") + public CommonResult getDeviceOperationalStatus() throws JsonProcessingException { + DeviceOperationStatusRespVO deviceOperationalStatus=deviceService.getDeviceOperationalStatus(); + return success(deviceOperationalStatus); + } + + + // ==================== 子表(设备属性) ==================== @GetMapping("/device-attribute/page") diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceOperationStatusRespVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceOperationStatusRespVO.java new file mode 100644 index 0000000000..da93533001 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceOperationStatusRespVO.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.iot.controller.admin.device.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +@Schema(description = "管理后台 - 设备运行状态 Resp VO") +@Data +@ToString(callSuper = true) +public class DeviceOperationStatusRespVO { + + @Schema(description = "总设备数") + private int totalDevices; + + @Schema(description = "运行") + private int runningCount; + + @Schema(description = "待机中(不运行、没故障)") + private int standbyCount; + + @Schema(description = "故障中(故障且待机)") + private int faultCount; + + @Schema(description = "报警中(故障且运行)") + private int warningCount; + + @Schema(description = "利用率") + private String utilizationRate; + + @Schema(description = "故障率") + private String faultRate; + +} + + diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/DeviceOperationRecordController.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/DeviceOperationRecordController.java index d38edb45e1..b171cd2331 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/DeviceOperationRecordController.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/DeviceOperationRecordController.java @@ -119,6 +119,6 @@ public class DeviceOperationRecordController { // 导出Excel String fileName = String.format("设备运行报表记录_%s.xls", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 导出 Excel - ExcelUtils.write(response, "设备运行报表记录.xls", "数据", DeviceTotalTimeRecordRespVO.class,pageResult.getList()); + ExcelUtils.write(response, fileName, "数据", DeviceTotalTimeRecordRespVO.class,pageResult.getList()); } } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/vo/DeviceTotalTimeRecordRespVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/vo/DeviceTotalTimeRecordRespVO.java index f1db9a33c8..bdb6da6a76 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/vo/DeviceTotalTimeRecordRespVO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/vo/DeviceTotalTimeRecordRespVO.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.iot.controller.admin.deviceoperationrecord.vo; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -10,8 +11,8 @@ import lombok.Data; @ExcelIgnoreUnannotated public class DeviceTotalTimeRecordRespVO { - @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4283") - private Long id; +// @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4283") +// private Long id; @Schema(description = "设备编码") @ExcelProperty("设备编码") @@ -40,4 +41,14 @@ public class DeviceTotalTimeRecordRespVO { @Schema(description = "稼动率") @ExcelProperty("稼动率") private String utilizationRate; + + @Schema(description = "开始时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ExcelProperty("开始时间") + private String startTime; + + @Schema(description = "结束时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ExcelProperty("结束时间") + private String endTime; } diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/DeviceMapper.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/DeviceMapper.java index bf003757d6..ad6b081718 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/DeviceMapper.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/DeviceMapper.java @@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.DeviceOperationStatusRespVO; import cn.iocoder.yudao.module.iot.controller.admin.device.vo.DevicePageReqVO; import cn.iocoder.yudao.module.iot.controller.admin.device.vo.LineDeviceRequestVO; import cn.iocoder.yudao.module.iot.controller.admin.device.vo.LineDeviceRespVO; @@ -96,4 +97,5 @@ public interface DeviceMapper extends BaseMapperX { IPage lineDevicePage(Page page, @Param("pageReqVO") LineDeviceRequestVO pageReqVO); + DeviceOperationStatusRespVO getDeviceOperationalStatus(); } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceService.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceService.java index 435cdf6a72..e8d12c0808 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceService.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceService.java @@ -131,4 +131,5 @@ public interface DeviceService { Boolean scheduledStop(Long id); + DeviceOperationStatusRespVO getDeviceOperationalStatus(); } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java index 26102ba004..0b118b9340 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/DeviceServiceImpl.java @@ -788,4 +788,52 @@ public class DeviceServiceImpl implements DeviceService { } } + @Override + public DeviceOperationStatusRespVO getDeviceOperationalStatus() { + + DeviceOperationStatusRespVO deviceOperationalStatus= deviceMapper.getDeviceOperationalStatus(); + + // 计算利用率 + calculateUtilizationRate(deviceOperationalStatus); + + // 计算故障率 + calculateFaultRate(deviceOperationalStatus); + + return deviceOperationalStatus; + } + /** + * 计算利用率 + * 利用率 = 运行数量 / 设备总数 * 100% + */ + private void calculateUtilizationRate(DeviceOperationStatusRespVO statusVO) { + int totalDevices = statusVO.getTotalDevices(); + int runningCount = statusVO.getRunningCount(); + + double utilizationRate = 0.0; + if (totalDevices > 0) { + utilizationRate = (double) runningCount / totalDevices * 100; + } + + // 格式化百分比,保留2位小数 + String formattedRate = String.format("%.2f%%", utilizationRate); + statusVO.setUtilizationRate(formattedRate); + } + + /** + * 计算故障率 + * 故障率 = 故障数量 / 设备总数 * 100% + */ + private void calculateFaultRate(DeviceOperationStatusRespVO statusVO) { + int totalDevices = statusVO.getTotalDevices(); + int faultCount = statusVO.getFaultCount(); + + double faultRate = 0.0; + if (totalDevices > 0) { + faultRate = (double) faultCount / totalDevices * 100; + } + + // 格式化百分比,保留2位小数 + String formattedRate = String.format("%.2f%%", faultRate); + statusVO.setFaultRate(formattedRate); + } } \ No newline at end of file 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 3eae7cdf6d..4c0b1ed696 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 @@ -4,6 +4,7 @@ import cn.iocoder.yudao.module.iot.controller.admin.deviceoperationrecord.utils. import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -83,7 +84,7 @@ public class DeviceOperationRecordServiceImpl implements DeviceOperationRecordSe IPage deviceOperationRecordRespVOIPage = deviceOperationRecordMapper.deviceOperationPage(page,pageReqVO); // 计算和转换 if (deviceOperationRecordRespVOIPage != null && !deviceOperationRecordRespVOIPage.getRecords().isEmpty()) { - calculateAndSetConvertedValues(deviceOperationRecordRespVOIPage.getRecords()); + calculateAndSetConvertedValues(deviceOperationRecordRespVOIPage.getRecords(),pageReqVO); } @@ -91,9 +92,17 @@ public class DeviceOperationRecordServiceImpl implements DeviceOperationRecordSe } - private void calculateAndSetConvertedValues(List records) { + private void calculateAndSetConvertedValues(List records,DeviceTotalTimeRecordReqVO deviceTotalTimeRecordReqVO) { for (DeviceTotalTimeRecordRespVO record : records) { try { + //添加时间字段 + if (StringUtils.isNotBlank(deviceTotalTimeRecordReqVO.getStartTime())){ + record.setStartTime(deviceTotalTimeRecordReqVO.getStartTime()); + } + if (StringUtils.isNotBlank(deviceTotalTimeRecordReqVO.getEndTime())){ + record.setEndTime(deviceTotalTimeRecordReqVO.getEndTime()); + } + // 获取原始秒数 double runningTimeSec = record.getTotalRunningTime(); double standbyTimeSec = record.getTotalStandbyTime(); diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/device/DeviceMapper.xml b/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/device/DeviceMapper.xml index 5764094367..dac8d6d149 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/device/DeviceMapper.xml +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/device/DeviceMapper.xml @@ -45,4 +45,31 @@ order by mo.create_time desc + + \ No newline at end of file