字段修改日志工具类

字段修改日志工具类

package com.jwx.license.common.util;

import com.jwx.license.common.annotation.ModifyLog;
import com.jwx.license.pojo.dto.KeyEditDTO;
import com.jwx.license.pojo.entity.KeyDO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * 字段修改日志工具类
 *
 * @author ZENG.XIAO.YAN
 * @version 1.0
 * @Date 2019-12-18
 */
@Slf4j
public final class ModifyLogUtils {

    /** 日志记录, eg: 修改xx: 由aa改为bb */
    private static final String LOG_FORMAT_STRING = "修改[%s]: 由[%s]改为[%s]";

    // 私有化构造方法
    private ModifyLogUtils() {
    }


    /**
     * 构建修改日志
     * @param target 修改后的对象
     * @param source 修改前的对象
     * @return
     */
    public static List<String> buildModifyLog(Object target, Object source) {
        List<String> result = null;
        if (Objects.isNull(target) || Objects.isNull(source)) {
            return result;
        }
        Field[] declaredFields = target.getClass().getDeclaredFields();
        try {
            if (ArrayUtils.isNotEmpty(declaredFields)) {
                result = new ArrayList<>();
                for (Field field : declaredFields) {
                    ModifyLog modifyLog = field.getAnnotation(ModifyLog.class);
                    if (Objects.nonNull(modifyLog)) {
                        String compareResult = compareObject(field, target, source, modifyLog);
                        if (StringUtils.isNotBlank(compareResult)) {
                            result.add(compareResult);
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.error("buildModifyLog 异常", e);
        }
        return result;
    }

    /**
     * 比较2个对象里面的字段值不同
     * @param field
     * @param target
     * @param source
     * @param modifyLog
     * @return
     * @throws Exception
     */
    private static String compareObject(Field field, Object target,  Object source, ModifyLog modifyLog) throws Exception {
        String alias = modifyLog.alias();
        String name = modifyLog.name();
        field.setAccessible(true);
        Object targetValue = field.get(target);
        Object sourceValue = getFieldValue(StringUtils.isBlank(alias) ? field.getName() : alias, source);
        // t= null && s !=null
        if (Objects.isNull(targetValue) && Objects.nonNull(sourceValue)) {
            return String.format(LOG_FORMAT_STRING,  name, customToString(sourceValue), customToString(targetValue));
        } else if (Objects.nonNull(targetValue) && !targetValue.equals(sourceValue)){
            return String.format(LOG_FORMAT_STRING,  name, customToString(sourceValue), customToString(targetValue));
        } else {
            return null;
        }
    }


    /**
     * 暴力反射获取对象字段值
     * @param fieldName
     * @param object
     * @return
     */
    private static Object getFieldValue(String fieldName, Object object) {
        try {
            Field field = object.getClass().getDeclaredField(fieldName);
            field.setAccessible(true);
            return field.get(object);
        } catch (Exception e) {
            log.error("getFieldValue 异常", e);
        }
        return null;
    }

    private static String customToString(Object obj) {
        if (null == obj) {
            return "null";
        } else if (obj instanceof java.util.Date){
            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((Date) obj);
        } else {
            return obj.toString();
        }
    }

    public static void main(String[] args) {
        KeyEditDTO editDTO = new KeyEditDTO();
        editDTO.setDepaCode("111111");
        editDTO.setDepaName("21111");
        editDTO.setKeySecret("3111");
        editDTO.setKeyValidDate(new Date());
        KeyDO keyDO = new KeyDO();
        keyDO.setDepaCode("2222");
        keyDO.setDepaName("3333");
        keyDO.setKeySecret("4444");
        keyDO.setKeyValidDate(null);

        List<String> list = buildModifyLog(editDTO, keyDO);
        list.forEach(System.out::println);
        // 结果
        // 修改[单位名字]: 由[3333]改为[21111]
        // 修改[授权码]: 由[4444]改为[3111]
        // 修改[到期时间]: 由[null]改为[2019-12-18 16:12:13]
    }
}


使用:

List<String> basicLogList = ModifyLogUtils.buildModifyLog(keyEditDTO, keyDO);

keyEditDTO:

@Data
public class KeyEditDTO extends BaseDTO {
    @ModifyLog(name = "授权码")
    private String keySecret;
    ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值