liyong
63 分钟以前 7a23c450f3ac85de7dca1b908de273ff636ce218
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package cn.iocoder.yudao.module.im.service.statistics;
 
import cn.hutool.core.convert.Convert;
import cn.iocoder.yudao.module.im.dal.mysql.statistics.ImStatisticsManagerMapper;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
 
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
 
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
 
/**
 * IM 数据看板 Service 实现类
 *
 * @author 芋道源码
 */
@Service
@Validated
public class ImStatisticsManagerServiceImpl implements ImStatisticsManagerService {
 
    @Resource
    private ImStatisticsManagerMapper statisticsMapper;
 
    // ==================== 用户 ====================
 
    @Override
    public Long getTotalUserCount() {
        return statisticsMapper.selectTotalUserCount();
    }
 
    @Override
    public Long getNewUserCount(LocalDateTime beginTime, LocalDateTime endTime) {
        return statisticsMapper.selectNewUserCount(beginTime, endTime);
    }
 
    @Override
    public Long getActiveUserCount(LocalDateTime beginTime, LocalDateTime endTime) {
        return statisticsMapper.selectActiveUserCount(beginTime, endTime);
    }
 
    @Override
    public Map<LocalDateTime, Long> getNewUserDailyCountMap(LocalDateTime beginTime, LocalDateTime endTime) {
        List<Map<String, Object>> rows = statisticsMapper.selectNewUserDailyCount(beginTime, endTime);
        return toDailyCountMap(rows);
    }
 
    @Override
    public Map<LocalDateTime, Long> getActiveUserDailyCountMap(LocalDateTime beginTime, LocalDateTime endTime) {
        List<Map<String, Object>> rows = statisticsMapper.selectActiveUserDailyCount(beginTime, endTime);
        return toDailyCountMap(rows);
    }
 
    // ==================== 群 ====================
 
    @Override
    public Long getTotalGroupCount() {
        return statisticsMapper.selectTotalGroupCount();
    }
 
    @Override
    public Long getNewGroupCount(LocalDateTime beginTime, LocalDateTime endTime) {
        return statisticsMapper.selectNewGroupCount(beginTime, endTime);
    }
 
    @Override
    public Map<String, Long> getGroupSizeCountMap() {
        List<Map<String, Object>> rows = statisticsMapper.selectGroupSizeDistribution();
        return convertMap(rows,
                row -> (String) row.get("range"),
                row -> Convert.toLong(row.get("count")));
    }
 
    // ==================== 消息 ====================
 
    @Override
    public Long getPrivateMessageCount(LocalDateTime beginTime, LocalDateTime endTime) {
        return statisticsMapper.selectPrivateMessageCount(beginTime, endTime);
    }
 
    @Override
    public Long getGroupMessageCount(LocalDateTime beginTime, LocalDateTime endTime) {
        return statisticsMapper.selectGroupMessageCount(beginTime, endTime);
    }
 
    @Override
    public Map<LocalDateTime, Long> getPrivateMessageDailyCountMap(LocalDateTime beginTime, LocalDateTime endTime) {
        List<Map<String, Object>> rows = statisticsMapper.selectPrivateMessageDailyCount(beginTime, endTime);
        return toDailyCountMap(rows);
    }
 
    @Override
    public Map<LocalDateTime, Long> getGroupMessageDailyCountMap(LocalDateTime beginTime, LocalDateTime endTime) {
        List<Map<String, Object>> rows = statisticsMapper.selectGroupMessageDailyCount(beginTime, endTime);
        return toDailyCountMap(rows);
    }
 
    @Override
    public Map<Integer, Long> getMessageTypeCountMap(LocalDateTime beginTime, LocalDateTime endTime) {
        List<Map<String, Object>> rows = statisticsMapper.selectMessageTypeDistribution(beginTime, endTime);
        return convertMap(rows,
                row -> Convert.toInt(row.get("type")),
                row -> Convert.toLong(row.get("count")));
    }
 
    @Override
    public Map<Long, Long> getTopSenderCountMap(LocalDateTime beginTime, LocalDateTime endTime, int limit) {
        List<Map<String, Object>> rows = statisticsMapper.selectTopSenders(beginTime, endTime, limit);
        return convertMap(rows,
                row -> Convert.toLong(row.get("userId")),
                row -> Convert.toLong(row.get("messageCount")));
    }
 
    /**
     * 把 [{date, count}] 行映射为 {LocalDateTime -> Long};
     */
    private static Map<LocalDateTime, Long> toDailyCountMap(List<Map<String, Object>> rows) {
        return convertMap(rows,
                row -> Convert.convert(LocalDate.class, row.get("date")).atStartOfDay(),
                row -> Convert.toLong(row.get("count")));
    }
 
}