package com.util;
import com.anfachina.aflc.entity.order.AflcLclCompanyDriver;
import io.swagger.annotations.ApiModelProperty;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Timestamp;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@Slf4j
public class BeanChangeUtil {
/**
* 默认校验所以参数
*
* @param before 修改前的对象
* @param after 修改后的对象
* @param editLog
* @param flag 传入true,则只校验params的参数。传入false,则校验除了params以外的所有字段
* @param params 这个字段输入的 不比较
*/
public static void contrastObj(Object before, Object after, StringBuilder editLog, boolean flag, String... params) {
if (before == null || after == null) {
log.error("比较对象为空,无法参加比较");
return;
}
if (before.getClass() != after.getClass()) {
log.error("两个类不相同,无法比较!");
return;
}
Class beforeClass = before.getClass();
Class afterClass = after.getClass();
Field[] beforeClassDeclaredFields = beforeClass.getDeclaredFields();
Field[] afterClassDeclaredFields = afterClass.getDeclaredFields();
//校验属性长度是否一致
if (beforeClassDeclaredFields.length != afterClassDeclaredFields.length) {
log.error("对象属性长度不一致,无法比较!");
return;
}
for (int i = 0; i < beforeClassDeclaredFields.length; i++) {
Field beforeField = beforeClassDeclaredFields[i];
Field afterField = afterClassDeclaredFields[i];
//设置些属性是可以访问的
beforeField.setAccessible(true);
afterField.setAccessible(true);
//获取属性的名称
String paramName = beforeField.getName();
boolean paramsFlag = checkParams(paramName, params);
//去除不要校验的参数
if (!((flag && paramsFlag) || (!flag && !paramsFlag))) {
continue;
}
//参数的值
Object beforeValue = null;
Object afterValue = null;
try {
//获取参数的值
beforeValue = beforeField.get(before);
afterValue = afterField.get(after);
//获取注解
ApiModelProperty apiModelProperty = beforeField.getAnnotation(ApiModelProperty.class);
if (apiModelProperty == null) {
log.info("字段:{} 没有添加ApiModelProperty注解,无法自动生成日志", paramName);
continue;
}
if (beforeValue != null) {
if (beforeValue instanceof List) {
continue;
}
if (beforeValue instanceof Timestamp) {
beforeValue = new Date(((Timestamp) beforeValue).getTime());
}
if (beforeValue instanceof Date) {
beforeValue = (Date) beforeValue;
}
}
if (afterValue != null) {
if (afterValue instanceof List) {
continue;
}
if (afterValue instanceof Timestamp) {
afterValue = new Date(((Timestamp) afterValue).getTime());
}
if (afterValue instanceof Date) {
afterValue = (Date) afterValue;
}
}
//获取字段的注解
String paramAnnotaeValue = apiModelProperty.value();
if (beforeValue == null && afterValue != null) {
editLog.append(" 参数为:" + paramAnnotaeValue + " 增加值为:" + afterValue);
} else if (beforeValue != null && afterValue == null) {
editLog.append(" " + paramAnnotaeValue + "修改为空");
} else if (beforeValue != afterValue && !beforeValue.equals(afterValue)) {
if (beforeValue instanceof String) {
if (!StringUtils.equals((String) beforeValue, (String) afterValue)) {
editLog.append(" " + paramAnnotaeValue + "修改:" + beforeValue + " -> " + afterValue);
}
} else {
editLog.append(" " + paramAnnotaeValue + "修改:" + beforeValue + " -> " + afterValue);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 有相同,返回true,反之返回false
*
* @param paramName
* @param noParams
* @return
*/
public static boolean checkParams(String paramName, String... noParams) {
for (String pa : noParams) {
if (StringUtils.equals(pa, paramName)) {
return true;
}
}
return false;
}
public static void main(String[] args) {
AflcLclCompanyDriver aflcLclCompanyDriverbf = new AflcLclCompanyDriver();
aflcLclCompanyDriverbf.setId("111");
aflcLclCompanyDriverbf.setCompanyId("151");
aflcLclCompanyDriverbf.setVersion("20");
AflcLclCompanyDriver aflcLclCompanyDriveraf = new AflcLclCompanyDriver();
aflcLclCompanyDriveraf.setId("111");
aflcLclCompanyDriveraf.setCompanyId("151");
aflcLclCompanyDriveraf.setVersion("25");
aflcLclCompanyDriveraf.setUpdater("修改人姓名大大大");
StringBuilder stringBuilder=new StringBuilder("修改对象日志:");
contrastObj(aflcLclCompanyDriverbf,aflcLclCompanyDriveraf,stringBuilder,false,"serialVersionUID");
System.out.println(stringBuilder);
}
}
package com.entity.order;
import java.util.Date;
import java.math.BigDecimal;
import org.springframework.format.annotation.DateTimeFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import javax.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;
/**
*
*/
@Getter
@Setter
@ApiModel(value="物流公司司机表",description="物流公司司机表")
public class AflcLclCompanyDriver implements java.io.Serializable{
private static final long serialVersionUID = 1L;
@ApiModelProperty(value="编号",name="id")
private String id;
@ApiModelProperty(value="物流公司id",name="companyId")
private String companyId;
@ApiModelProperty(value="司机姓名",name="driverName")
private String driverName;
@ApiModelProperty(value="司机手机号码",name="driverMobile")
private String driverMobile;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value="创建时间",name="createTime")
private Date createTime;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value="更新时间",name="updateTime")
private Date updateTime;
@ApiModelProperty(value="创建人",name="creater")
private String creater;
@ApiModelProperty(value="修改人",name="updater")
private String updater;
@ApiModelProperty(value="版本",name="version")
private String version;
@ApiModelProperty(value="删除状态",name="delFlag")
private String delFlag;
}
运行结果:
修改对象日志: 参数为:修改人 增加值为:修改人姓名大大大 版本修改:20 -> 25