|
@@ -0,0 +1,171 @@
|
|
|
+package com.huashe.park.core.interceptor;
|
|
|
+
|
|
|
+import com.ruoyi.common.core.domain.model.LoginUser;
|
|
|
+import com.ruoyi.common.utils.SecurityUtils;
|
|
|
+import org.apache.ibatis.binding.MapperMethod;
|
|
|
+import org.apache.ibatis.binding.MapperMethod.ParamMap;
|
|
|
+import org.apache.ibatis.executor.Executor;
|
|
|
+import org.apache.ibatis.mapping.MappedStatement;
|
|
|
+import org.apache.ibatis.mapping.SqlCommandType;
|
|
|
+import org.apache.ibatis.plugin.*;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+import java.lang.reflect.Field;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+@Component
|
|
|
+@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
|
|
|
+public class MybatisInterceptor implements Interceptor {
|
|
|
+ private static final Logger log = LoggerFactory.getLogger(MybatisInterceptor.class);
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Object intercept(Invocation invocation) throws Throwable {
|
|
|
+ MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
|
|
|
+ String sqlId = mappedStatement.getId();
|
|
|
+ log.debug("------sqlId------" + sqlId);
|
|
|
+ SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
|
|
|
+ Object parameter = invocation.getArgs()[1];
|
|
|
+ log.debug("------sqlCommandType------" + sqlCommandType);
|
|
|
+
|
|
|
+ if (parameter == null) {
|
|
|
+ return invocation.proceed();
|
|
|
+ }
|
|
|
+ if (SqlCommandType.INSERT == sqlCommandType) {
|
|
|
+ LoginUser sysUser = getLoginUser();
|
|
|
+ Field[] fields = getAllFields(parameter);
|
|
|
+ assert fields != null;
|
|
|
+ for (Field field : fields) {
|
|
|
+ try {
|
|
|
+ if ("createBy".equals(field.getName())) {
|
|
|
+ field.setAccessible(true);
|
|
|
+ Object local_createBy = field.get(parameter);
|
|
|
+ field.setAccessible(false);
|
|
|
+ if (local_createBy == null || local_createBy.equals("")) {
|
|
|
+ if (sysUser != null) {
|
|
|
+ // 登录人账号
|
|
|
+ field.setAccessible(true);
|
|
|
+ field.set(parameter, sysUser.getUserId());
|
|
|
+ field.setAccessible(false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if ("createName".equals(field.getName())) {
|
|
|
+ field.setAccessible(true);
|
|
|
+ Object local_createBy = field.get(parameter);
|
|
|
+ field.setAccessible(false);
|
|
|
+ if (local_createBy == null || local_createBy.equals("")) {
|
|
|
+ if (sysUser != null) {
|
|
|
+ // 登录人账号
|
|
|
+ field.setAccessible(true);
|
|
|
+ field.set(parameter, sysUser.getUser().getNickName());
|
|
|
+ field.setAccessible(false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 注入创建时间
|
|
|
+ if ("createTime".equals(field.getName())) {
|
|
|
+ field.setAccessible(true);
|
|
|
+ Object local_createDate = field.get(parameter);
|
|
|
+ field.setAccessible(false);
|
|
|
+ if (local_createDate == null || local_createDate.equals("")) {
|
|
|
+ field.setAccessible(true);
|
|
|
+ field.set(parameter, new Date());
|
|
|
+ field.setAccessible(false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("------MybatisInterceptor field.name------{},error:", field.getName(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (SqlCommandType.UPDATE == sqlCommandType) {
|
|
|
+ LoginUser sysUser = this.getLoginUser();
|
|
|
+ Field[] fields = null;
|
|
|
+ if (parameter instanceof MapperMethod.ParamMap) {
|
|
|
+ MapperMethod.ParamMap<?> p = (ParamMap<?>) parameter;
|
|
|
+ //update-begin-author:scott date:20190729 for:批量更新报错issues/IZA3Q--
|
|
|
+ if (p.containsKey("et")) {
|
|
|
+ parameter = p.get("et");
|
|
|
+ } else {
|
|
|
+ parameter = p.get("param1");
|
|
|
+ }
|
|
|
+ //update-end-author:scott date:20190729 for:批量更新报错issues/IZA3Q-
|
|
|
+
|
|
|
+ //update-begin-author:scott date:20190729 for:更新指定字段时报错 issues/#516-
|
|
|
+ if (parameter == null) {
|
|
|
+ return invocation.proceed();
|
|
|
+ }
|
|
|
+ //update-end-author:scott date:20190729 for:更新指定字段时报错 issues/#516-
|
|
|
+
|
|
|
+ fields = this.getAllFields(parameter);
|
|
|
+ } else {
|
|
|
+ fields = this.getAllFields(parameter);
|
|
|
+ }
|
|
|
+
|
|
|
+ for (Field field : fields) {
|
|
|
+ field.setAccessible(true);
|
|
|
+ try {
|
|
|
+ if ("updateBy".equals(field.getName())) {
|
|
|
+ //获取登录用户信息
|
|
|
+ if (sysUser != null) {
|
|
|
+ // 登录账号
|
|
|
+ field.set(parameter, sysUser.getUserId().toString());
|
|
|
+ field.setAccessible(false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if ("updateTime".equals(field.getName())) {
|
|
|
+ field.set(parameter, new Date());
|
|
|
+ field.setAccessible(false);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("------ MybatisInterceptor field.name------{},error:", field.getName(), e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return invocation.proceed();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Object plugin(Object target) {
|
|
|
+ return Plugin.wrap(target, this);
|
|
|
+ }
|
|
|
+
|
|
|
+ private LoginUser getLoginUser() {
|
|
|
+ LoginUser userNow = null;
|
|
|
+ try {
|
|
|
+// try catch避免线程任务出错
|
|
|
+ userNow = SecurityUtils.getLoginUser() != null ? SecurityUtils.getLoginUser() : null;
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.debug("------MybatisInterceptor getLoginUser------,error:", e);
|
|
|
+ }
|
|
|
+ return userNow;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取类的所有属性,包括父类
|
|
|
+ *
|
|
|
+ * @param object
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Field[] getAllFields(Object object) {
|
|
|
+ Class<?> clazz = object.getClass();
|
|
|
+ if (clazz == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ List<Field> fieldList = new ArrayList<>();
|
|
|
+ while (clazz != null) {
|
|
|
+ fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
|
|
|
+ clazz = clazz.getSuperclass();
|
|
|
+ }
|
|
|
+ Field[] fields = new Field[fieldList.size()];
|
|
|
+ fieldList.toArray(fields);
|
|
|
+ return fields;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|