变更字段对比,可能存在列表对比的情况
代码地址,可以直接运行测试方法。Bean-Compare Utils
字段对比工具类,查询方法。 通过操作记录ID、ClassName、CompareKey 逐级归类。
package os.component.compare.compare;
import org.springframework.beans.BeanUtils;
import org.springframework.util.Assert;
import java.beans.PropertyDescriptor;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
/**
* 数据字段对比工具类
*/
public class CompareUtils {
/**
* 获取最新一次操作记录所有的字段变更并分组, 返回对应的变更过的字段
*
* @param compareDtoList 最新一次操作记录变更的字段列表
* @param clazzs 涉及到的类列表
*/
public static final List<CompareVO> getChangedFiledMap(List<Class> clazzs, List<CompareDto> compareDtoList) {
Map<String, String> fieldNoteMap = new HashMap<>();
for (Class clazz : clazzs) {
fieldNoteMap.putAll(getFieldNoteMap(clazz));
}
return getChangedFiledMap(fieldNoteMap, compareDtoList);
}
/**
* 获取一次操作记录所有的字段变更并分组、进行字段名转换
*
* @param compareDtoList 一次操作记录的所有字段变更记录
* @param fieldNoteMap 多个类, 变更的字段名不能相同
*/
private static final List<CompareVO> getChangedFiledMap(Map<String, String> fieldNoteMap,
List<CompareDto> compareDtoList) {
List<CompareVO> compareVOList = new ArrayList<>();
if (compareDtoList == null || compareDtoList.isEmpty()) {
return compareVOList;
}
Map<String, List<CompareDto>> classTypeCompare = compareDtoList.
stream().collect(Collectors.groupingBy(CompareDto::getClassType));
classTypeCompare.forEach((classType, compareList) -> {
Map<String, List<CompareDto>> compareKeyCompare = compareList.
stream().collect(Collectors.groupingBy(CompareDto::getCompareKey));
compareKeyCompare.forEach((compareKey, compar