|
@@ -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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|