From ecb83531e88469dfcb58ec4b696683d96f53d968 Mon Sep 17 00:00:00 2001 From: lld <15027638633@163.com> Date: Tue, 24 Mar 2026 19:22:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9A=E6=97=B6=E6=B8=85=E7=90=86=EF=BC=8C?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=8C=96=E4=BF=AE=E6=94=B9=E3=80=81=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=8C=96=E8=AF=AF=E5=B7=AE=E4=B8=8A=E4=B8=8B=E6=B8=A9?= =?UTF-8?q?=E5=BA=A6=E6=94=B9=E4=B8=BA0.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/agri/common/utils/TempJudgeUtil.java | 2 +- .../com/agri/quartz/task/AgriStatusTask.java | 5 -- .../java/com/agri/quartz/task/AgriTask.java | 46 +++++-------------- .../com/agri/quartz/task/RollerAutoTask.java | 2 +- .../controller/SysAgriInfoController.java | 15 ++++++ 5 files changed, 28 insertions(+), 42 deletions(-) diff --git a/agri-common/src/main/java/com/agri/common/utils/TempJudgeUtil.java b/agri-common/src/main/java/com/agri/common/utils/TempJudgeUtil.java index ec0bc00..07f4324 100644 --- a/agri-common/src/main/java/com/agri/common/utils/TempJudgeUtil.java +++ b/agri-common/src/main/java/com/agri/common/utils/TempJudgeUtil.java @@ -9,7 +9,7 @@ import java.math.BigDecimal; */ public class TempJudgeUtil { // 条件参考温度允许的上下误差(抽成常量,后续可配置化) - public static final BigDecimal TEMP_ERROR_RANGE = java.math.BigDecimal.ONE; + public static final BigDecimal TEMP_ERROR_RANGE = BigDecimal.valueOf(0.5); /** * 温度判断核心方法:根据当前温度与参考温度的差值,返回指令状态 diff --git a/agri-quartz/src/main/java/com/agri/quartz/task/AgriStatusTask.java b/agri-quartz/src/main/java/com/agri/quartz/task/AgriStatusTask.java index 3139dd9..5367ea9 100644 --- a/agri-quartz/src/main/java/com/agri/quartz/task/AgriStatusTask.java +++ b/agri-quartz/src/main/java/com/agri/quartz/task/AgriStatusTask.java @@ -82,7 +82,6 @@ public class AgriStatusTask { log.info("大棚表无数据,结束推送"); return; } - log.info("从大棚表获取到合法IMEI总数:{}", imeiList.size()); // 3. 批量查询设备在线状态(Redis Pipeline,一次网络往返) agriStatusManager.asyncBatchPushMqtt(agriStatusManager.batchCheckDeviceOnline(imeiList)); @@ -93,7 +92,6 @@ public class AgriStatusTask { } finally { // 释放锁(可选,也可依赖TTL自动过期) stringRedisTemplate.delete(LOCK_KEY); - log.info("设备在线状态推送任务完成,耗时:{}ms", System.currentTimeMillis() - startTime); } } @@ -148,9 +146,6 @@ public class AgriStatusTask { } } - log.info("Lua查询完成:合法IMEI数={},在线数={}", - allGreenhouseImeiList.size(), - onlineStatusMap.values().stream().filter(Boolean::booleanValue).count()); return onlineStatusMap; } catch (Exception e) { log.error("Lua脚本执行失败", e); diff --git a/agri-quartz/src/main/java/com/agri/quartz/task/AgriTask.java b/agri-quartz/src/main/java/com/agri/quartz/task/AgriTask.java index a67a6d1..ab0c2f2 100644 --- a/agri-quartz/src/main/java/com/agri/quartz/task/AgriTask.java +++ b/agri-quartz/src/main/java/com/agri/quartz/task/AgriTask.java @@ -1,71 +1,50 @@ package com.agri.quartz.task; +import com.agri.common.utils.spring.SpringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; import org.springframework.data.redis.core.Cursor; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ScanOptions; import org.springframework.stereotype.Component; -import javax.annotation.Resource; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; -/** - * JDK 8 适配版 Redis 缓存清理任务 - * 解决:1. RedisTemplate 多实例冲突 2. Cursor 类型不匹配 3. 空指针问题 - * 功能:批量删除 Redis 中 sub: 开头的键 - */ @Component("agriTask") public class AgriTask { - // 核心修复:指定注入的 Bean 名称为 "redisTemplate"(匹配自定义配置的 Bean) - @Autowired - private RedisTemplate redisTemplate; - private static final Logger log = LoggerFactory.getLogger(AgriTask.class); - /** - * 每日零点执行:清理 sub: 开头的 Redis 键 - */ public void clearInvalidCache() { - log.info("===== 开始执行Redis sub: 键清理任务 ====="); + log.info("=============【定时任务】开始执行Redis sub: 键清理任务============="); int deletedCount = 0; - // 兜底获取 RedisTemplate(指定 Bean 名称,解决多实例冲突) - if (redisTemplate == null) { - log.error("RedisTemplate 初始化失败,清理任务终止"); - return; - } - try { - // 配置 SCAN 参数:匹配 sub:*,分批遍历(每次1000条) + // 重点***** + RedisTemplate redisTemplate = SpringUtils.getBean("redisTemplate"); + if (redisTemplate == null) { + log.error("RedisTemplate 获取失败,清理任务终止"); + return; + } + ScanOptions scanOptions = ScanOptions.scanOptions() .match("sub:*") .count(1000) .build(); - // 接收 Cursor 类型(JDK 8 下原生返回类型) Cursor cursor = redisTemplate.executeWithStickyConnection(connection -> connection.scan(scanOptions) ); - // 批量删除缓冲区(存储 String 类型键) List batchKeys = new ArrayList<>(1000); - // 遍历字节数组类型的键,转换为 String while (cursor != null && cursor.hasNext()) { byte[] keyBytes = cursor.next(); - // 转换 byte[] -> String(UTF-8 编码,避免乱码) String key = new String(keyBytes, StandardCharsets.UTF_8); batchKeys.add(key); - // 每攒1000个键批量删除 if (batchKeys.size() >= 1000) { deletedCount += batchKeys.size(); redisTemplate.delete(batchKeys); @@ -74,14 +53,12 @@ public class AgriTask { } } - // 删除剩余的键 if (!batchKeys.isEmpty()) { deletedCount += batchKeys.size(); redisTemplate.delete(batchKeys); log.info("批量删除剩余 {} 个sub: 键", batchKeys.size()); } - // 关闭游标(避免资源泄漏) if (cursor != null) { try { cursor.close(); @@ -90,11 +67,10 @@ public class AgriTask { } } - log.info("===== Redis sub: 键清理完成,总计删除 {} 个键 =====", deletedCount); + log.info("=============【定时任务】Redis sub: 键清理完成,总计删除 {} 个键=============", deletedCount); } catch (Exception e) { - log.error("Redis sub: 键清理失败", e); + log.error("=============【定时任务】Redis sub: 键清理失败=============", e); } } - } \ No newline at end of file diff --git a/agri-quartz/src/main/java/com/agri/quartz/task/RollerAutoTask.java b/agri-quartz/src/main/java/com/agri/quartz/task/RollerAutoTask.java index c2dedf2..33d68c6 100644 --- a/agri-quartz/src/main/java/com/agri/quartz/task/RollerAutoTask.java +++ b/agri-quartz/src/main/java/com/agri/quartz/task/RollerAutoTask.java @@ -370,7 +370,7 @@ public class RollerAutoTask { // ========== 4. 计算运行时间并调度自动关 ========== int runTime = RollerTimeCalculator.calculateRunTime(len); if (runTime > 0) { - String autoOffKey = roller + (isOpen ? "k" : "g"); + String autoOffKey = roller + (isOpen ? "k1" : "g1"); autoOffManager.scheduleAutoOff(imei, autoOffKey, runTime); log.debug("【自动关调度】设备{}卷膜「{}:{}」调度{}秒后自动关闭", imei, roller,(isOpen?"开":"关"), runTime); } diff --git a/agri-system/src/main/java/com/agri/system/controller/SysAgriInfoController.java b/agri-system/src/main/java/com/agri/system/controller/SysAgriInfoController.java index 9e13787..6c9818a 100644 --- a/agri-system/src/main/java/com/agri/system/controller/SysAgriInfoController.java +++ b/agri-system/src/main/java/com/agri/system/controller/SysAgriInfoController.java @@ -142,4 +142,19 @@ public class SysAgriInfoController extends BaseController .update(); return success(); } + + /** + * 修改大棚名称 + */ + @PreAuthorize("@ss.hasPermi('assets:agri:edit')") + @Log(title = "大棚管理", businessType = BusinessType.UPDATE) + @PutMapping("/renameAgriName") + public AjaxResult renameAgriName(@RequestParam("imei") String imei, @RequestParam("newAgriName") String newAgriName) + { + boolean update = sysAgriInfoService.lambdaUpdate() + .eq(SysAgriInfo::getImei, imei) + .set(SysAgriInfo::getAgriName, newAgriName) + .update(); + return update? success():error(); + } }