策略转化

parent b0d9e31b
package com.aps.common.util;
import com.aps.entity.StrategyScheduling;
import com.aps.entity.ConfigSetting;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
/**
* 增强版JSON转换工具类,支持字段映射配置
*/
public class EnhancedJsonConversionUtil {
private static final Logger logger = LoggerFactory.getLogger(EnhancedJsonConversionUtil.class);
// 字段映射配置
private static final Map<String, String> FIELD_MAPPINGS = new ConcurrentHashMap<>();
static {
// 初始化字段映射
FIELD_MAPPINGS.put("_X_ROW_KEY", "rowKey");
FIELD_MAPPINGS.put("row_key", "rowKey");
FIELD_MAPPINGS.put("ROW_KEY", "rowKey");
// 可以添加更多映射
}
/**
* 添加自定义字段映射
*/
public static void addFieldMapping(String sourceField, String targetField) {
FIELD_MAPPINGS.put(sourceField, targetField);
}
/**
* 转换JSON数组到实体列表,支持字段映射
*/
public static <T> List<T> convertJsonToEntities(String jsonArray,
Map<String, String> customMappings,
Class<T> targetType) {
if (jsonArray == null || jsonArray.trim().isEmpty()) {
return Collections.emptyList();
}
try {
ObjectMapper mapper = new ObjectMapper();
// 忽略未知属性
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
List<Map<String, Object>> rawList = mapper.readValue(
jsonArray,
new com.fasterxml.jackson.core.type.TypeReference<List<Map<String, Object>>>() {}
);
List<T> result = new ArrayList<>();
for (Map<String, Object> rawMap : rawList) {
T entity = convertMapToEntity(rawMap, customMappings, targetType);
if (entity != null) {
result.add(entity);
}
}
return result;
} catch (Exception e) {
logger.error("JSON转换失败", e);
return Collections.emptyList();
}
}
/**
* 转换Map到实体,应用字段映射
*/
private static <T> T convertMapToEntity(Map<String, Object> sourceMap,
Map<String, String> customMappings,
Class<T> targetType) {
if (sourceMap == null) {
return null;
}
try {
// 合并映射配置
Map<String, String> allMappings = new HashMap<>(FIELD_MAPPINGS);
if (customMappings != null) {
allMappings.putAll(customMappings);
}
// 创建目标Map(应用字段映射)
Map<String, Object> targetMap = new HashMap<>();
for (Map.Entry<String, Object> entry : sourceMap.entrySet()) {
String targetField = allMappings.getOrDefault(entry.getKey(), entry.getKey());
targetMap.put(targetField, entry.getValue());
}
// 转换为实体
ObjectMapper mapper = new ObjectMapper();
// 忽略未知属性
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return mapper.convertValue(targetMap, targetType);
} catch (Exception e) {
logger.error("Map转换实体失败", e);
return null;
}
}
/**
* 批量转换(性能优化版)
*/
public static <T> List<T> batchConvert(List<Map<String, Object>> sourceList, Class<T> targetType) {
if (sourceList == null || sourceList.isEmpty()) {
return Collections.emptyList();
}
List<T> result = new ArrayList<>(sourceList.size());
ObjectMapper mapper = new ObjectMapper();
// 忽略未知属性
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
for (Map<String, Object> sourceMap : sourceList) {
try {
// 应用字段映射
Map<String, Object> processedMap = processFieldMappings(sourceMap);
T entity = mapper.convertValue(processedMap, targetType);
result.add(entity);
} catch (Exception e) {
logger.warn("跳过转换失败的数据: {}", sourceMap);
}
}
return result;
}
/**
* 处理字段映射
*/
private static Map<String, Object> processFieldMappings(Map<String, Object> sourceMap) {
Map<String, Object> result = new HashMap<>();
for (Map.Entry<String, Object> entry : sourceMap.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
// 应用映射规则
String mappedKey = FIELD_MAPPINGS.getOrDefault(key, key);
result.put(mappedKey, value);
}
return result;
}
// 为了向后兼容,保留原有的方法
public static List<StrategyScheduling> convertJsonToEntities(String jsonArray,
Map<String, String> customMappings) {
return convertJsonToEntities(jsonArray, customMappings, StrategyScheduling.class);
}
}
\ No newline at end of file
package com.aps.entity; package com.aps.entity;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
@Data @Data
public class Config { public class Config {
@TableId(value = "id", type = IdType.AUTO)
private Long id; private Long id;
private String page; private String page;
private String component; private String component;
......
...@@ -12,4 +12,5 @@ public class ConfigSetting { ...@@ -12,4 +12,5 @@ public class ConfigSetting {
private String title; private String title;
private boolean value; private boolean value;
private String content; private String content;
} private int upid;
}
\ No newline at end of file
package com.aps.entity; package com.aps.entity;
import lombok.Data;
/** /**
* 作者:佟礼 * 作者:佟礼
* 时间:2025-12-10 * 时间:2025-12-10
*/ */
@Data
public class StrategyScheduling { public class StrategyScheduling {
private String name; private String name;
private String title; private String title;
private String content; private String content;
private int amplitude; private int amplitude;
private boolean value; private boolean value;
}
}
\ No newline at end of file
package com.aps.service; package com.aps.service;
import com.aps.entity.Config; import com.aps.entity.Config;
import com.aps.entity.ConfigSetting;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/** /**
* <p> * <p>
* 用户配置 服务类 * 用户配置 服务类
...@@ -13,4 +16,5 @@ import com.baomidou.mybatisplus.extension.service.IService; ...@@ -13,4 +16,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/ */
public interface ConfigService extends IService<Config> { public interface ConfigService extends IService<Config> {
} List<ConfigSetting> getComponentSettingsByPageAndNote(Long id, String component);
}
\ No newline at end of file
package com.aps.service; package com.aps.service;
import com.aps.entity.StrategyRule; import com.aps.entity.StrategyRule;
import com.aps.entity.StrategyScheduling;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/** /**
* <p> * <p>
* 策略规则 服务类 * 策略规则 服务类
...@@ -12,5 +15,14 @@ import com.baomidou.mybatisplus.extension.service.IService; ...@@ -12,5 +15,14 @@ import com.baomidou.mybatisplus.extension.service.IService;
* @since 2025-12-10 * @since 2025-12-10
*/ */
public interface StrategyRuleService extends IService<StrategyRule> { public interface StrategyRuleService extends IService<StrategyRule> {
/**
* 根据策略规则ID获取其前向调度配置并转换为StrategyScheduling实体列表
*
* @param ruleId 策略规则ID
* @return StrategyScheduling实体列表
*/
List<StrategyScheduling> getForwardSchedulingByRuleId(Long ruleId);
} }
\ No newline at end of file
package com.aps.service.impl; package com.aps.service.impl;
import com.aps.entity.Config; import com.aps.entity.Config;
import com.aps.entity.ConfigSetting;
import com.aps.mapper.ConfigMapper; import com.aps.mapper.ConfigMapper;
import com.aps.service.ConfigService; import com.aps.service.ConfigService;
import com.aps.common.util.EnhancedJsonConversionUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
/** /**
* <p> * <p>
...@@ -16,5 +24,45 @@ import org.springframework.stereotype.Service; ...@@ -16,5 +24,45 @@ import org.springframework.stereotype.Service;
*/ */
@Service @Service
public class ConfigServiceImpl extends ServiceImpl<ConfigMapper, Config> implements ConfigService { public class ConfigServiceImpl extends ServiceImpl<ConfigMapper, Config> implements ConfigService {
private static final Logger logger = LoggerFactory.getLogger(ConfigServiceImpl.class);
/**
* 简单校验是否为有效的JSON数组格式
* @param jsonString 待校验的字符串
* @return 是否为有效的JSON数组
*/
private boolean isValidJsonArray(String jsonString) {
if (jsonString == null || jsonString.trim().isEmpty()) {
return false;
}
String trimmed = jsonString.trim();
return trimmed.startsWith("[") && trimmed.endsWith("]");
}
@Override
public List<ConfigSetting> getComponentSettingsByPageAndNote(Long id, String component) {
Config config = this.lambdaQuery()
.eq(Config::getId, id)
.eq(Config::getComponent, component)
.one();
if (config != null && config.getContent() != null && !config.getContent().isEmpty()) {
try {
// 使用EnhancedJsonConversionUtil将JSON字符串转换为ConfigSetting实体列表
return EnhancedJsonConversionUtil.convertJsonToEntities(config.getContent(), null, ConfigSetting.class);
} catch (Exception e) {
logger.error("解析配置组件数据时发生错误");
}
}
return null;
}
} }
\ No newline at end of file
...@@ -3,9 +3,15 @@ package com.aps.service.impl; ...@@ -3,9 +3,15 @@ package com.aps.service.impl;
import com.aps.entity.StrategyRule; import com.aps.entity.StrategyRule;
import com.aps.mapper.StrategyRuleMapper; import com.aps.mapper.StrategyRuleMapper;
import com.aps.service.StrategyRuleService; import com.aps.service.StrategyRuleService;
import com.aps.entity.StrategyScheduling;
import com.aps.common.util.EnhancedJsonConversionUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/** /**
* <p> * <p>
* 策略规则 服务实现类 * 策略规则 服务实现类
...@@ -16,5 +22,25 @@ import org.springframework.stereotype.Service; ...@@ -16,5 +22,25 @@ import org.springframework.stereotype.Service;
*/ */
@Service @Service
public class StrategyRuleServiceImpl extends ServiceImpl<StrategyRuleMapper, StrategyRule> implements StrategyRuleService { public class StrategyRuleServiceImpl extends ServiceImpl<StrategyRuleMapper, StrategyRule> implements StrategyRuleService {
/**
* 根据策略规则ID获取其前向调度配置并转换为StrategyScheduling实体列表
*
* @param ruleId 策略规则ID
* @return StrategyScheduling实体列表
*/
public List<StrategyScheduling> getForwardSchedulingByRuleId(Long ruleId) {
// 从数据库查询StrategyRule
StrategyRule strategyRule = this.getById(ruleId);
if (strategyRule != null && strategyRule.getForwardScheduling() != null) {
// 使用EnhancedJsonConversionUtil将JSON字符串转换为StrategyScheduling实体列表
return EnhancedJsonConversionUtil.convertJsonToEntities(strategyRule.getForwardScheduling(), null, StrategyScheduling.class);
}
return null;
}
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment