package com.moral.api.service.impl;
|
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONObject;
|
import com.moral.api.entity.SysArea;
|
import com.moral.api.mapper.SysAreaMapper;
|
import com.moral.api.service.SysAreaService;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.stereotype.Service;
|
import org.springframework.util.ObjectUtils;
|
|
import java.util.ArrayList;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.function.Predicate;
|
|
/**
|
* <p>
|
* 系统区域表 服务实现类
|
* </p>
|
*
|
* @author moral
|
* @since 2021-04-07
|
*/
|
@Service
|
public class SysAreaServiceImpl extends ServiceImpl<SysAreaMapper, SysArea> implements SysAreaService {
|
|
@Autowired
|
SysAreaMapper sysAreaMapper;
|
|
@Autowired
|
RedisTemplate redisTemplate;
|
|
@Override
|
public List<SysArea> querySysArea() {
|
List<SysArea> sysAreas = redisTemplate.opsForList().range("sysArea", 0, -1);
|
if (ObjectUtils.isEmpty(sysAreas)) {
|
sysAreas = querySysAreaFromDB();
|
}
|
return sysAreas;
|
}
|
|
|
private List<SysArea> querySysAreaFromDB() {
|
//取出所有地区
|
List<SysArea> sysAreas = sysAreaMapper.selectList(null);
|
//创建Map key为地区码 value为地区对象 供组装使用
|
Map<Integer, SysArea> areaMap = new HashMap<>();
|
for (SysArea sysArea : sysAreas) {
|
areaMap.put(sysArea.getAreaCode(), sysArea);
|
sysArea.setChildren(new ArrayList<>());//初始化children集合
|
}
|
//遍历所有城市,判断是否有父城市,如果有则添加到父城市中。
|
for (SysArea sysArea : sysAreas) {
|
Integer parentCode = sysArea.getParentCode();
|
if (!parentCode.equals(0)) {
|
SysArea parentArea = areaMap.get(parentCode);
|
parentArea.getChildren().add(sysArea);
|
}
|
}
|
//移除集合中非父顶级城市
|
sysAreas.removeIf(new Predicate<SysArea>() {
|
@Override
|
public boolean test(SysArea sysArea) {
|
if (sysArea.getParentCode().equals(0))
|
return false;
|
return true;
|
}
|
});
|
//存入缓存
|
redisTemplate.opsForList().rightPushAll("sysArea",sysAreas);
|
|
return sysAreas;
|
}
|
|
|
}
|