Browse Source

添加“获取全量区域树形结构”接口

wangzhijun 1 ngày trước cách đây
mục cha
commit
bd2b39f000

+ 9 - 0
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/AreaController.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ylx.massage.domain.Area;
+import com.ylx.massage.domain.vo.AreaTreeNode;
 import com.ylx.massage.service.AreaService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -15,6 +16,7 @@ import com.ylx.common.core.domain.R;
 import javax.annotation.Resource;
 import java.io.Serializable;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 区域数据(Area)表控制层
@@ -113,5 +115,12 @@ public class AreaController {
         }
         return R.ok(CollectionUtil.getFirst(list).getCode());
     }
+
+    @GetMapping("/tree")
+    @ApiOperation("获取全量区域树形结构")
+    public R<List<AreaTreeNode>> getAreaTree() {
+        List<AreaTreeNode> tree = this.areaService.getAreaTree();
+        return R.ok(tree);
+    }
 }
 

+ 17 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/AreaTreeNode.java

@@ -0,0 +1,17 @@
+package com.ylx.massage.domain.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class AreaTreeNode {
+    private Long id;
+    private String code;
+    private String name;
+    private String parentCode;
+    private Integer level;
+
+    // 子节点列表(递归核心)
+    private List<AreaTreeNode> children;
+}

+ 4 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/AreaService.java

@@ -2,6 +2,9 @@ package com.ylx.massage.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ylx.massage.domain.Area;
+import com.ylx.massage.domain.vo.AreaTreeNode;
+
+import java.util.List;
 
 /**
  * 区域数据(Area)表服务接口
@@ -11,5 +14,6 @@ import com.ylx.massage.domain.Area;
  */
 public interface AreaService extends IService<Area> {
 
+    List<AreaTreeNode> getAreaTree();
 }
 

+ 50 - 8
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/AreaServiceImpl.java

@@ -1,19 +1,61 @@
 package com.ylx.massage.service.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ylx.massage.mapper.AreaMapper;
 import com.ylx.massage.domain.Area;
+import com.ylx.massage.domain.vo.AreaTreeNode;
+import com.ylx.massage.mapper.AreaMapper;
 import com.ylx.massage.service.AreaService;
 import org.springframework.stereotype.Service;
 
-/**
- * 区域数据(Area)表服务实现类
- *
- * @author makejava
- * @since 2024-07-01 09:22:27
- */
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 @Service("areaService")
 public class AreaServiceImpl extends ServiceImpl<AreaMapper, Area> implements AreaService {
 
-}
+    /**
+     * 一次性查询所有区域,内存构建树形结构
+     */
+    @Override
+    public List<AreaTreeNode> getAreaTree() {
+        // 1. 只查询需要的字段,减少数据传输与内存占用(核心优化)
+        List<Area> areaList = this.list(Wrappers.lambdaQuery(Area.class)
+                .select(Area::getId, Area::getCode, Area::getName, Area::getParentCode, Area::getLevel)
+        );
+
+        // 2. 转树形节点(流式处理)
+        List<AreaTreeNode> allNodes = areaList.stream()
+                .map(area -> {
+                    AreaTreeNode node = new AreaTreeNode();
+                    node.setId(area.getId());
+                    node.setCode(area.getCode());
+                    node.setName(area.getName());
+                    node.setParentCode(area.getParentCode());
+                    node.setLevel(area.getLevel());
+                    node.setChildren(new ArrayList<>()); // 预先初始化,避免空指针
+                    return node;
+                })
+                .collect(Collectors.toList());
+
+        // 3. 构建 code -> node 映射(O(1) 快速查找,性能提升巨大)
+        Map<String, AreaTreeNode> nodeMap = allNodes.stream()
+                .collect(Collectors.toMap(AreaTreeNode::getCode, node -> node));
+
+        // 4. 组装父子关系(单循环,O(n) 最优复杂度)
+        for (AreaTreeNode node : allNodes) {
+            String parentCode = node.getParentCode();
+            AreaTreeNode parentNode = nodeMap.get(parentCode);
+            if (parentNode != null) {
+                parentNode.getChildren().add(node);
+            }
+        }
 
+        // 5. 只返回顶级节点(parentCode = 0)
+        return allNodes.stream()
+                .filter(node -> "0".equals(node.getParentCode()))
+                .collect(Collectors.toList());
+    }
+}