package com.whdc.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.whdc.mapper.AdinfoMapper;
import com.whdc.model.entity.Adinfo;
import com.whdc.model.vo.AdcdTree;
import com.whdc.service.IAdinfoService;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
/**
*
* 服务实现类
*
* @author xusan
* @date 2024-05-11
*/
@Service
public class AdinfoServiceImpl extends ServiceImpl implements IAdinfoService {
@Override
public IPage page(Adinfo dto) {
return baseMapper.page(new Page<>(), dto);
}
@Override
public List find(Adinfo dto) {
return baseMapper.find(dto);
}
/**
* 行政区划树型查询
* 420116,001,002,000
* 6位区县,9位街道,12位组
* 省 市 县
* 42 28 22 100 011 100
*
* @param adcd
* @return
*/
// @Cacheable(cacheNames = {REDIS_KEY}, key = "getMethodName()", condition = "#adcd", unless = "false", cacheResolver = "redisExpireCacheResolver")
public List tree(String adcd, String adnm) {
List list = treeList(adcd, adnm);
if (CollectionUtils.isNotEmpty(list)){
list = list.stream().sorted(Comparator.comparing(Adinfo::getAdcd)
.reversed()
).collect(Collectors.toList());
}
// 市 4205 00000000000
Map> city = new HashMap<>();
// 县 421122 000000000
Map> county = new HashMap<>();
List tree = new ArrayList<>();
for (Adinfo adinfo : list) {
String ad = adinfo.getAdcd();
String nm = adinfo.getAdnm();
AdcdTree adcdTree = new AdcdTree().setAdcd(ad).setAdnm(nm).setAdcdChildren(new ArrayList<>());
// 判断行政区划编码
String provinceStr = ad.substring(0, 2);
String cityStr = ad.substring(0, 4);
if ("00000000000".equals(ad.substring(4))) { // 市
adcdTree.setAdlevel(1);
adcdTree.setAdcdChildren(county.get(cityStr));
addTree(city, provinceStr, adcdTree);
} else if ("000000000".equals(ad.substring(6))) { // 县
adcdTree.setAdlevel(2);
addTree(county, cityStr, adcdTree);
}
}
// 排序
return sorted(tree);
}
public List treeList(String adcd, String adnm) {
if(StringUtils.isNotBlank(adcd) && adcd.endsWith("0000000000000")){
adcd = adcd.substring(0,2);
}
if (StringUtils.isNotBlank(adcd) && StringUtils.isNotBlank(adnm)) {
// 需要查出层级数据
return baseMapper.selectByCdOrNm(adcd, adnm);
} else {
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
if (StringUtils.isNotBlank(adcd)) {
queryWrapper.like(Adinfo::getAdcd, adcd);
}
List adinfos = baseMapper.selectList(queryWrapper);
return adinfos; // 查所有
}
}
private List sorted( List tree) {
List sorteds = null;
if (CollectionUtils.isNotEmpty(tree)){
sorteds = tree.stream().sorted(Comparator.comparing(AdcdTree::getAdcd)
).collect(Collectors.toList());
sorteds.forEach(o->{
o.setAdcdChildren(sorted(o.getAdcdChildren()));
});
}
return sorteds;
}
private void addTree(Map> data, String key, AdcdTree tree) {
List trees = data.get(key);
if (CollectionUtils.isEmpty(trees)) {
trees = new ArrayList<>();
}
trees.add(tree);
data.put(key, trees);
}
}