From ce0437814b42fb20d1aa9f1baf0e174037067818 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=A3=B7=E5=8F=B6?=
<14103883+leaf-phos@user.noreply.gitee.com>
Date: Thu, 15 May 2025 17:38:44 +0800
Subject: [PATCH] =?UTF-8?q?=E6=80=A7=E8=83=BD=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../common/core/redis/enums/RedisLockKey.java | 3 +-
.../service/impl/DeviceIotServiceImpl.java | 10 +++----
.../service/impl/DeviceServiceImpl.java | 2 +-
.../locationLog/mapper/LocationLogMapper.xml | 2 +-
.../service/impl/IotReceiveServiceImpl.java | 28 ++++++++++++++++---
.../iot/service/impl/IotServiceImpl.java | 18 ++++++++----
6 files changed, 45 insertions(+), 18 deletions(-)
diff --git a/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/enums/RedisLockKey.java b/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/enums/RedisLockKey.java
index c8cf8f1..0e135b8 100644
--- a/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/enums/RedisLockKey.java
+++ b/common-ruoyi/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/enums/RedisLockKey.java
@@ -17,7 +17,8 @@ public enum RedisLockKey {
DEVICE_SN_UNIQUE("device_sn_unique", "设备SN唯一"),
DEVICE_MAC_UNIQUE("device_mac_unique", "设备MAC唯一"),
USER_NAME_UNIQUE("user_name_unique", "用户账号唯一"),
- DEVICE_IOT_REFRESH("device_iot_refresh", "设备物联网信息刷新");
+ DEVICE_IOT_REFRESH("device_iot_refresh", "设备物联网信息刷新"),
+ DEVICE_UPDATE_IOT_LOCK("device_update_iot_lock", "设备更新物联网信息锁");
private final String key;
private final String name;
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 02509ee..c151583 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
@@ -111,7 +111,7 @@ public class DeviceIotServiceImpl implements DeviceIotService {
transactionTemplate.execute(status -> {
// 更新数据库
- int rows = deviceMapper.updateByQuery(data, query);
+ int rows = deviceMapper.updateByQuerySimple(data, query);
vo.setDb(rows);
if (rows > 0) {
@@ -157,9 +157,9 @@ public class DeviceIotServiceImpl implements DeviceIotService {
query.setStatusList(DeviceStatus.canUserLock());
}
- Integer result = transactionTemplate.execute(status -> {
+ transactionTemplate.execute(status -> {
// 更新设备状态
- int rows = deviceMapper.updateByQuery(data, query);
+ int rows = deviceMapper.updateByQuerySimple(data, query);
vo.setDb(rows);
if (rows > 0) {
@@ -200,7 +200,7 @@ public class DeviceIotServiceImpl implements DeviceIotService {
// 是否有正在进行的订单
boolean hasOrder = device.getOrderDeviceId() != null && OrderDeviceStatus.inUse().contains(device.getOrderDeviceStatus());
- Integer result = transactionTemplate.execute(status -> {
+ transactionTemplate.execute(status -> {
// 更新设备状态
Device data = new Device();
data.setLockStatus(DeviceLockStatus.CLOSE.getCode());
@@ -208,7 +208,7 @@ public class DeviceIotServiceImpl implements DeviceIotService {
DeviceQuery query = new DeviceQuery();
query.setId(device.getId());
query.setStatusList(DeviceStatus.canQLock());
- int rows = deviceMapper.updateByQuery(data, query);
+ int rows = deviceMapper.updateByQuerySimple(data, query);
vo.setDb(rows);
if (rows > 0) {
diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceServiceImpl.java
index 9a40b7e..20f4126 100644
--- a/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceServiceImpl.java
+++ b/ruoyi-service/src/main/java/com/ruoyi/bst/device/service/impl/DeviceServiceImpl.java
@@ -480,7 +480,7 @@ public class DeviceServiceImpl implements DeviceService
data.setOnlineStatus(onlineStatus);
DeviceQuery query = new DeviceQuery();
query.setEqMac(mac);
- return deviceMapper.updateByQuery(data, query);
+ return deviceMapper.updateByQuerySimple(data, query);
}
@Override
diff --git a/ruoyi-service/src/main/java/com/ruoyi/bst/locationLog/mapper/LocationLogMapper.xml b/ruoyi-service/src/main/java/com/ruoyi/bst/locationLog/mapper/LocationLogMapper.xml
index dc18e3a..093f1ca 100644
--- a/ruoyi-service/src/main/java/com/ruoyi/bst/locationLog/mapper/LocationLogMapper.xml
+++ b/ruoyi-service/src/main/java/com/ruoyi/bst/locationLog/mapper/LocationLogMapper.xml
@@ -235,7 +235,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
select
bll.longitude,
bll.latitude
-
+ from bst_location_log bll
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 760903a..1caf9fe 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
@@ -29,6 +29,8 @@ import com.ruoyi.bst.locationLog.domain.LocationLog;
import com.ruoyi.bst.locationLog.service.LocationLogConverter;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.core.redis.RedisLock;
+import com.ruoyi.common.core.redis.enums.RedisLockKey;
import com.ruoyi.common.enums.LogBizType;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.MathUtils;
@@ -76,6 +78,9 @@ public class IotReceiveServiceImpl implements IotReceiveService {
@Autowired
private OperLogService operLogService;
+ @Autowired
+ private RedisLock redisLock;
+
@Override
public void handleReceive(ReceiveMsg msg) {
if (msg == null) {
@@ -103,10 +108,9 @@ public class IotReceiveServiceImpl implements IotReceiveService {
// 更新设备信息
device.setOnlineStatus(DeviceOnlineStatus.ONLINE.getStatus());
device.setLastOnlineTime(at);
- int update = deviceIotService.updateIot(device);
- if (update != 1) {
- log.error("更新设备信息失败: {}", msg.getDevName());
- }
+
+ // 增加更新频率控制
+ this.updateDeviceIot(device);
// 定位无效,不处理
if (device.getLongitude() == null || device.getLatitude() == null) {
@@ -143,6 +147,22 @@ public class IotReceiveServiceImpl implements IotReceiveService {
}
}
+ /**
+ * 更新设备物联网信息
+ * @param device
+ */
+ private void updateDeviceIot(DeviceVO device) {
+ boolean lock = redisLock.lock(RedisLockKey.DEVICE_UPDATE_IOT_LOCK.getKey(), device.getMac(), 20L, TimeUnit.SECONDS, 1);
+ if (lock) {
+ int update = deviceIotService.updateIot(device);
+ if (update != 1) {
+ log.error("更新设备信息失败: {}", device.getMac());
+ }
+ } else {
+ log.info("设备{}更新太频繁,跳过本次更新", device.getMac());
+ }
+ }
+
/**
* 处理设备重启
*/
diff --git a/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotServiceImpl.java
index 24d71f1..ece196c 100644
--- a/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotServiceImpl.java
+++ b/ruoyi-service/src/main/java/com/ruoyi/iot/service/impl/IotServiceImpl.java
@@ -289,13 +289,19 @@ public class IotServiceImpl implements IotService {
// 转为在线状态,并缓存结果10秒
String status = this.parseToOnlineStatus(res, deviceName, true);
redisCache.setCacheObject(this.getOnlineCacheKey(deviceName), status, 10, TimeUnit.SECONDS);
+
// 异步更新设备在线状态
- scheduledExecutorService.schedule(() -> {
- int update = deviceService.updateOnlineStatusByMac(deviceName, status);
- if (update != 1) {
- log.error("异步更新设备在线状态失败,MAC={},status={}", deviceName, status);
- }
- },0, TimeUnit.SECONDS);
+ boolean lock = redisLock.lock(RedisLockKey.DEVICE_UPDATE_IOT_LOCK.getKey(), deviceName, 20L, TimeUnit.SECONDS, 1);
+ if (lock ) {
+ scheduledExecutorService.execute(() -> {
+ int update = deviceService.updateOnlineStatusByMac(deviceName, status);
+ if (update != 1) {
+ log.error("异步更新设备在线状态失败,MAC={},status={}", deviceName, status);
+ }
+ });
+ } else {
+ log.info("设备{}更新太频繁,跳过本次更新", deviceName);
+ }
return res;
} catch (Exception e) {