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 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 allDistricts = response.getResult(); // 将腾讯地图返回的数据格式转换成标准的三层结构 // List formatterDistrict =normalizeTreeToThreeLevels(allDistricts); // // List allTengxunDistricts = new ArrayList<>(); // // 递归遍历所有的节点,然后把所有节点加入到 allDistricts 列表中 // for (TengxunDistrict tengxunDistrict : formatterDistrict){ // addDistrictToList(tengxunDistrict, null, allTengxunDistricts); // 从根节点开始,父节点 ID 为 null // } // List formatterDistrict =normalizeTreeToThreeLevels(allDistricts); List allTengxunDistricts = new ArrayList<>(); // 递归遍历所有的节点,然后把所有节点加入到 allDistricts 列表中 for (TengxunDistrict tengxunDistrict : allDistricts){ addDistrictToList(tengxunDistrict, null, allTengxunDistricts); // 从根节点开始,父节点 ID 为 null } List districtTengxunDOList= ConverterUtil.transList(allTengxunDistricts, DistrictTengxunDO.class); districtTengxunService.saveRemoteDistricts(districtTengxunDOList); // for (TengxunDistrict tengxunDistrict : allTengxunDistricts) { // printDistrictInfo(tengxunDistrict); // } } } public static List normalizeTreeToThreeLevels(List tree) { List result = new ArrayList<>(); for (TengxunDistrict node : tree) { int depth = getTreeDepth(node); if(depth<3){ List 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 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 } } } }