You've already forked FrameTour-BE
refactor(basic): 重构景区配置管理逻辑
- 移除 AppOrderV2Controller 中的价格缓存逻辑 - 修正 VoucherServiceImpl 中的购买数量计算方式- 重构 ScenicRepository 中的景区配置获取逻辑 -增加 ScenicConfigManager 的扁平化配置和驼峰转换功能
This commit is contained in:
@@ -76,14 +76,14 @@ public class AppOrderV2Controller {
|
||||
Long scenicId = face.getScenicId();
|
||||
|
||||
// 先尝试从Redis缓存获取价格计算结果
|
||||
PriceCalculationResult cachedResult = priceCacheService.getCachedPriceResult(
|
||||
currentUserId, scenicId, request.getProducts());
|
||||
|
||||
if (cachedResult != null) {
|
||||
log.info("命中价格缓存: userId={}, scenicId={}, finalAmount={}",
|
||||
currentUserId, scenicId, cachedResult.getFinalAmount());
|
||||
return ApiResponse.success(cachedResult);
|
||||
}
|
||||
// PriceCalculationResult cachedResult = priceCacheService.getCachedPriceResult(
|
||||
// currentUserId, scenicId, request.getProducts());
|
||||
//
|
||||
// if (cachedResult != null) {
|
||||
// log.info("命中价格缓存: userId={}, scenicId={}, finalAmount={}",
|
||||
// currentUserId, scenicId, cachedResult.getFinalAmount());
|
||||
// return ApiResponse.success(cachedResult);
|
||||
// }
|
||||
|
||||
// 转换为标准价格计算请求
|
||||
PriceCalculationRequest standardRequest = request.toStandardRequest(currentUserId, scenicId);
|
||||
|
@@ -310,7 +310,7 @@ public class VoucherServiceImpl implements IVoucherService {
|
||||
// 在实际应用中可能需要更复杂的计算逻辑
|
||||
BigDecimal totalAmount = BigDecimal.ZERO;
|
||||
for (ProductItem item : applicableItems) {
|
||||
BigDecimal itemAmount = item.getUnitPrice().multiply(BigDecimal.valueOf(item.getQuantity()));
|
||||
BigDecimal itemAmount = item.getUnitPrice().multiply(BigDecimal.valueOf(item.getPurchaseCount()));
|
||||
totalAmount = totalAmount.add(itemAmount);
|
||||
}
|
||||
return totalAmount;
|
||||
|
@@ -97,28 +97,71 @@ public class ScenicRepository {
|
||||
}
|
||||
|
||||
public ScenicConfigEntity getScenicConfig(Long scenicId) {
|
||||
String key = String.format(SCENIC_CONFIG_CACHE_KEY, scenicId);
|
||||
try {
|
||||
ScenicV2WithConfigDTO scenicWithConfigDTO = scenicIntegrationService.getScenicWithConfig(scenicId);
|
||||
ScenicConfigEntity configEntity = convertToScenicConfigEntity(scenicWithConfigDTO, scenicId);
|
||||
|
||||
// 请求成功,写入缓存
|
||||
if (configEntity != null) {
|
||||
redisTemplate.opsForValue().set(
|
||||
key,
|
||||
JacksonUtil.toJSONString(configEntity)
|
||||
);
|
||||
}
|
||||
return configEntity;
|
||||
} catch (Exception e) {
|
||||
// 请求失败,尝试从缓存获取历史成功数据
|
||||
String cacheKey = key;
|
||||
if (redisTemplate.hasKey(cacheKey)) {
|
||||
return JacksonUtil.parseObject(redisTemplate.opsForValue().get(cacheKey), ScenicConfigEntity.class);
|
||||
}
|
||||
// 缓存也没有,返回null
|
||||
return null;
|
||||
}
|
||||
ScenicConfigManager scenicConfigManager = getScenicConfigManager(scenicId);
|
||||
ScenicConfigEntity config = new ScenicConfigEntity();
|
||||
|
||||
// 基础配置
|
||||
config.setScenicId(scenicId);
|
||||
|
||||
// 业务流程配置
|
||||
config.setBookRoutine(scenicConfigManager.getInteger("book_routine"));
|
||||
config.setForceFinishTime(scenicConfigManager.getInteger("force_finish_time"));
|
||||
config.setTourTime(scenicConfigManager.getInteger("tour_time"));
|
||||
|
||||
// 存储时间配置
|
||||
config.setSampleStoreDay(scenicConfigManager.getInteger("sample_store_day"));
|
||||
config.setFaceStoreDay(scenicConfigManager.getInteger("face_store_day"));
|
||||
config.setVideoStoreDay(scenicConfigManager.getInteger("video_store_day"));
|
||||
config.setVideoSourceStoreDay(scenicConfigManager.getInteger("video_source_store_day"));
|
||||
config.setImageSourceStoreDay(scenicConfigManager.getInteger("image_source_store_day"));
|
||||
config.setUserSourceExpireDay(scenicConfigManager.getInteger("user_source_expire_day"));
|
||||
|
||||
// 功能开关配置
|
||||
config.setAllFree(scenicConfigManager.getBoolean("all_free"));
|
||||
config.setDisableSourceVideo(scenicConfigManager.getBoolean("disable_source_video"));
|
||||
config.setDisableSourceImage(scenicConfigManager.getBoolean("disable_source_image"));
|
||||
config.setVoucherEnable(scenicConfigManager.getBoolean("voucher_enable"));
|
||||
|
||||
// 模板和防录屏配置
|
||||
config.setTemplateNewVideoType(scenicConfigManager.getInteger("template_new_video_type"));
|
||||
config.setAntiScreenRecordType(scenicConfigManager.getInteger("anti_screen_record_type"));
|
||||
|
||||
// 人脸识别配置
|
||||
config.setFaceScoreThreshold(scenicConfigManager.getFloat("face_score_threshold"));
|
||||
config.setFaceDetectHelperThreshold(scenicConfigManager.getInteger("face_detect_helper_threshold"));
|
||||
config.setFaceType(scenicConfigManager.getEnum("face_type", FaceBodyAdapterType.class));
|
||||
config.setFaceConfigJson(scenicConfigManager.getString("face_config_json"));
|
||||
|
||||
// 存储配置
|
||||
config.setStoreType(scenicConfigManager.getEnum("store_type", StorageType.class));
|
||||
config.setStoreConfigJson(scenicConfigManager.getString("store_config_json"));
|
||||
config.setTmpStoreType(scenicConfigManager.getEnum("tmp_store_type", StorageType.class));
|
||||
config.setTmpStoreConfigJson(scenicConfigManager.getString("tmp_store_config_json"));
|
||||
config.setLocalStoreType(scenicConfigManager.getEnum("local_store_type", StorageType.class));
|
||||
config.setLocalStoreConfigJson(scenicConfigManager.getString("local_store_config_json"));
|
||||
|
||||
// 支付配置
|
||||
config.setPayType(scenicConfigManager.getEnum("pay_type", PayAdapterType.class));
|
||||
config.setPayConfigJson(scenicConfigManager.getString("pay_config_json"));
|
||||
|
||||
// 推客配置
|
||||
config.setBrokerDirectRate(scenicConfigManager.getBigDecimal("broker_direct_rate"));
|
||||
|
||||
// 水印配置
|
||||
config.setWatermarkType(scenicConfigManager.getString("watermark_type"));
|
||||
config.setWatermarkScenicText(scenicConfigManager.getString("watermark_scenic_text"));
|
||||
config.setWatermarkDtFormat(scenicConfigManager.getString("watermark_dt_format"));
|
||||
|
||||
// 提示信息配置
|
||||
config.setImageSourcePackHint(scenicConfigManager.getString("image_source_pack_hint"));
|
||||
config.setVideoSourcePackHint(scenicConfigManager.getString("video_source_pack_hint"));
|
||||
config.setExtraNotificationTime(scenicConfigManager.getString("extra_notification_time"));
|
||||
|
||||
// 免费数量配置
|
||||
config.setPhotoFreeNum(scenicConfigManager.getInteger("photo_free_num"));
|
||||
config.setVideoFreeNum(scenicConfigManager.getInteger("video_free_num"));
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
public MpConfigEntity getScenicMpConfig(Long scenicId) {
|
||||
|
@@ -366,6 +366,65 @@ public class ScenicConfigManager {
|
||||
return new ScenicConfigManager(subsetMap);
|
||||
}
|
||||
|
||||
/**
|
||||
* 将配置转换为扁平化的Map,键名转换为驼峰形式
|
||||
*
|
||||
* @return 扁平化的配置Map,键为驼峰形式
|
||||
*/
|
||||
public Map<String, Object> toFlatConfig() {
|
||||
Map<String, Object> flatConfig = new HashMap<>();
|
||||
|
||||
for (Map.Entry<String, Object> entry : configMap.entrySet()) {
|
||||
String key = entry.getKey();
|
||||
Object value = entry.getValue();
|
||||
|
||||
if (key != null) {
|
||||
String camelCaseKey = toCamelCase(key);
|
||||
flatConfig.put(camelCaseKey, value);
|
||||
}
|
||||
}
|
||||
|
||||
return flatConfig;
|
||||
}
|
||||
|
||||
/**
|
||||
* 将字符串转换为驼峰形式
|
||||
* 支持下划线、短横线、点号分隔的字符串转换
|
||||
*
|
||||
* @param str 原始字符串
|
||||
* @return 驼峰形式的字符串
|
||||
*/
|
||||
private String toCamelCase(String str) {
|
||||
if (str == null || str.isEmpty()) {
|
||||
return str;
|
||||
}
|
||||
|
||||
// 支持下划线、短横线、点号作为分隔符
|
||||
String[] parts = str.split("[_\\-.]");
|
||||
|
||||
if (parts.length <= 1) {
|
||||
return str;
|
||||
}
|
||||
|
||||
StringBuilder camelCase = new StringBuilder();
|
||||
|
||||
// 第一部分保持原样(全小写)
|
||||
camelCase.append(parts[0].toLowerCase());
|
||||
|
||||
// 后续部分首字母大写
|
||||
for (int i = 1; i < parts.length; i++) {
|
||||
String part = parts[i];
|
||||
if (!part.isEmpty()) {
|
||||
camelCase.append(Character.toUpperCase(part.charAt(0)));
|
||||
if (part.length() > 1) {
|
||||
camelCase.append(part.substring(1).toLowerCase());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return camelCase.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ScenicConfigManager{" +
|
||||
|
Reference in New Issue
Block a user