最近项目中遇到了需要对整表数据进行比对是否改变,以及数字类型改变后是变大了还是变小了,想着几个字段随便写写if-else算了, 结果瓦特了,170个字段,搞不了搞不来,写方法把开撸
tps: 方法仅供参考学习
一、主方法
public List<ContrastResults> contrast(T t) throws Exception {
//比对结果集
List<ContrastResults> resultsList = new ArrayList<>();
//提取保留字段信息,获取原始数据
JsonNode extend = t.getExtend();
//将数据中的信息进行置空,减小对象的体积
t.setExtend(null);
//将新修改的数据对象转为map处理
Map<String, Object> map = BeanReflect.beanToMap(t);
//获取保留字段中保存的原始数据 sourceData此处因为源数据在json字段中,
//需要根据实际需求进行改造哦
JsonNode data = extend.get("sourceData");
//将原始数据转为map
Map<String, Object> beanToMap = super.objectMapper.convertValue(data, new TypeReference<>() {
});
//将对象的map的key提取
Set<String> keys = map.keySet();
//循环判断当前字段是否发生了变化
for (String key : keys) {
if (FILTER_LIST.contains(key)) {
continue;
}
ContrastResults results = new ContrastResults();
results.setFieldName(key);
results.setStatus(0);
results.setTId(t.getId());
results.setTenantCode(t.getTenantCode());
//是否一致,默认一致
boolean consistent = true;
if (!ObjectUtils.isEmpty(beanToMap.get(key)) && !ObjectUtils.isEmpty(map.get(key))) {
Object newData = map.get(key);
Object oldData = beanToMap.get(key);
if (newData instanceof Number newO2 && oldData instanceof Number oldO3) {
consistent = newO2.equals(oldO3);
double v = newO2.doubleValue();
double v2 = oldO3.doubleValue();
if (v > v2) {
results.setStatus(1);
} else if (v < v2) {
results.setStatus(2);
}
} else if (newData instanceof Boolean newO2 && oldData instanceof Boolean oldO3) {
consistent = newO2.equals(oldO3);
} else if (newData instanceof String newO2 && oldData instanceof String oldO3) {
consistent = newO2.equals(oldO3);
}
} else {
Object newData = map.get(key);
Object oldData = beanToMap.get(key);
if (!ObjectUtils.isEmpty(newData) && ObjectUtils.isEmpty(oldData)) {
if (newData instanceof Number newO2) {
double v = newO2.doubleValue();
if (v > 0) {
results.setStatus(1);
} else if (v < 0) {
results.setStatus(2);
}
} else if (newData instanceof Boolean newO2) {
consistent = newO2;
} else if (newData instanceof String) {
consistent = false;
}
}
}
results.setIsConsistent(consistent);
resultsList.add(results);
}
return resultsList;
}
使用主方法时需要注意根据自己的需求进行修改
二、工具类
1. 结果集方法字段展示
@Schema(title = "主键")
private Long id;
@Schema(title = "数据ID")
private Long tId;
@Schema(title = "字段名")
private String fieldName;
@Schema(title = "是否一致")
private Boolean isConsistent;
@Schema(title = "状态:0.默认 1.变大 2.变小")
private Integer status;
2.对象转Map方法
/**
* 对象转Map
*
* @param object 需要转换的对象
* @return 返回转换后的map
* @throws IllegalAccessException 异常信息
*/
public static Map<String, Object> beanToMap(Object object) throws IllegalAccessException {
if (ObjectUtils.isEmpty(object)) {
return Map.of();
}
Map<String, Object> map = new HashMap<>(16);
Field[] fields = object.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
map.put(field.getName(), field.get(object));
}
return map;
}
好啦,到此为止啦。有什么疑惑可以在评论区留言或者私信我,看到会第一时间回复