package cn.cslg.pas.service; import cn.cslg.pas.common.model.dto.AreaAddressDTO; import cn.cslg.pas.domain.Area; import cn.cslg.pas.mapper.AreaMapper; import cn.cslg.pas.common.utils.CacheUtils; import cn.cslg.pas.common.utils.PatentUtils; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.lang.tree.TreeNode; import cn.hutool.core.lang.tree.TreeNodeConfig; import cn.hutool.core.lang.tree.TreeUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; /** *

* 省市县表 服务实现类 *

* * @author 王岩 * @since 2021-12-30 */ @Service @RequiredArgsConstructor(onConstructor_ = {@Lazy}) public class AreaService extends ServiceImpl { private final CacheUtils cacheUtils; public List getAreaByIds(List ids) { if (ids == null || ids.size() == 0) { return new ArrayList<>(); } LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(Area::getId, ids); return this.list(queryWrapper); } public List getAreaList() { List treeNodes = cacheUtils.getAreaTreeList(); if (treeNodes == null) { List dataList = this.list(); dataList.stream().filter(item -> item.getLevel() == 1).forEach(item -> item.setParentId(0)); TreeNodeConfig treeNodeConfig = new TreeNodeConfig(); treeNodeConfig.setWeightKey("order"); List> nodeList = CollUtil.newArrayList(); for (Area data : dataList) { nodeList.add(new TreeNode<>(data.getId(), data.getParentId(), data.getName(), 0)); } List> treeList = TreeUtil.build(nodeList, 0, treeNodeConfig, (treeNode, tree) -> { Area temp = dataList.stream().filter(item -> item.getId().equals(treeNode.getId())).findFirst().orElse(new Area()); tree.setId(treeNode.getId()); tree.setParentId(treeNode.getParentId()); tree.setWeight(treeNode.getWeight()); tree.setName(treeNode.getName()); tree.putExtra("level", temp.getLevel()); }); treeNodes = cacheUtils.setAreaTreeList(treeList); } return treeNodes; } public List getAreaCitiesName(String name) { List temp = this.list(Wrappers.lambdaQuery().eq(Area::getName, name).orderByAsc(Area::getLevel)); Integer id = temp.get(temp.size() == 1 ? 0 : temp.size() - 1).getId(); return this.list(Wrappers.lambdaQuery().eq(Area::getParentId, id)).stream().map(Area::getName).collect(Collectors.toList()); } public Area getAreaByNameAndLevel(String name, Integer level) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Area::getName, name); queryWrapper.eq(Area::getLevel, level); return this.getOne(queryWrapper); } public List getAreaByNameListAndLevel(List nameList, Integer level) { if (nameList == null || nameList.size() == 0) { return new ArrayList<>(); } LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(Area::getName, nameList); queryWrapper.eq(Area::getLevel, level); return this.list(queryWrapper); } public Area getAreaByParentIdAndName(Integer parentId, String name) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Area::getName, name); queryWrapper.eq(Area::getParentId, parentId); return this.getOne(queryWrapper); } public AreaAddressDTO getAreaAddressDTO(String address) { AreaAddressDTO dto = new AreaAddressDTO(); dto.setProvinceName(PatentUtils.formatAddress(address, 1)); dto.setCityName(PatentUtils.formatAddress(address, 2)); dto.setAreaName(PatentUtils.formatAddress(address, 3)); Area province = this.getAreaByNameAndLevel(dto.getProvinceName(), 1); if (province != null) { dto.setProvinceId(province.getId()); } if (province != null) { Area city = this.getAreaByParentIdAndName(province.getId(), PatentUtils.CHARTERED_CITIES.contains(dto.getProvinceName()) ? dto.getProvinceName() : dto.getCityName()); if (city != null) { dto.setCityId(city.getId()); Area area = this.getAreaByParentIdAndName(city.getId(), dto.getAreaName()); if (area != null) { dto.setAreaId(area.getId()); } } } return dto; } }