|
@@ -1,19 +1,61 @@
|
|
|
package com.ylx.massage.service.impl;
|
|
package com.ylx.massage.service.impl;
|
|
|
|
|
|
|
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
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.Area;
|
|
|
|
|
+import com.ylx.massage.domain.vo.AreaTreeNode;
|
|
|
|
|
+import com.ylx.massage.mapper.AreaMapper;
|
|
|
import com.ylx.massage.service.AreaService;
|
|
import com.ylx.massage.service.AreaService;
|
|
|
import org.springframework.stereotype.Service;
|
|
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")
|
|
@Service("areaService")
|
|
|
public class AreaServiceImpl extends ServiceImpl<AreaMapper, Area> implements 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());
|
|
|
|
|
+ }
|
|
|
|
|
+}
|