From 0bcf2aaccfa4aad047b65dba07f1bf753520cbcf Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Mon, 1 Sep 2025 23:14:45 +0800 Subject: [PATCH] =?UTF-8?q?refactor(device):=20=E9=87=8D=E6=9E=84=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E4=BF=A1=E6=81=AF=E8=8E=B7=E5=8F=96=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0=E7=BC=93=E5=AD=98=E9=99=8D=E7=BA=A7?= =?UTF-8?q?=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 DeviceV2DTO 转换为 DeviceEntity 的方法 - 引入成功结果缓存,用于失败时降级 - 优化 getDevice 和 getDeviceByDeviceNo 方法,增加异常处理和缓存逻辑 - 清理缓存时增加成功结果缓存的清理 --- .../basic/repository/DeviceRepository.java | 99 +++++++++++++++---- 1 file changed, 79 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/ycwl/basic/repository/DeviceRepository.java b/src/main/java/com/ycwl/basic/repository/DeviceRepository.java index 210af67..77d9121 100644 --- a/src/main/java/com/ycwl/basic/repository/DeviceRepository.java +++ b/src/main/java/com/ycwl/basic/repository/DeviceRepository.java @@ -5,52 +5,107 @@ import com.ycwl.basic.mapper.DeviceMapper; import com.ycwl.basic.model.pc.device.entity.DeviceConfigEntity; import com.ycwl.basic.model.pc.device.entity.DeviceEntity; import com.ycwl.basic.utils.SnowFlakeUtil; +import com.ycwl.basic.integration.device.service.DeviceIntegrationService; +import com.ycwl.basic.integration.device.dto.device.DeviceV2DTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; +import lombok.extern.slf4j.Slf4j; +import java.time.ZoneId; import java.util.Date; import java.util.List; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; +@Slf4j @Component public class DeviceRepository { @Autowired private DeviceMapper deviceMapper; @Autowired private RedisTemplate redisTemplate; + @Autowired + private DeviceIntegrationService deviceIntegrationService; public static final String DEVICE_ONLINE_CACHE_KEY = "device:online_status:%s"; public static final String DEVICE_CACHE_KEY = "device:%s"; public static final String DEVICE_CONFIG_CACHE_KEY = "device:%s:config"; + public static final String DEVICE_CACHE_SUCCESS_KEY = "device:success:%s"; + public static final String DEVICE_NO_CACHE_SUCCESS_KEY = "device:success:no:%s"; + + /** + * 将DeviceV2DTO转换为DeviceEntity + */ + private DeviceEntity convertToEntity(DeviceV2DTO dto) { + if (dto == null) { + return null; + } + DeviceEntity entity = new DeviceEntity(); + entity.setId(dto.getId()); + entity.setName(dto.getName()); + entity.setNo(dto.getNo()); + entity.setScenicId(dto.getScenicId()); + // DeviceV2DTO中的isActive对应DeviceEntity中的status + entity.setStatus(dto.getIsActive()); + // 转换时间格式:LocalDateTime -> Date + if (dto.getCreateTime() != null) { + entity.setCreateAt(Date.from(dto.getCreateTime().atZone(ZoneId.systemDefault()).toInstant())); + } + if (dto.getUpdateTime() != null) { + entity.setUpdateAt(Date.from(dto.getUpdateTime().atZone(ZoneId.systemDefault()).toInstant())); + } + return entity; + } public DeviceEntity getDevice(Long deviceId) { - if (redisTemplate.hasKey(String.format(DEVICE_CACHE_KEY, deviceId))) { - return JacksonUtil.parseObject(redisTemplate.opsForValue().get(String.format(DEVICE_CACHE_KEY, deviceId)), DeviceEntity.class); + log.debug("获取设备信息, deviceId: {}", deviceId); + try { + DeviceV2DTO deviceDto = deviceIntegrationService.getDevice(deviceId); + DeviceEntity device = convertToEntity(deviceDto); + if (device != null) { + // 存储到常规缓存 + redisTemplate.opsForValue().set(String.format(DEVICE_CACHE_KEY, deviceId), JacksonUtil.toJSONString(device), 3, TimeUnit.DAYS); + // 存储到成功结果缓存,用于失败时降级 + redisTemplate.opsForValue().set(String.format(DEVICE_CACHE_SUCCESS_KEY, deviceId), JacksonUtil.toJSONString(device), 7, TimeUnit.DAYS); + } + return device; + } catch (Exception e) { + log.warn("调用zt-device服务失败, deviceId: {}, 尝试返回缓存结果", deviceId, e); + String cachedDevice = redisTemplate.opsForValue().get(String.format(DEVICE_CACHE_SUCCESS_KEY, deviceId)); + if (cachedDevice != null) { + log.info("返回缓存的设备信息, deviceId: {}", deviceId); + return JacksonUtil.parseObject(cachedDevice, DeviceEntity.class); + } + log.error("无法获取设备信息且无缓存数据, deviceId: {}", deviceId); + throw e; } - DeviceEntity device = deviceMapper.getByDeviceId(deviceId); - if (null != device) { - redisTemplate.opsForValue().set(String.format(DEVICE_CACHE_KEY, deviceId), JacksonUtil.toJSONString(device), 3, TimeUnit.DAYS); - } - return device; } public DeviceEntity getDeviceByDeviceNo(String deviceNo) { - if (redisTemplate.hasKey(String.format(DEVICE_CACHE_KEY, deviceNo))) { - return JacksonUtil.parseObject(redisTemplate.opsForValue().get(String.format(DEVICE_CACHE_KEY, deviceNo)), DeviceEntity.class); + log.debug("根据设备编号获取设备信息, deviceNo: {}", deviceNo); + try { + DeviceV2DTO deviceDto = deviceIntegrationService.getDeviceByNo(deviceNo); + DeviceEntity device = convertToEntity(deviceDto); + if (device != null) { + // 存储到常规缓存 + redisTemplate.opsForValue().set(String.format(DEVICE_CACHE_KEY, deviceNo), JacksonUtil.toJSONString(device), 3, TimeUnit.DAYS); + redisTemplate.opsForValue().set(String.format(DEVICE_CACHE_KEY, device.getId()), JacksonUtil.toJSONString(device), 3, TimeUnit.DAYS); + // 存储到成功结果缓存,用于失败时降级 + redisTemplate.opsForValue().set(String.format(DEVICE_NO_CACHE_SUCCESS_KEY, deviceNo), JacksonUtil.toJSONString(device), 7, TimeUnit.DAYS); + redisTemplate.opsForValue().set(String.format(DEVICE_CACHE_SUCCESS_KEY, device.getId()), JacksonUtil.toJSONString(device), 7, TimeUnit.DAYS); + } + return device; + } catch (Exception e) { + log.warn("调用zt-device服务失败, deviceNo: {}, 尝试返回缓存结果", deviceNo, e); + String cachedDevice = redisTemplate.opsForValue().get(String.format(DEVICE_NO_CACHE_SUCCESS_KEY, deviceNo)); + if (cachedDevice != null) { + log.info("返回缓存的设备信息, deviceNo: {}", deviceNo); + return JacksonUtil.parseObject(cachedDevice, DeviceEntity.class); + } + log.error("无法获取设备信息且无缓存数据, deviceNo: {}", deviceNo); + throw e; } - DeviceEntity device = deviceMapper.getByDeviceNo(deviceNo); - if (null == device) { - device = deviceMapper.getByDeviceNo2(deviceNo); - } - if (null != device) { - redisTemplate.opsForValue().set(String.format(DEVICE_CACHE_KEY, deviceNo), JacksonUtil.toJSONString(device), 3, TimeUnit.DAYS); - redisTemplate.opsForValue().set(String.format(DEVICE_CACHE_KEY, device.getId()), JacksonUtil.toJSONString(device), 3, TimeUnit.DAYS); - } else { - redisTemplate.opsForValue().set(String.format(DEVICE_CACHE_KEY, deviceNo), "null", 60L, TimeUnit.SECONDS); - } - return device; } public DeviceConfigEntity getDeviceConfig(Long deviceId) { @@ -82,6 +137,8 @@ public class DeviceRepository { } } redisTemplate.delete(String.format(DEVICE_CACHE_KEY, deviceNo)); + // 清理成功结果缓存 + redisTemplate.delete(String.format(DEVICE_NO_CACHE_SUCCESS_KEY, deviceNo)); return true; } public boolean clearDeviceCache(Long deviceId) { @@ -92,6 +149,8 @@ public class DeviceRepository { } redisTemplate.delete(String.format(DEVICE_CACHE_KEY, deviceId)); redisTemplate.delete(String.format(DEVICE_CONFIG_CACHE_KEY, deviceId)); + // 清理成功结果缓存 + redisTemplate.delete(String.format(DEVICE_CACHE_SUCCESS_KEY, deviceId)); return true; }