Pārlūkot izejas kodu

优化事件处理

zhouhao 2 gadi atpakaļ
vecāks
revīzija
ffdd084920

+ 11 - 7
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/EasyormConfiguration.java

@@ -38,6 +38,8 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.core.Ordered;
+import org.springframework.core.annotation.Order;
 
 import java.beans.PropertyDescriptor;
 import java.lang.annotation.Annotation;
@@ -112,22 +114,24 @@ public class EasyormConfiguration {
         };
     }
 
+
     @Bean
-    public EntityEventListener entityEventListener(ApplicationEventPublisher eventPublisher,
-                                                   ObjectProvider<EntityEventListenerCustomizer> customizers) {
-        DefaultEntityEventListenerConfigure configure = new DefaultEntityEventListenerConfigure();
-        customizers.forEach(customizer -> customizer.customize(configure));
-        return new EntityEventListener(eventPublisher, configure);
+    public CreatorEventListener creatorEventListener() {
+        return new CreatorEventListener();
     }
 
+
     @Bean
     public ValidateEventListener validateEventListener() {
         return new ValidateEventListener();
     }
 
     @Bean
-    public CreatorEventListener creatorEventListener() {
-        return new CreatorEventListener();
+    public EntityEventListener entityEventListener(ApplicationEventPublisher eventPublisher,
+                                                   ObjectProvider<EntityEventListenerCustomizer> customizers) {
+        DefaultEntityEventListenerConfigure configure = new DefaultEntityEventListenerConfigure();
+        customizers.forEach(customizer -> customizer.customize(configure));
+        return new EntityEventListener(eventPublisher, configure);
     }
 
     @Bean

+ 3 - 0
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/CompositeEventListener.java

@@ -5,7 +5,9 @@ import lombok.Setter;
 import org.hswebframework.ezorm.rdb.events.EventContext;
 import org.hswebframework.ezorm.rdb.events.EventListener;
 import org.hswebframework.ezorm.rdb.events.EventType;
+import org.springframework.core.Ordered;
 
+import java.util.Comparator;
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
 
@@ -24,5 +26,6 @@ public class CompositeEventListener implements EventListener {
 
     public void addListener(EventListener eventListener) {
         eventListeners.add(eventListener);
+        eventListeners.sort(Comparator.comparingLong(e -> e instanceof Ordered ? ((Ordered) e).getOrder() : Ordered.LOWEST_PRECEDENCE));
     }
 }

+ 51 - 20
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/CreatorEventListener.java

@@ -12,19 +12,21 @@ import org.hswebframework.web.api.crud.entity.RecordModifierEntity;
 import org.hswebframework.web.authorization.Authentication;
 import org.hswebframework.web.validator.CreateGroup;
 import org.hswebframework.web.validator.UpdateGroup;
+import org.springframework.core.Ordered;
 import org.springframework.util.ObjectUtils;
 import org.springframework.util.StringUtils;
 import reactor.core.publisher.Mono;
 
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 import java.util.function.Consumer;
 
 /**
  * 自动填充创建人和修改人信息
  */
-public class CreatorEventListener implements EventListener {
+public class CreatorEventListener implements EventListener, Ordered {
 
     @Override
     public String getId() {
@@ -60,27 +62,45 @@ public class CreatorEventListener implements EventListener {
     }
 
     protected void doApplyCreator(EventType type, EventContext context, Authentication auth) {
-        context.get(MappingContextKeys.instance)
-               .ifPresent(obj -> {
-                   if (obj instanceof Collection) {
-                       applyCreator(auth, ((Collection<?>) obj), type != MappingEventTypes.update_before);
-                   } else {
-                       applyCreator(auth, obj, type != MappingEventTypes.update_before);
-                   }
-               });
+        Object instance = context.get(MappingContextKeys.instance).orElse(null);
+        if (instance != null) {
+            if (instance instanceof Collection) {
+                applyCreator(auth, context, ((Collection<?>) instance), type != MappingEventTypes.update_before);
+            } else {
+                applyCreator(auth, context, instance, type != MappingEventTypes.update_before);
+            }
+        } else {
+            context.get(MappingContextKeys.updateColumnInstance)
+                   .ifPresent(map -> {
+                       applyCreator(auth, context, map, type != MappingEventTypes.update_before);
+                   });
+        }
+
+
     }
 
-    public void applyCreator(Authentication auth, Object entity, boolean updateCreator) {
-        if (updateCreator && entity instanceof RecordCreationEntity) {
-            RecordCreationEntity e = (RecordCreationEntity) entity;
-            if (ObjectUtils.isEmpty(e.getCreatorId())) {
-                e.setCreatorId(auth.getUser().getId());
-                e.setCreatorName(auth.getUser().getName());
-            }
-            if (e.getCreateTime() == null) {
-                e.setCreateTimeNow();
+    public void applyCreator(Authentication auth,
+                             EventContext context,
+                             Object entity,
+                             boolean updateCreator) {
+        if (updateCreator) {
+            if (entity instanceof RecordCreationEntity) {
+                RecordCreationEntity e = (RecordCreationEntity) entity;
+                if (ObjectUtils.isEmpty(e.getCreatorId())) {
+                    e.setCreatorId(auth.getUser().getId());
+                    e.setCreatorName(auth.getUser().getName());
+                }
+                if (e.getCreateTime() == null) {
+                    e.setCreateTimeNow();
+                }
+            } else if (entity instanceof Map) {
+                Map<Object, Object> map = ((Map) entity);
+                map.putIfAbsent("creatorId", auth.getUser().getId());
+                map.putIfAbsent("creatorName", auth.getUser().getName());
+                map.putIfAbsent("createTime", auth.getUser().getId());
             }
 
+
         }
         if (entity instanceof RecordModifierEntity) {
             RecordModifierEntity e = (RecordModifierEntity) entity;
@@ -91,13 +111,24 @@ public class CreatorEventListener implements EventListener {
             if (e.getModifyTime() == null) {
                 e.setModifyTimeNow();
             }
+        } else if (entity instanceof Map) {
+            Map<Object, Object> map = ((Map) entity);
+            map.putIfAbsent("modifierId", auth.getUser().getId());
+            map.putIfAbsent("modifierName", auth.getUser().getName());
+            map.putIfAbsent("modifyTime", auth.getUser().getId());
+
         }
     }
 
-    public void applyCreator(Authentication auth, Collection<?> entities, boolean updateCreator) {
+    public void applyCreator(Authentication auth, EventContext context, Collection<?> entities, boolean updateCreator) {
         for (Object entity : entities) {
-            applyCreator(auth, entity, updateCreator);
+            applyCreator(auth, context, entity, updateCreator);
         }
 
     }
+
+    @Override
+    public int getOrder() {
+        return Ordered.HIGHEST_PRECEDENCE;
+    }
 }

+ 11 - 0
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/events/EntityEventListener.java

@@ -142,6 +142,17 @@ public class EntityEventListener implements EventListener {
                 .get(MappingContextKeys.updateColumnInstance)
                 .orElse(Collections.emptyMap());
 
+        List<Object> newerInstance = context
+                .get(MappingContextKeys.instance)
+                .map(instance -> {
+                    if (instance instanceof List) {
+                        return ((List) instance);
+                    }
+                    return Collections.singletonList(instance);
+                })
+                .orElse(null);
+
+
         for (Object old : olds) {
             Object data = FastBeanCopier.copy(old, mapping.newInstance());
             for (Map.Entry<String, Object> entry : columns.entrySet()) {