Commit 18051dc8fdb9f2539f9a2ba21a4b52002270d198

Authored by kangtian
1 parent 9e93e31a

品类添加树形结构返回接口

assistant-product/src/main/java/com/diligrp/assistant/product/controller/CategoryOpenApiController.java
1 1 package com.diligrp.assistant.product.controller;
2 2  
3   -import com.diligrp.assistant.product.domain.CategoryVO;
4   -import com.diligrp.assistant.product.domain.CategoryPageQuery;
5   -import com.diligrp.assistant.product.domain.ListCategory;
  3 +import com.diligrp.assistant.product.domain.*;
6 4 import com.diligrp.assistant.product.model.Category;
7 5 import com.diligrp.assistant.product.service.ProductCategoryService;
8 6 import com.diligrp.assistant.shared.domain.Message;
... ... @@ -30,21 +28,21 @@ public class CategoryOpenApiController {
30 28 public Message<CategoryVO> findById(@RequestParam("id") Long id) {
31 29 Category category = productCategoryService.findCategoryById(id);
32 30 return Message.success(CategoryVO.of(category.getId(), category.getParentId(),
33   - category.getName(), category.getAlias(), category.getLevel(), category.getIcon(), category.getPath()));
  31 + category.getName(), category.getAlias(), category.getLevel(), category.getIcon(), category.getPath()));
34 32 }
35 33  
36 34 @RequestMapping(value = "/findParentById.do")
37 35 public Message<CategoryVO> findParentById(@RequestParam("id") Long id) {
38 36 Category category = productCategoryService.findParentCategoryById(id);
39 37 return Message.success(CategoryVO.of(category.getId(), category.getParentId(),
40   - category.getName(), category.getAlias(), category.getLevel(), category.getIcon(), category.getPath()));
  38 + category.getName(), category.getAlias(), category.getLevel(), category.getIcon(), category.getPath()));
41 39 }
42 40  
43 41 @RequestMapping(value = "/listParentsById.do")
44 42 public Message<List<CategoryVO>> listParentsById(@RequestParam("id") Long id) {
45 43 List<CategoryVO> categories = productCategoryService.listParentsById(id).stream().map(category ->
46   - CategoryVO.of(category.getId(), category.getParentId(), category.getName(), category.getAlias(),
47   - category.getLevel(), category.getIcon(), category.getPath())).collect(Collectors.toList());
  44 + CategoryVO.of(category.getId(), category.getParentId(), category.getName(), category.getAlias(),
  45 + category.getLevel(), category.getIcon(), category.getPath())).collect(Collectors.toList());
48 46 return Message.success(categories);
49 47 }
50 48  
... ... @@ -59,8 +57,8 @@ public class CategoryOpenApiController {
59 57 query.from(request.getPageNo(), request.getPageSize());
60 58  
61 59 List<CategoryVO> categories = productCategoryService.listChildrenById(query).stream().map(category ->
62   - CategoryVO.of(category.getId(), category.getParentId(), category.getName(), category.getAlias(),
63   - category.getLevel(), category.getIcon(), category.getPath())).collect(Collectors.toList());
  60 + CategoryVO.of(category.getId(), category.getParentId(), category.getName(), category.getAlias(),
  61 + category.getLevel(), category.getIcon(), category.getPath())).collect(Collectors.toList());
64 62 return Message.success(categories);
65 63 }
66 64  
... ... @@ -75,8 +73,8 @@ public class CategoryOpenApiController {
75 73 query.from(request.getPageNo(), request.getPageSize());
76 74  
77 75 List<CategoryVO> categories = productCategoryService.listCategoriesByLevel(query).stream().map(category ->
78   - CategoryVO.of(category.getId(), category.getParentId(), category.getName(), category.getAlias(),
79   - category.getLevel(), category.getIcon(), category.getPath())).collect(Collectors.toList());
  76 + CategoryVO.of(category.getId(), category.getParentId(), category.getName(), category.getAlias(),
  77 + category.getLevel(), category.getIcon(), category.getPath())).collect(Collectors.toList());
