package com.mzl.flower.service.impl.district; import cn.hutool.core.util.IdUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.google.gson.Gson; import com.mzl.flower.base.cache.StringCacheClient; import com.mzl.flower.config.exception.ValidationException; import com.mzl.flower.config.security.SecurityUtils; import com.mzl.flower.dto.request.district.CreateDistrictGaodeDTO; import com.mzl.flower.dto.response.district.DistrictVO; import com.mzl.flower.dto.response.system.AreaDTO; import com.mzl.flower.entity.district.DistrictDO; import com.mzl.flower.entity.district.DistrictTengxunDO; import com.mzl.flower.mapper.district.DistrictMapper; import com.mzl.flower.mapper.district.DistrictMapperCustom; import com.mzl.flower.service.district.DistrictService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.mzl.flower.utils.ConverterUtil; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; /** *

* 对接高德地图行政区划 服务实现类 *

* * @author @TaoJie * @since 2024-12-19 */ @Service public class DistrictServiceImpl extends ServiceImpl implements DistrictService { @Autowired private DistrictMapperCustom districtMapperCustom; @Autowired private StringCacheClient stringCacheClient; @Override public void removeAllDistricts() { districtMapperCustom.removeAllDistricts(); } @Override public void refreshDistrict() { // 获取所有的数据,并组织成树形结构 List districtDOList = getAllDistrict(); List districtVOList= ConverterUtil.transList(districtDOList, DistrictVO.class); if(CollectionUtils.isNotEmpty(districtDOList)){ // 找出parent_id 是null的为根节点 Optional root = districtVOList.stream().filter(districtVO -> districtVO.getParentId() == null).findFirst(); // 遍历districtDOList,形成树形结构 if(null!=root && root.isPresent()){ DistrictVO rootNode = root.get(); // 构建树形结构 buildTree(rootNode, districtVOList); // 查看这里的树形状结构,将这里的树型转换成之前前端使用的结构 AreaDTO areaDTO = transform(rootNode); Gson gson=new Gson(); System.out.println("整个中国地图的json"); System.out.println(gson.toJson(areaDTO)); System.out.println("整个中国地图下城市的json"); System.out.println(gson.toJson(areaDTO.getChildren())); } } // 根据id和partent_id 构造出行政区划字典 // AreaDTO areaDTO = AreaDTO.build(districtDOList); } // 递归构建树形结构 private static void buildTree(DistrictVO parent, List allNodes) { List children = allNodes.stream() .filter(node -> parent.getId().equals(node.getParentId())) .collect(Collectors.toList()); parent.setChildren(children); for (DistrictVO child : children) { buildTree(child, allNodes); } } // 转换方法 public static AreaDTO transform(DistrictVO sourceNode) { if (sourceNode == null) { return null; } // 映射当前节点 AreaDTO targetNode = new AreaDTO(sourceNode.getName(), sourceNode.getName()); // 递归映射子节点 if (sourceNode.getChildren() != null) { for (DistrictVO child : sourceNode.getChildren()) { targetNode.getChildren().add(transform(child)); } } return targetNode; } @Override public List getAllDistrict() { return baseMapper.selectList(new LambdaQueryWrapper().eq(DistrictDO::getDeleted, false).orderByAsc(DistrictDO::getAdcode)); } @Override public List getAreaDTOListByDB() { return null; } @Override public List getAreaDTOListByJsonFile() { return null; } @Override public void saveRemoteDistricts(List districtDOList) { // 先把所有数据放入缓存 removeAllDistricts(); districtDOList.stream().forEach(districtDO -> { districtDO.create(); districtDO.setCreateBy("system"); districtDO.setUpdateBy("system"); }); // 保存数据入库 saveBatch(districtDOList); // saveOrUpdateBatch(districtDOList) } @Override public List getDistrictTreeList() { // 获取所有的数据,并组织成树形结构 List districtDOList = getAllDistrict(); List districtVOList= ConverterUtil.transList(districtDOList, DistrictVO.class); if(CollectionUtils.isNotEmpty(districtDOList)){ // 找出parent_id 是null的为根节点 Optional root = districtVOList.stream().filter(districtVO -> districtVO.getParentId() == null).findFirst(); // 遍历districtDOList,形成树形结构 if(null!=root && root.isPresent()){ DistrictVO rootNode = root.get(); // 构建树形结构 buildTree(rootNode, districtVOList); return rootNode.getChildren(); } } return null; } @Transactional @Override public boolean createDistrict(CreateDistrictGaodeDTO dto) { // 查看相同节点下的名称是否存在,这里的partentId可能是null的情况 if(StringUtils.isBlank(dto.getParentId())){ // 获取根节点 adcode=100000 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(DistrictDO::getDeleted, false).eq(DistrictDO::getAdcode,"100000"); List list = list(queryWrapper); if(CollectionUtils.isNotEmpty(list)){ DistrictDO districtDO = list.get(0); dto.setParentId(districtDO.getId()); } } if(StringUtils.isNotBlank(dto.getName())){ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(DistrictDO::getDeleted, false).eq(DistrictDO::getName, dto.getName()); if (dto.getParentId() == null) { queryWrapper.isNull(DistrictDO::getParentId); } else { queryWrapper.eq(DistrictDO::getParentId, dto.getParentId()); } if (count(queryWrapper)>0) { throw new ValidationException("当前名称已经存在"); } } DistrictDO districtDO =new DistrictDO(); BeanUtils.copyProperties(dto,districtDO); districtDO.setId(IdUtil.simpleUUID()); districtDO.create(SecurityUtils.getUserId()); boolean result= save(districtDO); // 清空缓存 clearChineseDataCache(); return result; } @Transactional @Override public boolean updateDistrict(CreateDistrictGaodeDTO dto) { DistrictDO existsDistrict = getById(dto.getId()); if(Objects.isNull(existsDistrict)){ throw new ValidationException("当前id不存在"); } if(StringUtils.isNotBlank(dto.getName())){ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(DistrictDO::getDeleted, false) .eq(DistrictDO::getName, dto.getName()) .ne(DistrictDO::getId,dto.getId()); if (dto.getParentId() == null) { queryWrapper.isNull(DistrictDO::getParentId); } else { queryWrapper.eq(DistrictDO::getParentId, dto.getParentId()); } if (count(queryWrapper)>0) { throw new ValidationException("当前名称已经存在"); } } BeanUtils.copyProperties(dto, existsDistrict); existsDistrict.update(SecurityUtils.getUserId()); boolean result= updateById(existsDistrict); // 清空缓存 clearChineseDataCache(); return result; } @Transactional @Override public boolean deleteDistrict(String id) { DistrictDO existsDistrict = getById(id); existsDistrict.update(SecurityUtils.getUserId()); existsDistrict.setDeleted(true); updateById(existsDistrict); List childrenList = list(new LambdaQueryWrapper().eq(DistrictDO::getParentId, id)); if(CollectionUtils.isNotEmpty(childrenList)){ childrenList.stream().forEach(districtTengxunDO -> { deleteDistrict(districtTengxunDO.getId()); }); } // 清空缓存 clearChineseDataCache(); return true; } @Override public String getChineseArea() { String result = stringCacheClient.get("CHINA_AREA_DATA"); if (StringUtils.isNotBlank(result)) { return result; } else { List districtDOList = getAllDistrict(); List districtVOList= ConverterUtil.transList(districtDOList, DistrictVO.class); if(CollectionUtils.isNotEmpty(districtDOList)){ // 找出parent_id 是null的为根节点 Optional root = districtVOList.stream().filter(districtVO -> districtVO.getParentId() == null).findFirst(); // 遍历districtDOList,形成树形结构 if(null!=root && root.isPresent()){ DistrictVO rootNode = root.get(); // 构建树形结构 buildTree(rootNode, districtVOList); // 查看这里的树形状结构,将这里的树型转换成之前前端使用的结构 AreaDTO areaDTO = transform(rootNode); Gson gson=new Gson(); result=gson.toJson(areaDTO.getChildren()); // System.out.println(result); if(StringUtils.isNotBlank(result)){ stringCacheClient.set("CHINA_AREA_DATA", result); } return result; } } return null; } } @Override public void clearChineseDataCache() { stringCacheClient.delete("CHINA_AREA_DATA"); } }