diff --git a/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/utils/MathUtils.java b/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/utils/MathUtils.java index de6fc18..a36f0c3 100644 --- a/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/utils/MathUtils.java +++ b/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/utils/MathUtils.java @@ -1,6 +1,7 @@ package com.ruoyi.common.utils; import java.math.BigDecimal; +import java.math.RoundingMode; /** * @author wjh @@ -160,7 +161,7 @@ public class MathUtils { if (a == null || b == null) { return false; } - return equals(a.setScale(precision, BigDecimal.ROUND_HALF_UP), b.setScale(precision, BigDecimal.ROUND_HALF_UP)); + return equals(a.setScale(precision, RoundingMode.HALF_UP), b.setScale(precision, RoundingMode.HALF_UP)); } // 获取最大值 diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/DeviceQuery.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/DeviceQuery.java index ce846dc..e129f71 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/DeviceQuery.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/domain/DeviceQuery.java @@ -17,7 +17,7 @@ public class DeviceQuery extends DeviceVO { @ApiModelProperty("是否刷新物联网信息") private Boolean refresh; - + @ApiModelProperty("设备ID列表") private List ids; @@ -54,5 +54,9 @@ public class DeviceQuery extends DeviceVO { @ApiModelProperty("最后上报时间(结束)") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime lastTimeEnd; - + + @ApiModelProperty("最后上报时间(起始)") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime lastTimeStart; + } diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/mapper/DeviceMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/device/mapper/DeviceMapper.xml index 1f8c828..f9f9dc9 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/mapper/DeviceMapper.xml +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/mapper/DeviceMapper.xml @@ -127,6 +127,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and bul.user_name like concat('%', #{query.lastUserPhone}, '%') and mch.nick_name like concat('%', #{query.mchName}, '%') and bm.name like concat('%', #{query.modelName}, '%') + and bd.last_location_time <= #{query.lastTimeEnd} + and bd.last_location_time >= #{query.lastTimeStart} and ( bd.sn like concat('%', #{query.keyword}, '%') diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceIotServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceIotServiceImpl.java index 88cb718..882e948 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceIotServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceIotServiceImpl.java @@ -274,28 +274,18 @@ public class DeviceIotServiceImpl implements DeviceIotService { DeviceUtil.setIotInfo(device, iot); } - // 异步更新数据库 - // scheduledExecutorService.schedule(() -> { - // for (DeviceVO device : deviceList) { - // try { - // // 加锁,控制更新频率 - // boolean lock = redisLock.lock(RedisLockKey.DEVICE_IOT_REFRESH, device.getMac(), 10); - // if (!lock) { - // continue; - // } - - // // 获取在线状态 - // if (StringUtils.hasText(onlineType)) { - // String onlineStatus = iotService.getOnlineStatus(device, onlineType); - // this.setOnlineStatus(device, onlineStatus); - // } - // // 更新物联网信息 - // this.updateIot(device); - // } catch (Exception e) { - // log.error("更新设备{}物联网信息失败", device.getSn(), e); - // } - // } - // }, 0, TimeUnit.SECONDS); + // 异步发送命令,强制设备上报数据 + scheduledExecutorService.schedule(() -> { + for (DeviceVO device : deviceList) { + try { + if (onlineType != null) { + iotService.getOnlineStatus(device, onlineType); + } + } catch (Exception e) { + log.error("强制设备{}上报数据失败", device.getSn(), e); + } + } + }, 0, TimeUnit.SECONDS); } private void setOnlineStatus(DeviceVO device, String onlineStatus) { diff --git a/ruoyi-service/src/main/java/com/ruoyi/iot/enums/IotHttpStatus.java b/ruoyi-service/src/main/java/com/ruoyi/iot/enums/IotHttpStatus.java index 42338cb..4859558 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/iot/enums/IotHttpStatus.java +++ b/ruoyi-service/src/main/java/com/ruoyi/iot/enums/IotHttpStatus.java @@ -1,12 +1,12 @@ package com.ruoyi.iot.enums; -import lombok.AllArgsConstructor; -import lombok.Getter; - import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; +import lombok.AllArgsConstructor; +import lombok.Getter; + /** * @author wjh * 2024/7/11 diff --git a/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java index be17f8c..2be8e9b 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java @@ -1,6 +1,7 @@ package com.ruoyi.iot.service.impl; import java.math.BigDecimal; +import java.math.RoundingMode; import java.time.Duration; import java.time.LocalDateTime; import java.util.List; @@ -83,21 +84,21 @@ public class IotReceiveServiceImpl implements IotReceiveService { if (device == null) { return; } + BigDecimal oldLon = device.getLongitude(); + BigDecimal oldLat = device.getLatitude(); // 转为设备信息 log.info("收到sys数据:{}", msg.getValue()); IotDeviceSysInfo sys = IotUtil.toSysInfo(msg.getValue()); LocalDateTime at = DateUtils.toLocalDateTime(msg.getAt()); + DeviceUtil.setIotSysInfo(device, sys, at); // 处理设备定位BUG,若出现BUG则重启设备 - int handle = this.handleDeviceLocationBug(device, sys, at); + int handle = this.handleDeviceLocationBug(device, at, oldLon, oldLat); if (handle == 1) { return; } - // 设置设备信息 - DeviceUtil.setIotSysInfo(device, sys, at); - // 更新设备信息 device.setOnlineStatus(DeviceOnlineStatus.ONLINE.getStatus()); device.setLastOnlineTime(at); @@ -134,7 +135,7 @@ public class IotReceiveServiceImpl implements IotReceiveService { * 处理设备定位BUG * @param device */ - private int handleDeviceLocationBug(DeviceVO device, IotDeviceSysInfo sys, LocalDateTime at) { + private int handleDeviceLocationBug(DeviceVO device, LocalDateTime at, BigDecimal oldLon, BigDecimal oldLat) { if (device == null || StringUtils.isBlank(device.getMac()) || device.getLastLocationTime() == null || at == null) { return 0; } @@ -144,22 +145,22 @@ public class IotReceiveServiceImpl implements IotReceiveService { return 0; } // 0,0定位不处理 - if (MathUtils.equals(sys.getLon(), BigDecimal.ZERO) && MathUtils.equals(sys.getLat(), BigDecimal.ZERO)) { - log.info("设备{}定位异常:{},{},不处理", device.getMac(), sys.getLon(), sys.getLat()); + if (MathUtils.equals(device.getLongitude(), BigDecimal.ZERO) && MathUtils.equals(device.getLatitude(), BigDecimal.ZERO)) { + log.info("设备{}定位异常:{},{},不处理", device.getMac(), device.getLongitude(), device.getLatitude()); return 0; } - boolean isOpen = DeviceQuality.OPEN.getCode().equals(sys.getQ()); // 电门是否开启 + boolean isOpen = DeviceQuality.OPEN.getCode().equals(device.getQuality()); // 电门是否开启 // 需要在设备未启动的时候做,否则可能有安全问题 if (!isOpen) { // 若当前数据点的上报时间和设备内上次上报的时间不一样,但是定位一样,则重启设备 - log.info("当前定位:{},{},上次定位:{},{}", - sys.getLon().setScale(8, BigDecimal.ROUND_HALF_UP), - sys.getLat().setScale(8, BigDecimal.ROUND_HALF_UP), - device.getLongitude().setScale(8, BigDecimal.ROUND_HALF_UP), - device.getLatitude().setScale(8, BigDecimal.ROUND_HALF_UP) + log.info("当前定位:{},{},上次定位:{},{}", + device.getLongitude().setScale(8, RoundingMode.HALF_UP), + device.getLatitude().setScale(8, RoundingMode.HALF_UP), + oldLon.setScale(8, RoundingMode.HALF_UP), + oldLat.setScale(8, RoundingMode.HALF_UP) ); - if (at.isAfter(device.getLastLocationTime()) && MathUtils.equalsFixed(device.getLongitude(), sys.getLon(), 8) && MathUtils.equalsFixed(device.getLatitude(), sys.getLat(), 8)) { - String reason = String.format("设备不同时间的两次定位一样,重启设备。新定位:%s,%s,旧定位:%s,%s", sys.getLon(), sys.getLat(), device.getLongitude(), device.getLatitude()); + if (at.isAfter(device.getLastLocationTime()) && MathUtils.equalsFixed(device.getLongitude(), oldLon, 8) && MathUtils.equalsFixed(device.getLatitude(), oldLat, 8)) { + String reason = String.format("设备不同时间的两次定位一样,重启设备。新定位:%s,%s,旧定位:%s,%s", device.getLongitude(), device.getLatitude(), oldLon, oldLat); deviceIotService.reboot(device, reason, true); return 1; } diff --git a/ruoyi-service/src/main/java/com/ruoyi/iot/util/IotUtil.java b/ruoyi-service/src/main/java/com/ruoyi/iot/util/IotUtil.java index 230b3fd..0abc01b 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/iot/util/IotUtil.java +++ b/ruoyi-service/src/main/java/com/ruoyi/iot/util/IotUtil.java @@ -31,6 +31,7 @@ import com.ruoyi.common.utils.StringUtils; import com.ruoyi.iot.domain.IotDeviceSysInfo; import com.ruoyi.iot.domain.ObjBody; import com.ruoyi.iot.domain.response.CommandResponse; +import com.ruoyi.iot.enums.IotHttpStatus; import lombok.extern.slf4j.Slf4j; @@ -214,7 +215,8 @@ public class IotUtil { if (result == null) { return "未知错误"; } - return result.getMsg(); + IotHttpStatus status = IotHttpStatus.convertByCode(result.getCode()); + return status.getMsg(); } public static IotDeviceSysInfo toSysInfo(Object value) {