Browse Source

拼接逻辑删除优化

24282 1 year ago
parent
commit
8d677093aa

+ 2 - 21
ruoyi-framework/src/main/java/com/ruoyi/framework/aspect/LogicAspect.java

@@ -1,6 +1,5 @@
 package com.ruoyi.framework.aspect;
 
-import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.ruoyi.common.annotation.LogicIgnore;
 import com.ruoyi.framework.mybatis.holder.LogicHolder;
 import org.aspectj.lang.ProceedingJoinPoint;
@@ -25,28 +24,10 @@ public class LogicAspect {
     @Around("@annotation(logicIgnore) || @within(logicIgnore)")
     public Object around(ProceedingJoinPoint point, LogicIgnore logicIgnore) throws Throwable {
         try {
-            //TODO 这里通过切面进来logicIgnore 一直是null  问题待排查......
-            if(ObjectUtils.isNotEmpty(logicIgnore)){
-                String[] alias = logicIgnore.alias();
-                String[] tableName = logicIgnore.tableName();
-                LogicHolder logicHolder = new LogicHolder();
-                logicHolder.setAliases(alias);
-                logicHolder.setTableNames(tableName);
-                // 开启忽略
-                LogicHolder.setLogicHolder(logicHolder);
-            }else{
-                String[] alias = {};
-                String[] tableName = {};
-                LogicHolder logicHolder = new LogicHolder();
-                logicHolder.setAliases(alias);
-                logicHolder.setTableNames(tableName);
-                // 开启忽略
-                LogicHolder.setLogicHolder(logicHolder);
-            }
-
+            // 开启忽略
+            LogicHolder.setLogicHolder(true);
             // 执行方法
             return point.proceed();
-
         } finally {
             // 关闭忽略
             LogicHolder.clear();

+ 3 - 12
ruoyi-framework/src/main/java/com/ruoyi/framework/mybatis/holder/LogicHolder.java

@@ -2,7 +2,6 @@ package com.ruoyi.framework.mybatis.holder;
 
 import lombok.Getter;
 import lombok.Setter;
-import org.springframework.core.NamedThreadLocal;
 
 /**
  * 租户线程处理
@@ -11,21 +10,13 @@ import org.springframework.core.NamedThreadLocal;
 @Setter
 public class LogicHolder {
 
-    private static final ThreadLocal<LogicHolder> LOGIC_KEY_HOLDER = new NamedThreadLocal<>("hx-delFlag");
-    /**
-     * 排除表名
-     */
-    private String[] tableNames;
-    /**
-     * 排除表别名
-     */
-    private String[] aliases;
+    private static final ThreadLocal<Boolean> LOGIC_KEY_HOLDER = ThreadLocal.withInitial(() -> false);
 
-    public static LogicHolder getLogicHolder() {
+    public static Boolean getLogicHolder() {
         return LOGIC_KEY_HOLDER.get();
     }
 
-    public static void setLogicHolder(LogicHolder logicHolder) {
+    public static void setLogicHolder(Boolean logicHolder) {
         LOGIC_KEY_HOLDER.set(logicHolder);
     }
 

+ 15 - 31
ruoyi-framework/src/main/java/com/ruoyi/framework/mybatis/interceptor/LogicInterceptor.java

@@ -1,7 +1,6 @@
 package com.ruoyi.framework.mybatis.interceptor;
 
 import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.druid.pool.DruidDataSource;
 import com.alibaba.druid.stat.JdbcDataSourceStat;
@@ -21,7 +20,6 @@ import com.ruoyi.framework.mybatis.RemoveParam;
 import com.ruoyi.framework.mybatis.holder.LogicHolder;
 import lombok.extern.slf4j.Slf4j;
 import net.sf.jsqlparser.JSQLParserException;
-import net.sf.jsqlparser.expression.Alias;
 import net.sf.jsqlparser.expression.Expression;
 import net.sf.jsqlparser.expression.LongValue;
 import net.sf.jsqlparser.expression.StringValue;
@@ -94,7 +92,7 @@ public class LogicInterceptor extends BaseMultiTableInnerInterceptor implements
                 String sql = "SELECT table_name FROM information_schema.COLUMNS WHERE table_schema = ? AND column_name = ?";
                 // 执行sql找出不包含逻辑删除字段的表名
                 List<String> notContainsDelFlagTableNameList = new JdbcTemplate(v).queryForList(sql, String.class, dbName, delFlagName);
-                
+
                 List<String> tempList = new ArrayList<>(notContainsDelFlagTableNameList);
                 tempList.forEach(item -> notContainsDelFlagTableNameList.add("`" + item + "`"));
 
@@ -117,11 +115,22 @@ public class LogicInterceptor extends BaseMultiTableInnerInterceptor implements
         PluginUtils.MPStatementHandler mpSh = PluginUtils.mpStatementHandler(sh);
         MappedStatement ms = mpSh.mappedStatement();
         SqlCommandType sct = ms.getSqlCommandType();
-        // 处理新增编辑
-        if (sct == SqlCommandType.INSERT || sct == SqlCommandType.UPDATE) {
+
+        // 处理新增
+        if (Objects.equals(sct, SqlCommandType.INSERT)) {
             PluginUtils.MPBoundSql mpBs = mpSh.mPBoundSql();
             mpBs.sql(parserMulti(mpBs.sql(), null));
         }
+
+        // 处理编辑
+        else if (Objects.equals(sct, SqlCommandType.UPDATE)) {
+            if (LogicHolder.getLogicHolder()) {
+                return;
+            }
+            PluginUtils.MPBoundSql mpBs = mpSh.mPBoundSql();
+            mpBs.sql(parserMulti(mpBs.sql(), null));
+        }
+
         // 处理删除
         if (sct == SqlCommandType.DELETE) {
             PluginUtils.MPBoundSql mpBs = mpSh.mPBoundSql();
@@ -291,31 +300,6 @@ public class LogicInterceptor extends BaseMultiTableInnerInterceptor implements
      */
     private boolean isSkip(Table table) {
 
-        LogicHolder logicHolder = LogicHolder.getLogicHolder();
-        String name = table.getName();
-
-        if (logicHolder != null) {
-
-            String[] tableNames = logicHolder.getTableNames();
-            String[] aliases = logicHolder.getAliases();
-
-            if (ObjectUtil.isEmpty(tableNames) && ObjectUtil.isEmpty(aliases)) {
-                return true;
-            }
-
-            if (ObjectUtil.isNotEmpty(tableNames) && Arrays.asList(tableNames).contains(name)) {
-                return true;
-            }
-
-            Alias alias = table.getAlias();
-            if (alias != null) {
-                if (ObjectUtil.isNotEmpty(aliases) && Arrays.asList(aliases).contains(alias.getName())) {
-                    return true;
-                }
-            }
-
-        }
-
         // 执行sql的数据源名称
         String dataSourceType = DynamicDataSourceContextHolder.peek();
         if (StrUtil.isBlank(dataSourceType)) {
@@ -329,7 +313,7 @@ public class LogicInterceptor extends BaseMultiTableInnerInterceptor implements
         }
 
         // 如果不包涵则跳过拼接逻辑删除
-        return !tableNameList.contains(name);
+        return !tableNameList.contains(table.getName());
     }