package cn.iocoder.yudao.module.im.dal.mysql.statistics;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
/**
* IM 数据看板 Mapper
*
* 独立于业务 Mapper:所有统计 SQL 集中在此,仅服务于 manager 看板,不被其它业务调用,保持各业务 Mapper / Service 不受统计需求污染。
*
* @author 芋道源码
*/
@Mapper
public interface ImStatisticsManagerMapper {
String NORMAL_MESSAGE_CONDITION = "type IN (101,102,103,104,105,107,108,115,125) AND status <> 2";
// ==================== 用户 ====================
/**
* 用户总数(system_users)
*/
@Select("SELECT COUNT(*) FROM system_users WHERE deleted = 0")
Long selectTotalUserCount();
/**
* 区间内新增用户数
*/
@Select("SELECT COUNT(*) FROM system_users " +
"WHERE deleted = 0 AND create_time >= #{beginTime} AND create_time < #{endTime}")
Long selectNewUserCount(@Param("beginTime") LocalDateTime beginTime,
@Param("endTime") LocalDateTime endTime);
/**
* 区间内活跃用户数:私聊或群聊发过消息的去重用户数
*/
@Select("SELECT COUNT(DISTINCT user_id) FROM (" +
" SELECT sender_id AS user_id FROM im_private_message " +
" WHERE deleted = 0 AND " + NORMAL_MESSAGE_CONDITION +
" AND send_time >= #{beginTime} AND send_time < #{endTime}" +
" UNION ALL " +
" SELECT sender_id AS user_id FROM im_group_message " +
" WHERE deleted = 0 AND " + NORMAL_MESSAGE_CONDITION +
" AND send_time >= #{beginTime} AND send_time < #{endTime}" +
") t")
Long selectActiveUserCount(@Param("beginTime") LocalDateTime beginTime,
@Param("endTime") LocalDateTime endTime);
/**
* 区间内每日新增用户数(按天分组)
*
* @return [{date: "yyyy-MM-dd", count: 123}, ...]
*/
@Select("SELECT DATE(create_time) AS date, COUNT(*) AS count FROM system_users " +
"WHERE deleted = 0 AND create_time >= #{beginTime} AND create_time < #{endTime} " +
"GROUP BY DATE(create_time)")
List