对比新文件 |
| | |
| | | package com.mzl.flower.service.impl.map; |
| | | |
| | | import cn.hutool.core.util.IdUtil; |
| | | import cn.hutool.http.HttpUtil; |
| | | import com.google.gson.Gson; |
| | | import com.mzl.flower.config.TengxunMapProperties; |
| | | import com.mzl.flower.dto.map.gaode.GaodeDistrict; |
| | | import com.mzl.flower.dto.map.tengxun.TengxunDistrict; |
| | | import com.mzl.flower.dto.map.tengxun.TencentMapResponse; |
| | | import com.mzl.flower.entity.district.DistrictDO; |
| | | import com.mzl.flower.entity.district.DistrictTengxunDO; |
| | | import com.mzl.flower.service.BaseService; |
| | | import com.mzl.flower.service.district.DistrictTengxunService; |
| | | import com.mzl.flower.service.map.MapTengxunService; |
| | | import com.mzl.flower.utils.ConverterUtil; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.context.annotation.Bean; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | |
| | | @Slf4j |
| | | @Service |
| | | public class MapTengxunServiceImpl extends BaseService implements MapTengxunService { |
| | | |
| | | @Autowired |
| | | private TengxunMapProperties tengxunMapProperties; |
| | | |
| | | @Autowired |
| | | private DistrictTengxunService districtTengxunService; |
| | | |
| | | @Override |
| | | public void getAdministrativeDivision() { |
| | | String administrativeDivisionsUrl = tengxunMapProperties.getAdministrativeDivisionsUrl(); |
| | | //可以单独传入http参数,这样参数会自动做URL编码,拼接在URL中 |
| | | HashMap<String, Object> paramMap = new HashMap<>(); |
| | | |
| | | String result= HttpUtil.get(administrativeDivisionsUrl, paramMap); |
| | | System.out.println(result); |
| | | // 使用 Gson 解析 JSON 字符串 |
| | | Gson gson = new Gson(); |
| | | TencentMapResponse response = gson.fromJson(result, TencentMapResponse.class); |
| | | |
| | | if(response.getStatus()==0){ |
| | | |
| | | |
| | | List<TengxunDistrict> allDistricts = response.getResult(); |
| | | // 将腾讯地图返回的数据格式转换成标准的三层结构 |
| | | List<TengxunDistrict> formatterDistrict =normalizeTreeToThreeLevels(allDistricts); |
| | | |
| | | List<TengxunDistrict> allTengxunDistricts = new ArrayList<>(); |
| | | // 递归遍历所有的节点,然后把所有节点加入到 allDistricts 列表中 |
| | | for (TengxunDistrict tengxunDistrict : formatterDistrict){ |
| | | addDistrictToList(tengxunDistrict, null, allTengxunDistricts); // 从根节点开始,父节点 ID 为 null |
| | | } |
| | | List<DistrictTengxunDO> districtTengxunDOList= ConverterUtil.transList(allTengxunDistricts, DistrictTengxunDO.class); |
| | | |
| | | districtTengxunService.saveRemoteDistricts(districtTengxunDOList); |
| | | |
| | | |
| | | // for (TengxunDistrict tengxunDistrict : allTengxunDistricts) { |
| | | // printDistrictInfo(tengxunDistrict); |
| | | // } |
| | | |
| | | } |
| | | |
| | | } |
| | | |
| | | public static List<TengxunDistrict> normalizeTreeToThreeLevels(List<TengxunDistrict> tree) { |
| | | List<TengxunDistrict> result = new ArrayList<>(); |
| | | for (TengxunDistrict node : tree) { |
| | | int depth = getTreeDepth(node); |
| | | if(depth<3){ |
| | | List<TengxunDistrict> childrenList=new ArrayList<>(); |
| | | childrenList.add(node); |
| | | |
| | | TengxunDistrict tengxunDistrict= new TengxunDistrict(); |
| | | BeanUtils.copyProperties(node, tengxunDistrict); |
| | | tengxunDistrict.setDistricts(childrenList); |
| | | // 虚拟的id、code |
| | | tengxunDistrict.setId(tengxunDistrict.getId()+"virtual"); |
| | | // 虚拟的层级 |
| | | tengxunDistrict.setLevel(-1); |
| | | result.add(tengxunDistrict); |
| | | continue; |
| | | }else{ |
| | | result.add(node); |
| | | } |
| | | |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * 遍历树的深度 |
| | | * @param node |
| | | * @return |
| | | */ |
| | | private static int getTreeDepth(TengxunDistrict node) { |
| | | if (node == null || node.getDistricts() == null || node.getDistricts().isEmpty()) { |
| | | return 1; |
| | | } |
| | | int maxDepth = 0; |
| | | for (TengxunDistrict child : node.getDistricts()) { |
| | | maxDepth = Math.max(maxDepth, getTreeDepth(child)); |
| | | } |
| | | return maxDepth + 1; |
| | | } |
| | | |
| | | // 打印区划信息的辅助方法 |
| | | public static void printDistrictInfo(TengxunDistrict tengxunDistrict) { |
| | | System.out.println("ID: " + tengxunDistrict.getId() + ", 父节点ID: " + tengxunDistrict.getParentId()); |
| | | System.out.println("名称: " + tengxunDistrict.getName()); |
| | | System.out.println("全称: " + tengxunDistrict.getFullname()); |
| | | System.out.println("级别: " + tengxunDistrict.getLevel()); |
| | | System.out.println("拼音: " + tengxunDistrict.getPinyin()); |
| | | System.out.println("经纬度: " + tengxunDistrict.getTengxunLocation()); |
| | | System.out.println("--------------------------"); |
| | | } |
| | | |
| | | |
| | | // 递归遍历区划节点,并将它们添加到 allDistricts 列表 |
| | | public static void addDistrictToList(TengxunDistrict tengxunDistrict, String parentId, List<TengxunDistrict> allTengxunDistricts) { |
| | | // 将腾讯地图返回的id作为code存放到code中 |
| | | tengxunDistrict.setCode(tengxunDistrict.getId()); |
| | | // 如果name 是空的话,则将fullname赋值给name |
| | | if(StringUtils.isBlank(tengxunDistrict.getName())){ |
| | | tengxunDistrict.setName(tengxunDistrict.getFullname()); |
| | | } |
| | | |
| | | // tengxunDistrict.setId(IdUtil.simpleUUID()); |
| | | // 设置父节点 ID |
| | | tengxunDistrict.setParentId(parentId); |
| | | |
| | | // 将当前区划添加到结果列表 |
| | | allTengxunDistricts.add(tengxunDistrict); |
| | | |
| | | // 递归遍历子区划 |
| | | if (tengxunDistrict.getDistricts()!= null) { |
| | | for (TengxunDistrict child : tengxunDistrict.getDistricts()) { |
| | | addDistrictToList(child, tengxunDistrict.getId(), allTengxunDistricts); // 将当前节点的 ID 作为子节点的父节点 ID |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | } |