You've already forked FrameTour-BE
feat(scenic): 添加景区配置管理器并集成缓存支持
- 新增 ScenicConfigManager 类,用于管理和获取景区配置 - 在 ScenicRepository 中添加获取景区配置管理器的方法 - 实现了带缓存支持的景区配置获取,提高性能
This commit is contained in:
@@ -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.ScenicV2ListResponse;
|
||||||
import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2WithConfigDTO;
|
import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2WithConfigDTO;
|
||||||
import com.ycwl.basic.integration.scenic.service.ScenicIntegrationService;
|
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.MpConfigMapper;
|
||||||
import com.ycwl.basic.mapper.MpNotifyConfigMapper;
|
import com.ycwl.basic.mapper.MpNotifyConfigMapper;
|
||||||
import com.ycwl.basic.model.pc.mp.MpConfigEntity;
|
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.pay.enums.PayAdapterType;
|
||||||
import com.ycwl.basic.storage.enums.StorageType;
|
import com.ycwl.basic.storage.enums.StorageType;
|
||||||
import com.ycwl.basic.utils.JacksonUtil;
|
import com.ycwl.basic.utils.JacksonUtil;
|
||||||
|
import com.ycwl.basic.util.ScenicConfigManager;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.data.redis.core.RedisTemplate;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
public class ScenicRepository {
|
public class ScenicRepository {
|
||||||
@@ -31,6 +35,8 @@ public class ScenicRepository {
|
|||||||
private RedisTemplate<String, String> redisTemplate;
|
private RedisTemplate<String, String> redisTemplate;
|
||||||
@Autowired
|
@Autowired
|
||||||
private ScenicIntegrationService scenicIntegrationService;
|
private ScenicIntegrationService scenicIntegrationService;
|
||||||
|
@Autowired
|
||||||
|
private ScenicConfigIntegrationService scenicConfigIntegrationService;
|
||||||
|
|
||||||
public static final String SCENIC_CACHE_KEY = "scenic:%s";
|
public static final String SCENIC_CACHE_KEY = "scenic:%s";
|
||||||
public static final String SCENIC_BASIC_CACHE_KEY = "scenic:basic:%s";
|
public static final String SCENIC_BASIC_CACHE_KEY = "scenic:basic:%s";
|
||||||
@@ -308,4 +314,65 @@ public class ScenicRepository {
|
|||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取景区配置管理器
|
||||||
|
*
|
||||||
|
* @param scenicId 景区ID
|
||||||
|
* @return ScenicConfigManager实例,如果获取失败返回null
|
||||||
|
*/
|
||||||
|
public ScenicConfigManager getScenicConfigManager(Long scenicId) {
|
||||||
|
try {
|
||||||
|
List<ScenicConfigV2DTO> 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<com.ycwl.basic.integration.scenic.dto.config.ScenicConfigV2DTO> 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<ScenicConfigV2DTO> cachedConfigList =
|
||||||
|
JacksonUtil.parseArray(cachedConfigJson, ScenicConfigV2DTO.class);
|
||||||
|
return new ScenicConfigManager(cachedConfigList);
|
||||||
|
} catch (Exception cacheException) {
|
||||||
|
// 缓存解析失败,返回null
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 缓存也没有,返回null
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
376
src/main/java/com/ycwl/basic/util/ScenicConfigManager.java
Normal file
376
src/main/java/com/ycwl/basic/util/ScenicConfigManager.java
Normal file
@@ -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<String, Object> configMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从配置列表构造管理器
|
||||||
|
*
|
||||||
|
* @param configList 配置项列表
|
||||||
|
*/
|
||||||
|
public ScenicConfigManager(List<ScenicConfigV2DTO> 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<String, Object> 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 <T> 枚举类型泛型
|
||||||
|
* @return 枚举值,如果键不存在或转换失败返回null
|
||||||
|
*/
|
||||||
|
public <T extends Enum<T>> T getEnum(String key, Class<T> enumClass) {
|
||||||
|
return ConfigValueUtil.getEnumValue(configMap, key, enumClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取枚举值,如果为null则返回默认值
|
||||||
|
*
|
||||||
|
* @param key 配置键
|
||||||
|
* @param enumClass 枚举类型
|
||||||
|
* @param defaultValue 默认值
|
||||||
|
* @param <T> 枚举类型泛型
|
||||||
|
* @return 枚举值或默认值
|
||||||
|
*/
|
||||||
|
public <T extends Enum<T>> T getEnum(String key, Class<T> 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 <T> 目标类型泛型
|
||||||
|
* @return 转换后的对象,如果转换失败返回null
|
||||||
|
*/
|
||||||
|
public <T> T getObject(String key, Class<T> clazz) {
|
||||||
|
return ConfigValueUtil.getObjectValue(configMap, key, clazz);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取Map类型的值
|
||||||
|
*
|
||||||
|
* @param key 配置键
|
||||||
|
* @return Map值,如果转换失败返回null
|
||||||
|
*/
|
||||||
|
public Map<String, Object> getMap(String key) {
|
||||||
|
return ConfigValueUtil.getMapValue(configMap, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取List类型的值
|
||||||
|
*
|
||||||
|
* @param key 配置键
|
||||||
|
* @return List值,如果转换失败返回null
|
||||||
|
*/
|
||||||
|
public List<Object> getList(String key) {
|
||||||
|
return ConfigValueUtil.getListValue(configMap, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取指定元素类型的List值
|
||||||
|
*
|
||||||
|
* @param key 配置键
|
||||||
|
* @param elementClass List元素类型
|
||||||
|
* @param <T> List元素类型泛型
|
||||||
|
* @return 指定类型的List,如果转换失败返回null
|
||||||
|
*/
|
||||||
|
public <T> List<T> getList(String key, Class<T> 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<String> 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<String, Object> getAllConfigs() {
|
||||||
|
return new HashMap<>(configMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据键前缀过滤配置
|
||||||
|
*
|
||||||
|
* @param prefix 键前缀
|
||||||
|
* @return 匹配前缀的配置Map
|
||||||
|
*/
|
||||||
|
public Map<String, Object> 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<String> keys) {
|
||||||
|
Map<String, Object> 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() +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user