소스 검색

递归地址

yangyb 2 주 전
부모
커밋
37512b9d47

+ 8 - 0
operating-service/src/main/java/com/txz/operating/controller/DivisionsController.java

@@ -6,6 +6,7 @@ import com.txz.operating.core.ResultCode;
 import com.txz.operating.model.Divisions;
 import com.txz.operating.result.Result;
 import com.txz.operating.service.DivisionsService;
+import com.txz.operating.web.vo.AreaTreeVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
@@ -120,4 +121,11 @@ public class DivisionsController {
         }
         return Result.success(pageInfo);
     }
+
+    @PostMapping("/treeList")
+    @ApiOperation(value = "获取树列表")
+    public Result<List<AreaTreeVo>> treeList(@RequestParam(required = false) String name) {
+        List<AreaTreeVo> treedList = divisionsService.treeList(name);
+        return Result.success(treedList);
+    }
 }

+ 9 - 0
operating-service/src/main/java/com/txz/operating/service/DivisionsService.java

@@ -2,6 +2,9 @@ package com.txz.operating.service;
 
 import com.txz.operating.core.Service;
 import com.txz.operating.model.Divisions;
+import com.txz.operating.web.vo.AreaTreeVo;
+
+import java.util.List;
 
 
 /**
@@ -9,4 +12,10 @@ import com.txz.operating.model.Divisions;
  */
 public interface DivisionsService extends Service<Divisions> {
 
+    /**
+     * 树形列表
+     *
+     * @return
+     */
+    List<AreaTreeVo> treeList(String name);
 }

+ 143 - 1
operating-service/src/main/java/com/txz/operating/service/impl/DivisionsServiceImpl.java

@@ -1,13 +1,29 @@
 package com.txz.operating.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.txz.operating.core.AbstractService;
 import com.txz.operating.dao.DivisionsMapper;
+import com.txz.operating.model.Districts;
 import com.txz.operating.model.Divisions;
+import com.txz.operating.model.Unions;
+import com.txz.operating.model.Upazilas;
+import com.txz.operating.service.DistrictsService;
 import com.txz.operating.service.DivisionsService;
