VisitLogService.java 6.67 KB
Newer Older
张辰's avatar
张辰 committed
1 2 3
package com.tanpu.community.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
王亚雷's avatar
王亚雷 committed
4
import com.google.common.collect.Lists;
张辰's avatar
张辰 committed
5
import com.tanpu.biz.common.enums.clue.PageEnum;
刘基明's avatar
刘基明 committed
6
import com.tanpu.community.api.enums.DeleteTagEnum;
刘基明's avatar
刘基明 committed
7
import com.tanpu.community.cache.RedisCache;
刘基明's avatar
刘基明 committed
8
import com.tanpu.community.dao.entity.community.TimesCountEntity;
刘基明's avatar
刘基明 committed
9 10
import com.tanpu.community.dao.entity.community.VisitLogEntity;
import com.tanpu.community.dao.mapper.community.VisitLogMapper;
张辰's avatar
张辰 committed
11
import lombok.extern.slf4j.Slf4j;
刘基明's avatar
刘基明 committed
12
import org.apache.commons.collections4.CollectionUtils;
张辰's avatar
张辰 committed
13
import org.apache.commons.collections4.ListUtils;
刘基明's avatar
刘基明 committed
14
import org.apache.commons.lang3.StringUtils;
张辰's avatar
张辰 committed
15
import org.apache.commons.lang3.time.DateUtils;
张辰's avatar
张辰 committed
16
import org.springframework.stereotype.Service;
刘基明's avatar
刘基明 committed
17
import org.springframework.transaction.annotation.Transactional;
张辰's avatar
张辰 committed
18 19

import javax.annotation.Resource;
张辰's avatar
张辰 committed
20
import java.util.Date;
刘基明's avatar
刘基明 committed
21
import java.util.HashMap;
刘基明's avatar
刘基明 committed
22
import java.util.List;
刘基明's avatar
刘基明 committed
23
import java.util.Map;
张辰's avatar
张辰 committed
24
import java.util.stream.Collectors;
张辰's avatar
张辰 committed
25

王亚雷's avatar
王亚雷 committed
26
import static com.tanpu.biz.common.enums.clue.PageEnum.*;
27

张辰's avatar
张辰 committed
28 29
@Slf4j
@Service
刘基明's avatar
刘基明 committed
30
public class VisitLogService {
张辰's avatar
张辰 committed
31 32

    @Resource
刘基明's avatar
刘基明 committed
33
    private VisitLogMapper visitLogMapper;
张辰's avatar
张辰 committed
34

刘基明's avatar
刘基明 committed
35 36 37
    @Resource
    private RedisCache redisCache;

张辰's avatar
张辰 committed
38 39 40 41
    // 获取用户7天内访问过的
    public List<String> queryUserRecentVisited(String userId) {
        Date endDate = new Date();
        Date startDate = DateUtils.addDays(endDate, -7);
张辰's avatar
张辰 committed
42
        List<String> visited = visitLogMapper.selectRefIdByVisitorIdAndCreateBetween(userId, startDate, endDate);
张辰's avatar
张辰 committed
43 44 45
        return visited;
    }

46
    // 从refIds中去掉用户已经访问过的
张辰's avatar
张辰 committed
47 48 49 50
    public List<String> filterUserNotVisited(String userId, List<String> refIds) {
        if (refIds.isEmpty()) {
            return refIds;
        }
刘基明's avatar
刘基明 committed
51 52 53 54
        List<String> visited = visitLogMapper.selectList(new LambdaQueryWrapper<VisitLogEntity>()
                .eq(VisitLogEntity::getVisitorId, userId)
                .in(VisitLogEntity::getRefId, refIds))
                .stream().map(VisitLogEntity::getRefId).distinct().collect(Collectors.toList());
张辰's avatar
张辰 committed
55 56
        return ListUtils.subtract(refIds, visited);
    }
刘基明's avatar
刘基明 committed
57

刘基明's avatar
刘基明 committed
58
    public List<String> queryUserVisited(String userId) {
刘基明's avatar
刘基明 committed
59 60 61
        List<String> visited = visitLogMapper.selectList(new LambdaQueryWrapper<VisitLogEntity>()
                .eq(VisitLogEntity::getVisitorId, userId))
                .stream().map(VisitLogEntity::getRefId).distinct().collect(Collectors.toList());
刘基明's avatar
刘基明 committed
62 63 64
        return visited;
    }

张辰's avatar
张辰 committed
65 66

