diff --git a/viewsh-module-iot/viewsh-module-iot-server/src/main/java/com/viewsh/module/iot/service/integration/clean/CleanOrderIntegrationConfigServiceImpl.java b/viewsh-module-iot/viewsh-module-iot-server/src/main/java/com/viewsh/module/iot/service/integration/clean/CleanOrderIntegrationConfigServiceImpl.java index 81db962..05935cf 100644 --- a/viewsh-module-iot/viewsh-module-iot-server/src/main/java/com/viewsh/module/iot/service/integration/clean/CleanOrderIntegrationConfigServiceImpl.java +++ b/viewsh-module-iot/viewsh-module-iot-server/src/main/java/com/viewsh/module/iot/service/integration/clean/CleanOrderIntegrationConfigServiceImpl.java @@ -112,17 +112,43 @@ public class CleanOrderIntegrationConfigServiceImpl implements CleanOrderIntegra // 2. 缓存未命中,调用 Ops 模块 CommonResult> result = areaDeviceApi.getDevicesByAreaAndType(areaId, relationType); - if (result == null || !result.isSuccess() || result.getData() == null) { - log.warn("[CleanOrderConfig] 调用 Ops 模块获取区域配置失败:areaId={}, relationType={}", areaId, relationType); + if (result == null || !result.isSuccess() || result.getData() == null || result.getData().isEmpty()) { + log.warn("[CleanOrderConfig] 调用 Ops 模块获取区域配置为空或失败:areaId={}, relationType={}", areaId, relationType); + // 写入防缓存穿透标记 (1分钟) + try { + stringRedisTemplate.opsForValue().set(cacheKey, NULL_CACHE, 1, TimeUnit.MINUTES); + } catch (Exception e) { + log.warn("[CleanOrderConfig] 写入防击穿缓存失败:areaId={}, relationType={}", areaId, relationType, e); + } return null; } - // 返回第一个启用的配置 - return result.getData().stream() + // 3. 返回第一个启用的配置,并主动写入缓存 (模拟 Ops 端的缓存策略,24小时) + AreaDeviceDTO validDto = result.getData().stream() .filter(dto -> dto.getEnabled() != null && dto.getEnabled()) .findFirst() - .map(this::wrapDto) .orElse(null); + + if (validDto != null) { + try { + stringRedisTemplate.opsForValue().set( + cacheKey, + JsonUtils.toJsonString(validDto), + 24, + TimeUnit.HOURS); + } catch (Exception e) { + log.warn("[CleanOrderConfig] 写入区域配置缓存失败:areaId={}, relationType={}", areaId, relationType, e); + } + return wrapDto(validDto); + } else { + // 没有找到启用的配置,写入 NULL_CACHE + try { + stringRedisTemplate.opsForValue().set(cacheKey, NULL_CACHE, 1, TimeUnit.MINUTES); + } catch (Exception e) { + log.warn("[CleanOrderConfig] 写入防击穿缓存失败:areaId={}, relationType={}", areaId, relationType, e); + } + return null; + } } @Override