diff --git a/hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/service/ReactiveTreeSortEntityService.java b/hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/service/ReactiveTreeSortEntityService.java index dfa6caeae..e49225f1b 100644 --- a/hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/service/ReactiveTreeSortEntityService.java +++ b/hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/service/ReactiveTreeSortEntityService.java @@ -32,16 +32,16 @@ public interface ReactiveTreeSortEntityService TreeSupportEntity.list2tree(list, - this::setChildren, - this::createRootNodePredicate)); + this::setChildren, + this::createRootNodePredicate)); } default Mono> queryIncludeChildrenTree(QueryParamEntity paramEntity) { return queryIncludeChildren(paramEntity) .collectList() .map(list -> TreeSupportEntity.list2tree(list, - this::setChildren, - this::createRootNodePredicate)); + this::setChildren, + this::createRootNodePredicate)); } default Flux queryIncludeChildren(Collection idList) { @@ -68,11 +68,11 @@ public interface ReactiveTreeSortEntityService insertBatch(Publisher> entityPublisher) { return this.getRepository() - .insertBatch(Flux.from(entityPublisher) - .flatMap(Flux::fromIterable) - .flatMap(this::applyTreeProperty) - .flatMap(e -> Flux.fromIterable(TreeSupportEntity.expandTree2List(e, getIDGenerator()))) - .collectList()); + .insertBatch(Flux.from(entityPublisher) + .flatMap(Flux::fromIterable) + .flatMap(this::applyTreeProperty) + .flatMap(e -> Flux.fromIterable(TreeSupportEntity.expandTree2List(e, getIDGenerator()))) + .collectList()); } default Mono applyTreeProperty(E ele) { @@ -80,25 +80,39 @@ public interface ReactiveTreeSortEntityService ele.setPath(parent.getPath() + "-" + RandomUtil.randomChar(4))) - .thenReturn(ele); + + return this.checkCyclicDependency(ele.getId(), ele) + .then(this.findById(ele.getParentId()) + .doOnNext(parent -> ele.setPath(parent.getPath() + "-" + RandomUtil.randomChar(4)))) + .thenReturn(ele); + } + + //校验是否有循环依赖,修改父节点为自己的子节点? + default Mono checkCyclicDependency(K id, E ele) { + return this + .queryIncludeChildren(Collections.singletonList(id)) + .doOnNext(e -> { + if (Objects.equals(ele.getParentId(), e.getId())) { + throw new IllegalArgumentException("不能修改父节点为自己或者自己的子节点"); + } + }) + .then(Mono.just(ele)); } @Override default Mono save(Publisher entityPublisher) { return this.getRepository() - .save(Flux.from(entityPublisher) - .flatMap(this::applyTreeProperty) - //把树结构平铺 - .flatMap(e -> Flux.fromIterable(TreeSupportEntity.expandTree2List(e, getIDGenerator()))) - ); + .save(Flux.from(entityPublisher) + .flatMap(this::applyTreeProperty) + //把树结构平铺 + .flatMap(e -> Flux.fromIterable(TreeSupportEntity.expandTree2List(e, getIDGenerator()))) + ); } @Override default Mono updateById(K id, Mono entityPublisher) { - return save(entityPublisher - .doOnNext(e -> e.setId(id))) + return this + .save(entityPublisher.doOnNext(e -> e.setId(id))) .map(SaveResult::getTotal); }