80 78 return Message.success(categories);
81 79 }
82 80  
... ... @@ -89,4 +87,14 @@ public class CategoryOpenApiController {
89 87 category.getLevel(), category.getIcon(), category.getPath())).collect(Collectors.toList());
90 88 return Message.success(categories);
91 89 }
  90 +
  91 +
  92 + @RequestMapping(value = "/amis/tree.do")
  93 + public Message<List<CategoryNodeVO>> findTree(@RequestParam(value = "term", required = false) String term) {
  94 + CategoryTreeQuery categoryTreeQuery = new CategoryTreeQuery();
  95 + categoryTreeQuery.setTerm(term);
  96 + return Message.success(productCategoryService.tree(categoryTreeQuery));
  97 + }
  98 +
  99 +
92 100 }
... ...
assistant-product/src/main/java/com/diligrp/assistant/product/dao/ProductCategoryDao.java
1 1 package com.diligrp.assistant.product.dao;
2 2  
  3 +import com.diligrp.assistant.product.domain.CategoryNodeVO;
3 4 import com.diligrp.assistant.product.domain.CategoryPageQuery;
  5 +import com.diligrp.assistant.product.domain.CategoryTreeQuery;
4 6 import com.diligrp.assistant.product.model.Category;
5 7 import com.diligrp.assistant.shared.mybatis.MybatisMapperSupport;
6 8 import org.springframework.stereotype.Repository;
... ... @@ -27,4 +29,6 @@ public interface ProductCategoryDao extends MybatisMapperSupport {
27 29 List<Category> listCategoriesByLevel(CategoryPageQuery query);
28 30  
29 31 List<Category> list(CategoryPageQuery query);
  32 +
  33 + List<CategoryNodeVO> tree(CategoryTreeQuery query);
30 34 }
... ...
assistant-product/src/main/java/com/diligrp/assistant/product/domain/CategoryNodeVO.java 0 → 100644
  1 +package com.diligrp.assistant.product.domain;
  2 +
  3 +import java.util.List;
  4 +
  5 +public class CategoryNodeVO {
  6 + // ID
  7 + private Long categoryId;
  8 + // 父品类ID
  9 + private Long parentId;
  10 + // 名称
  11 + private String categoryName;
  12 + // 级别
  13 + private Integer level;
  14 + // 路径
  15 + private String path;
  16 + //子节点
  17 + private List<CategoryNodeVO> children;
  18 +
  19 + public Long getCategoryId() {
  20 + return categoryId;
  21 + }
  22 +
  23 + public void setCategoryId(Long categoryId) {
  24 + this.categoryId = categoryId;
  25 + }
  26 +
  27 + public Long getParentId() {
  28 + return parentId;
  29 + }
  30 +
  31 + public void setParentId(Long parentId) {
  32 + this.parentId = parentId;
  33 + }
  34 +
  35 + public String getCategoryName() {
  36 + return categoryName;
  37 + }
  38 +
  39 + public void setCategoryName(String categoryName) {
  40 + this.categoryName = categoryName;
  41 + }
  42 +
  43 + public Integer getLevel() {
  44 + return level;
  45 + }
  46 +
  47 + public void setLevel(Integer level) {
  48 + this.level = level;
  49 + }
  50 +
  51 + public String getPath() {
  52 + return path;
  53 + }
  54 +
  55 + public void setPath(String path) {
  56 + this.path = path;
  57 + }
  58 +
  59 + public List<CategoryNodeVO> getChildren() {
  60 + return children;
  61 + }
  62 +
  63 + public void setChildren(List<CategoryNodeVO> children) {
  64 + this.children = children;
  65 + }
  66 +}
