| package com.moral.api.service.impl; | 
|   | 
| import com.alibaba.fastjson.JSON; | 
| import com.alibaba.fastjson.JSONObject; | 
| import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | 
| 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 lombok.extern.slf4j.Slf4j; | 
| 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 | 
| @Slf4j | 
| 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; | 
|     } | 
|   | 
|     @Override | 
|     public SysArea select(Integer code) { | 
|         QueryWrapper<SysArea> wrapper = new QueryWrapper<>(); | 
|         wrapper.eq("area_code",code); | 
|         SysArea sysArea = sysAreaMapper.selectOne(wrapper); | 
|         return sysArea; | 
|     } | 
|   | 
|     /** | 
|      * 查询除了乡镇以外的地区 | 
|      * | 
|      * @return | 
|      */ | 
|     @Override | 
|     public List<SysArea> queryCity() { | 
|         //取出所有地区 | 
|         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集合 | 
|         } | 
|         //遍历所有城市,判断是否有父城市,如果有则添加到父城市中。 | 
|         int i=0; | 
|         for (SysArea sysArea : sysAreas) { | 
|             Integer parentCode = sysArea.getParentCode(); | 
|             String s = sysArea.getAreaCode().toString(); | 
|             if (!parentCode.equals(0)) { | 
|                 if (s.length()>7){ | 
|                     continue; | 
|                 } | 
|                 SysArea parentArea = areaMap.get(parentCode); | 
|                 if (ObjectUtils.isEmpty(parentArea)){ | 
|                     continue; | 
|                 } | 
|                 List<SysArea> children = parentArea.getChildren(); | 
|                 children.add(sysArea); | 
| //                parentArea.getChildren().add(sysArea); | 
|             } | 
|         } | 
|         //移除集合中非父顶级城市 | 
|         sysAreas.removeIf(new Predicate<SysArea>() { | 
|             @Override | 
|             public boolean test(SysArea sysArea) { | 
|                 if (sysArea.getParentCode().equals(0)) | 
|                     return false; | 
|                 return true; | 
|             } | 
|         }); | 
|         return sysAreas; | 
|     } | 
|   | 
|     @Override | 
|     public List<SysArea> selectCode(Integer code) { | 
|         QueryWrapper<SysArea> wrapper = new QueryWrapper<>(); | 
|         wrapper.eq("parent_code",code); | 
|         List<SysArea> sysAreas = sysAreaMapper.selectList(wrapper); | 
|         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); | 
|                 if (ObjectUtils.isEmpty(parentArea)){ | 
|                     continue; | 
|                 } | 
|                 List<SysArea> children = parentArea.getChildren(); | 
|                 children.add(sysArea); | 
| //                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; | 
|     } | 
|   | 
|   | 
| } |