我公司最近要我开发销售退货/款单,其中就有编辑退货款时需要保存修改数据的历史记录。我也是一个新入职场的小白,研究了一上午终于解决了,若有不对的地方麻烦私聊找我。要求如图所示:
下面是我解决问题的代码:
主要代码
/**
* 比较修改前后销售退款单
*
* @param oldBean 修改前数据
* @param newBean 修改后数据
* @param saleSn
* @param <T>
* @return
*/
public static <T> List<WpOrderSaleReturnRecord> updateLog(Object oldBean, Object newBean, String saleSn) {
List<WpOrderSaleReturnRecord> recordList = new ArrayList<>();
StringBuilder str = new StringBuilder();
T pojo1 = (T) oldBean;
T pojo2 = (T) newBean;
try {
// 通过反射获取类的类类型及字段属性
Class clazz = pojo1.getClass();
Field[] fields = clazz.getDeclaredFields();
int i = 1;
for (Field field : fields) {
// 排除序列化属性
if ("serialVersionUID".equals(field.getName())) {
continue;
}
//1、获取属性上的指定类型的注解
Annotation annotation = field.getAnnotation(XmlElement.class);
//有该类型的注解存在
if (annotation != null) {
PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
// 获取对应属性值
Method getMethod = pd.getReadMethod();
Object o1 = getMethod.invoke(pojo1);
Object o2 = getMethod.invoke(pojo2);
if (o1 == null || o2 == null) {
continue;
}
//bigDecimal 类型的数据要去掉小数点后尾部的0不一致造成数据比对差异
String type = field.getType().getName();
if(type.equals("java.math.BigDecimal")