From 27778698a27aa60847335a9643ad9ba2ea6af3d9 Mon Sep 17 00:00:00 2001 From: HuangHuiKang Date: Fri, 23 Jan 2026 14:45:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=AE=8C=E6=88=90=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E8=BF=90=E8=A1=8C=E6=8A=A5=E8=A1=A8=E9=A1=B5=E9=9D=A2=EF=BC=8C?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=87=87=E9=9B=86=E8=AE=BE=E5=A4=87=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E8=BF=90=E8=A1=8C=E7=8A=B6=E6=80=81=E3=80=81=E9=87=87?= =?UTF-8?q?=E9=9B=86=E6=97=B6=E9=97=B4=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/device/DeviceController.java | 15 +++-- .../admin/device/enums/DeviceStatusEnum.java | 2 +- .../device/scheduled/coretask/DeviceTask.java | 44 ++++++------- .../admin/device/vo/DeviceRespVO.java | 19 +++++- .../DeviceOperationRecordController.java | 29 +++++++++ .../utils/TimeConverterUtil.java | 63 +++++++++++++++++++ .../vo/DeviceTotalTimeRecordReqVO.java | 32 ++++++++++ .../vo/DeviceTotalTimeRecordRespVO.java | 43 +++++++++++++ .../DeviceOperationRecordMapper.java | 5 ++ .../iot/service/device/DeviceService.java | 2 +- .../iot/service/device/DeviceServiceImpl.java | 45 ++++++++++--- .../DeviceOperationRecordService.java | 2 + .../DeviceOperationRecordServiceImpl.java | 63 +++++++++++++++++++ .../DeviceOperationRecordMapper.xml | 31 +++++++++ 14 files changed, 353 insertions(+), 42 deletions(-) create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/utils/TimeConverterUtil.java create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/vo/DeviceTotalTimeRecordReqVO.java create mode 100644 yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/vo/DeviceTotalTimeRecordRespVO.java 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 6c9cb258e1..d4d4cfa6d4 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 @@ -96,8 +96,8 @@ public class DeviceController { @Operation(summary = "获得物联设备分页") @PreAuthorize("@ss.hasPermission('iot:device:query')") public CommonResult> getDevicePage(@Valid DevicePageReqVO pageReqVO) { - PageResult pageResult = deviceService.getDevicePage(pageReqVO); - return success(BeanUtils.toBean(pageResult, DeviceRespVO.class)); + PageResult pageResult = deviceService.getDevicePage(pageReqVO); + return success(pageResult); } @GetMapping("/export-excel") @@ -107,17 +107,16 @@ public class DeviceController { public void exportDeviceExcel(@Valid DevicePageReqVO pageReqVO, HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List list = deviceService.getDevicePage(pageReqVO).getList(); + List list = deviceService.getDevicePage(pageReqVO).getList(); // 导出 Excel - ExcelUtils.write(response, "物联设备.xls", "数据", DeviceRespVO.class, - BeanUtils.toBean(list, DeviceRespVO.class)); + ExcelUtils.write(response, "物联设备.xls", "数据", DeviceRespVO.class,list); } @GetMapping("/deviceList") @PreAuthorize("@ss.hasPermission('iot:device:query')") - public CommonResult> deviceList(@Valid DevicePageReqVO pageReqVO) { + public CommonResult> deviceList(@Valid DevicePageReqVO pageReqVO) { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List list = deviceService.getDevicePage(pageReqVO).getList(); - return success(BeanUtils.toBean(list, DeviceDO.class)); + List list = deviceService.getDevicePage(pageReqVO).getList(); + return success(list); } @PostMapping("/connect") diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/enums/DeviceStatusEnum.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/enums/DeviceStatusEnum.java index de1cbd4e7e..9c31b6f8a6 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/enums/DeviceStatusEnum.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/enums/DeviceStatusEnum.java @@ -53,7 +53,7 @@ public enum DeviceStatusEnum { /** * 根据状态码获取枚举 */ - public static DeviceStatusEnum getByCode(Integer code) { + public static DeviceStatusEnum getByCode(String code) { if (code == null) { return null; } diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/coretask/DeviceTask.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/coretask/DeviceTask.java index 047d87bf73..c0791e532e 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/coretask/DeviceTask.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/coretask/DeviceTask.java @@ -417,36 +417,36 @@ public class DeviceTask implements Task { return; } - DeviceOperationRecordDO lastRecord = deviceOperationRecordMapper.selectOne( - Wrappers.lambdaQuery() - .eq(DeviceOperationRecordDO::getRule, ruleCode) - .orderByDesc(DeviceOperationRecordDO::getCreateTime) - .last("LIMIT 1") - ); +// DeviceOperationRecordDO lastRecord = deviceOperationRecordMapper.selectOne( +// Wrappers.lambdaQuery() +// .eq(DeviceOperationRecordDO::getRule, ruleCode) +// .orderByDesc(DeviceOperationRecordDO::getCreateTime) +// .last("LIMIT 1") +// ); if (ruleCode.equals(DeviceStatusEnum.RUNNING.getCode())) { - Double totalTime = (lastRecord != null && lastRecord.getTotalRunningTime() != null) - ? lastRecord.getTotalRunningTime() + sampleCycle - : sampleCycle; - record.setTotalRunningTime(totalTime); +// Double totalTime = (lastRecord != null && lastRecord.getTotalRunningTime() != null) +// ? lastRecord.getTotalRunningTime() + sampleCycle +// : sampleCycle; + record.setTotalRunningTime(sampleCycle); } else if (ruleCode.equals(DeviceStatusEnum.STANDBY.getCode())) { - Double totalTime = (lastRecord != null && lastRecord.getTotalStandbyTime() != null) - ? lastRecord.getTotalStandbyTime() + sampleCycle - : sampleCycle; - record.setTotalStandbyTime(totalTime); +// Double totalTime = (lastRecord != null && lastRecord.getTotalStandbyTime() != null) +// ? lastRecord.getTotalStandbyTime() + sampleCycle +// : sampleCycle; + record.setTotalStandbyTime(sampleCycle); } else if (ruleCode.equals(DeviceStatusEnum.FAULT_STANDBY.getCode())) { - Double totalTime = (lastRecord != null && lastRecord.getTotalFaultTime() != null) - ? lastRecord.getTotalFaultTime() + sampleCycle - : sampleCycle; - record.setTotalFaultTime(totalTime); +// Double totalTime = (lastRecord != null && lastRecord.getTotalFaultTime() != null) +// ? lastRecord.getTotalFaultTime() + sampleCycle +// : sampleCycle; + record.setTotalFaultTime(sampleCycle); } else if (ruleCode.equals(DeviceStatusEnum.ALARM_RUNNING.getCode())) { - Double totalTime = (lastRecord != null && lastRecord.getTotalWarningTime() != null) - ? lastRecord.getTotalWarningTime() + sampleCycle - : sampleCycle; - record.setTotalWarningTime(totalTime); +// Double totalTime = (lastRecord != null && lastRecord.getTotalWarningTime() != null) +// ? lastRecord.getTotalWarningTime() + sampleCycle +// : sampleCycle; + record.setTotalWarningTime(sampleCycle); } } diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceRespVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceRespVO.java index 247b7e6a52..6a31a1d11f 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceRespVO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/DeviceRespVO.java @@ -3,6 +3,11 @@ package cn.iocoder.yudao.module.iot.controller.admin.device.vo; import cn.iocoder.yudao.module.iot.controller.admin.devicemodelrules.vo.PointRulesRespVO; import cn.iocoder.yudao.module.iot.dal.dataobject.devicepointrules.DevicePointRulesDO; import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.util.*; @@ -102,6 +107,16 @@ public class DeviceRespVO { @ExcelProperty("密码") private String password; - @Schema(description = "点位规则") - private List pointRulesVOList; + @Schema(description = "运行状态") + @ExcelProperty("运行状态") + private String operatingStatus; + + + @Schema(description = "采集时间") + @ExcelProperty("采集时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + private LocalDateTime collectionTime; + } \ 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/DeviceOperationRecordController.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/DeviceOperationRecordController.java index d16e8d3efa..d38edb45e1 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 @@ -11,6 +11,9 @@ import io.swagger.v3.oas.annotations.Operation; import javax.validation.constraints.*; import javax.validation.*; import javax.servlet.http.*; +import java.net.URLEncoder; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.io.IOException; @@ -92,4 +95,30 @@ public class DeviceOperationRecordController { BeanUtils.toBean(list, DeviceOperationRecordRespVO.class)); } + @GetMapping("/deviceOperationPage") + @Operation(summary = "设备运行报表") + @PreAuthorize("@ss.hasPermission('mes:repair-tems:query')") + public CommonResult> deviceOperationPage(@Valid DeviceTotalTimeRecordReqVO pageReqVO) { + PageResult pageResult = deviceOperationRecordService.deviceOperationPage(pageReqVO); + return success(pageResult); + } + + + @GetMapping("/export-device-operation-report") + @Operation(summary = "导出设备运行报表记录 Excel") + @PreAuthorize("@ss.hasPermission('iot:device-operation-record:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportDeviceOperationReport(@Valid DeviceTotalTimeRecordReqVO pageReqVO, + HttpServletResponse response) throws IOException { + PageResult pageResult = deviceOperationRecordService.deviceOperationPage(pageReqVO); + // 设置响应头 + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + response.setHeader("Content-Disposition", + "attachment;filename=" + URLEncoder.encode("设备运行报表记录.xls", "UTF-8")); + response.setHeader("Content-Encoding", "identity"); + // 导出Excel + String fileName = String.format("设备运行报表记录_%s.xls", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + // 导出 Excel + ExcelUtils.write(response, "设备运行报表记录.xls", "数据", 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/utils/TimeConverterUtil.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/utils/TimeConverterUtil.java new file mode 100644 index 0000000000..69d413c220 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/utils/TimeConverterUtil.java @@ -0,0 +1,63 @@ +package cn.iocoder.yudao.module.iot.controller.admin.deviceoperationrecord.utils; + +import org.springframework.stereotype.Component; + +@Component +public class TimeConverterUtil { + + private static final int SECONDS_PER_HOUR = 3600; + + /** + * 秒转小时(保留2位小数) + */ + public static double secondsToHours(double seconds) { + if (seconds <= 0) { + return 0.0; + } + double hours = seconds / SECONDS_PER_HOUR; + return formatDouble(hours, 2); + } + + /** + * 秒转小时(自定义小数位数) + */ + public static double secondsToHours(double seconds, int scale) { + if (seconds <= 0) { + return 0.0; + } + double hours = seconds / SECONDS_PER_HOUR; + return formatDouble(hours, scale); + } + + /** + * 计算稼动率 + * 稼动率 = 运行时间 / (运行时间 + 待机时间 + 故障时间 + 警告时间) * 100% + */ + public static double calculateUtilizationRate(double runningTime, double standbyTime, + double faultTime, double warningTime) { + double totalTime = runningTime + standbyTime + faultTime + warningTime; + if (totalTime <= 0) { + return 0.0; + } + double rate = runningTime / totalTime * 100; + return formatDouble(rate, 2); + } + + /** + * 格式化小数 + */ + public static double formatDouble(double value, int scale) { + if (scale < 0) { + scale = 2; + } + double factor = Math.pow(10, scale); + return Math.round(value * factor) / factor; + } + + /** + * 获取百分比字符串 + */ + public static String getPercentString(double value) { + return formatDouble(value, 2) + "%"; + } +} \ 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/DeviceTotalTimeRecordReqVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/vo/DeviceTotalTimeRecordReqVO.java new file mode 100644 index 0000000000..0032afc7d1 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/vo/DeviceTotalTimeRecordReqVO.java @@ -0,0 +1,32 @@ +package cn.iocoder.yudao.module.iot.controller.admin.deviceoperationrecord.vo; + + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - 运行记录分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeviceTotalTimeRecordReqVO extends PageParam{ + + @Schema(description = "设备编码") + private String deviceCode; + + @Schema(description = "设备名称") + private String deviceName; + + @Schema(description = "开始时间") + private String startTime; + + @Schema(description = "结束时间") + private String endTime; + + @Schema(description = "ids导出集合用") + private String ids; + +} 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 new file mode 100644 index 0000000000..f1db9a33c8 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/deviceoperationrecord/vo/DeviceTotalTimeRecordRespVO.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.module.iot.controller.admin.deviceoperationrecord.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 运行设备报表时间记录 Request VO") +@Data +@ExcelIgnoreUnannotated +public class DeviceTotalTimeRecordRespVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4283") + private Long id; + + @Schema(description = "设备编码") + @ExcelProperty("设备编码") + private String deviceCode; + + @Schema(description = "设备名称") + @ExcelProperty("设备名称") + private String deviceName; + + @Schema(description = "运行时间(小时)") + @ExcelProperty("运行时间(小时)") + private double totalRunningTime; + + @Schema(description = "待机时间(小时)") + @ExcelProperty("待机时间(小时)") + private double totalStandbyTime; + + @Schema(description = "故障时间(小时)") + @ExcelProperty("故障时间(小时)") + private double totalFaultTime; + + @Schema(description = "警告时间(小时)") + @ExcelProperty("警告时间(小时)") + private double totalWarningTime; + + @Schema(description = "稼动率") + @ExcelProperty("稼动率") + private String utilizationRate; +} diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/deviceoperationrecord/DeviceOperationRecordMapper.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/deviceoperationrecord/DeviceOperationRecordMapper.java index f5c7c17aca..da1956d738 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/deviceoperationrecord/DeviceOperationRecordMapper.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/deviceoperationrecord/DeviceOperationRecordMapper.java @@ -6,8 +6,11 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.module.iot.dal.dataobject.deviceoperationrecord.DeviceOperationRecordDO; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Mapper; import cn.iocoder.yudao.module.iot.controller.admin.deviceoperationrecord.vo.*; +import org.apache.ibatis.annotations.Param; /** * 运行记录 Mapper @@ -28,4 +31,6 @@ public interface DeviceOperationRecordMapper extends BaseMapperX deviceOperationPage(Page page,@Param("pageReqVO") DeviceTotalTimeRecordReqVO pageReqVO); + } \ 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 d75f6ceb4b..435cdf6a72 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 @@ -69,7 +69,7 @@ public interface DeviceService { * @param pageReqVO 分页查询 * @return 物联设备分页 */ - PageResult getDevicePage(DevicePageReqVO pageReqVO); + PageResult getDevicePage(DevicePageReqVO pageReqVO); List selectList(DevicePageReqVO reqVO); // ==================== 子表(设备属性) ==================== 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 051805853e..26102ba004 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 @@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.opc.OpcUtils; +import cn.iocoder.yudao.module.iot.controller.admin.device.enums.DeviceStatusEnum; import cn.iocoder.yudao.module.iot.controller.admin.device.scheduled.utils.CronExpressionUtils; import cn.iocoder.yudao.module.iot.controller.admin.device.scheduled.scheduler.TaskSchedulerManager; import cn.iocoder.yudao.module.iot.controller.admin.device.vo.*; @@ -16,6 +17,7 @@ import cn.iocoder.yudao.module.iot.dal.dataobject.deviceattributetype.DeviceAttr import cn.iocoder.yudao.module.iot.dal.dataobject.devicemodel.DeviceModelDO; import cn.iocoder.yudao.module.iot.dal.dataobject.devicemodelattribute.DeviceModelAttributeDO; import cn.iocoder.yudao.module.iot.dal.dataobject.devicemodelrules.DeviceModelRulesDO; +import cn.iocoder.yudao.module.iot.dal.dataobject.deviceoperationrecord.DeviceOperationRecordDO; import cn.iocoder.yudao.module.iot.dal.dataobject.devicepointrules.DevicePointRulesDO; import cn.iocoder.yudao.module.iot.dal.dataobject.mqttdatarecord.MqttDataRecordDO; import cn.iocoder.yudao.module.iot.dal.dataobject.devicecontactmodel.DeviceContactModelDO; @@ -25,6 +27,7 @@ import cn.iocoder.yudao.module.iot.dal.mysql.devicecontactmodel.DeviceContactMod import cn.iocoder.yudao.module.iot.dal.mysql.devicemodel.DeviceModelMapper; import cn.iocoder.yudao.module.iot.dal.mysql.devicemodelattribute.DeviceModelAttributeMapper; import cn.iocoder.yudao.module.iot.dal.mysql.devicemodelrules.DeviceModelRulesMapper; +import cn.iocoder.yudao.module.iot.dal.mysql.deviceoperationrecord.DeviceOperationRecordMapper; import cn.iocoder.yudao.module.iot.dal.mysql.devicepointrules.DevicePointRulesMapper; import cn.iocoder.yudao.module.iot.dal.mysql.mqttdatarecord.MqttDataRecordMapper; import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceAttributeDO; @@ -102,6 +105,9 @@ public class DeviceServiceImpl implements DeviceService { @Resource private DevicePointRulesMapper devicePointRulesMapper; + @Resource + private DeviceOperationRecordMapper deviceOperationRecordMapper; + @Override @Transactional(rollbackFor = Exception.class) @@ -231,12 +237,12 @@ public class DeviceServiceImpl implements DeviceService { DeviceRespVO deviceRespVO = BeanUtils.toBean(deviceDO, DeviceRespVO.class); List devicePointRulesDOList = devicePointRulesMapper.selectList(Wrappers.lambdaQuery() .eq(DevicePointRulesDO::getDeviceId, id)); - - //设置点位规则 - if (!devicePointRulesDOList.isEmpty()){ - - deviceRespVO.setPointRulesVOList(devicePointRulesDOList); - } +// +// //设置点位规则 +// if (!devicePointRulesDOList.isEmpty()){ +// +// deviceRespVO.setPointRulesVOList(devicePointRulesDOList); +// } return deviceRespVO; @@ -250,8 +256,31 @@ public class DeviceServiceImpl implements DeviceService { return deviceMapper.selectByTopic(topic); } @Override - public PageResult getDevicePage(DevicePageReqVO pageReqVO) { - return deviceMapper.selectPage(pageReqVO); + public PageResult getDevicePage(DevicePageReqVO pageReqVO) { + + PageResult deviceDOPageResult = deviceMapper.selectPage(pageReqVO); + PageResult deviceRespVOPageResult = BeanUtils.toBean(deviceDOPageResult, DeviceRespVO.class); + + List ruleCodes = Arrays.stream(DeviceStatusEnum.values()) + .map(DeviceStatusEnum::getCode) + .collect(Collectors.toList()); + + for (DeviceRespVO deviceRespVO : deviceRespVOPageResult.getList()) { + + DeviceOperationRecordDO deviceOperationRecordDO = deviceOperationRecordMapper.selectOne(Wrappers.lambdaQuery() + .eq(DeviceOperationRecordDO::getDeviceId, deviceRespVO.getId()) + .in(DeviceOperationRecordDO::getRule, ruleCodes) + .orderByDesc(DeviceOperationRecordDO::getCreateTime) + .last("LIMIT 1")); + if(deviceOperationRecordDO !=null){ + deviceRespVO.setOperatingStatus(DeviceStatusEnum.getByCode(deviceOperationRecordDO.getRule()).getName()); + deviceRespVO.setCollectionTime(deviceOperationRecordDO.getCreateTime()); + } + + + } + + return deviceRespVOPageResult; } @Override diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/deviceoperationrecord/DeviceOperationRecordService.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/deviceoperationrecord/DeviceOperationRecordService.java index 5e3af18836..6ef733e47c 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/deviceoperationrecord/DeviceOperationRecordService.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/deviceoperationrecord/DeviceOperationRecordService.java @@ -52,4 +52,6 @@ public interface DeviceOperationRecordService { */ PageResult getDeviceOperationRecordPage(DeviceOperationRecordPageReqVO pageReqVO); + PageResult deviceOperationPage(@Valid DeviceTotalTimeRecordReqVO pageReqVO); + } \ 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 52469c3c0b..3eae7cdf6d 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 @@ -1,5 +1,9 @@ package cn.iocoder.yudao.module.iot.service.deviceoperationrecord; +import cn.iocoder.yudao.module.iot.controller.admin.deviceoperationrecord.utils.TimeConverterUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -24,6 +28,7 @@ import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*; */ @Service @Validated +@Slf4j public class DeviceOperationRecordServiceImpl implements DeviceOperationRecordService { @Resource @@ -71,4 +76,62 @@ public class DeviceOperationRecordServiceImpl implements DeviceOperationRecordSe return deviceOperationRecordMapper.selectPage(pageReqVO); } + @Override + public PageResult deviceOperationPage(DeviceTotalTimeRecordReqVO pageReqVO) { + + Page page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()); + IPage deviceOperationRecordRespVOIPage = deviceOperationRecordMapper.deviceOperationPage(page,pageReqVO); + // 计算和转换 + if (deviceOperationRecordRespVOIPage != null && !deviceOperationRecordRespVOIPage.getRecords().isEmpty()) { + calculateAndSetConvertedValues(deviceOperationRecordRespVOIPage.getRecords()); + } + + + return new PageResult<>(deviceOperationRecordRespVOIPage.getRecords(), deviceOperationRecordRespVOIPage.getTotal()); + + } + + private void calculateAndSetConvertedValues(List records) { + for (DeviceTotalTimeRecordRespVO record : records) { + try { + // 获取原始秒数 + double runningTimeSec = record.getTotalRunningTime(); + double standbyTimeSec = record.getTotalStandbyTime(); + double faultTimeSec = record.getTotalFaultTime(); + double warningTimeSec = record.getTotalWarningTime(); + + // 1. 转换为小时 + double runningHours = TimeConverterUtil.secondsToHours(runningTimeSec, 2); + double standbyHours = TimeConverterUtil.secondsToHours(standbyTimeSec, 2); + double faultHours = TimeConverterUtil.secondsToHours(faultTimeSec, 2); + double warningHours = TimeConverterUtil.secondsToHours(warningTimeSec, 2); + + // 2. 计算稼动率 + double utilizationRate = TimeConverterUtil.calculateUtilizationRate( + runningTimeSec, standbyTimeSec, faultTimeSec, warningTimeSec + ); + + // 3. 设置转换后的值(将原来的秒数值覆盖为小时值) + record.setTotalRunningTime(runningHours); + record.setTotalStandbyTime(standbyHours); + record.setTotalFaultTime(faultHours); + record.setTotalWarningTime(warningHours); + record.setUtilizationRate(TimeConverterUtil.getPercentString(utilizationRate)); + + } catch (Exception e) { + log.error("计算设备{}时间转换时出错: {}", record.getDeviceCode(), e.getMessage()); + // 设置默认值 + setDefaultValues(record); + } + } + } + + private void setDefaultValues(DeviceTotalTimeRecordRespVO record) { + record.setTotalRunningTime(0.0); + record.setTotalStandbyTime(0.0); + record.setTotalFaultTime(0.0); + record.setTotalWarningTime(0.0); + record.setUtilizationRate("0%"); + } + } \ No newline at end of file diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/deviceoperationrecord/DeviceOperationRecordMapper.xml b/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/deviceoperationrecord/DeviceOperationRecordMapper.xml index cbcab4b99a..bc33e7e71a 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/deviceoperationrecord/DeviceOperationRecordMapper.xml +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/deviceoperationrecord/DeviceOperationRecordMapper.xml @@ -9,4 +9,35 @@ 文档可见:https://www.iocoder.cn/MyBatis/x-plugins/ --> + \ No newline at end of file