package com.ruoyi.basic.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.entity.City;
import com.ruoyi.basic.entity.District;
import com.ruoyi.basic.entity.Province;
import com.ruoyi.basic.entity.dto.TreeSelectOption;
import com.ruoyi.basic.mapper.CityMapper;
import com.ruoyi.basic.mapper.DistrictMapper;
import com.ruoyi.basic.mapper.ProvinceMapper;
import com.ruoyi.basic.service.ProvinceService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
*
* 省表 服务实现类
*
*
* @author ruoyi
* @since 2025-05-31
*/
@Service
@RequiredArgsConstructor
public class ProvinceServiceImpl extends ServiceImpl implements ProvinceService {
@Autowired
private ProvinceMapper provinceMapper;
@Autowired
private CityMapper cityMapper;
@Autowired
private DistrictMapper districtMapper;
@Override
public List getAreaOptions() {
List res = new ArrayList<>();
// 批量查询所有省份
List provinces = provinceMapper.selectList(null);
if (provinces.isEmpty()) {
return res;
}
// 获取所有省份ID用于批量查询城市
List provinceIds = provinces.stream()
.map(Province::getId)
.collect(Collectors.toList());
// 批量查询所有城市
List allCities = cityMapper.selectList(
new LambdaQueryWrapper().in(City::getProvinceId, provinceIds));
// 将城市按省份ID分组
Map> cityMap = allCities.stream()
.collect(Collectors.groupingBy(City::getProvinceId));
// 获取所有城市ID用于批量查询区域
List cityIds = allCities.stream()
.map(City::getId)
.collect(Collectors.toList());
// 批量查询所有区域
List allDistricts = districtMapper.selectList(
new LambdaQueryWrapper().in(District::getCityId, cityIds));
// 将区域按城市ID分组
Map> districtMap = allDistricts.stream()
.collect(Collectors.groupingBy(District::getCityId));
// 构建树形结构
for (Province province : provinces) {
List cities = new ArrayList<>();
List cityList = cityMap.get(province.getId());
if (cityList != null && !cityList.isEmpty()) {
for (City city : cityList) {
List districts = new ArrayList<>();
List districtList = districtMap.get(city.getId());
if (districtList != null && !districtList.isEmpty()) {
for (District district : districtList) {
districts.add(new TreeSelectOption(district.getId().toString(),
district.getName(), district.getId(), null));
}
}
TreeSelectOption cityTreeSelectOption = new TreeSelectOption();
cityTreeSelectOption.setValue(city.getId().toString());
cityTreeSelectOption.setLabel(city.getName());
cityTreeSelectOption.setId(city.getId());
cityTreeSelectOption.setChildren(districts);
cities.add(cityTreeSelectOption);
}
}
TreeSelectOption treeSelectOption = new TreeSelectOption();
treeSelectOption.setValue(province.getId().toString());
treeSelectOption.setLabel(province.getName());
treeSelectOption.setId(province.getId());
treeSelectOption.setChildren(cities);
res.add(treeSelectOption);
}
return res;
}
@Override
public String getAreaDisplay(Long provinceId, Long cityId, Long districtId) {
Province province = provinceMapper.selectById(provinceId);
if (province == null) {
throw new RuntimeException("省不存在");
}
City city = cityMapper.selectById(cityId);
if (city == null) {
throw new RuntimeException("市不存在");
}
District district = districtMapper.selectById(districtId);
if (district == null) {
throw new RuntimeException("区不存在");
}
// 如果省和市同名
if (province.getName().equals(city.getName())) {
return province.getName() + " " + district.getName();
}
return province.getName() + city.getName() + district.getName();
}
}