diff --git a/src/main/java/com/ycwl/basic/repository/ScenicRepository.java b/src/main/java/com/ycwl/basic/repository/ScenicRepository.java index 0e8325b..b3db8bd 100644 --- a/src/main/java/com/ycwl/basic/repository/ScenicRepository.java +++ b/src/main/java/com/ycwl/basic/repository/ScenicRepository.java @@ -6,6 +6,8 @@ import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2DTO; import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2ListResponse; import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2WithConfigDTO; import com.ycwl.basic.integration.scenic.service.ScenicIntegrationService; +import com.ycwl.basic.integration.scenic.service.ScenicConfigIntegrationService; +import com.ycwl.basic.integration.scenic.dto.config.ScenicConfigV2DTO; import com.ycwl.basic.mapper.MpConfigMapper; import com.ycwl.basic.mapper.MpNotifyConfigMapper; import com.ycwl.basic.model.pc.mp.MpConfigEntity; @@ -17,11 +19,13 @@ 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 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 { @@ -31,6 +35,8 @@ public class ScenicRepository { private RedisTemplate redisTemplate; @Autowired private ScenicIntegrationService scenicIntegrationService; + @Autowired + private ScenicConfigIntegrationService scenicConfigIntegrationService; public static final String SCENIC_CACHE_KEY = "scenic:%s"; public static final String SCENIC_BASIC_CACHE_KEY = "scenic:basic:%s"; @@ -307,5 +313,66 @@ public class ScenicRepository { return entity; } + + /** + * 获取景区配置管理器 + * + * @param scenicId 景区ID + * @return ScenicConfigManager实例,如果获取失败返回null + */ + public ScenicConfigManager getScenicConfigManager(Long scenicId) { + try { + List configList = scenicConfigIntegrationService.listConfigs(scenicId); + if (configList != null) { + return new ScenicConfigManager(configList); + } + return null; + } catch (Exception e) { + return null; + } + } + + /** + * 获取景区配置管理器,带缓存支持 + * + * @param scenicId 景区ID + * @return ScenicConfigManager实例,如果获取失败返回null + */ + public ScenicConfigManager getScenicConfigManagerWithCache(Long scenicId) { + String key = String.format(SCENIC_CONFIG_CACHE_KEY + ":manager", scenicId); + + try { + List configList = + scenicConfigIntegrationService.listConfigs(scenicId); + if (configList != null) { + ScenicConfigManager manager = new ScenicConfigManager(configList); + + // 请求成功,写入缓存(将配置列表序列化存储) + redisTemplate.opsForValue().set( + key, + JacksonUtil.toJSONString(configList) + ); + + return manager; + } + return null; + } catch (Exception e) { + // 请求失败,尝试从缓存获取历史成功数据 + if (redisTemplate.hasKey(key)) { + try { + String cachedConfigJson = redisTemplate.opsForValue().get(key); + @SuppressWarnings("unchecked") + List cachedConfigList = + JacksonUtil.parseArray(cachedConfigJson, ScenicConfigV2DTO.class); + return new ScenicConfigManager(cachedConfigList); + } catch (Exception cacheException) { + // 缓存解析失败,返回null + return null; + } + } + // 缓存也没有,返回null + return null; + } + } } diff --git a/src/main/java/com/ycwl/basic/util/ScenicConfigManager.java b/src/main/java/com/ycwl/basic/util/ScenicConfigManager.java new file mode 100644 index 0000000..3da9397 --- /dev/null +++ b/src/main/java/com/ycwl/basic/util/ScenicConfigManager.java @@ -0,0 +1,376 @@ +package com.ycwl.basic.util; + +import com.ycwl.basic.integration.common.util.ConfigValueUtil; +import com.ycwl.basic.integration.scenic.dto.config.ScenicConfigV2DTO; + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 景区配置管理器 + * + * 提供类型安全的配置值获取功能,支持多种数据类型的自动转换, + * 当类型不兼容时返回null而不是抛出异常。 + */ +public class ScenicConfigManager { + + private final Map configMap; + + /** + * 从配置列表构造管理器 + * + * @param configList 配置项列表 + */ + public ScenicConfigManager(List configList) { + this.configMap = new HashMap<>(); + if (configList != null) { + for (ScenicConfigV2DTO config : configList) { + if (config.getConfigKey() != null && config.getConfigValue() != null) { + this.configMap.put(config.getConfigKey(), config.getConfigValue()); + } + } + } + } + + /** + * 从配置Map构造管理器 + * + * @param configMap 配置Map + */ + public ScenicConfigManager(Map configMap) { + this.configMap = configMap != null ? new HashMap<>(configMap) : new HashMap<>(); + } + + /** + * 获取字符串值 + * + * @param key 配置键 + * @return 字符串值,如果键不存在或转换失败返回null + */ + public String getString(String key) { + return ConfigValueUtil.getStringValue(configMap, key); + } + + /** + * 获取字符串值,如果为null则返回默认值 + * + * @param key 配置键 + * @param defaultValue 默认值 + * @return 字符串值或默认值 + */ + public String getString(String key, String defaultValue) { + return ConfigValueUtil.getStringValue(configMap, key, defaultValue); + } + + /** + * 获取整数值 + * + * @param key 配置键 + * @return Integer值,如果键不存在或转换失败返回null + */ + public Integer getInteger(String key) { + return ConfigValueUtil.getIntValue(configMap, key); + } + + /** + * 获取整数值,如果为null则返回默认值 + * + * @param key 配置键 + * @param defaultValue 默认值 + * @return Integer值或默认值 + */ + public Integer getInteger(String key, Integer defaultValue) { + return ConfigValueUtil.getIntValue(configMap, key, defaultValue); + } + + /** + * 获取长整数值 + * + * @param key 配置键 + * @return Long值,如果键不存在或转换失败返回null + */ + public Long getLong(String key) { + return ConfigValueUtil.getLongValue(configMap, key); + } + + /** + * 获取长整数值,如果为null则返回默认值 + * + * @param key 配置键 + * @param defaultValue 默认值 + * @return Long值或默认值 + */ + public Long getLong(String key, Long defaultValue) { + Long value = ConfigValueUtil.getLongValue(configMap, key); + return value != null ? value : defaultValue; + } + + /** + * 获取浮点数值 + * + * @param key 配置键 + * @return Float值,如果键不存在或转换失败返回null + */ + public Float getFloat(String key) { + return ConfigValueUtil.getFloatValue(configMap, key); + } + + /** + * 获取浮点数值,如果为null则返回默认值 + * + * @param key 配置键 + * @param defaultValue 默认值 + * @return Float值或默认值 + */ + public Float getFloat(String key, Float defaultValue) { + Float value = ConfigValueUtil.getFloatValue(configMap, key); + return value != null ? value : defaultValue; + } + + /** + * 获取双精度浮点数值 + * + * @param key 配置键 + * @return Double值,如果键不存在或转换失败返回null + */ + public Double getDouble(String key) { + return ConfigValueUtil.getDoubleValue(configMap, key); + } + + /** + * 获取双精度浮点数值,如果为null则返回默认值 + * + * @param key 配置键 + * @param defaultValue 默认值 + * @return Double值或默认值 + */ + public Double getDouble(String key, Double defaultValue) { + Double value = ConfigValueUtil.getDoubleValue(configMap, key); + return value != null ? value : defaultValue; + } + + /** + * 获取高精度小数值 + * + * @param key 配置键 + * @return BigDecimal值,如果键不存在或转换失败返回null + */ + public BigDecimal getBigDecimal(String key) { + return ConfigValueUtil.getBigDecimalValue(configMap, key); + } + + /** + * 获取高精度小数值,如果为null则返回默认值 + * + * @param key 配置键 + * @param defaultValue 默认值 + * @return BigDecimal值或默认值 + */ + public BigDecimal getBigDecimal(String key, BigDecimal defaultValue) { + BigDecimal value = ConfigValueUtil.getBigDecimalValue(configMap, key); + return value != null ? value : defaultValue; + } + + /** + * 获取布尔值 + * + * @param key 配置键 + * @return Boolean值,如果键不存在或转换失败返回null + */ + public Boolean getBoolean(String key) { + return ConfigValueUtil.getBooleanValue(configMap, key); + } + + /** + * 获取布尔值,如果为null则返回默认值 + * + * @param key 配置键 + * @param defaultValue 默认值 + * @return Boolean值或默认值 + */ + public Boolean getBoolean(String key, Boolean defaultValue) { + return ConfigValueUtil.getBooleanValue(configMap, key, defaultValue); + } + + /** + * 获取枚举值 + * + * @param key 配置键 + * @param enumClass 枚举类型 + * @param 枚举类型泛型 + * @return 枚举值,如果键不存在或转换失败返回null + */ + public > T getEnum(String key, Class enumClass) { + return ConfigValueUtil.getEnumValue(configMap, key, enumClass); + } + + /** + * 获取枚举值,如果为null则返回默认值 + * + * @param key 配置键 + * @param enumClass 枚举类型 + * @param defaultValue 默认值 + * @param 枚举类型泛型 + * @return 枚举值或默认值 + */ + public > T getEnum(String key, Class enumClass, T defaultValue) { + T value = ConfigValueUtil.getEnumValue(configMap, key, enumClass); + return value != null ? value : defaultValue; + } + + /** + * 获取原始对象值 + * + * @param key 配置键 + * @return 原始Object值 + */ + public Object getObject(String key) { + return ConfigValueUtil.getObjectValue(configMap, key); + } + + /** + * 获取并转换为指定类型的对象 + * + * @param key 配置键 + * @param clazz 目标类型 + * @param 目标类型泛型 + * @return 转换后的对象,如果转换失败返回null + */ + public T getObject(String key, Class clazz) { + return ConfigValueUtil.getObjectValue(configMap, key, clazz); + } + + /** + * 获取Map类型的值 + * + * @param key 配置键 + * @return Map值,如果转换失败返回null + */ + public Map getMap(String key) { + return ConfigValueUtil.getMapValue(configMap, key); + } + + /** + * 获取List类型的值 + * + * @param key 配置键 + * @return List值,如果转换失败返回null + */ + public List getList(String key) { + return ConfigValueUtil.getListValue(configMap, key); + } + + /** + * 获取指定元素类型的List值 + * + * @param key 配置键 + * @param elementClass List元素类型 + * @param List元素类型泛型 + * @return 指定类型的List,如果转换失败返回null + */ + public List getList(String key, Class elementClass) { + return ConfigValueUtil.getListValue(configMap, key, elementClass); + } + + /** + * 检查配置键是否存在 + * + * @param key 配置键 + * @return true如果键存在,false如果不存在 + */ + public boolean hasKey(String key) { + return ConfigValueUtil.hasKey(configMap, key); + } + + /** + * 检查配置键是否存在且值不为null + * + * @param key 配置键 + * @return true如果键存在且值不为null + */ + public boolean hasNonNullValue(String key) { + return ConfigValueUtil.hasNonNullValue(configMap, key); + } + + /** + * 获取所有配置键 + * + * @return 配置键集合 + */ + public Set getAllKeys() { + return new HashSet<>(configMap.keySet()); + } + + /** + * 获取配置项数量 + * + * @return 配置项数量 + */ + public int size() { + return configMap.size(); + } + + /** + * 检查配置是否为空 + * + * @return true如果没有配置项 + */ + public boolean isEmpty() { + return configMap.isEmpty(); + } + + /** + * 获取所有配置的拷贝 + * + * @return 配置Map的拷贝 + */ + public Map getAllConfigs() { + return new HashMap<>(configMap); + } + + /** + * 根据键前缀过滤配置 + * + * @param prefix 键前缀 + * @return 匹配前缀的配置Map + */ + public Map getConfigsByPrefix(String prefix) { + if (prefix == null) { + return new HashMap<>(); + } + + return configMap.entrySet().stream() + .filter(entry -> entry.getKey() != null && entry.getKey().startsWith(prefix)) + .collect(Collectors.toMap( + Map.Entry::getKey, + Map.Entry::getValue + )); + } + + /** + * 创建新的ScenicConfigManager,包含当前配置的子集 + * + * @param keys 要包含的配置键 + * @return 包含指定键配置的新管理器 + */ + public ScenicConfigManager subset(Set keys) { + Map subsetMap = new HashMap<>(); + if (keys != null) { + for (String key : keys) { + if (configMap.containsKey(key)) { + subsetMap.put(key, configMap.get(key)); + } + } + } + return new ScenicConfigManager(subsetMap); + } + + @Override + public String toString() { + return "ScenicConfigManager{" + + "configCount=" + configMap.size() + + ", keys=" + configMap.keySet() + + '}'; + } +} \ No newline at end of file