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