    @Transactional
刘基明's avatar
刘基明 committed
67
    public void insertOrUpdateDur(VisitLogEntity vs) {
刘基明's avatar
刘基明 committed
68
        // 分布式锁
刘基明's avatar
刘基明 committed
69
        for (int i = 0; i < 5 * 10; i++) {
刘基明's avatar
刘基明 committed
70
            String key = getVisitLogRedisKey(vs);
刘基明's avatar
刘基明 committed
71 72
            String rand = String.valueOf((int) Math.floor(Math.random() * 100));
            if (redisCache.setIfAbsent(key, rand, 15)) {
刘基明's avatar
刘基明 committed
73 74 75
                if (visitLogMapper.selectByIdentAndRefId(vs.getIdent(), vs.getRefId(), vs.getRefType()) == null) {
                    visitLogMapper.insert(vs);
                } else {
刘基明's avatar
刘基明 committed
76
                    visitLogMapper.updateDurByIdent(vs.getDuration(), vs.getIdent(), vs.getRefId(), vs.getRefType());
刘基明's avatar
刘基明 committed
77
                }
刘基明's avatar
刘基明 committed
78
                redisCache.evict(key + ":" + rand);
刘基明's avatar
刘基明 committed
79 80
                return;
            }
刘基明's avatar
刘基明 committed
81 82 83 84 85
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
张辰's avatar
张辰 committed
86 87 88
        }
    }

刘基明's avatar
刘基明 committed
89 90 91 92
    private String getVisitLogRedisKey(VisitLogEntity vs) {
        return StringUtils.join("insertOrUpdateDur:", vs.getIdent().substring(0, 4), vs.getRefId(), vs.getRefType());
    }

刘基明's avatar
刘基明 committed
93 94
    @Transactional
    //TODO 临时埋点,接入新埋点后删除
95
    public void addPageView(String userId, String targetId, PageEnum type) {
刘基明's avatar
刘基明 committed
96
        visitLogMapper.insert(VisitLogEntity.builder()
刘基明's avatar
刘基明 committed
97 98
                .visitorId(userId)
                .refId(targetId)
99
                .refType(type.getId())
刘基明's avatar
刘基明 committed
100 101 102 103
                .duration(0)
                .build());
    }

张辰's avatar
张辰 committed
104 105
    // 查询话题 详细页面 浏览量
    public Integer queryTopicDetailVisit(String topicId) {
刘基明's avatar
刘基明 committed
106 107
        return visitLogMapper.selectCount(new LambdaQueryWrapper<VisitLogEntity>()
                .eq(VisitLogEntity::getRefId, topicId)
王亚雷's avatar
王亚雷 committed
108
                .in(VisitLogEntity::getRefType, Lists.newArrayList(COMM_VISIT_TOPIC_DETAIL_HOT.getId(), COMM_VISIT_TOPIC_DETAIL_NEW.getId())));
刘基明's avatar
刘基明 committed
109 110 111 112
    }

    // 查询主题 浏览量
    public Integer queryThemeVisit(String theme) {
刘基明's avatar
刘基明 committed
113 114
        return visitLogMapper.selectCount(new LambdaQueryWrapper<VisitLogEntity>()
                .eq(VisitLogEntity::getRefId, theme)
张辰's avatar
张辰 committed
115
                .eq(VisitLogEntity::getRefType, PageEnum.COMM_VISIT_THEME.getId()));
刘基明's avatar
刘基明 committed
116 117 118 119
    }

    // 查询主题 浏览量
    public Integer queryThemeVisit(List<String> themes) {
刘基明's avatar
刘基明 committed
120
        if (CollectionUtils.isEmpty(themes)) {
刘基明's avatar
刘基明 committed
121 122
            return 0;
        }
刘基明's avatar
刘基明 committed
123 124
        return visitLogMapper.selectCount(new LambdaQueryWrapper<VisitLogEntity>()
                .in(VisitLogEntity::getRefId, themes)
张辰's avatar
张辰 committed
125
                .eq(VisitLogEntity::getRefType, PageEnum.COMM_VISIT_THEME.getId()));
张辰's avatar
张辰 committed
126
    }
张辰's avatar
张辰 committed
127

刘基明's avatar
刘基明 committed
128

刘基明's avatar
刘基明 committed
129
    //统计行为集合的浏览量
张辰's avatar
张辰 committed
130
    public Map<String, Integer> getCountMapByTargetIds(List<String> refIds, String refType) {
刘基明's avatar
刘基明 committed
131
        if (CollectionUtils.isEmpty(refIds)) {
刘基明's avatar
刘基明 committed
132 133
            return new HashMap<>();
        }
刘基明's avatar
刘基明 committed
134
        LambdaQueryWrapper<VisitLogEntity> wrapper = (new LambdaQueryWrapper<VisitLogEntity>()
刘基明's avatar
刘基明 committed
135
                .in(VisitLogEntity::getRefId, refIds))
刘基明's avatar
刘基明 committed
136
                .eq(VisitLogEntity::getDeleteTag, DeleteTagEnum.NOT_DELETED)
张辰's avatar
张辰 committed
137
                .eq(VisitLogEntity::getRefType, refType)
刘基明's avatar
刘基明 committed
138 139
                .groupBy(VisitLogEntity::getRefId);
        return visitLogMapper.selectCountByThemeIds(wrapper).stream()
刘基明's avatar
刘基明 committed
140 141
                .collect(Collectors.toMap(TimesCountEntity::getId, TimesCountEntity::getTimes));
    }
刘基明's avatar
刘基明 committed
142

刘基明's avatar
刘基明 committed
143 144 145 146 147 148 149 150 151 152 153 154 155 156
    //统计行为集合的浏览量
    public Map<String, Integer> getCountMapByTargetIds(List<String> refIds, List<String> refTypes) {
        if (CollectionUtils.isEmpty(refIds)) {
            return new HashMap<>();
        }
        LambdaQueryWrapper<VisitLogEntity> wrapper = (new LambdaQueryWrapper<VisitLogEntity>()
                .in(VisitLogEntity::getRefId, refIds))
                .eq(VisitLogEntity::getDeleteTag, DeleteTagEnum.NOT_DELETED)
                .in(VisitLogEntity::getRefType, refTypes)
                .groupBy(VisitLogEntity::getRefId);
        return visitLogMapper.selectCountByThemeIds(wrapper).stream()
                .collect(Collectors.toMap(TimesCountEntity::getId, TimesCountEntity::getTimes));
    }

刘基明's avatar
刘基明 committed
157 158 159 160 161 162 163 164
    // 查询讨论区最近浏览
    public Integer queryLastTopicVisit(String theme) {
        return visitLogMapper.selectCount(new LambdaQueryWrapper<VisitLogEntity>()
                .eq(VisitLogEntity::getRefId, theme)
                .eq(VisitLogEntity::getRefType, PageEnum.COMM_VISIT_THEME.getId()));
    }


张辰's avatar
张辰 committed
165
}