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;
/**
*
* 对接高德地图行政区划 服务实现类
*
*
* @author @TaoJie
* @since 2024-12-19
*/
@Service
public class DistrictServiceImpl extends ServiceImpl implements DistrictService {
@Autowired
private DistrictMapperCustom districtMapperCustom;
@Autowired
private StringCacheClient stringCacheClient;
@Override
public void removeAllDistricts() {
districtMapperCustom.removeAllDistricts();
}
@Override
public void refreshDistrict() {
// 获取所有的数据,并组织成树形结构
List districtDOList = getAllDistrict();
List districtVOList= ConverterUtil.transList(districtDOList, DistrictVO.class);
if(CollectionUtils.isNotEmpty(districtDOList)){
// 找出parent_id 是null的为根节点
Optional 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 allNodes) {
List 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 getAllDistrict() {
return baseMapper.selectList(new LambdaQueryWrapper().eq(DistrictDO::getDeleted, false).orderByAsc(DistrictDO::getAdcode));
}
@Override
public List getAreaDTOListByDB() {
return null;
}
@Override
public List getAreaDTOListByJsonFile() {
return null;
}
@Override
public void saveRemoteDistricts(List districtDOList) {
// 先把所有数据放入缓存
removeAllDistricts();
districtDOList.stream().forEach(districtDO -> {
districtDO.create();
districtDO.setCreateBy("system");
districtDO.setUpdateBy("system");
});
// 保存数据入库
saveBatch(districtDOList);
// saveOrUpdateBatch(districtDOList)
}
@Override
public List getDistrictTreeList() {
// 获取所有的数据,并组织成树形结构
List districtDOList = getAllDistrict();
List districtVOList= ConverterUtil.transList(districtDOList, DistrictVO.class);
if(CollectionUtils.isNotEmpty(districtDOList)){
// 找出parent_id 是null的为根节点
Optional 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 queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DistrictDO::getDeleted, false).eq(DistrictDO::getAdcode,"100000");
List list = list(queryWrapper);
if(CollectionUtils.isNotEmpty(list)){
DistrictDO districtDO = list.get(0);
dto.setParentId(districtDO.getId());
}
}
if(StringUtils.isNotBlank(dto.getName())){
LambdaQueryWrapper 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 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 childrenList = list(new LambdaQueryWrapper().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 districtDOList = getAllDistrict();
List districtVOList= ConverterUtil.transList(districtDOList, DistrictVO.class);
if(CollectionUtils.isNotEmpty(districtDOList)){
// 找出parent_id 是null的为根节点
Optional 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");
}
}