package com.ruoyi.member.service.impl;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.ruoyi.common.core.constant.CacheConstants;
|
import com.ruoyi.common.redis.service.RedisService;
|
import com.ruoyi.member.domain.Region;
|
import com.ruoyi.member.domain.vo.RegionVo;
|
import com.ruoyi.member.mapper.RegionMapper;
|
import com.ruoyi.member.service.IRegionService;
|
import java.util.ArrayList;
|
import java.util.Iterator;
|
import java.util.List;
|
import javax.annotation.Resource;
|
import org.springframework.stereotype.Service;
|
|
/**
|
* <p>
|
* 省市区三级联动 服务实现类
|
* </p>
|
*
|
* @author mitao
|
* @since 2024-05-21
|
*/
|
@Service
|
public class RegionServiceImpl extends ServiceImpl<RegionMapper, Region> implements IRegionService {
|
|
@Resource
|
private RegionMapper regionMapper;
|
|
@Resource
|
private RedisService redisService;
|
|
/**
|
* 列出所有城市信息的视图对象。
|
* <p>
|
* 该方法首先尝试从Redis缓存中获取城市列表,如果缓存存在则直接返回缓存数据。 如果缓存不存在,则从数据库中查询城市信息,进行处理并构建地区层级关系后,
|
* 将结果存储到Redis缓存中,并返回处理后的数据。
|
*
|
* @return 返回包含城市信息的视图对象列表,这些视图对象已经按照地区级别组织好。
|
*/
|
@Override
|
public List<RegionVo> listCityVo() {
|
if (redisService.hasKey(CacheConstants.CITY_LIST)) {
|
// 如果存在,则直接从缓存中获取并返回
|
List<RegionVo> result = redisService.getCacheList(CacheConstants.CITY_LIST);
|
return result;
|
} else {
|
// 如果不存在,则从数据库中查询并进行处理
|
List<RegionVo> regionVoList = regionMapper.listRegionVo();
|
List<RegionVo> regionVoList1 = new ArrayList<>();
|
List<RegionVo> regionVoList2 = new ArrayList<>();
|
List<RegionVo> regionVoList3 = new ArrayList<>();
|
// 将地区按照级别分别存放到不同的列表中
|
for (RegionVo regionVo : regionVoList) {
|
if (regionVo.getLevel() == 1) {
|
regionVoList1.add(regionVo);
|
}
|
if (regionVo.getLevel() == 2) {
|
regionVoList2.add(regionVo);
|
}
|
if (regionVo.getLevel() == 3) {
|
regionVoList3.add(regionVo);
|
}
|
}
|
RegionVo children;
|
Iterator<RegionVo> regionVoIterator2;
|
|
for (RegionVo regionVo : regionVoList2) {
|
if (null == regionVo.getChildren()) {
|
regionVo.setChildren(new ArrayList<>());
|
}
|
regionVoIterator2 = regionVoList3.iterator();
|
while (regionVoIterator2.hasNext()) {
|
children = regionVoIterator2.next();
|
if (regionVo.getId().equals(children.getParentId())) {
|
regionVo.getChildren().add(children);
|
regionVoIterator2.remove();
|
}
|
}
|
}
|
|
// 将第二级地区挂到第一级地区下面
|
for (RegionVo regionVo : regionVoList1) {
|
if (null == regionVo.getChildren()) {
|
regionVo.setChildren(new ArrayList<>());
|
}
|
regionVoIterator2 = regionVoList2.iterator();
|
while (regionVoIterator2.hasNext()) {
|
children = regionVoIterator2.next();
|
if (regionVo.getId().equals(children.getParentId())) {
|
regionVo.getChildren().add(children);
|
regionVoIterator2.remove();
|
}
|
}
|
}
|
// 将处理后的地区列表存入缓存中
|
redisService.setCacheList(CacheConstants.CITY_LIST, regionVoList1);
|
// 返回处理后的地区列表
|
return regionVoList1;
|
}
|
}
|
|
/**
|
* 列出所有地区信息的视图对象。
|
* <p>
|
* 该方法首先尝试从缓存中获取地区信息列表。如果缓存中不存在,则从数据库中查询地区信息, 并按照级别将地区分类,构建地区层级关系,并将处理后的地区列表存入缓存。
|
*
|
* @return 返回包含所有地区信息的视图对象列表,列表中的地区已按照级别分类并建立父子关系。
|
*/
|
@Override
|
public List<RegionVo> listRegionVo() {
|
if (redisService.hasKey(CacheConstants.REGION_LIST)) {
|
// 如果存在,则直接从缓存中获取并返回
|
List<RegionVo> result = redisService.getCacheList(CacheConstants.REGION_LIST);
|
return result;
|
} else {
|
// 如果不存在,则从数据库中查询并进行处理
|
List<RegionVo> regionVoList = regionMapper.listRegionVo();
|
List<RegionVo> regionVoList1 = new ArrayList<>();
|
List<RegionVo> regionVoList2 = new ArrayList<>();
|
List<RegionVo> regionVoList3 = new ArrayList<>();
|
// 将地区按照级别分别存放到不同的列表中
|
for (RegionVo regionVo : regionVoList) {
|
if (regionVo.getLevel() == 1) {
|
regionVoList1.add(regionVo);
|
}
|
if (regionVo.getLevel() == 2) {
|
regionVoList2.add(regionVo);
|
}
|
if (regionVo.getLevel() == 3) {
|
regionVoList3.add(regionVo);
|
}
|
}
|
Iterator<RegionVo> regionVoIterator3;
|
RegionVo children;
|
// 将第三级地区挂到第二级地区下面
|
for (RegionVo regionVo : regionVoList2) {
|
if (null == regionVo.getChildren()) {
|
regionVo.setChildren(new ArrayList<>());
|
}
|
regionVoIterator3 = regionVoList3.iterator();
|
while (regionVoIterator3.hasNext()) {
|
children = regionVoIterator3.next();
|
if (regionVo.getId().equals(children.getParentId())) {
|
regionVo.getChildren().add(children);
|
regionVoIterator3.remove();
|
}
|
}
|
}
|
Iterator<RegionVo> regionVoIterator2;
|
// 将第二级地区挂到第一级地区下面
|
for (RegionVo regionVo : regionVoList1) {
|
if (null == regionVo.getChildren()) {
|
regionVo.setChildren(new ArrayList<>());
|
}
|
regionVoIterator2 = regionVoList2.iterator();
|
while (regionVoIterator2.hasNext()) {
|
children = regionVoIterator2.next();
|
if (regionVo.getId().equals(children.getParentId())) {
|
regionVo.getChildren().add(children);
|
regionVoIterator2.remove();
|
}
|
}
|
}
|
// 将处理后的地区列表存入缓存中
|
redisService.setCacheList(CacheConstants.REGION_LIST, regionVoList1);
|
// 返回处理后的地区列表
|
return regionVoList1;
|
}
|
}
|
}
|