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;