From f17d5ef6b841b1ea7ff408cb853ffa17dac711e5 Mon Sep 17 00:00:00 2001 From: lzh Date: Tue, 24 Feb 2026 14:03:49 +0800 Subject: [PATCH] =?UTF-8?q?fix(ops):=20=E5=90=8C=E6=AD=A5=E5=8C=BA?= =?UTF-8?q?=E5=9F=9F=E8=AE=BE=E5=A4=87=E5=85=B3=E8=81=94=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E8=87=B3=20Redis=20=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复管理后台更新、绑定、解绑设备关联配置时未清理缓存导致旧配置(如客流阈值)在24小时内依然生效的问题 - 采用 Cache-Aside 模式,在 DB 操作后主动逐出 (evictConfigCache) 对应区域的关联类型缓存,确保高可用和强一致性 - 补充 AreaDeviceService Mock,修复并更新对应单元测试 --- .../area/AreaDeviceRelationServiceImpl.java | 71 +++++++++++-------- .../area/AreaDeviceRelationServiceTest.java | 13 ++-- 2 files changed, 51 insertions(+), 33 deletions(-) diff --git a/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/area/AreaDeviceRelationServiceImpl.java b/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/area/AreaDeviceRelationServiceImpl.java index 7c12bbc..04a1238 100644 --- a/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/area/AreaDeviceRelationServiceImpl.java +++ b/viewsh-module-ops/viewsh-module-ops-biz/src/main/java/com/viewsh/module/ops/service/area/AreaDeviceRelationServiceImpl.java @@ -34,14 +34,17 @@ import static com.viewsh.module.ops.enums.AreaTypeEnum.*; @Slf4j public class AreaDeviceRelationServiceImpl implements AreaDeviceRelationService { - @Resource - private OpsAreaDeviceRelationMapper opsAreaDeviceRelationMapper; - - @Resource - private OpsBusAreaMapper opsBusAreaMapper; - - @Resource - private IotDeviceQueryApi iotDeviceQueryApi; + @Resource + private OpsAreaDeviceRelationMapper opsAreaDeviceRelationMapper; + + @Resource + private OpsBusAreaMapper opsBusAreaMapper; + + @Resource + private IotDeviceQueryApi iotDeviceQueryApi; + + @Resource + private AreaDeviceService areaDeviceService; private static final String TYPE_TRAFFIC_COUNTER = "TRAFFIC_COUNTER"; private static final String TYPE_BEACON = "BEACON"; @@ -114,9 +117,13 @@ public class AreaDeviceRelationServiceImpl implements AreaDeviceRelationService .enabled(true) .build(); - opsAreaDeviceRelationMapper.insert(relation); - return relation.getId(); - } + opsAreaDeviceRelationMapper.insert(relation); + + // 清除可能存在的 NULL_CACHE 标记 + areaDeviceService.evictConfigCache(relation.getAreaId(), relation.getRelationType()); + + return relation.getId(); + } @Override @Transactional(rollbackFor = Exception.class) @@ -134,24 +141,32 @@ public class AreaDeviceRelationServiceImpl implements AreaDeviceRelationService relation.setConfigData(updateReq.getConfigData()); } - // enabled 更新 - if (updateReq.getEnabled() != null) { - relation.setEnabled(updateReq.getEnabled()); - } + // enabled 更新 + if (updateReq.getEnabled() != null) { + relation.setEnabled(updateReq.getEnabled()); + } + + opsAreaDeviceRelationMapper.updateById(relation); + + // 删缓存以同步 Redis + areaDeviceService.evictConfigCache(existing.getAreaId(), existing.getRelationType()); + } - opsAreaDeviceRelationMapper.updateById(relation); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public Boolean unbindDevice(Long id) { - OpsAreaDeviceRelationDO existing = opsAreaDeviceRelationMapper.selectById(id); - if (existing == null) { - return false; - } - - return opsAreaDeviceRelationMapper.deleteById(id) > 0; - } + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean unbindDevice(Long id) { + OpsAreaDeviceRelationDO existing = opsAreaDeviceRelationMapper.selectById(id); + if (existing == null) { + return false; + } + + boolean deleted = opsAreaDeviceRelationMapper.deleteById(id) > 0; + if (deleted) { + // 同步 Redis 缓存 + areaDeviceService.evictConfigCache(existing.getAreaId(), existing.getRelationType()); + } + return deleted; + } /** * 转换为响应 VO diff --git a/viewsh-module-ops/viewsh-module-ops-biz/src/test/java/com/viewsh/module/ops/service/area/AreaDeviceRelationServiceTest.java b/viewsh-module-ops/viewsh-module-ops-biz/src/test/java/com/viewsh/module/ops/service/area/AreaDeviceRelationServiceTest.java index f1ce657..a086ad4 100644 --- a/viewsh-module-ops/viewsh-module-ops-biz/src/test/java/com/viewsh/module/ops/service/area/AreaDeviceRelationServiceTest.java +++ b/viewsh-module-ops/viewsh-module-ops-biz/src/test/java/com/viewsh/module/ops/service/area/AreaDeviceRelationServiceTest.java @@ -43,11 +43,14 @@ class AreaDeviceRelationServiceTest { @Mock private OpsAreaDeviceRelationMapper opsAreaDeviceRelationMapper; - @Mock - private OpsBusAreaMapper opsBusAreaMapper; - - @InjectMocks - private AreaDeviceRelationServiceImpl areaDeviceRelationService; + @Mock + private OpsBusAreaMapper opsBusAreaMapper; + + @Mock + private AreaDeviceService areaDeviceService; + + @InjectMocks + private AreaDeviceRelationServiceImpl areaDeviceRelationService; private OpsBusAreaDO testArea; private OpsAreaDeviceRelationDO testRelation;