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/DistrictTengxunServiceImpl.java | 367 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 367 insertions(+), 0 deletions(-) diff --git a/src/main/java/com/mzl/flower/service/impl/district/DistrictTengxunServiceImpl.java b/src/main/java/com/mzl/flower/service/impl/district/DistrictTengxunServiceImpl.java new file mode 100644 index 0000000..b2ec3f5 --- /dev/null +++ b/src/main/java/com/mzl/flower/service/impl/district/DistrictTengxunServiceImpl.java @@ -0,0 +1,367 @@ +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.extension.service.impl.ServiceImpl; +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.CreateDistrictTengxunDTO; +import com.mzl.flower.dto.response.district.DistrictTengxunVO; +import com.mzl.flower.dto.response.system.AreaDTO; +import com.mzl.flower.entity.district.DistrictTengxunDO; +import com.mzl.flower.entity.district.DistrictTengxunDO; +import com.mzl.flower.mapper.district.DistrictTengxunMapper; +import com.mzl.flower.mapper.district.DistrictTengxunMapperCustom; +import com.mzl.flower.service.district.DistrictTengxunService; +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.ArrayList; +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 DistrictTengxunServiceImpl extends ServiceImpl<DistrictTengxunMapper, DistrictTengxunDO> implements DistrictTengxunService { + + @Autowired + private DistrictTengxunMapperCustom districtTengxunMapperCustom; + @Override + public void removeAllDistricts() { + districtTengxunMapperCustom.removeAllDistricts(); + } + + @Autowired + private StringCacheClient stringCacheClient; + @Override + public void refreshDistrict() { + List<DistrictTengxunDO> districtTengxunDOList = getAllDistrict(); + List<DistrictTengxunVO> districtTengxunVOList = ConverterUtil.transList(districtTengxunDOList, DistrictTengxunVO.class); + + if (CollectionUtils.isNotEmpty(districtTengxunDOList)) { + // 找出所有 parent_id 为 null 的节点作为根节点集合 + List<DistrictTengxunVO> roots = districtTengxunVOList.stream() + .filter(districtTengxunVO -> districtTengxunVO.getParentId() == null) + .collect(Collectors.toList()); + + // 遍历根节点,构建每棵树形结构 + List<AreaDTO> areaDTOList = new ArrayList<>(); + for (DistrictTengxunVO rootNode : roots) { + // 构建树形结构 + buildTree(rootNode, districtTengxunVOList); + + // 将树形转换成前端需要的结构 + AreaDTO areaDTO = transform(rootNode); + areaDTOList.add(areaDTO); + + // 打印每个根节点对应的树形 JSON + Gson gson = new Gson(); + System.out.println("根节点:" + rootNode.getName()); + System.out.println("树形结构 JSON:" + gson.toJson(areaDTO)); + } + + // 如果需要整个树形结构的 JSON + Gson gson = new Gson(); + System.out.println("整个中国地图的 JSON:" + gson.toJson(areaDTOList)); + } + + } + + + // 递归构建树形结构 + private static void buildTree(DistrictTengxunVO parent, List<DistrictTengxunVO> allNodes) { + List<DistrictTengxunVO> children = allNodes.stream() + .filter(node -> parent.getId().equals(node.getParentId())) + .collect(Collectors.toList()); + + parent.setChildren(children); + + for (DistrictTengxunVO child : children) { + buildTree(child, allNodes); + } + } + + // 转换方法 + public static AreaDTO transform(DistrictTengxunVO sourceNode) { + if (sourceNode == null) { + return null; + } + + // 映射当前节点 + AreaDTO targetNode = new AreaDTO(sourceNode.getName(), sourceNode.getName()); + + // 递归映射子节点 + if (sourceNode.getChildren() != null) { + for (DistrictTengxunVO child : sourceNode.getChildren()) { + targetNode.getChildren().add(transform(child)); + } + } + + return targetNode; + } + + + @Override + public List<DistrictTengxunDO> getAllDistrict() { + return baseMapper.selectList(new LambdaQueryWrapper<DistrictTengxunDO>().eq(DistrictTengxunDO::getDeleted, false).orderByAsc(DistrictTengxunDO::getCode)); + } + + @Override + public List<AreaDTO> getAreaDTOListByDB() { + + return null; + } + + @Override + public List<AreaDTO> getAreaDTOListByJsonFile() { + return null; + } + + @Override + public void saveRemoteDistricts(List<DistrictTengxunDO> districtTengxunDOList) { + + districtTengxunDOList.stream().forEach(districtTengxunDO -> { + // 保存数据库中必要的信息 + districtTengxunDO.create(); + districtTengxunDO.setCreateBy("system"); + districtTengxunDO.setUpdateBy("system"); + }); + + saveOrUpdateBatch(districtTengxunDOList); + /* + List<DistrictTengxunDO> existList=new ArrayList<>(); + List<DistrictTengxunDO> noneExistList=new ArrayList<>(); + + // 查看是否已经存在code,如果存在则更新,不存在则插入 + districtTengxunDOList.stream().forEach(districtTengxunDO -> { + List<DistrictTengxunDO> list = list(new LambdaQueryWrapper<DistrictTengxunDO>().eq(DistrictTengxunDO::getDeleted, false).eq(DistrictTengxunDO::getCode,districtTengxunDO.getCode() )); + if (CollectionUtils.isNotEmpty(list)) { + existList.add(districtTengxunDO); + } else { + // 插入 + noneExistList.add(districtTengxunDO); + } + }); + + + + removeAllDistricts(); + System.out.println("删除成功"); + // 保存数据入库 + saveBatch(districtTengxunDOList);*/ + System.out.println("保存成功"); + } + + @Override + public List<DistrictTengxunVO> getDistrictTreeList() { + List<DistrictTengxunDO> districtTengxunDOList = getAllDistrict(); + List<DistrictTengxunVO> districtTengxunVOList = ConverterUtil.transList(districtTengxunDOList, DistrictTengxunVO.class); + + if (CollectionUtils.isNotEmpty(districtTengxunDOList)) { + // 找出所有 parent_id 为 null 的节点作为根节点集合 + List<DistrictTengxunVO> roots = districtTengxunVOList.stream() + .filter(districtTengxunVO -> districtTengxunVO.getParentId() == null) + .collect(Collectors.toList()); + + + for (DistrictTengxunVO rootNode : roots) { + // 构建树形结构 + buildTree(rootNode, districtTengxunVOList); + + } + return roots; + } + return null; + } + + @Transactional + @Override + public boolean createDistrict(CreateDistrictTengxunDTO dto) { + + // 查看编码是否存在 + if (count(new LambdaQueryWrapper<DistrictTengxunDO>() + .eq(DistrictTengxunDO::getDeleted, false) + .eq(DistrictTengxunDO::getCode, dto.getCode()))>0) { + throw new ValidationException("当前编码已经存在,code全局唯一"); + } + // 查看相同节点下的名称是否存在,这里的partentId可能是null的情况 + + if(StringUtils.isNotBlank(dto.getName())){ + LambdaQueryWrapper<DistrictTengxunDO> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DistrictTengxunDO::getDeleted, false) + .eq(DistrictTengxunDO::getName, dto.getName()); + if (dto.getParentId() == null) { + queryWrapper.isNull(DistrictTengxunDO::getParentId); + } else { + queryWrapper.eq(DistrictTengxunDO::getParentId, dto.getParentId()); + } + if (count(queryWrapper)>0) { + throw new ValidationException("当前名称已经存在"); + } + } + + if(StringUtils.isNotBlank(dto.getFullname())){ + LambdaQueryWrapper<DistrictTengxunDO> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DistrictTengxunDO::getDeleted, false) + .eq(DistrictTengxunDO::getFullname, dto.getFullname()); + if (dto.getParentId() == null) { + queryWrapper.isNull(DistrictTengxunDO::getParentId); + } else { + queryWrapper.eq(DistrictTengxunDO::getParentId, dto.getParentId()); + } + if (count(queryWrapper)>0) { + throw new ValidationException("当前全称已经存在"); + } + } + + DistrictTengxunDO districtTengxunDO =new DistrictTengxunDO(); + BeanUtils.copyProperties(dto,districtTengxunDO); + + districtTengxunDO.setId(IdUtil.simpleUUID()); + districtTengxunDO.create(SecurityUtils.getUserId()); + + // 保存 + boolean result=save(districtTengxunDO); + // 清空缓存 + clearChineseDataCache(); + return result; + } + + @Transactional + @Override + public boolean deleteDistrict(String id) { + DistrictTengxunDO existsDistrict = getById(id); + existsDistrict.update(SecurityUtils.getUserId()); + existsDistrict.setDeleted(true); + updateById(existsDistrict); + + List<DistrictTengxunDO> childrenList = list(new LambdaQueryWrapper<DistrictTengxunDO>().eq(DistrictTengxunDO::getParentId, id)); + if(CollectionUtils.isNotEmpty(childrenList)){ + childrenList.stream().forEach(districtTengxunDO -> { + deleteDistrict(districtTengxunDO.getId()); + }); + } + // 清空缓存 + clearChineseDataCache(); + return true; + } + + @Transactional + @Override + public boolean updateDistrict(CreateDistrictTengxunDTO dto) { + DistrictTengxunDO existsDistrict = getById(dto.getId()); + if(Objects.isNull(existsDistrict)){ + throw new ValidationException("当前id不存在"); + } + + // 查看编码是否存在 + if (count(new LambdaQueryWrapper<DistrictTengxunDO>() + .eq(DistrictTengxunDO::getDeleted, false) + .eq(DistrictTengxunDO::getCode, dto.getCode()).ne(DistrictTengxunDO::getId,dto.getId()))>0) { + throw new ValidationException("当前编码已经存在,code全局唯一"); + } + // 查看相同节点下的名称是否存在,这里的partentId可能是null的情况 + + if(StringUtils.isNotBlank(dto.getName())){ + LambdaQueryWrapper<DistrictTengxunDO> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DistrictTengxunDO::getDeleted, false) + .eq(DistrictTengxunDO::getName, dto.getName()) + .ne(DistrictTengxunDO::getId,dto.getId()); + if (dto.getParentId() == null) { + queryWrapper.isNull(DistrictTengxunDO::getParentId); + } else { + queryWrapper.eq(DistrictTengxunDO::getParentId, dto.getParentId()); + } + if (count(queryWrapper)>0) { + throw new ValidationException("当前名称已经存在"); + } + } + + if(StringUtils.isNotBlank(dto.getFullname())){ + LambdaQueryWrapper<DistrictTengxunDO> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DistrictTengxunDO::getDeleted, false) + .eq(DistrictTengxunDO::getFullname, dto.getFullname()) + .ne(DistrictTengxunDO::getId,dto.getId()); + if (dto.getParentId() == null) { + queryWrapper.isNull(DistrictTengxunDO::getParentId); + } else { + queryWrapper.eq(DistrictTengxunDO::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; + } + + @Override + public String getChineseArea() { + + String result = stringCacheClient.get("CHINA_AREA_DATA"); + if (StringUtils.isNotBlank(result)) { + return result; + } else { + // 打印每个根节点对应的树形 JSON + Gson gson = new Gson(); + + List<DistrictTengxunDO> districtTengxunDOList = getAllDistrict(); + List<DistrictTengxunVO> districtTengxunVOList = ConverterUtil.transList(districtTengxunDOList, DistrictTengxunVO.class); + + if (CollectionUtils.isNotEmpty(districtTengxunDOList)) { + // 找出所有 parent_id 为 null 的节点作为根节点集合 + List<DistrictTengxunVO> roots = districtTengxunVOList.stream() + .filter(districtTengxunVO -> districtTengxunVO.getParentId() == null) + .collect(Collectors.toList()); + + // 遍历根节点,构建每棵树形结构 + List<AreaDTO> areaDTOList = new ArrayList<>(); + for (DistrictTengxunVO rootNode : roots) { + // 构建树形结构 + buildTree(rootNode, districtTengxunVOList); + + // 将树形转换成前端需要的结构 + AreaDTO areaDTO = transform(rootNode); + areaDTOList.add(areaDTO); + } + result=gson.toJson(areaDTOList); + if(StringUtils.isNotBlank(result)){ + stringCacheClient.set("CHINA_AREA_DATA", result); + } + + return result; + } + return ""; + } + + + } + + @Override + public void clearChineseDataCache() { + stringCacheClient.delete("CHINA_AREA_DATA"); + } + +} -- Gitblit v1.9.3