1、扩展MetaObjectHandler接口,可容易去实现数据插入或者修改时,一些公共默认字段的赋值
package com.sfpay.merchant.tmn.interceptor;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.sfpay.merchant.common.model.BuiOperDTO;
import com.sfpay.merchant.common.model.UrmOperDTO;
import com.sfpay.merchant.tmn.dal.entity.BaseSysConfigDO;
import com.sfpay.merchant.tmn.service.baseSysConfig.BaseSysConfigService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Base64;
import java.util.Date;
import java.util.Map;
import java.util.Optional;
/**
* <p> MyBatisPlus自定义字段自动填充处理类 - 实体类中使用 @TableField注解 </p>
*
* @description: 注意前端传值时要为null
* @date: 2022/10/20
*/
@Component
@Slf4j
public class TmnMetaObjectHandler implements MetaObjectHandler {
@Resource
private RedisTemplate<String, Map<String, Object>> redisTemplate;
private BaseSysConfigService baseSysConfigService;
@Autowired
@Lazy
public TmnMetaObjectHandler(BaseSysConfigService baseSysConfigService) {
this.baseSysConfigService = baseSysConfigService;
}
/**
* 创建时间
*/
@Override
public void insertFill(MetaObject metaObject) {
Date date = new Date();
try {
//创建时填充商户表状态变更时间
this.fillStrategy(metaObject, "stsUpdTm", date);
//公共字段填充
this.fillStrategy(metaObject, "createTime", date);
this.fillStrategy(metaObject, "updateTime", date);
//从session中获取操作员
String operatorNo = getOperatorNoFromSession();
this.fillStrategy(metaObject, "createId", operatorNo);
this.fillStrategy(metaObject, "updateId", operatorNo);
this.fillStrategy(metaObject, "operater", operatorNo);
metaObject.setValue("reportAdmin", getTmnAdminByBaseConfig());
} catch (Exception e) {
log.error(e.getMessage());
}
}
private String getTmnAdminByBaseConfig() {
BaseSysConfigDO baseSysConfigDO = baseSysConfigService.queryBaseConfigInfoByParamCodeAndParamType("REPORT_ADMIN_TO_TMN","S");
if (baseSysConfigDO != null){
return baseSysConfigDO.getParamValStr();
}
return "";
}
/**
* 数据修改时间
*/
@Override
public void updateFill(MetaObject metaObject) {
try {
//公共字段填充
this.fillStrategy(metaObject, "updateTime", new Date());
this.fillStrategy(metaObject, "updateId", getOperatorNoFromSession());
// this.fillStrategy(metaObject, "remark", getTmnAdminByBaseConfig());
metaObject.setValue("reportAdmin", getTmnAdminByBaseConfig());
} catch (Exception e) {
log.error(e.getMessage());
}
}
/**
* 从session中获取操作员
* do请求没有走DispatcherServlet,所有RequestContextHolder只存了servlet容器中的facade类型的request,
* 没有SessionRepositoryRequestWrapper类型的request
*
* @return
*/
public String getOperatorNoFromSession() {
String sessionId = Optional.ofNullable(RequestContextHolder.getRequestAttributes())
.map(requestAttributes -> ((ServletRequestAttributes) requestAttributes).getRequest())
.map(HttpServletRequest::getRequestedSessionId).orElse("");
log.debug("从session中获取操作员,sessionId {}", sessionId);
//从redis中获取session信息
String operatorNo = "system";
if (StringUtils.isNotBlank(sessionId)) {
String sessionKey = "spring:session:sessions:" + base64Decode(sessionId);
log.debug("从session中获取操作员,sessionKey {}", sessionKey);
Object object = redisTemplate.opsForHash().get(sessionKey, "sessionAttr:" + "oper_inf");
log.debug("从session中获取操作员,user {}" , object);
if (object != null) {
if (object instanceof BuiOperDTO) {
BuiOperDTO operator = (BuiOperDTO) object;
operatorNo = operator.getOperNo();
} else if (object instanceof UrmOperDTO) {
UrmOperDTO operator = (UrmOperDTO) object;
operatorNo = String.valueOf(operator.getUsrOprNo() == null ? "system" : operator.getUsrOprNo());
}
}
}
log.info("从session中获取操作员,operatorNo {}", operatorNo);
return operatorNo;
}
/**
* Decode the value using Base64.
*
* @param base64Value the Base64 String to decode
* @return the Base64 decoded value
* @since 1.2.2
*/
private String base64Decode(String base64Value) {
try {
byte[] decodedCookieBytes = Base64.getDecoder().decode(base64Value);
return new String(decodedCookieBytes);
} catch (Exception e) {
return null;
}
}
}
2、定义表中的公共字段
package com.sfpay.merchant.common.util;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.sfpay.merchant.common.util.annotation.DateTime2String;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 公共字段
* </p>
*
* @author
* @since 2021-06-18
*/
@Data
public class CommonDO implements Serializable {
/**
* 创建操作员
*/
@TableField(value = "CREATE_ID", fill = FieldFill.INSERT)
private String createId;
/**
* 创建时间
*/
@DateTime2String
@TableField(value = "CREATE_TIME", fill = FieldFill.INSERT)
private Date createTime;
/**
* 创建时间
*/
@TableField(exist = false)
private String createTimeDesc;
/**
* 更新操作员
*/
@TableField(value = "UPDATE_ID", fill = FieldFill.INSERT_UPDATE)
private String updateId;
/**
* 更新时间
*/
@DateTime2String
@TableField(value = "UPDATE_TIME", fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
/**
* 更新时间
*/
@TableField(exist = false)
private String updateTimeDesc;
}