From 8c64e1a9d5dea7c2456a8edab5e86de0501217e8 Mon Sep 17 00:00:00 2001 From: lihongjie0209 Date: Mon, 18 Mar 2024 10:59:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E8=AE=BE=E5=A4=87=E5=88=86?= =?UTF-8?q?=E7=B1=BB=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/DeviceCategoryController.java | 13 ++++ .../dto/CreateDeviceCategoryDto.java | 1 - .../dto/DeviceCategoryTreeDto.java | 14 ++++ .../entity/DeviceCategoryEntity.java | 6 +- .../mapper/DeviceCategoryMapper.java | 13 +++- .../service/DeviceCategoryService.java | 67 +++++++++++++++++++ .../dict/tree/deviceCategoryTree.groovy | 17 +++++ 7 files changed, 124 insertions(+), 7 deletions(-) create mode 100644 src/main/java/cn/lihongjie/coal/deviceCategory/dto/DeviceCategoryTreeDto.java create mode 100644 src/main/resources/scripts/dict/tree/deviceCategoryTree.groovy diff --git a/src/main/java/cn/lihongjie/coal/deviceCategory/controller/DeviceCategoryController.java b/src/main/java/cn/lihongjie/coal/deviceCategory/controller/DeviceCategoryController.java index 96f22f81..1c68c413 100644 --- a/src/main/java/cn/lihongjie/coal/deviceCategory/controller/DeviceCategoryController.java +++ b/src/main/java/cn/lihongjie/coal/deviceCategory/controller/DeviceCategoryController.java @@ -6,6 +6,7 @@ import cn.lihongjie.coal.base.dto.CommonQuery; import cn.lihongjie.coal.base.dto.IdRequest; import cn.lihongjie.coal.deviceCategory.dto.CreateDeviceCategoryDto; import cn.lihongjie.coal.deviceCategory.dto.DeviceCategoryDto; +import cn.lihongjie.coal.deviceCategory.dto.DeviceCategoryTreeDto; import cn.lihongjie.coal.deviceCategory.dto.UpdateDeviceCategoryDto; import cn.lihongjie.coal.deviceCategory.service.DeviceCategoryService; @@ -18,6 +19,8 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + @RestController @RequestMapping("/deviceCategory") @SysLog(module = "设备分类") @@ -51,4 +54,14 @@ public class DeviceCategoryController { public Page list(@RequestBody CommonQuery request) { return this.service.list(request); } + + @PostMapping("/roots") + public List roots(@RequestBody CommonQuery request) { + return this.service.getRoots(request); + } + + @PostMapping("/treeByIds") + public List treeByIds(@RequestBody IdRequest request) { + return this.service.getTreeByIds(request); + } } diff --git a/src/main/java/cn/lihongjie/coal/deviceCategory/dto/CreateDeviceCategoryDto.java b/src/main/java/cn/lihongjie/coal/deviceCategory/dto/CreateDeviceCategoryDto.java index 22da73d2..160690e0 100644 --- a/src/main/java/cn/lihongjie/coal/deviceCategory/dto/CreateDeviceCategoryDto.java +++ b/src/main/java/cn/lihongjie/coal/deviceCategory/dto/CreateDeviceCategoryDto.java @@ -6,6 +6,5 @@ import lombok.Data; @Data public class CreateDeviceCategoryDto extends OrgCommonDto { - private String parent; } diff --git a/src/main/java/cn/lihongjie/coal/deviceCategory/dto/DeviceCategoryTreeDto.java b/src/main/java/cn/lihongjie/coal/deviceCategory/dto/DeviceCategoryTreeDto.java new file mode 100644 index 00000000..0fcbeb20 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/deviceCategory/dto/DeviceCategoryTreeDto.java @@ -0,0 +1,14 @@ +package cn.lihongjie.coal.deviceCategory.dto; + +import cn.lihongjie.coal.base.dto.OrgCommonDto; + +import lombok.Data; + +import java.util.List; + +@Data +public class DeviceCategoryTreeDto extends OrgCommonDto { + private List children; + + private String parent; +} diff --git a/src/main/java/cn/lihongjie/coal/deviceCategory/entity/DeviceCategoryEntity.java b/src/main/java/cn/lihongjie/coal/deviceCategory/entity/DeviceCategoryEntity.java index 83f20729..495ce62a 100644 --- a/src/main/java/cn/lihongjie/coal/deviceCategory/entity/DeviceCategoryEntity.java +++ b/src/main/java/cn/lihongjie/coal/deviceCategory/entity/DeviceCategoryEntity.java @@ -14,12 +14,8 @@ import java.util.List; @Data @Entity public class DeviceCategoryEntity extends OrgCommonEntity { - + @ManyToOne private DeviceCategoryEntity parent; @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL) private List children; - - @ManyToOne - private DeviceCategoryEntity parent; - } diff --git a/src/main/java/cn/lihongjie/coal/deviceCategory/mapper/DeviceCategoryMapper.java b/src/main/java/cn/lihongjie/coal/deviceCategory/mapper/DeviceCategoryMapper.java index 728898e2..d3cbcffd 100644 --- a/src/main/java/cn/lihongjie/coal/deviceCategory/mapper/DeviceCategoryMapper.java +++ b/src/main/java/cn/lihongjie/coal/deviceCategory/mapper/DeviceCategoryMapper.java @@ -5,10 +5,14 @@ import cn.lihongjie.coal.base.mapper.CommonEntityMapper; import cn.lihongjie.coal.base.mapper.CommonMapper; import cn.lihongjie.coal.deviceCategory.dto.CreateDeviceCategoryDto; import cn.lihongjie.coal.deviceCategory.dto.DeviceCategoryDto; +import cn.lihongjie.coal.deviceCategory.dto.DeviceCategoryTreeDto; import cn.lihongjie.coal.deviceCategory.dto.UpdateDeviceCategoryDto; import cn.lihongjie.coal.deviceCategory.entity.DeviceCategoryEntity; import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Mappings; +import org.mapstruct.Named; import org.mapstruct.control.DeepClone; @Mapper( @@ -20,4 +24,11 @@ public interface DeviceCategoryMapper DeviceCategoryEntity, DeviceCategoryDto, CreateDeviceCategoryDto, - UpdateDeviceCategoryDto> {} + UpdateDeviceCategoryDto> { + @Mappings({@Mapping(target = "children", qualifiedByName = "toTreeDto")}) + @Named("toTreeDto") + DeviceCategoryTreeDto toTreeDto(DeviceCategoryEntity entity); + + @Mappings({@Mapping(target = "children", ignore = true)}) + DeviceCategoryTreeDto toTreeDtoExcludeChildren(DeviceCategoryEntity entity); +} diff --git a/src/main/java/cn/lihongjie/coal/deviceCategory/service/DeviceCategoryService.java b/src/main/java/cn/lihongjie/coal/deviceCategory/service/DeviceCategoryService.java index 0cd638ad..93f77ded 100644 --- a/src/main/java/cn/lihongjie/coal/deviceCategory/service/DeviceCategoryService.java +++ b/src/main/java/cn/lihongjie/coal/deviceCategory/service/DeviceCategoryService.java @@ -3,8 +3,11 @@ package cn.lihongjie.coal.deviceCategory.service; import cn.lihongjie.coal.base.dto.CommonQuery; import cn.lihongjie.coal.base.dto.IdRequest; import cn.lihongjie.coal.base.service.BaseService; +import cn.lihongjie.coal.common.TreeUtils; +import cn.lihongjie.coal.dbFunctions.DbFunctionService; import cn.lihongjie.coal.deviceCategory.dto.CreateDeviceCategoryDto; import cn.lihongjie.coal.deviceCategory.dto.DeviceCategoryDto; +import cn.lihongjie.coal.deviceCategory.dto.DeviceCategoryTreeDto; import cn.lihongjie.coal.deviceCategory.dto.UpdateDeviceCategoryDto; import cn.lihongjie.coal.deviceCategory.entity.DeviceCategoryEntity; import cn.lihongjie.coal.deviceCategory.mapper.DeviceCategoryMapper; @@ -12,6 +15,7 @@ import cn.lihongjie.coal.deviceCategory.repository.DeviceCategoryRepository; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.convert.ConversionService; import org.springframework.data.domain.Page; @@ -20,6 +24,11 @@ import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + @Service @Slf4j @Transactional @@ -31,6 +40,8 @@ public class DeviceCategoryService @Autowired private ConversionService conversionService; + @Autowired private DbFunctionService dbFunctionService; + public DeviceCategoryDto create(CreateDeviceCategoryDto request) { DeviceCategoryEntity entity = mapper.toEntity(request); @@ -68,4 +79,60 @@ public class DeviceCategoryService return page.map(this.mapper::toDto); } + + public List getRoots(CommonQuery request) { + + if (CollectionUtils.isEmpty(request.getItems())) { + List roots = + this.repository.findAll( + (root, query, criteriaBuilder) -> + criteriaBuilder.isNull(root.get("parent"))); + return roots.stream().map(de -> this.mapper.toTreeDto(de)).collect(Collectors.toList()); + } else { + Page page = + repository.findAll( + request.specification(conversionService), + PageRequest.of( + request.getPageNo(), + request.getPageSize(), + Sort.by(request.getOrders()))); + + List selfAndParentIds = + this.dbFunctionService.selfAndParentIds( + dbFunctionService.entityToTableName(DeviceCategoryEntity.class), + page.stream().map(x -> x.getId()).collect(Collectors.toList()), + true); + + List selfAndParent = + this.findAllByIds(selfAndParentIds).stream() + .map(x -> (this.mapper.toTreeDtoExcludeChildren(x))) + .collect(Collectors.toList()); + + return StreamSupport.stream( + TreeUtils.buildTreeFromList( + selfAndParent, + DeviceCategoryTreeDto::getId, + x -> x.getParent(), + (x, y) -> { + if (x.getChildren() == null) { + x.setChildren(new ArrayList<>()); + } + x.getChildren().add(y); + return null; + }) + .spliterator(), + false) + .collect(Collectors.toList()); + } + } + + public List getTreeByIds(IdRequest request) { + if (request.getIds().isEmpty()) { + return new ArrayList<>(); + } + var roots = + this.repository.findAll( + (root, query, criteriaBuilder) -> root.get("id").in(request.getIds())); + return roots.stream().map(de -> this.mapper.toTreeDto(de)).collect(Collectors.toList()); + } } diff --git a/src/main/resources/scripts/dict/tree/deviceCategoryTree.groovy b/src/main/resources/scripts/dict/tree/deviceCategoryTree.groovy new file mode 100644 index 00000000..9f1af848 --- /dev/null +++ b/src/main/resources/scripts/dict/tree/deviceCategoryTree.groovy @@ -0,0 +1,17 @@ + +package scripts.dict + +import cn.lihongjie.coal.base.dto.CommonQuery +import cn.lihongjie.coal.deviceCategory.controller.DeviceCategoryController +import org.springframework.context.ApplicationContext + +ApplicationContext ioc = ioc + +def controller = ioc.getBean(DeviceCategoryController.class) + + + + +return controller.roots(new CommonQuery()) + +