From a11ee1d0cb49a05e531a99fdd65fc7d7ed71ba92 Mon Sep 17 00:00:00 2001 From: wangwei_123 <1255324804@qq.com> Date: Thu, 5 Mar 2026 13:23:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=8B=E6=8C=81=E8=A1=A8=E4=B8=8A=E6=8A=A5?= =?UTF-8?q?=E6=97=B6=E8=87=AA=E5=8A=A8=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../processor/BatchDeviceMessageProcessor.java | 79 ++++++++++++++++++++-- .../module/hand/service/HandDetectorService.java | 2 + .../hand/service/impl/AlarmRuleServiceImpl.java | 3 - .../hand/service/impl/HandDetectorServiceImpl.java | 8 +++ .../src/main/resources/mapper/TdengineMapper.xml | 2 +- .../src/main/resources/application-dev.yaml | 12 ++-- .../src/main/resources/application.yaml | 2 +- 7 files changed, 93 insertions(+), 15 deletions(-) diff --git a/cc-admin-master/yudao-module-hand-mqtt/src/main/java/cn/iocoder/yudao/module/mqtt/processor/BatchDeviceMessageProcessor.java b/cc-admin-master/yudao-module-hand-mqtt/src/main/java/cn/iocoder/yudao/module/mqtt/processor/BatchDeviceMessageProcessor.java index f5d30f2..08bb13e 100644 --- a/cc-admin-master/yudao-module-hand-mqtt/src/main/java/cn/iocoder/yudao/module/mqtt/processor/BatchDeviceMessageProcessor.java +++ b/cc-admin-master/yudao-module-hand-mqtt/src/main/java/cn/iocoder/yudao/module/mqtt/processor/BatchDeviceMessageProcessor.java @@ -53,7 +53,8 @@ public class BatchDeviceMessageProcessor { @Resource private FenceAlarmService fenceAlarmService; @Resource - private KafkaTemplate kafkaTemplate; + private KafkaTemplate kafkaTemplate; + private List> records; /** @@ -93,6 +94,7 @@ public class BatchDeviceMessageProcessor { } private BatchContext prepareBatchContext(List> records) { + this.records = records; BatchContext context = new BatchContext(); // 1. 提取所有有效的 SNs @@ -109,6 +111,76 @@ public class BatchDeviceMessageProcessor { // 2. 批量获取租户信息 context.snToTenantMap = getTenantIdsInBatch(sns); + // ======================= 新增:处理缺失租户/未注册设备的 SN ======================= + List missingSns = sns.stream() + .filter(sn -> !context.snToTenantMap.containsKey(sn)) + .toList(); + if (CollectionUtils.isNotEmpty(missingSns)) { + // 2.1 查库判断设备是否真的不存在(可能只是 Redis 中丢失了映射) + QueryWrapper query = new QueryWrapper<>(); + query.in("sn", missingSns); + List dbDetectors = handDetectorService.listAll(query); + + Set existingDbSns = new HashSet<>(); + for (HandDetectorDO dbDetector : dbDetectors) { + existingDbSns.add(dbDetector.getSn()); + if (dbDetector.getTenantId() != null) { + context.snToTenantMap.put(dbDetector.getSn(), Long.valueOf(dbDetector.getTenantId())); + // 顺便回填 Redis,防止下次继续穿透查库 + try { + redisUtil.hset(RedisKeyUtil.getDeviceTenantMappingKey(), dbDetector.getSn(), dbDetector.getTenantId()); + } catch (Exception e) { + log.warn("[准备数据] 回填 Redis 租户映射失败,SN: {}", dbDetector.getSn(), e); + } + } + } + + // 2.2 数据库中确实没有的,直接自动注册,默认租户为 1 + List trulyNewSns = missingSns.stream() + .filter(sn -> !existingDbSns.contains(sn)) + .toList(); + + if (CollectionUtils.isNotEmpty(trulyNewSns)) { + List newDetectors = new ArrayList<>(); + LocalDateTime now = LocalDateTime.now(); + for (String sn : trulyNewSns) { + HandDetectorDO newDetector = new HandDetectorDO(); + newDetector.setSn(sn); + newDetector.setTenantId(1); // 默认租户ID设为 1 + newDetector.setName(sn); // 默认使用 SN 作为名称 + newDetector.setEnableStatus(EnableStatus.ENABLED.value()); // 默认启用 + newDetector.setCreator("system"); + newDetector.setCreateTime(now); + newDetector.setGasTypeId(1L); + newDetector.setGasChemical("CO"); + newDetectors.add(newDetector); + + + } + + try { + // 保存到数据库。注意: 这里使用 save 单条保存,如果项目中存在 saveBatch(newDetectors) 则推荐替换成批量保存以提升性能。 + + handDetectorService.saveList(newDetectors); + log.info("[自动注册] 自动保存未知设备 {} 个,默认租户ID为 1", newDetectors.size()); + + // 将新注册的设备信息回填进上下文并更新 Redis,这样后续步骤就能流畅处理了 + for (HandDetectorDO nd : newDetectors) { + context.snToTenantMap.put(nd.getSn(), 1L); + try { + redisUtil.hset(RedisKeyUtil.getDeviceTenantMappingKey(), nd.getSn(), "1"); + } catch (Exception e) { + log.warn("[自动注册] 回填 Redis 租户映射失败,SN: {}", nd.getSn(), e); + } + } + } catch (Exception e) { + log.error("[自动注册] 自动注册新设备流程发生异常", e); + } + } + } + // ======================= 新增逻辑结束 ======================= + + // 3. 按租户分组 SN Map> tenantToSnsMap = sns.stream() .filter(context.snToTenantMap::containsKey) @@ -184,7 +256,7 @@ public class BatchDeviceMessageProcessor { processFenceAlarm(handVo, context); // 9. 保存处理后的数据日志 - context.processedLogs.add(createTdengineDataVo(handVo,tenantId)); + context.processedLogs.add(createTdengineDataVo(handVo, tenantId)); // 10. 记录需要更新到 Redis 的数据 context.redisUpdates.put(sn, handVo); @@ -862,7 +934,7 @@ public class BatchDeviceMessageProcessor { handVo.getSn(), handVo.getUserName(), msgContent - ); + ); // 使用 sourceSn 作为 Key,保证同一个部门/设备的报警排队有序处理 String key = handVo.getSn(); @@ -875,7 +947,6 @@ public class BatchDeviceMessageProcessor { } - /** * 批量更新 Redis */ diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/HandDetectorService.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/HandDetectorService.java index 4f8ac8d..8a224cf 100644 --- a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/HandDetectorService.java +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/HandDetectorService.java @@ -79,4 +79,6 @@ public interface HandDetectorService { void batchUpdateRedisData(Long tenantId, Map deviceMap); + void saveList(List newDetectors); + } \ No newline at end of file diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/AlarmRuleServiceImpl.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/AlarmRuleServiceImpl.java index 629a9e2..0dea7be 100644 --- a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/AlarmRuleServiceImpl.java +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/AlarmRuleServiceImpl.java @@ -47,9 +47,6 @@ import static cn.iocoder.yudao.module.hand.enums.ErrorCodeConstants.ALARM_RULE_N @Slf4j public class AlarmRuleServiceImpl implements AlarmRuleService { - // 定义一个常量来表示缓存清除的 SpEL 表达式,避免重复和拼写错误 - private static final String EVICT_CACHE_KEY_SPEL = - "'gas_rules_map:' + T(cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder).getTenantId()"; @Resource private AlarmRuleMapper alarmRuleMapper; @Resource diff --git a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/HandDetectorServiceImpl.java b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/HandDetectorServiceImpl.java index 8479829..9095cd3 100644 --- a/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/HandDetectorServiceImpl.java +++ b/cc-admin-master/yudao-module-hand/src/main/java/cn/iocoder/yudao/module/hand/service/impl/HandDetectorServiceImpl.java @@ -382,4 +382,12 @@ public class HandDetectorServiceImpl implements HandDetectorService { } } + @Override + @TenantIgnore + @Transactional(rollbackFor = Exception.class) + public void saveList(List newDetectors) { + + handDetectorMapper.insertBatch(newDetectors); + } + } \ No newline at end of file diff --git a/cc-admin-master/yudao-module-hand/src/main/resources/mapper/TdengineMapper.xml b/cc-admin-master/yudao-module-hand/src/main/resources/mapper/TdengineMapper.xml index c572c3e..f4ed2cb 100644 --- a/cc-admin-master/yudao-module-hand/src/main/resources/mapper/TdengineMapper.xml +++ b/cc-admin-master/yudao-module-hand/src/main/resources/mapper/TdengineMapper.xml @@ -46,7 +46,7 @@