Browse Source

优化树结构

zhou-hao 4 years ago
parent
commit
487af334ac

+ 21 - 3
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/service/ReactiveTreeSortEntityService.java

@@ -1,6 +1,5 @@
 package org.hswebframework.web.crud.service;
 
-import org.hswebframework.ezorm.core.param.QueryParam;
 import org.hswebframework.ezorm.rdb.mapping.defaults.SaveResult;
 import org.hswebframework.utils.RandomUtil;
 import org.hswebframework.web.api.crud.entity.QueryParamEntity;
@@ -13,6 +12,8 @@ import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 
 import java.util.*;
+import java.util.function.Function;
+import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
 /**
@@ -30,13 +31,17 @@ public interface ReactiveTreeSortEntityService<E extends TreeSortSupportEntity<K
     default Mono<List<E>> queryResultToTree(QueryParamEntity paramEntity) {
         return query(paramEntity)
                 .collectList()
-                .map(list -> TreeSupportEntity.list2tree(list, this::setChildren, this::isRootNode));
+                .map(list -> TreeSupportEntity.list2tree(list,
+                        this::setChildren,
+                        this::createRootNodePredicate));
     }
 
     default Mono<List<E>> queryIncludeChildrenTree(QueryParamEntity paramEntity) {
         return queryIncludeChildren(paramEntity)
                 .collectList()
-                .map(list -> TreeSupportEntity.list2tree(list, this::setChildren, this::isRootNode));
+                .map(list -> TreeSupportEntity.list2tree(list,
+                        this::setChildren,
+                        this::createRootNodePredicate));
     }
 
     default Flux<E> queryIncludeChildren(Collection<K> idList) {
@@ -115,6 +120,19 @@ public interface ReactiveTreeSortEntityService<E extends TreeSortSupportEntity<K
         return entity.getChildren();
     }
 
+    default Predicate<E> createRootNodePredicate(TreeSupportEntity.TreeHelper<E, K> helper) {
+        return node -> {
+            if (isRootNode(node)) {
+                return true;
+            }
+            //有父节点,但是父节点不存在
+            if (!StringUtils.isEmpty(node.getParentId())) {
+                return helper.getNode(node.getParentId()) == null;
+            }
+            return false;
+        };
+    }
+
     default boolean isRootNode(E entity) {
         return StringUtils.isEmpty(entity.getParentId()) || "-1".equals(String.valueOf(entity.getParentId()));
     }

+ 0 - 4
hsweb-commons/hsweb-commons-crud/src/test/java/org/hswebframework/web/crud/service/TestTreeSortEntityService.java

@@ -25,9 +25,5 @@ public class TestTreeSortEntityService extends GenericReactiveCrudService<TestTr
         return entity.getChildren();
     }
 
-    @Override
-    public boolean isRootNode(TestTreeSortEntity entity) {
-        return entity.getParentId()==null;
-    }
 
 }

+ 3 - 2
hsweb-core/src/main/java/org/hswebframework/web/context/ContextUtils.java

@@ -11,8 +11,7 @@ import java.util.function.Function;
  */
 public class ContextUtils {
 
-    private static ThreadLocal<Context> contextThreadLocal = ThreadLocal.withInitial(MapContext::new);
-
+    private static final ThreadLocal<Context> contextThreadLocal = ThreadLocal.withInitial(MapContext::new);
 
     public static Context currentContext() {
         return contextThreadLocal.get();
@@ -23,6 +22,8 @@ public class ContextUtils {
                 .<Context>handle((context, sink) -> {
                     if (context.hasKey(Context.class)) {
                         sink.next(context.get(Context.class));
+                    }else {
+                        sink.complete();
                     }
                 })
                 .subscriberContext(acceptContext(ctx -> {