zhanghua
2023-11-12 ead280567beb29e26e0980c6b3770815e6fe86d9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package com.ycl.service.region.impl;
 
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ycl.entity.region.SccgRegion;
import com.ycl.mapper.region.SccgRegionMapper;
import com.ycl.service.redis.RedisService;
import com.ycl.service.region.ISccgRegionService;
import com.ycl.utils.common.LiveTimeMillisecond;
import com.ycl.utils.redis.RedisKey;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
 
import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
 
/**
 * <p>
 * 遂昌行政区域 服务实现类
 * </p>
 *
 * @author lyq
 * @since 2022-09-16
 */
@Service
public class SccgRegionServiceImpl extends ServiceImpl<SccgRegionMapper, SccgRegion> implements ISccgRegionService {
 
    @Resource
    private SccgRegionMapper sccgRegionMapper;
    @Resource
    private RedisService redisService;
 
    @Override
    public List<SccgRegion> getTree() {
        String result = (String) redisService.get(RedisKey.SCCG_REGION);
        if (StringUtils.isBlank(result)) {
            // 1.查出所有网格
            List<SccgRegion> list = this.list();
            // 2.组装成父子的树型结构
            // 2.1、找到所有的一级网格:使用jdk8的stream流进行过滤
            List<SccgRegion> collect = list.stream().filter(griddingEntity -> {
                //分类父id为0就表示该网格为 一级网格
                return griddingEntity.getParentId() == 0;
            }).map(item -> {
                // 找到子网格 set进children属性中
                item.setChildren(getChildrens(item, list));
                return item;
            }).collect(Collectors.toList());
            List<SccgRegion> treeData = getTreeData(collect);
            redisService.set(RedisKey.SCCG_REGION, JSON.toJSONString(treeData), LiveTimeMillisecond.s3600.time);
            return treeData;
        }
        return JSON.parseArray(result, SccgRegion.class);
    }
 
 
    public List<SccgRegion> getChildrens(SccgRegion root, List<SccgRegion> all) {
        List<SccgRegion> collect = all.stream().filter(e -> {
            return e.getParentId().equals(root.getId());
        }).map(item -> {
            item.setChildren(getChildrens(item, all));
            return item;
        }).collect(Collectors.toList());
        return collect;
    }
 
    /**
     * 利用递归将最后一级空集合变为null,前端联级选择器最后才不会出现 暂无数据的bug
     *
     * @return
     */
    public List<SccgRegion> getTreeData(List<SccgRegion> e) {
        for (int i = 0; i < e.size(); i++) {
            //如果Children的size小于1就说明为空,设置为null
            if (e.get(i).getChildren().size() < 1) {
                e.get(i).setChildren(null);
            } else {
                //子网格有数据就递归
                getTreeData(e.get(i).getChildren());
            }
        }
        return e;
    }
 
    @Override
    public Page<SccgRegion> list(Integer pageSize, Integer pageNum) {
        Page<SccgRegion> page = new Page<>();
        page.setSize(pageSize);
        page.setCurrent(pageNum);
        return page(page);
    }
 
    @Override
    public List<SccgRegion> getChildren(Long parentId) {
        LambdaQueryWrapper<SccgRegion> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SccgRegion::getParentId, parentId);
        List<SccgRegion> regions = baseMapper.selectList(wrapper);
        return regions;
    }
 
    @Override
    public SccgRegion getByCode(String code) {
        LambdaQueryWrapper<SccgRegion> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SccgRegion::getRegionCode, code);
 
        return baseMapper.selectOne(wrapper);
    }
}