feat(client): 家属端设备列表返回在线状态与最后心跳时间

- 批量查询 Redis 心跳状态,避免逐台查询
- 修正心跳时间 Redis 序列化格式,防止读取时解析失败导致状态恒为离线
This commit is contained in:
tongtong committed 2026-11-07 11:21:49 +08:00
1 parent 0f99abb876
commit 3f2b07ddd0
4 files changed
+68

No files matched your search

@@ -0,0 +1,45 @@
package com.youlai.boot.device;
import com.youlai.boot.config.JacksonConfig;
import com.youlai.boot.device.model.vo.DeviceOnlineVO;
import org.junit.jupiter.api.Test;
import org.springframework.data.redis.serializer.JacksonJsonRedisSerializer;
import tools.jackson.databind.cfg.DateTimeFeature;
import tools.jackson.databind.json.JsonMapper;
import java.time.LocalDateTime;
import static org.junit.jupiter.api.Assertions.assertEquals;
/**
* 设备在线状态在 Redis 写入与全局 ObjectMapper 读取之间的格式一致性校验
* <p>
* RedisConfig 的序列化器与 JacksonConfig 的全局时间格式不一致时,
* convertValue 会抛 DateTimeParseException,导致在线状态永远读成离线。
*/
class DeviceOnlineRedisRoundTripTest {
@Test
void redisValueCanBeConvertedByGlobalObjectMapper() {
JsonMapper redisMapper = JsonMapper.builder()
.disable(DateTimeFeature.WRITE_DATES_AS_TIMESTAMPS)
.build();
JacksonJsonRedisSerializer<Object> serializer = new JacksonJsonRedisSerializer<>(redisMapper, Object.class);
LocalDateTime heartbeat = LocalDateTime.of(2026, 11, 7, 10, 37, 22);
DeviceOnlineVO vo = new DeviceOnlineVO();
vo.setSerialno("895Y044WC");
vo.setOnline(1);
vo.setIp("192.168.100.141");
vo.setScreenState(0);
vo.setLastHeartbeatTime(heartbeat);
Object cached = serializer.deserialize(serializer.serialize(vo));
DeviceOnlineVO converted = new JacksonConfig().objectMapper().convertValue(cached, DeviceOnlineVO.class);
assertEquals("895Y044WC", converted.getSerialno());
assertEquals(1, converted.getOnline());
assertEquals(heartbeat, converted.getLastHeartbeatTime());
}
}