From 2d4f601816e2651f962a26bf01ec6feb2f05ea28 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: Sat, 4 Jan 2025 13:43:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=A8=E7=BA=BF=E7=8A=B6=E6=80=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/common/constant/CacheConstants.java | 15 ++++ .../ruoyi/common/core/redis/RedisCache.java | 83 ++++++++++++++++-- .../common/core/redis/enums/RedisLockKey.java | 3 +- .../ruoyi/common/utils/http/HttpUtils.java | 31 +++---- .../src/main/resources/vm/xml/mapper.xml.vm | 1 + .../com/ruoyi/iot/domain/IotDeviceDetail.java | 4 +- .../iot/domain/response/CommandResponse.java | 11 ++- .../com/ruoyi/iot/service/IotService.java | 10 +-- .../iot/service/impl/IotServiceImpl.java | 84 +++++++++++++++---- .../commandLog/mapper/CommandLogMapper.java | 7 +- .../ss/commandLog/mapper/CommandLogMapper.xml | 42 ++++++++++ .../service/ICommandLogService.java | 11 ++- .../service/impl/CommandLogServiceImpl.java | 35 ++++++-- .../service/impl/DeviceServiceImpl.java | 35 +++++--- .../com/ruoyi/task/bill/BillMonitorTask.java | 4 +- .../ruoyi/task/commandLog/CommandLogTask.java | 41 +++++++++ .../main/resources/mybatis/mybatis-config.xml | 2 +- 17 files changed, 338 insertions(+), 81 deletions(-) create mode 100644 smart-switch-service/src/main/java/com/ruoyi/task/commandLog/CommandLogTask.java diff --git a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java index a2d827fe..96357610 100644 --- a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java +++ b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java @@ -65,4 +65,19 @@ public class CacheConstants * 微信access_token */ public static final String WX_ACCESS_TOKEN = "wx_access_token"; + + /** + * 设备在线状态 + */ + public static final String DEVICE_ONLINE_STATUS = "device_online_status:"; + + /** + * 设备离线计数 + */ + public static final String DEVICE_OFFLINE_INCREMENT = "device_offline_increment:"; + + /** + * 待插入的命令日志 + */ + public static final String INSERT_COMMAND_LOG = "insert_command_log"; } diff --git a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java index 44e80d83..fc2440b8 100644 --- a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java +++ b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java @@ -1,18 +1,17 @@ package com.ruoyi.common.core.redis; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.TimeUnit; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.BoundSetOperations; import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; +import org.springframework.data.redis.core.script.DefaultRedisScript; +import org.springframework.data.redis.core.script.RedisScript; import org.springframework.stereotype.Component; +import java.util.*; +import java.util.concurrent.TimeUnit; + /** * spring redis 工具类 * @@ -265,4 +264,76 @@ public class RedisCache { return redisTemplate.keys(pattern); } + + /** + * 累计缓存的值,并设置过期时间。每次累计时刷新过期时间。 + * + * @param key 缓存的键值 + * @param timeout 过期时间 + * @param timeUnit 时间单位 + * @return 累计后的值 + */ + public long incrementCacheValue(final String key, final long timeout, final TimeUnit timeUnit) { + // 使用 SET 命令的 NX 和 EX 选项确保初始值设置和过期时间设置是原子性的 + Boolean isNewKey = redisTemplate.opsForValue().setIfAbsent(key, 0, timeout, timeUnit); + if (isNewKey != null && isNewKey) { + // 如果 key 是新设置的,初始值为 0 + return 1L; + } + // 使用 INCR 命令累计值 + long newValue = redisTemplate.opsForValue().increment(key); + // 刷新过期时间 + redisTemplate.expire(key, timeout, timeUnit); + return newValue; + } + + /** + * 向缓存列表的右侧(尾部)添加数据 + * + * @param key 缓存的键值 + * @param value 要添加的数据 + * @return 添加后的列表长度 + */ + public long rightPush(final String key, final Object value) { + return redisTemplate.opsForList().rightPush(key, value); + } + + /** + * 向缓存列表的左侧(头部)添加数据 + * + * @param key 缓存的键值 + * @param value 要添加的数据 + * @return 添加后的列表长度 + */ + public long leftPush(final String key, final Object value) { + return redisTemplate.opsForList().leftPush(key, value); + } + + /** + * 清空缓存列表的数据 + * + * @param key 缓存的键值 + * @return 是否成功清空 + */ + public boolean clearCacheList(final String key) { + return redisTemplate.delete(key); + } + + + /** + * 获取并清空缓存列表的数据(原子性操作) + * + * @param key 缓存的键值 + * @return 缓存键值对应的数据列表 + */ + public List getAndClearCacheList(final String key) { + // 定义 Lua 脚本 + String scriptText = "local list = redis.call('LRANGE', KEYS[1], 0, -1) " + + "redis.call('DEL', KEYS[1]) " + + "return list"; + RedisScript> redisScript = new DefaultRedisScript<>(scriptText, (Class>) (Class) List.class); + + // 执行 Lua 脚本 + return (List) redisTemplate.execute(redisScript, Collections.singletonList(key)); + } } diff --git a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/core/redis/enums/RedisLockKey.java b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/core/redis/enums/RedisLockKey.java index 0827703c..b5d59418 100644 --- a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/core/redis/enums/RedisLockKey.java +++ b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/core/redis/enums/RedisLockKey.java @@ -27,7 +27,8 @@ public enum RedisLockKey { RECOVER_DEVICE_BALANCE("recover_device_balance", "恢复设备余额"), ADD_USER_WX_OPEN_ID("add_user_wx_open_id", "微信注册用户"), ADD_USER_MOBILE("add_user_mobile", "手机号注册用户"), - SUBMIT_RISK_INFO("submit_risk_info", "提交风控材料"); + SUBMIT_RISK_INFO("submit_risk_info", "提交风控材料"), + DEVICE_ONLINE_COMMAND("device_online_command", "设备在线发送命令"); private final String key; diff --git a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java index 59483c8b..6af8fe71 100644 --- a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java +++ b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java @@ -1,10 +1,14 @@ package com.ruoyi.common.utils.http; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.PrintWriter; +import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.net.ssl.*; +import javax.servlet.http.HttpServletRequest; +import java.io.*; import java.net.ConnectException; import java.net.SocketTimeoutException; import java.net.URL; @@ -14,19 +18,6 @@ import java.security.cert.X509Certificate; import java.util.HashMap; import java.util.Iterator; import java.util.Map; -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSession; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; -import javax.servlet.http.HttpServletRequest; - -import com.ruoyi.common.exception.ServiceException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.utils.StringUtils; /** * 通用http发送方法 @@ -311,8 +302,8 @@ public class HttpUtils StringBuilder result = new StringBuilder(); try { - log.info("sendPost - {}", url); - log.info("发送命令 - {}", param); +// log.info("sendPost - {}", url); +// log.info("发送命令 - {}", param); URL realUrl = new URL(url); URLConnection conn = realUrl.openConnection(); conn.setRequestProperty("accept", "*/*"); diff --git a/smart-switch-ruoyi/smart-switch-generator/src/main/resources/vm/xml/mapper.xml.vm b/smart-switch-ruoyi/smart-switch-generator/src/main/resources/vm/xml/mapper.xml.vm index 9fbe5567..dc668191 100644 --- a/smart-switch-ruoyi/smart-switch-generator/src/main/resources/vm/xml/mapper.xml.vm +++ b/smart-switch-ruoyi/smart-switch-generator/src/main/resources/vm/xml/mapper.xml.vm @@ -57,6 +57,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #end #end #end + ${query.params.dataScope}