24282 10 ماه پیش
والد
کامیت
229258614e

+ 51 - 35
ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/handler/InjectionMetaObjectHandler.java

@@ -11,6 +11,7 @@ import org.dromara.common.mybatis.core.domain.BaseAllPo;
 import org.dromara.common.mybatis.core.domain.BaseCreatePo;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
 import org.dromara.common.mybatis.core.domain.BaseTimePo;
+import org.dromara.common.mybatis.helper.MetaObjectHelp;
 import org.dromara.common.satoken.utils.LoginHelper;
 
 import java.util.Date;
@@ -26,44 +27,61 @@ public class InjectionMetaObjectHandler implements MetaObjectHandler {
 
     @Override
     public void insertFill(MetaObject metaObject) {
+        if (ObjectUtil.isNull(metaObject)) {
+            return;
+        }
+
+        Object originalObject = metaObject.getOriginalObject();
         try {
-            if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity baseEntity) {
-                Date current = ObjectUtil.isNotNull(baseEntity.getCreateTime())
-                        ? baseEntity.getCreateTime() : new Date();
-                baseEntity.setCreateTime(current);
-                baseEntity.setUpdateTime(current);
+            if (originalObject instanceof BaseEntity po) {
+                Date current = ObjectUtil.defaultIfNull(po.getCreateTime(), new Date());
+                po.setCreateTime(current);
+                po.setUpdateTime(current);
+
                 LoginUser loginUser = getLoginUser();
-                if (ObjectUtil.isNotNull(loginUser)) {
-                    Long userId = ObjectUtil.isNotNull(baseEntity.getCreateBy())
-                            ? baseEntity.getCreateBy() : loginUser.getUserId();
-                    // 当前已登录 且 创建人为空 则填充
-                    baseEntity.setCreateBy(userId);
-                    // 当前已登录 且 更新人为空 则填充
-                    baseEntity.setUpdateBy(userId);
-                    baseEntity.setCreateDept(ObjectUtil.isNotNull(baseEntity.getCreateDept())
-                            ? baseEntity.getCreateDept() : loginUser.getDeptId());
+                if (ObjectUtil.isNull(loginUser)) {
+                    return;
                 }
-            } else if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseAllPo po) {
-                Date current = new Date();
+
+                Long userId = ObjectUtil.defaultIfNull(po.getCreateBy(), loginUser.getUserId());
+                Long deptId = ObjectUtil.defaultIfNull(po.getCreateDept(), loginUser.getDeptId());
+
+                // 当前已登录 且 创建人为空 则填充
+                po.setCreateBy(userId);
+                // 当前已登录 且 更新人为空 则填充
+                po.setUpdateBy(userId);
+                // 当前已登录 且 部门为空 则填充
+                po.setCreateDept(deptId);
+
+            } else if (originalObject instanceof BaseAllPo po) {
+                Date current = ObjectUtil.defaultIfNull(MetaObjectHelp.getTime(), ObjectUtil.defaultIfNull(po.getCreateTime(), new Date()));
                 po.setCreateTime(current);
                 po.setUpdateTime(current);
 
                 LoginUser loginUser = getLoginUser();
-                if (ObjectUtil.isNotNull(loginUser)) {
-                    Long userId = loginUser.getUserId();
-                    po.setCreateBy(userId);
-                    po.setUpdateBy(userId);
+                if (ObjectUtil.isNull(loginUser)) {
+                    return;
                 }
-            } else if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseCreatePo po) {
-                Date current = new Date();
+
+                Long userId = ObjectUtil.defaultIfNull(MetaObjectHelp.getUserId(), ObjectUtil.defaultIfNull(po.getCreateBy(), loginUser.getUserId()));
+                po.setCreateBy(userId);
+                po.setUpdateBy(userId);
+
+            } else if (originalObject instanceof BaseCreatePo po) {
+                Date current = ObjectUtil.defaultIfNull(MetaObjectHelp.getTime(), ObjectUtil.defaultIfNull(po.getCreateTime(), new Date()));
                 po.setCreateTime(current);
 
                 LoginUser loginUser = getLoginUser();
-                if (ObjectUtil.isNotNull(loginUser)) {
-                    po.setCreateBy(loginUser.getUserId());
+                if (ObjectUtil.isNull(loginUser)) {
+                    return;
                 }
-            } else if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseTimePo po) {
-                po.setCreateTime(new Date());
+
+                Long userId = ObjectUtil.defaultIfNull(MetaObjectHelp.getUserId(), ObjectUtil.defaultIfNull(po.getCreateBy(), loginUser.getUserId()));
+                po.setCreateBy(userId);
+
+            } else if (originalObject instanceof BaseTimePo po) {
+                Date current = ObjectUtil.defaultIfNull(MetaObjectHelp.getTime(), ObjectUtil.defaultIfNull(po.getCreateTime(), new Date()));
+                po.setCreateTime(current);
             }
 
         } catch (Exception e) {
@@ -75,25 +93,23 @@ public class InjectionMetaObjectHandler implements MetaObjectHandler {
     public void updateFill(MetaObject metaObject) {
         try {
             if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseEntity baseEntity) {
-                Date current = new Date();
                 // 更新时间填充(不管为不为空)
-                baseEntity.setUpdateTime(current);
-                LoginUser loginUser = getLoginUser();
+                baseEntity.setUpdateTime(ObjectUtil.defaultIfNull(MetaObjectHelp.getTime(), new Date()));
+
                 // 当前已登录 更新人填充(不管为不为空)
+                LoginUser loginUser = getLoginUser();
                 if (ObjectUtil.isNotNull(loginUser)) {
-                    baseEntity.setUpdateBy(loginUser.getUserId());
+                    baseEntity.setUpdateBy(ObjectUtil.defaultIfNull(MetaObjectHelp.getUserId(), loginUser.getUserId()));
                 }
             } else if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseAllPo baseEntity) {
-                Date current = new Date();
-                baseEntity.setUpdateTime(current);
+                baseEntity.setUpdateTime(ObjectUtil.defaultIfNull(MetaObjectHelp.getTime(), new Date()));
 
                 LoginUser loginUser = getLoginUser();
                 if (ObjectUtil.isNotNull(loginUser)) {
-                    Long userId = loginUser.getUserId();
-                    baseEntity.setUpdateBy(userId);
+                    baseEntity.setUpdateBy(ObjectUtil.defaultIfNull(MetaObjectHelp.getUserId(), loginUser.getUserId()));
                 }
             } else if (ObjectUtil.isNotNull(metaObject) && metaObject.getOriginalObject() instanceof BaseTimePo po) {
-                po.setUpdateTime(new Date());
+                po.setUpdateTime(ObjectUtil.defaultIfNull(MetaObjectHelp.getTime(), new Date()));
             }
         } catch (Exception e) {
             throw new ServiceException("自动注入异常 => " + e.getMessage(), HttpStatus.HTTP_UNAUTHORIZED);

+ 54 - 0
ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/MetaObjectHelp.java

@@ -0,0 +1,54 @@
+package org.dromara.common.mybatis.helper;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+public class MetaObjectHelp {
+
+    private static final ThreadLocal<Map<String, Object>> threadLocal = new ThreadLocal<>();
+    private static final String USER_ID = "userId";
+    private static final String TIME = "time";
+
+    public static void execute(Long userId, Date time, Runnable runnable) {
+        Map<String, Object> map = new HashMap<>();
+        map.put(USER_ID, userId);
+        map.put(TIME, time);
+        threadLocal.set(map);
+        runnable.run();
+        threadLocal.remove();
+    }
+
+    public static void execute(Long userId, Runnable runnable) {
+        execute(userId, null, runnable);
+    }
+
+    public static void execute(Date time, Runnable runnable) {
+        execute(null, time, runnable);
+    }
+
+    public static Long getUserId() {
+        Map<String, Object> map = threadLocal.get();
+        if (map == null) {
+            return null;
+        }
+        Object userId = map.get(USER_ID);
+        if (userId == null) {
+            return null;
+        }
+        return (Long) userId;
+    }
+
+    public static Date getTime() {
+        Map<String, Object> map = threadLocal.get();
+        if (map == null) {
+            return null;
+        }
+        Object time = map.get(TIME);
+        if (time == null) {
+            return null;
+        }
+        return (Date) time;
+    }
+
+}