... ...
assistant-product/src/main/java/com/diligrp/assistant/product/domain/CategoryPageQuery.java
... ... @@ -8,6 +8,8 @@ public class CategoryPageQuery extends PageQuery {
8 8 // 区域级别
9 9 private Integer level;
10 10  
  11 + private String term;
  12 +
11 13 public Long getId() {
12 14 return id;
13 15 }
... ... @@ -23,4 +25,12 @@ public class CategoryPageQuery extends PageQuery {
23 25 public void setLevel(Integer level) {
24 26 this.level = level;
25 27 }
  28 +
  29 + public String getTerm() {
  30 + return term;
  31 + }
  32 +
  33 + public void setTerm(String term) {
  34 + this.term = term;
  35 + }
26 36 }
... ...
assistant-product/src/main/java/com/diligrp/assistant/product/domain/CategoryTreeQuery.java 0 → 100644
  1 +package com.diligrp.assistant.product.domain;
  2 +
  3 +import java.io.Serializable;
  4 +
  5 +public class CategoryTreeQuery implements Serializable {
  6 +
  7 +
  8 + private String term;
  9 +
  10 +
  11 + public String getTerm() {
  12 + return term;
  13 + }
  14 +
  15 + public void setTerm(String term) {
  16 + this.term = term;
  17 + }
  18 +}
... ...
assistant-product/src/main/java/com/diligrp/assistant/product/service/ProductCategoryService.java
1 1 package com.diligrp.assistant.product.service;
2 2  
3 3 import com.diligrp.assistant.product.domain.CategoryDTO;
  4 +import com.diligrp.assistant.product.domain.CategoryNodeVO;
4 5 import com.diligrp.assistant.product.domain.CategoryPageQuery;
  6 +import com.diligrp.assistant.product.domain.CategoryTreeQuery;
5 7 import com.diligrp.assistant.product.model.Category;
6 8  
7 9 import java.util.List;
... ... @@ -77,4 +79,13 @@ public interface ProductCategoryService {
77 79 * @return 品类
78 80 */
79 81 List<Category> list(CategoryPageQuery query);
  82 +
  83 +
  84 + /**
  85 + * 查询所有品类
  86 + *
  87 + * @param query 查询条件
  88 + * @return 品类
  89 + */
  90 + List<CategoryNodeVO> tree(CategoryTreeQuery query);
80 91 }
... ...
assistant-product/src/main/java/com/diligrp/assistant/product/service/impl/ProductCategoryServiceImpl.java
... ... @@ -2,7 +2,9 @@ package com.diligrp.assistant.product.service.impl;
2 2  
3 3 import com.diligrp.assistant.product.dao.ProductCategoryDao;
4 4 import com.diligrp.assistant.product.domain.CategoryDTO;
  5 +import com.diligrp.assistant.product.domain.CategoryNodeVO;
5 6 import com.diligrp.assistant.product.domain.CategoryPageQuery;
  7 +import com.diligrp.assistant.product.domain.CategoryTreeQuery;
6 8 import com.diligrp.assistant.product.exception.CategoryServiceException;
7 9 import com.diligrp.assistant.product.model.Category;
8 10 import com.diligrp.assistant.product.service.ProductCategoryService;
... ... @@ -13,6 +15,7 @@ import org.springframework.transaction.annotation.Transactional;
13 15  
14 16 import java.time.LocalDateTime;
15 17 import java.util.*;
  18 +import java.util.stream.Collectors;
16 19  
17 20 @Service("productCategoryService")
18 21 public class ProductCategoryServiceImpl implements ProductCategoryService {
... ... @@ -26,9 +29,9 @@ public class ProductCategoryServiceImpl implements ProductCategoryService {
26 29 LocalDateTime now = LocalDateTime.now();
27 30 Category parent = findCategoryById(request.getParentId());
28 31 Category category = Category.builder().parentId(request.getParentId()).name(request.getName())
29   - .alias(request.getAlias()).level(parent.getLevel() + 1).pyCode(request.getPyCode())
30   - .shortCode(request.getShortCode()).path(parent.getPath()).icon(request.getIcon()).state(1).version(0)
31   - .createdTime(now).modifiedTime(now).build();
  32 + .alias(request.getAlias()).level(parent.getLevel() + 1).pyCode(request.getPyCode())
  33 + .shortCode(request.getShortCode()).path(parent.getPath()).icon(request.getIcon()).state(1).version(0)
  34 + .createdTime(now).modifiedTime(now).build();
32 35 productCategoryDao.insertCategory(category);
33 36  
34 37 // 更新路径信息, 将自身ID添加到路径信息中
... ... @@ -45,8 +48,8 @@ public class ProductCategoryServiceImpl implements ProductCategoryService {
45 48 public void updateCategory(CategoryDTO request) {
46 49 LocalDateTime now = LocalDateTime.now();
47 50 Category category = Category.builder().name(request.getName())
48   - .alias(request.getAlias()).pyCode(request.getPyCode()).shortCode(request.getShortCode())
49   - .icon(request.getIcon()).modifiedTime(now).build();
  51 + .alias(request.getAlias()).pyCode(request.getPyCode()).shortCode(request.getShortCode())
  52 + .icon(request.getIcon()).modifiedTime(now).build();
50 53 category.setId(request.getId());
51 54 if (productCategoryDao.updateCategory(category) == 0) {
52 55 throw new CategoryServiceException(ErrorCode.OBJECT_NOT_FOUND, "品类不存在");
... ... @@ -74,13 +77,13 @@ public class ProductCategoryServiceImpl implements ProductCategoryService {
74 77 @Override
75 78 public Category findCategoryById(Long id) {
76 79 return productCategoryDao.findCategoryById(id).orElseThrow(() ->
77   - new CategoryServiceException(ErrorCode.OBJECT_NOT_FOUND, "品类不存在"));
  80 + new CategoryServiceException(ErrorCode.OBJECT_NOT_FOUND, "品类不存在"));
78 81 }
79 82  
80 83 @Override
81 84 public Category findParentCategoryById(Long id) {
82 85 return productCategoryDao.findParentCategoryById(id).orElseThrow(() ->
83   - new CategoryServiceException(ErrorCode.OBJECT_NOT_FOUND, "品类不存在"));
  86 + new CategoryServiceException(ErrorCode.OBJECT_NOT_FOUND, "品类不存在"));
84 87 }
85 88  
86 89 @Override
... ... @@ -119,4 +122,23 @@ public class ProductCategoryServiceImpl implements ProductCategoryService {
119 122 public List<Category> list(CategoryPageQuery query) {
120 123 return productCategoryDao.list(query);
121 124 }
  125 +
  126 + @Override
  127 + public List<CategoryNodeVO> tree(CategoryTreeQuery query) {
  128 + List<CategoryNodeVO> categoryNodeList = productCategoryDao.tree(query);
  129 + List<CategoryNodeVO> categoryTree = streamToTree(categoryNodeList, 0L);
  130 + return categoryTree;
  131 + }
  132 +
  133 + public static List<CategoryNodeVO> streamToTree(List<CategoryNodeVO> treeList, Long parentId) {
  134 + List<CategoryNodeVO> list = treeList.stream()
  135 + // 过滤父节点
  136 + .filter(parent -> parent.getParentId().equals(parentId))
  137 + // 把父节点children递归赋值成为子节点
  138 + .map(child -> {
  139 + child.setChildren(streamToTree(treeList, child.getCategoryId()));
  140 + return child;
  141 + }).collect(Collectors.toList());
  142 + return list;
  143 + }
122 144 }
... ...
assistant-product/src/main/resources/com/diligrp/assistant/dao/mapper/ProductCategoryDao.xml
... ... @@ -90,4 +90,28 @@
90 90 <select id="list" parameterType="com.diligrp.assistant.product.domain.CategoryPageQuery" resultMap="CategoryMap">
91 91 SELECT * FROM product_category ORDER BY ID
92 92 </select>
  93 +
  94 + <select id="tree" parameterType="com.diligrp.assistant.product.domain.CategoryPageQuery" resultType="com.diligrp.assistant.product.domain.CategoryNodeVO">
  95 +
  96 + WITH RECURSIVE CategoryPath AS (
  97 + SELECT
  98 + id as categoryId,parent_id as parentId,name as categoryName,level as level, path as path
  99 + FROM
  100 + product_category
  101 + <where>
  102 + state > 0
  103 + <if test="term != null">
  104 + AND name like CONCAT('%',#{term},'%')
  105 + </if>
  106 + </where>
  107 +
  108 + UNION ALL
  109 +
  110 + SELECT
  111 + c.id as categoryId,c.parent_id as parentId,c.name as categoryName,c.level as level, c.path as path
  112 + FROM product_category c
  113 + INNER JOIN CategoryPath cp ON c.id = cp.parentId
  114 + )
  115 + SELECT DISTINCT * FROM CategoryPath;
  116 + </select>
93 117 </mapper>
... ...