fix(ops): 同步区域设备关联配置至 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

- 修复管理后台更新、绑定、解绑设备关联配置时未清理缓存导致旧配置(如客流阈值)在24小时内依然生效的问题
- 采用 Cache-Aside 模式,在 DB 操作后主动逐出 (evictConfigCache) 对应区域的关联类型缓存,确保高可用和强一致性
- 补充 AreaDeviceService Mock,修复并更新对应单元测试
This commit is contained in:
lzh
2026-02-24 14:03:49 +08:00
parent 1a245f01ce
commit f17d5ef6b8
2 changed files with 51 additions and 33 deletions

View File

@@ -34,14 +34,17 @@ import static com.viewsh.module.ops.enums.AreaTypeEnum.*;
@Slf4j @Slf4j
public class AreaDeviceRelationServiceImpl implements AreaDeviceRelationService { public class AreaDeviceRelationServiceImpl implements AreaDeviceRelationService {
@Resource @Resource
private OpsAreaDeviceRelationMapper opsAreaDeviceRelationMapper; private OpsAreaDeviceRelationMapper opsAreaDeviceRelationMapper;
@Resource @Resource
private OpsBusAreaMapper opsBusAreaMapper; private OpsBusAreaMapper opsBusAreaMapper;
@Resource @Resource
private IotDeviceQueryApi iotDeviceQueryApi; private IotDeviceQueryApi iotDeviceQueryApi;
@Resource
private AreaDeviceService areaDeviceService;
private static final String TYPE_TRAFFIC_COUNTER = "TRAFFIC_COUNTER"; private static final String TYPE_TRAFFIC_COUNTER = "TRAFFIC_COUNTER";
private static final String TYPE_BEACON = "BEACON"; private static final String TYPE_BEACON = "BEACON";
@@ -114,9 +117,13 @@ public class AreaDeviceRelationServiceImpl implements AreaDeviceRelationService
.enabled(true) .enabled(true)
.build(); .build();
opsAreaDeviceRelationMapper.insert(relation); opsAreaDeviceRelationMapper.insert(relation);
return relation.getId();
} // 清除可能存在的 NULL_CACHE 标记
areaDeviceService.evictConfigCache(relation.getAreaId(), relation.getRelationType());
return relation.getId();
}
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@@ -134,24 +141,32 @@ public class AreaDeviceRelationServiceImpl implements AreaDeviceRelationService
relation.setConfigData(updateReq.getConfigData()); relation.setConfigData(updateReq.getConfigData());
} }
// enabled 更新 // enabled 更新
if (updateReq.getEnabled() != null) { if (updateReq.getEnabled() != null) {
relation.setEnabled(updateReq.getEnabled()); 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) {
@Override OpsAreaDeviceRelationDO existing = opsAreaDeviceRelationMapper.selectById(id);
@Transactional(rollbackFor = Exception.class) if (existing == null) {
public Boolean unbindDevice(Long id) { return false;
OpsAreaDeviceRelationDO existing = opsAreaDeviceRelationMapper.selectById(id); }
if (existing == null) {
return false; boolean deleted = opsAreaDeviceRelationMapper.deleteById(id) > 0;
} if (deleted) {
// 同步 Redis 缓存
return opsAreaDeviceRelationMapper.deleteById(id) > 0; areaDeviceService.evictConfigCache(existing.getAreaId(), existing.getRelationType());
} }
return deleted;
}
/** /**
* 转换为响应 VO * 转换为响应 VO

View File

@@ -43,11 +43,14 @@ class AreaDeviceRelationServiceTest {
@Mock @Mock
private OpsAreaDeviceRelationMapper opsAreaDeviceRelationMapper; private OpsAreaDeviceRelationMapper opsAreaDeviceRelationMapper;
@Mock @Mock
private OpsBusAreaMapper opsBusAreaMapper; private OpsBusAreaMapper opsBusAreaMapper;
@InjectMocks @Mock
private AreaDeviceRelationServiceImpl areaDeviceRelationService; private AreaDeviceService areaDeviceService;
@InjectMocks
private AreaDeviceRelationServiceImpl areaDeviceRelationService;
private OpsBusAreaDO testArea; private OpsBusAreaDO testArea;
private OpsAreaDeviceRelationDO testRelation; private OpsAreaDeviceRelationDO testRelation;