package com.ruoyi.user.service.impl;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.constant.Constants;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.user.entity.Region;
import com.ruoyi.user.mapper.RegionMapper;
import com.ruoyi.user.service.RegionService;
import com.ruoyi.user.vo.RegionVo;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
/**
*
* 省市区三级联动 服务实现类
*
*
* @author hjl
* @since 2024-06-12
*/
@Service
public class RegionServiceImpl extends ServiceImpl implements RegionService {
@Override
public Object urbanArea(String keyword) {
LambdaQueryChainWrapper wrapper = this.lambdaQuery()
.ne(Region::getParentId, Constants.ZERO);
if (StringUtils.isNotBlank(keyword)) {
wrapper.like(Region::getName, keyword);
}
// 获取所有市区信息
List reginList = wrapper.orderByAsc(Region::getId).list();
// 根据市区首字母分组排序
return newSort(reginList);
}
/**
* 获取汉字串拼音,英文字符不变
*
* @param chinese 汉字串
* @return 汉语拼音
*/
public String getFullSpell(String chinese) {
StringBuilder pybf = new StringBuilder();
char[] arr = chinese.toCharArray();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
for (char c : arr) {
if (c > 128) {
try {
pybf.append(PinyinHelper.toHanyuPinyinStringArray(c, defaultFormat)[0]);
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
} else {
pybf.append(c);
}
}
return pybf.toString();
}
private Object newSort(List reginList) {
// 按照城市名称排序,并分组
Map> map = new TreeMap<>();
for (int i = 1; i <= 26; i++) {
// 循环找出首字母一样的数据
String letter = String.valueOf((char) (96 + i)).toUpperCase();
List regionVos = new ArrayList<>();
for (Region region : reginList) {
String firstLetter = getFullSpell(region.getName()).substring(0, 1);
if (letter.equals(firstLetter)) {
RegionVo regionVo = new RegionVo(region.getName(), region.getCode());
regionVos.add(regionVo);
}
if (!regionVos.isEmpty()) {
map.put(letter, regionVos);
}
}
}
return map;
}
}