diff --git a/ruoyi-common/ruoyi-common-orm/src/main/java/com/ruoyi/common/orm/helper/ListenerManager.java b/ruoyi-common/ruoyi-common-orm/src/main/java/com/ruoyi/common/orm/helper/ListenerManager.java new file mode 100644 index 0000000..708826f --- /dev/null +++ b/ruoyi-common/ruoyi-common-orm/src/main/java/com/ruoyi/common/orm/helper/ListenerManager.java @@ -0,0 +1,183 @@ +package com.ruoyi.common.orm.helper; + +import lombok.extern.slf4j.Slf4j; + +import java.util.function.Supplier; + +/** + * 监听器管理 + *

+ * 考虑任务调度、三方接口回调等可自由控制审计字段 + * + * @author Ice + * @version 1.0 + */ +@Slf4j +public class ListenerManager { + + private ListenerManager() {} + + private static ThreadLocal ignoreInsertListenerTl = ThreadLocal.withInitial(() -> Boolean.FALSE); + + private static ThreadLocal ignoreUpdateListenerTl = ThreadLocal.withInitial(() -> Boolean.FALSE); + + + /** + * 设置 InsertListenerThreadLocal + * @param tl ThreadLocal + */ + public static synchronized void setInsertListenerTl(ThreadLocal tl) { + ignoreInsertListenerTl = tl; + } + + /** + * 设置 UpdateListenerThreadLocal + * @param tl ThreadLocal + */ + public static synchronized void setUpdateListenerTl(ThreadLocal tl) { + ignoreUpdateListenerTl = tl; + } + + /** + * 是否执行 InsertListener + * @return 是否执行 + */ + public static boolean isDoInsertListener() { + return !ignoreInsertListenerTl.get(); + } + + /** + * 是否执行 UpdateListener + * @return 是否执行 + */ + public static boolean isDoUpdateListener() { + return !ignoreUpdateListenerTl.get(); + } + + /** + * 忽略 Listener + */ + public static T withoutListener(Supplier supplier) { + try { + ignoreListener(); + return supplier.get(); + } finally { + restoreListener(); + } + } + + /** + * 忽略 Listener + */ + public static void withoutListener(Runnable runnable) { + try { + ignoreListener(); + runnable.run(); + } finally { + restoreListener(); + } + } + + + /** + * 忽略 Listener + */ + public static void ignoreListener() { + ignoreInsertListenerTl.set(Boolean.TRUE); + ignoreUpdateListenerTl.set(Boolean.TRUE); + } + + + /** + * 恢复 Listener + */ + public static void restoreListener() { + ignoreInsertListenerTl.remove(); + ignoreUpdateListenerTl.remove(); + } + + + + /** + * 忽略 InsertListener + */ + public static T withoutInsertListener(Supplier supplier) { + try { + ignoreInsertListener(); + return supplier.get(); + } finally { + restoreInsertListener(); + } + } + + /** + * 忽略 InsertListener + */ + public static void withoutInsertListener(Runnable runnable) { + try { + ignoreInsertListener(); + runnable.run(); + } finally { + restoreInsertListener(); + } + } + + + /** + * 忽略 InsertListener + */ + public static void ignoreInsertListener() { + ignoreInsertListenerTl.set(Boolean.TRUE); + } + + + /** + * 恢复 InsertListener + */ + public static void restoreInsertListener() { + ignoreInsertListenerTl.remove(); + } + + + + + /** + * 忽略 UpdateListener + */ + public static T withoutUpdateListener(Supplier supplier) { + try { + ignoreUpdateListener(); + return supplier.get(); + } finally { + restoreUpdateListener(); + } + } + + /** + * 忽略 UpdateListener + */ + public static void withoutUpdateListener(Runnable runnable) { + try { + ignoreUpdateListener(); + runnable.run(); + } finally { + restoreUpdateListener(); + } + } + + + /** + * 忽略 UpdateListener + */ + public static void ignoreUpdateListener() { + ignoreUpdateListenerTl.set(Boolean.TRUE); + } + + + /** + * 恢复 UpdateListener + */ + public static void restoreUpdateListener() { + ignoreUpdateListenerTl.remove(); + } +} diff --git a/ruoyi-common/ruoyi-common-orm/src/main/java/com/ruoyi/common/orm/listener/EntityInsertListener.java b/ruoyi-common/ruoyi-common-orm/src/main/java/com/ruoyi/common/orm/listener/EntityInsertListener.java index 16cd82b..2379dee 100644 --- a/ruoyi-common/ruoyi-common-orm/src/main/java/com/ruoyi/common/orm/listener/EntityInsertListener.java +++ b/ruoyi-common/ruoyi-common-orm/src/main/java/com/ruoyi/common/orm/listener/EntityInsertListener.java @@ -5,6 +5,7 @@ import cn.hutool.http.HttpStatus; import com.mybatisflex.annotation.InsertListener; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.orm.core.domain.BaseEntity; +import com.ruoyi.common.orm.helper.ListenerManager; import com.ruoyi.common.security.utils.LoginHelper; import java.util.Date; @@ -19,7 +20,7 @@ public class EntityInsertListener implements InsertListener { @Override public void onInsert(Object entity) { try { - if (ObjectUtil.isNotNull(entity) && (entity instanceof BaseEntity)) { + if (ListenerManager.isDoInsertListener() && ObjectUtil.isNotNull(entity) && (entity instanceof BaseEntity)) { BaseEntity baseEntity = (BaseEntity) entity; Long loginUserId = LoginHelper.getUserId(); diff --git a/ruoyi-common/ruoyi-common-orm/src/main/java/com/ruoyi/common/orm/listener/EntityUpdateListener.java b/ruoyi-common/ruoyi-common-orm/src/main/java/com/ruoyi/common/orm/listener/EntityUpdateListener.java index 3b42383..ba72e05 100644 --- a/ruoyi-common/ruoyi-common-orm/src/main/java/com/ruoyi/common/orm/listener/EntityUpdateListener.java +++ b/ruoyi-common/ruoyi-common-orm/src/main/java/com/ruoyi/common/orm/listener/EntityUpdateListener.java @@ -5,6 +5,7 @@ import cn.hutool.http.HttpStatus; import com.mybatisflex.annotation.UpdateListener; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.orm.core.domain.BaseEntity; +import com.ruoyi.common.orm.helper.ListenerManager; import com.ruoyi.common.security.utils.LoginHelper; import java.util.Date; @@ -18,7 +19,7 @@ public class EntityUpdateListener implements UpdateListener { @Override public void onUpdate(Object entity) { try { - if (ObjectUtil.isNotNull(entity) && (entity instanceof BaseEntity)) { + if (ListenerManager.isDoUpdateListener() && ObjectUtil.isNotNull(entity) && (entity instanceof BaseEntity)) { BaseEntity baseEntity = (BaseEntity) entity; baseEntity.setUpdateBy(LoginHelper.getUserId()); baseEntity.setUpdateTime(new Date());