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");
|
}
|
|
}
|