refactor(integration): 重构配置管理功能

- 新增通用 ConfigManager 类,实现配置管理的通用功能
- 新增 DeviceConfigManager 和 ScenicConfigManager 类,分别实现设备和景区的配置管理- 更新相关控制器和服务,使用新的配置管理器类
-调整设备和景区的配置数据结构,以适应新的管理方式
This commit is contained in:
2025-09-02 15:30:54 +08:00
parent 2dee78247e
commit 8e770a5b97
8 changed files with 424 additions and 20 deletions

View File

@@ -1,5 +1,7 @@
package com.ycwl.basic.repository;
import com.ycwl.basic.integration.device.service.DeviceConfigIntegrationService;
import com.ycwl.basic.integration.device.dto.config.DeviceConfigV2DTO;
import com.ycwl.basic.utils.JacksonUtil;
import com.ycwl.basic.mapper.DeviceMapper;
import com.ycwl.basic.model.pc.device.entity.DeviceConfigEntity;
@@ -7,6 +9,7 @@ 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 com.ycwl.basic.integration.common.manager.DeviceConfigManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
@@ -31,6 +34,9 @@ public class DeviceRepository {
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_CONFIG_MANAGER_CACHE_KEY = "device:%s:config:manager";
@Autowired
private DeviceConfigIntegrationService deviceConfigIntegrationService;
/**
* 将DeviceV2DTO转换为DeviceEntity
@@ -71,18 +77,41 @@ public class DeviceRepository {
}
public DeviceConfigEntity getDeviceConfig(Long deviceId) {
if (redisTemplate.hasKey(String.format(DEVICE_CONFIG_CACHE_KEY, deviceId))) {
return JacksonUtil.parseObject(redisTemplate.opsForValue().get(String.format(DEVICE_CONFIG_CACHE_KEY, deviceId)), DeviceConfigEntity.class);
List<DeviceConfigV2DTO> configList = deviceConfigIntegrationService.getDeviceConfigs(deviceId);
if (configList != null && !configList.isEmpty()) {
return convertToDeviceConfigEntity(configList, deviceId);
}
DeviceConfigEntity deviceConfig = deviceMapper.getConfigByDeviceId(deviceId);
if (null == deviceConfig) {
deviceConfig = new DeviceConfigEntity();
deviceConfig.setId(SnowFlakeUtil.getLongId());
deviceConfig.setDeviceId(deviceId);
deviceMapper.addConfig(deviceConfig);
return null;
}
/**
* 获取设备配置管理器
*
* @param deviceId 设备ID
* @return DeviceConfigManager实例,如果获取失败返回null
*/
public DeviceConfigManager getDeviceConfigManager(Long deviceId) {
try {
List<DeviceConfigV2DTO> configList = deviceConfigIntegrationService.getDeviceConfigs(deviceId);
return new DeviceConfigManager(configList);
} catch (Exception e) {
log.warn("获取设备配置管理器失败, deviceId: {}", deviceId, e);
return null;
}
redisTemplate.opsForValue().set(String.format(DEVICE_CONFIG_CACHE_KEY, deviceId), JacksonUtil.toJSONString(deviceConfig), 3, TimeUnit.DAYS);
return deviceConfig;
}
/**
* 将DeviceConfigV2DTO列表转换为DeviceConfigEntity(为了兼容性)
*/
private DeviceConfigEntity convertToDeviceConfigEntity(List<DeviceConfigV2DTO> configList, Long deviceId) {
DeviceConfigEntity entity = new DeviceConfigEntity();
entity.setId(SnowFlakeUtil.getLongId());
entity.setDeviceId(deviceId);
// 由于DeviceConfigEntity没有通用的configJson字段,这里只设置基本信息
// 具体的配置项需要通过DeviceConfigManager来访问
return entity;
}
public boolean clearDeviceCache(String deviceNo) {
@@ -106,9 +135,11 @@ public class DeviceRepository {
DeviceEntity device = getDevice(deviceId);
redisTemplate.delete(String.format(DEVICE_CACHE_KEY, device.getNo()));
redisTemplate.delete(String.format(DEVICE_CONFIG_CACHE_KEY, device.getNo()));
redisTemplate.delete(String.format(DEVICE_CONFIG_MANAGER_CACHE_KEY, device.getNo()));
}
redisTemplate.delete(String.format(DEVICE_CACHE_KEY, deviceId));
redisTemplate.delete(String.format(DEVICE_CONFIG_CACHE_KEY, deviceId));
redisTemplate.delete(String.format(DEVICE_CONFIG_MANAGER_CACHE_KEY, deviceId));
return true;
}

View File

@@ -19,13 +19,12 @@ import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery;
import com.ycwl.basic.pay.enums.PayAdapterType;
import com.ycwl.basic.storage.enums.StorageType;
import com.ycwl.basic.utils.JacksonUtil;
import com.ycwl.basic.util.ScenicConfigManager;
import com.ycwl.basic.integration.common.manager.ScenicConfigManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
@Component
public class ScenicRepository {