diff --git a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/constant/IotConstants.java b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/constant/IotConstants.java index fff48fc0..203d7f51 100644 --- a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/constant/IotConstants.java +++ b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/constant/IotConstants.java @@ -94,7 +94,7 @@ public class IotConstants { /** * 命令 设置总用电量 */ - public static final String COMMAND_SET_TOTAL_ELE = ""; + public static final String COMMAND_SET_TOTAL_ELE = "pow_set"; /**----------------------------命令end----------------------------*/ diff --git a/smart-switch-service/src/main/java/com/ruoyi/iot/service/IotService.java b/smart-switch-service/src/main/java/com/ruoyi/iot/service/IotService.java index e6851c3f..a63335b1 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/iot/service/IotService.java +++ b/smart-switch-service/src/main/java/com/ruoyi/iot/service/IotService.java @@ -1,6 +1,7 @@ package com.ruoyi.iot.service; +import com.ruoyi.iot.domain.HistoryDeviceData; import com.ruoyi.iot.domain.IotDeviceInfo; import com.ruoyi.iot.domain.response.CommandResponse; import com.ruoyi.iot.interfaces.IotDevice; @@ -158,7 +159,7 @@ public interface IotService { /** * 设置总用电量 * @param device 设备 - * @param totalEle 总用电量(度) + * @param totalEle 总用电量(瓦时) */ boolean setTotalEle(IotDevice device, BigDecimal totalEle); @@ -166,7 +167,12 @@ public interface IotService { * 设置总用电量 * @param deviceName 设备MAC * @param productId 产品ID - * @param totalEle 总用电量(度) + * @param totalEle 总用电量(瓦时) */ boolean setTotalEle(String deviceName, String productId, BigDecimal totalEle); + + /** + * 获取历史数据 + */ + HistoryDeviceData getHistoryDataPoint(String deviceName, String productId); } diff --git a/smart-switch-service/src/main/java/com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java b/smart-switch-service/src/main/java/com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java index 5a0c561f..6dae9a3c 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/iot/service/impl/IotReceiveServiceImpl.java @@ -4,9 +4,9 @@ import com.ruoyi.common.core.redis.enums.RedisLockKey; import com.ruoyi.common.utils.NumberUtils; import com.ruoyi.common.utils.ServiceUtil; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.collection.CollectionUtils; import com.ruoyi.iot.constants.ReceiveConstants; -import com.ruoyi.iot.domain.IotDeviceDetail; -import com.ruoyi.iot.domain.ReceiveMsg; +import com.ruoyi.iot.domain.*; import com.ruoyi.iot.domain.response.CommandResponse; import com.ruoyi.iot.enums.ReceiveType; import com.ruoyi.iot.service.IotReceiveService; @@ -60,9 +60,12 @@ public class IotReceiveServiceImpl implements IotReceiveService { // 数据点推送 if (ReceiveType.DATA_POINT.getType().equals(msg.getType())) { log.info("收到推送数据点:{},{},{}", msg.getAt(), msg.getDsId(), msg.getValue()); - // 若推送数据点:CSQ,则恢复余额 + // 若推送数据点:CSQ if (ReceiveConstants.DS_CSQ.equals(msg.getDsId())) { + // 恢复余额 this.recoverBalance(msg); + // 恢复总用电量 + this.recoverTotalEle(msg); } } // 生命周期 @@ -70,6 +73,52 @@ public class IotReceiveServiceImpl implements IotReceiveService { } } + /** + * 恢复异常的总用电量 + * @param msg + */ + private void recoverTotalEle(ReceiveMsg msg) { + // 查询设备 + DeviceVO device = deviceService.selectByAnyMac(msg.getDevName()); + if (device == null) { + log.info("设备:{} 不存在", msg.getDevName()); + return; + } + + // 查询历史数据点 + HistoryDeviceData historyDataPoint = iotService.getHistoryDataPoint(msg.getDevName(), device.getProductId()); + if (historyDataPoint == null || CollectionUtils.isEmptyElement(historyDataPoint.getDatastreams()) ) { + log.info("设备:{} 没有历史数据点", msg.getDevName()); + return; + } + + // 获取总用电量数据点 + HistoryDatastream pointW = historyDataPoint.getDatastreams() + .stream().filter(item -> item.getId().equals(ReceiveConstants.DS_W)) + .findFirst().orElse(null); + if (pointW == null || CollectionUtils.isEmptyElement(pointW.getDatapoints())) { + log.info("设备:{} 没有数据点:{}", msg.getDevName(), ReceiveConstants.DS_W); + return; + } + + // 遍历数据点,查找异常数据并恢复 + Datapoint lastPoint = null; + for (Datapoint dp : pointW.getDatapoints()) { + // 若当前数据点值大于上次数据点值,则视为异常数据,进行恢复 + if (lastPoint != null && dp != null) { + BigDecimal lastEle = NumberUtils.nonNullDecimal(lastPoint.getValue().toString()); + BigDecimal currEle = NumberUtils.nonNullDecimal(dp.getValue().toString()); + + if (currEle.compareTo(lastEle) > 0) { + log.info("设备:{} 数据点异常,恢复总电量:{} 瓦时, lastPoint = {}, dp = {}", msg.getDevName(), currEle, lastPoint, dp); + iotService.setTotalEle(device, currEle); + break; + } + } + lastPoint = dp; + } + } + // 恢复设备的余额 private void recoverBalance(ReceiveMsg msg) { String lockKey = msg.getDevName(); @@ -78,13 +127,15 @@ public class IotReceiveServiceImpl implements IotReceiveService { } try { // 查询设备 - DeviceVO device = deviceService.selectByMac(msg.getDevName()); + DeviceVO device = deviceService.selectByAnyMac(msg.getDevName()); if (device == null) { + log.info("设备:{} 不存在", msg.getDevName()); return; } // 判断上次恢复余额的时间和本次恢复余额的时间是否相同,若相同则视为重复推送,则忽略 if (device.getLastRecoverTime() != null && msg.getAt().equals(device.getLastRecoverTime())) { + log.info("设备:{} 重复推送余额恢复,上次恢复时间:{}", msg.getDevName(), device.getLastRecoverTime()); return; } diff --git a/smart-switch-service/src/main/java/com/ruoyi/iot/service/impl/IotServiceImpl.java b/smart-switch-service/src/main/java/com/ruoyi/iot/service/impl/IotServiceImpl.java index cf6ea007..5095571b 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/iot/service/impl/IotServiceImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/iot/service/impl/IotServiceImpl.java @@ -164,15 +164,14 @@ public class IotServiceImpl implements IotService { } // 获取历史设备数据点信息 - private HistoryDeviceData getHistoryDataPoint(String deviceName, String productId) { + @Override + public HistoryDeviceData getHistoryDataPoint(String deviceName, String productId) { String param = "device_name=" + deviceName + "&product_id=" + productId; String sendUrl = iotHost + IotConstants.ADDS_HISTORY_DATAPOINTS + "?"+param; String token = Token.getToken(); -// log.info("IOT获取到Authorization:【{}】",token); String result = HttpUtils.sendGetWithToken(sendUrl, null, token); -// log.info("IOT返回的结果【{}】",result); if (!StringUtils.hasText(result)) { log.error("与OneNet通信异常"); return null; diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/mapper/DeviceMapper.java b/smart-switch-service/src/main/java/com/ruoyi/ss/device/mapper/DeviceMapper.java index 6834a5a5..039e3458 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/mapper/DeviceMapper.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/mapper/DeviceMapper.java @@ -186,4 +186,9 @@ public interface DeviceMapper * 续费时长 */ int renewalRentTime(@Param("deviceId") Long deviceId, @Param("seconds") long seconds); + + /** + * 根据任何一个MAC查询 + */ + DeviceVO selectByAnyMac(@Param("mac") String mac); } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/mapper/DeviceMapper.xml b/smart-switch-service/src/main/java/com/ruoyi/ss/device/mapper/DeviceMapper.xml index d60f3475..a4f9b87d 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/mapper/DeviceMapper.xml +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/mapper/DeviceMapper.xml @@ -280,6 +280,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" limit 1 + + select LAST_INSERT_ID() diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/DeviceService.java b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/DeviceService.java index 84d8210e..f098835a 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/DeviceService.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/DeviceService.java @@ -352,4 +352,10 @@ public interface DeviceService * 根据设备ID列表查询 */ List selectByDeviceIds(List deviceIds); + + /** + * 根据mac查询设备 + */ + DeviceVO selectByAnyMac(String mac); + } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceServiceImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceServiceImpl.java index 360630cf..1b329d82 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceServiceImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceServiceImpl.java @@ -647,6 +647,11 @@ public class DeviceServiceImpl implements DeviceService return this.selectSmDeviceList(query); } + @Override + public DeviceVO selectByAnyMac(String mac) { + return deviceMapper.selectByAnyMac(mac); + } + @Override public boolean addTime(Long deviceId, long seconds, boolean withIot) {