Pārlūkot izejas kodu

优化树结构

zhou-hao 5 gadi atpakaļ
vecāks
revīzija
3c168ff844

+ 17 - 0
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/service/GenericReactiveTreeSupportCrudService.java

@@ -0,0 +1,17 @@
+package org.hswebframework.web.crud.service;
+
+import org.hswebframework.ezorm.rdb.mapping.ReactiveRepository;
+import org.hswebframework.web.api.crud.entity.TreeSortSupportEntity;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public abstract class GenericReactiveTreeSupportCrudService<E extends TreeSortSupportEntity<K>, K> implements ReactiveTreeSortEntityService<E, K> {
+
+    @Autowired
+    private ReactiveRepository<E, K> repository;
+
+    @Override
+    public ReactiveRepository<E, K> getRepository() {
+        return repository;
+    }
+
+}

+ 7 - 2
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/service/ReactiveTreeSortEntityService.java

@@ -14,6 +14,11 @@ import reactor.core.publisher.Mono;
 import java.util.*;
 import java.util.stream.Collectors;
 
+/**
+ * @param <E> TreeSortSupportEntity
+ * @param <K> ID
+ * @see GenericReactiveTreeSupportCrudService
+ */
 public interface ReactiveTreeSortEntityService<E extends TreeSortSupportEntity<K>, K>
         extends ReactiveCrudService<E, K> {
 
@@ -59,8 +64,8 @@ public interface ReactiveTreeSortEntityService<E extends TreeSortSupportEntity<K
         return this.getRepository()
                 .insertBatch(Flux.from(entityPublisher)
                         .flatMap(Flux::fromIterable)
-                        .flatMap(e -> Flux.fromIterable(TreeSupportEntity.expandTree2List(e, getIDGenerator())))
                         .flatMap(this::applyTreeProperty)
+                        .flatMap(e -> Flux.fromIterable(TreeSupportEntity.expandTree2List(e, getIDGenerator())))
                         .collectList());
     }
 
@@ -78,9 +83,9 @@ public interface ReactiveTreeSortEntityService<E extends TreeSortSupportEntity<K
     default Mono<SaveResult> save(Publisher<E> entityPublisher) {
         return this.getRepository()
                 .save(Flux.from(entityPublisher)
+                        .flatMap(this::applyTreeProperty)
                         //把树结构平铺
                         .flatMap(e -> Flux.fromIterable(TreeSupportEntity.expandTree2List(e, getIDGenerator())))
-                        .flatMap(this::applyTreeProperty)
                 );
     }
 

+ 18 - 14
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/service/DefaultDimensionService.java

@@ -8,6 +8,8 @@ import org.hswebframework.ezorm.rdb.mapping.defaults.SaveResult;
 import org.hswebframework.web.authorization.DimensionProvider;
 import org.hswebframework.web.authorization.DimensionType;
 import org.hswebframework.web.crud.service.GenericReactiveCrudService;
+import org.hswebframework.web.crud.service.GenericReactiveTreeSupportCrudService;
+import org.hswebframework.web.crud.service.ReactiveCrudService;
 import org.hswebframework.web.crud.service.ReactiveTreeSortEntityService;
 import org.hswebframework.web.id.IDGenerator;
 import org.hswebframework.web.system.authorization.api.entity.AuthorizationSettingEntity;
@@ -26,8 +28,8 @@ import java.util.function.Function;
 import java.util.stream.Collectors;
 
 public class DefaultDimensionService
-        extends GenericReactiveCrudService<DimensionEntity, String>
-        implements ReactiveTreeSortEntityService<DimensionEntity, String>,
+        extends GenericReactiveTreeSupportCrudService<DimensionEntity, String>
+        implements
         DimensionProvider {
 
     @Autowired
@@ -121,22 +123,24 @@ public class DefaultDimensionService
 
     @Override
     public Mono<Integer> deleteById(Publisher<String> idPublisher) {
+
         return Flux.from(idPublisher)
                 .collectList()
-                .flatMap(list -> super.deleteById(Flux.fromIterable(list))
-                        .then(dimensionUserRepository.createDelete() //删除维度用户关联
+                .flatMap(list -> super.queryIncludeChildren(list)
+                        .flatMap(dimension -> dimensionUserRepository.createDelete() //删除维度用户关联
                                 .where()
-                                .in(DimensionUserEntity::getDimensionId, list)
-                                .execute())
-                        .then(findById(Flux.fromIterable(list))
-                                .groupBy(DimensionEntity::getTypeId, DimensionEntity::getId)//按维度类型分组
-                                .flatMap(grouping -> grouping.collectList()
-                                        .flatMap(dimensionId -> settingRepository //删除权限设置
-                                                .createDelete()
-                                                .where(AuthorizationSettingEntity::getDimensionType, grouping.key())
-                                                .in(AuthorizationSettingEntity::getDimensionTarget, dimensionId).execute()))
-                                .collect(Collectors.summarizingInt(Integer::intValue))
+                                .is(DimensionUserEntity::getDimensionId, dimension.getId())
+                                .execute()
+                                .then(getRepository().deleteById(Mono.just(dimension.getId())))
+                                .thenReturn(dimension)
                         )
+                        .groupBy(DimensionEntity::getTypeId, DimensionEntity::getId)//按维度类型分组
+                        .flatMap(grouping -> grouping.collectList()
+                                .flatMap(dimensionId -> settingRepository //删除权限设置
+                                        .createDelete()
+                                        .where(AuthorizationSettingEntity::getDimensionType, grouping.key())
+                                        .in(AuthorizationSettingEntity::getDimensionTarget, dimensionId).execute()))
+                        .collect(Collectors.summarizingInt(Integer::intValue))
                         .doOnSuccess((r) -> eventPublisher.publishEvent(ClearUserAuthorizationCacheEvent.all()))
                         .thenReturn(list.size()));
     }