+import com.txz.operating.service.UnionsService;
+import com.txz.operating.service.UpazilasService;
+import com.txz.operating.web.vo.AreaTreeVo;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import tk.mybatis.mapper.entity.Condition;
+import tk.mybatis.mapper.entity.Example;
 
 import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
 
 
 /**
@@ -17,6 +33,132 @@ import javax.annotation.Resource;
 @Transactional
 public class DivisionsServiceImpl extends AbstractService<Divisions> implements DivisionsService {
     @Resource
-    private DivisionsMapper oDivisionsMapper;
+    private DivisionsMapper divisionsMapper;
+    @Resource
+    private DistrictsService districtsService;
+    @Resource
+    private UpazilasService upazilasService;
+    @Resource
+    private UnionsService unionsService;
+
+    @Override
+    public List<AreaTreeVo> treeList(String name) {
+        List<Divisions> allTree = findAll();
+        if (CollectionUtils.isEmpty(allTree)) {
+            return Collections.emptyList();
+        }
+        // 获取所有树
+        List<AreaTreeVo> treeVoList = allTree.stream()
+                .map(divisions -> {
+                    AreaTreeVo vo = new AreaTreeVo();
+                    BeanUtil.copyProperties(divisions, vo);
+                    vo.setLevel(1);
+                    return vo;
+                })
+                .collect(Collectors.toList());
+
+        // 如果传入了code,则只返回该code下的树形结构,否则返回所有顶级节点的树形结构
+        if (StringUtils.isNotBlank(name)) {
+            // 查找指定code的节点
+            AreaTreeVo root = treeVoList.stream()
+                    .filter(vo -> name.equals(vo.getName()))
+                    .findFirst()
+                    .orElse(null);
+            if (root == null) {
+                Districts districts = districtsService.findBy("name", name);
+                if (districts != null) {
+                    root = new AreaTreeVo();
+                    BeanUtil.copyProperties(districts, root);
+                    root.setLevel(2);
+                }
+            }
+            if (root == null) {
+                Upazilas upazilas = upazilasService.findBy("name", name);
+                if (upazilas != null) {
+                    root = new AreaTreeVo();
+                    BeanUtil.copyProperties(upazilas, root);
+                    root.setLevel(3);
+                }
+            }
+            if (root == null) {
+                Unions unions = unionsService.findBy("name", name);
+                if (unions != null) {
+                    root = new AreaTreeVo();
+                    BeanUtil.copyProperties(unions, root);
+                    root.setLevel(4);
+                }
+            }
+            if (root == null) {
+                return Collections.emptyList();
+            }
+            // 递归构建该节点下的所有子树
+            buildTree(root);
+            return Collections.singletonList(root);
+        } else {
+            // 为每个顶级节点递归构建子树
+            for (AreaTreeVo root : treeVoList) {
+                buildTree(root);
+            }
+            return treeVoList;
+        }
+    }
+
+    private void buildTree(AreaTreeVo parent) {
+        List<AreaTreeVo> children = new ArrayList<>();
+        if (parent.getLevel() == 1) {
+            // 二级的时候查询districts(乡镇/街道)
+            Condition districtsCondition = new Condition(Districts.class);
+            Example.Criteria distriCtscriteria = districtsCondition.createCriteria();
+            distriCtscriteria.andEqualTo("divisionId", parent.getId());
+            districtsCondition.setOrderByClause("id ASC");
+            children = districtsService.findByCondition(districtsCondition).stream()
+                    .map(districts -> {
+                        AreaTreeVo vo = new AreaTreeVo();
+                        BeanUtil.copyProperties(districts, vo);
+                        vo.setLevel(2);
+                        return vo;
+                    })
+                    .collect(Collectors.toList());
+        } else if (parent.getLevel() == 2) {
+            Condition upazilasCondition = new Condition(Upazilas.class);
+            Example.Criteria upazilasCriteria = upazilasCondition.createCriteria();
+            upazilasCriteria.andEqualTo("districtId", parent.getId());
+            upazilasCondition.setOrderByClause("id ASC");
+            children = upazilasService.findByCondition(upazilasCondition).stream()
+                    .map(upazilas -> {
+                        AreaTreeVo vo = new AreaTreeVo();
+                        BeanUtil.copyProperties(upazilas, vo);
+                        vo.setLevel(3);
+                        return vo;
+                    })
+                    .collect(Collectors.toList());
+        } else if (parent.getLevel() == 3) {
+            // 四级的时候查询unions(具体地点)
+            Condition unionsCondition = new Condition(Unions.class);
+            Example.Criteria unionsCriteria = unionsCondition.createCriteria();
+            unionsCriteria.andEqualTo("upazillaId", parent.getId());
+            unionsCondition.setOrderByClause("id ASC");
+            children = unionsService.findByCondition(unionsCondition).stream()
+                    .map(unions -> {
+                        AreaTreeVo vo = new AreaTreeVo();
+                        BeanUtil.copyProperties(unions, vo);
+                        vo.setLevel(4);
+                        return vo;
+                    })
+                    .collect(Collectors.toList());
+        }
+
+        if (parent.getChild() == null) {
+            parent.setChild(new ArrayList<>());
+        }
+        if (CollectionUtils.isNotEmpty(children)) {
+            // 设置子节点
+            parent.setChild(children);
 
+            // 递归构建每个子节点的子树
+            for (AreaTreeVo child : children) {
+                buildTree(child);
+            }
+        }
+    }
 }

+ 24 - 0
operating-service/src/main/java/com/txz/operating/web/vo/AreaTreeVo.java

@@ -0,0 +1,24 @@
+package com.txz.operating.web.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class AreaTreeVo {
+
+    private Long id;
+
+    @ApiModelProperty("内容")
+    private String name;
+
+    @ApiModelProperty("内容")
+    private String bnName;
+
+    @ApiModelProperty("等级")
+    private Integer level;
+
+    @ApiModelProperty("下级")
+    private List<AreaTreeVo> child;
+}