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