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