From 780a4456e51772ab25dff999521b49ab4ae717db Mon Sep 17 00:00:00 2001 From: lld <15027638633@163.com> Date: Tue, 31 Mar 2026 20:45:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=9E=E6=89=A7=E5=85=A8=E9=83=A8=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../interceptor/DeviceAckHandler.java | 119 ++++++++++-------- 1 file changed, 64 insertions(+), 55 deletions(-) diff --git a/agri-framework/src/main/java/com/agri/framework/interceptor/DeviceAckHandler.java b/agri-framework/src/main/java/com/agri/framework/interceptor/DeviceAckHandler.java index 688d45c..93c2263 100644 --- a/agri-framework/src/main/java/com/agri/framework/interceptor/DeviceAckHandler.java +++ b/agri-framework/src/main/java/com/agri/framework/interceptor/DeviceAckHandler.java @@ -72,68 +72,77 @@ public class DeviceAckHandler { } public void isStartAutoOffTask(JSONObject payloadObj, String deviceId, String payload) { - // 第二步:判断是否为设备回执({"suc":true/false,"prop":{"功能码":指令}}) - String funcType = null; - Integer funcValue = null; - // 新增:标记是否需要执行自动关任务(全局可用) - // 第二步:设备回执处理逻辑(完全移除Redis写入) if (payloadObj.containsKey("suc") && payloadObj.containsKey("prop")) { JSONObject propObj = payloadObj.getJSONObject("prop"); if (propObj != null && !propObj.isEmpty()) { - // 提取prop中的第一个功能码 - Map.Entry propEntry = propObj.entrySet().iterator().next(); - funcType = propEntry.getKey(); - try { - funcValue = Integer.parseInt(String.valueOf(propEntry.getValue())); - } catch (Exception ignore) { + boolean suc = payloadObj.getBooleanValue("suc"); + + for (Map.Entry propEntry : propObj.entrySet()) { + String funcType = propEntry.getKey(); + Integer funcValue = parseFuncValue(propEntry.getValue()); + + processAck(deviceId, funcType, funcValue, suc); } - // 释放对应功能的分布式锁 - String lockKey = "lock:" + deviceId + ":" + funcType; - Boolean delete = stringRedisTemplate.delete(lockKey); if (propObj.size() > 1) { - log.warn("【设备回执】prop包含多个功能码,仅处理第一个:{}, {}", propObj,payload); + log.info("【设备回执】设备{}的{}个功能已处理", deviceId, propObj.size()); } - log.info("【设备回执】设备{}的{}功能执行完成,已释放锁:{},{}", deviceId, funcType, lockKey, delete); - int runTime = 0; - // 回执成功且值=1时启动自动关闭任务(保留原有逻辑) - boolean suc = payloadObj.getBooleanValue("suc"); - if (suc && StringUtils.hasText(funcType) && funcValue != null && funcValue == 1) { - SysAgriLimit agriLimit = agriLimitService.lambdaQuery() - .eq(SysAgriLimit::getImei, deviceId) - .one(); - int autoOffSeconds = 0; - if (agriLimit != null) { - autoOffSeconds = LIMIT_MAP.getOrDefault(funcType, k -> 0).apply(agriLimit); - } - runTime = autoOffSeconds; - // 新增:判断是否真的需要执行自动关任务(延迟秒数>0才是有效任务) - if (autoOffSeconds > 0) { - mqttAutoOffManager.scheduleAutoOff(deviceId, funcType, autoOffSeconds); - log.debug("【自动关任务】标记需要执行,deviceId={}, funcType={}, delay={}s", deviceId, funcType, autoOffSeconds); - } - } - if (suc && StringUtils.hasText(funcType) && funcValue != null && funcValue == 0) { - mqttAutoOffManager.cancelAutoOff(deviceId, funcType); - } - boolean isTask = (Objects.equals(funcValue, 1)) && (runTime > 0); - sysDevOperLogService.lambdaUpdate() - .eq(SysDevOperLog::getImei, deviceId) - .eq(SysDevOperLog::getFuncCode, funcType) - .eq(SysDevOperLog::getOpType, funcValue) - .eq(SysDevOperLog::getLockAcquired,1) - .orderByDesc(SysDevOperLog::getCreateTime) - .last("LIMIT 1") - .set(SysDevOperLog::getAckReceived,1) - .set(SysDevOperLog::getAckSuc, suc?1:0) - .set(SysDevOperLog::getIsLockSuc,delete?1:0) - .set(SysDevOperLog::getIsTask,isTask?1:0) - .set(isTask,SysDevOperLog::getRunTime, runTime) - .set(isTask,SysDevOperLog::getNoTaskReason,runTime > 0?null:"【自动关任务】标记不符合执行运行时间未配置,当前运行时间:【"+runTime+" s】") - .set(SysDevOperLog::getUpdateBy,"设备回执") - .set(SysDevOperLog::getAck, payload) - .update(); } } } -} + + private void processAck(String deviceId, String funcType, Integer funcValue, boolean suc) { + String lockKey = "lock:" + deviceId + ":" + funcType; + Boolean delete = stringRedisTemplate.delete(lockKey); + log.info("【设备回执】设备{}的{}功能执行完成,已释放锁:{},{}", deviceId, funcType, lockKey, delete); + + int runTime = 0; + if (suc && StringUtils.hasText(funcType) && funcValue != null && funcValue == 1) { + SysAgriLimit agriLimit = agriLimitService.lambdaQuery() + .eq(SysAgriLimit::getImei, deviceId) + .one(); + if (agriLimit != null) { + int autoOffSeconds = LIMIT_MAP.getOrDefault(funcType, k -> 0).apply(agriLimit); + runTime = autoOffSeconds; + if (autoOffSeconds > 0) { + mqttAutoOffManager.scheduleAutoOff(deviceId, funcType, autoOffSeconds); + log.debug("【自动关任务】标记需要执行,deviceId={}, funcType={}, delay={}s", deviceId, funcType, autoOffSeconds); + } + } + } + + if (suc && StringUtils.hasText(funcType) && funcValue != null && funcValue == 0) { + mqttAutoOffManager.cancelAutoOff(deviceId, funcType); + } + + boolean isTask = (Objects.equals(funcValue, 1)) && (runTime > 0); + sysDevOperLogService.lambdaUpdate() + .eq(SysDevOperLog::getImei, deviceId) + .eq(SysDevOperLog::getFuncCode, funcType) + .eq(SysDevOperLog::getOpType, funcValue) + .eq(SysDevOperLog::getLockAcquired, 1) + .orderByDesc(SysDevOperLog::getCreateTime) + .last("LIMIT 1") + .set(SysDevOperLog::getAckReceived, 1) + .set(SysDevOperLog::getAckSuc, suc ? 1 : 0) + .set(SysDevOperLog::getIsLockSuc, delete ? 1 : 0) + .set(SysDevOperLog::getIsTask, isTask ? 1 : 0) + .set(isTask, SysDevOperLog::getRunTime, runTime) + .set(isTask, SysDevOperLog::getNoTaskReason, runTime > 0 ? null : "【自动关任务】标记不符合执行运行时间未配置,当前运行时间:【" + runTime + " s】") + .set(SysDevOperLog::getUpdateBy, "设备回执") + .set(SysDevOperLog::getAck, "{funcType:" + funcType + ", value:" + funcValue + "}") + .update(); + } + + private Integer parseFuncValue(Object value) { + if (value == null) { + return null; + } + try { + return Integer.parseInt(String.valueOf(value)); + } catch (NumberFormatException e) { + return null; + } + } + +} \ No newline at end of file