fix(iot): 修复客流阈值触发时 IoT 模块未将区域配置回写至 Redis 缓存的问题
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled

This commit is contained in:
lzh
2026-02-24 18:01:39 +08:00
parent d85de5eeaa
commit 3e54094c3d

View File

@@ -112,17 +112,43 @@ public class CleanOrderIntegrationConfigServiceImpl implements CleanOrderIntegra
// 2. 缓存未命中,调用 Ops 模块
CommonResult<List<AreaDeviceDTO>> 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