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) {