package com.ads.common.config;

import com.ads.common.util.CommonConstant;
import com.ads.common.util.OnlineUserUtils;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * mybatis-plus插入或更新数据时自动填充createTime、createUser和updateTime、updateUser
 *
 * @author stamm
 * @date 2021/6/9 15:23
 */
@Slf4j
@Component
public class MyBatisObjectHandler implements MetaObjectHandler {
    /**
     * 新增数据执行
     * fieldName 指的是实体类的属性名,而不是数据库的字段名
     *
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        if (metaObject.hasGetter(CommonConstant.CREATE_TIME)) {
            this.setFieldValByName(CommonConstant.CREATE_TIME, new Date(), metaObject);
        }
        if (metaObject.hasGetter(CommonConstant.CREATE_USER)) {
            /*this.setFieldValByName(CommonConstant.CREATE_USER, currentJobCode, metaObject);*/
            // fillStrategy方法会判断属性是否有值，如果有值就不会覆盖，所以调整为setFieldValByName方法
            this.strictInsertFill(metaObject, CommonConstant.CREATE_USER, String.class, getCurrentJobCode());
        }
    }

    /**
     * 更新数据执行
     *
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill ....");
        if (metaObject.hasGetter(CommonConstant.UPDATE_TIME)) {
            this.setFieldValByName(CommonConstant.UPDATE_TIME, new Date(), metaObject);
        }
        if (metaObject.hasGetter(CommonConstant.UPDATE_USER)) {
            /*this.setFieldValByName(CommonConstant.UPDATE_USER,getCurrentJobCode(),metaObject);*/
            // fillStrategy方法会判断属性是否有值，如果有值就不会覆盖，所以调整为setFieldValByName方法
            this.strictUpdateFill(metaObject, CommonConstant.UPDATE_USER, String.class, getCurrentJobCode());
        }
    }

    /**
     * 获取当前登录用户id
     *
     * @return
     */
    private Long getCurrentJobCode() {
        return Long.valueOf(OnlineUserUtils.get().getUserId());
    }
}
