From 8ddec1fa60bdbd2d970cff7b4bf2ae5b4ded1627 Mon Sep 17 00:00:00 2001 From: 陶杰 <1378534974@qq.com> Date: 星期日, 29 十二月 2024 14:58:28 +0800 Subject: [PATCH] 1.腾讯地图:定时任务每天凌晨5点 --- src/main/java/com/mzl/flower/service/impl/district/DistrictServiceImpl.java | 303 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 303 insertions(+), 0 deletions(-) diff --git a/src/main/java/com/mzl/flower/service/impl/district/DistrictServiceImpl.java b/src/main/java/com/mzl/flower/service/impl/district/DistrictServiceImpl.java new file mode 100644 index 0000000..9eebb91 --- /dev/null +++ b/src/main/java/com/mzl/flower/service/impl/district/DistrictServiceImpl.java @@ -0,0 +1,303 @@ +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; + +/** + * <p> + * 对接高德地图行政区划 服务实现类 + * </p> + * + * @author @TaoJie + * @since 2024-12-19 + */ +@Service +public class DistrictServiceImpl extends ServiceImpl<DistrictMapper, DistrictDO> implements DistrictService { + + @Autowired + private DistrictMapperCustom districtMapperCustom; + + @Autowired + private StringCacheClient stringCacheClient; + @Override + public void removeAllDistricts() { + districtMapperCustom.removeAllDistricts(); + } + + @Override + public void refreshDistrict() { + // 获取所有的数据,并组织成树形结构 + List<DistrictDO> districtDOList = getAllDistrict(); + List<DistrictVO> districtVOList= ConverterUtil.transList(districtDOList, DistrictVO.class); + if(CollectionUtils.isNotEmpty(districtDOList)){ + // 找出parent_id 是null的为根节点 + Optional<DistrictVO> 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<DistrictVO> allNodes) { + List<DistrictVO> 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<DistrictDO> getAllDistrict() { + return baseMapper.selectList(new LambdaQueryWrapper<DistrictDO>().eq(DistrictDO::getDeleted, false).orderByAsc(DistrictDO::getAdcode)); + } + + @Override + public List<AreaDTO> getAreaDTOListByDB() { + return null; + } + + @Override + public List<AreaDTO> getAreaDTOListByJsonFile() { + return null; + } + + @Override + public void saveRemoteDistricts(List<DistrictDO> districtDOList) { + // 先把所有数据放入缓存 + removeAllDistricts(); + + districtDOList.stream().forEach(districtDO -> { + districtDO.create(); + districtDO.setCreateBy("system"); + districtDO.setUpdateBy("system"); + }); + // 保存数据入库 + saveBatch(districtDOList); + +// saveOrUpdateBatch(districtDOList) + } + + @Override + public List<DistrictVO> getDistrictTreeList() { + // 获取所有的数据,并组织成树形结构 + List<DistrictDO> districtDOList = getAllDistrict(); + List<DistrictVO> districtVOList= ConverterUtil.transList(districtDOList, DistrictVO.class); + if(CollectionUtils.isNotEmpty(districtDOList)){ + // 找出parent_id 是null的为根节点 + Optional<DistrictVO> 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<DistrictDO> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DistrictDO::getDeleted, false).eq(DistrictDO::getAdcode,"100000"); + List<DistrictDO> list = list(queryWrapper); + if(CollectionUtils.isNotEmpty(list)){ + DistrictDO districtDO = list.get(0); + dto.setParentId(districtDO.getId()); + } + + } + + if(StringUtils.isNotBlank(dto.getName())){ + LambdaQueryWrapper<DistrictDO> 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<DistrictDO> 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<DistrictDO> childrenList = list(new LambdaQueryWrapper<DistrictDO>().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<DistrictDO> districtDOList = getAllDistrict(); + List<DistrictVO> districtVOList= ConverterUtil.transList(districtDOList, DistrictVO.class); + if(CollectionUtils.isNotEmpty(districtDOList)){ + // 找出parent_id 是null的为根节点 + Optional<DistrictVO> 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"); + } + +} -- Gitblit v1.9.3