yj
2025-07-28 69945b730fd3f6b6138ce50e49fc3392fcd74d71
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
"""
群组统计API接口
"""
 
from typing import Optional
from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
from loguru import logger
 
from app.services.group_stats_service import group_stats_service
 
 
router = APIRouter()
 
 
class GroupStatsResponse(BaseModel):
    """群组统计响应模型"""
    success: bool
    message: str
    data: dict
 
 
class ClearStatsRequest(BaseModel):
    """清空统计请求模型"""
    group_id: str
 
 
@router.get("/group-stats/{group_id}", response_model=GroupStatsResponse)
async def get_group_stats(group_id: str):
    """
    获取指定群组的统计信息
 
    Args:
        group_id: 群组ID
 
    Returns:
        群组统计信息
    """
    try:
        stats_summary = group_stats_service.get_group_stats_summary(group_id)
        
        return GroupStatsResponse(
            success=True,
            message=f"获取群组统计信息成功: {group_id}",
            data=stats_summary
        )
 
    except Exception as e:
        logger.error(f"获取群组统计信息失败: group_id={group_id}, error={str(e)}")
        raise HTTPException(status_code=500, detail=f"获取群组统计信息失败: {str(e)}")
 
 
@router.get("/group-stats/{group_id}/most-active", response_model=GroupStatsResponse)
async def get_most_active_user(group_id: str):
    """
    获取指定群组中发言次数最多的用户昵称
 
    Args:
        group_id: 群组ID
 
    Returns:
        最活跃用户信息
    """
    try:
        most_active_nickname = group_stats_service.get_most_active_user_nickname(group_id)
        message_stats = group_stats_service.get_group_message_stats(group_id)
        
        # 找到最活跃用户的详细信息
        most_active_user_id = None
        max_count = 0
        
        for user_id, count in message_stats.items():
            if count > max_count:
                max_count = count
                most_active_user_id = user_id
        
        data = {
            "group_id": group_id,
            "most_active_nickname": most_active_nickname,
            "most_active_user_id": most_active_user_id,
            "message_count": max_count,
            "total_users": len([count for count in message_stats.values() if count > 0])
        }
        
        return GroupStatsResponse(
            success=True,
            message=f"获取最活跃用户成功: {group_id}",
            data=data
        )
 
    except Exception as e:
        logger.error(f"获取最活跃用户失败: group_id={group_id}, error={str(e)}")
        raise HTTPException(status_code=500, detail=f"获取最活跃用户失败: {str(e)}")
 
 
@router.post("/group-stats/clear", response_model=GroupStatsResponse)
async def clear_group_stats(request: ClearStatsRequest):
    """
    清空指定群组的统计数据
 
    Args:
        request: 清空统计请求
 
    Returns:
        操作结果
    """
    try:
        success = group_stats_service.clear_group_stats(request.group_id)
        
        if success:
            return GroupStatsResponse(
                success=True,
                message=f"群组统计数据已清空: {request.group_id}",
                data={"group_id": request.group_id, "cleared": True}
            )
        else:
            raise HTTPException(status_code=400, detail=f"清空群组统计数据失败: {request.group_id}")
 
    except HTTPException:
        raise
    except Exception as e:
        logger.error(f"清空群组统计数据失败: group_id={request.group_id}, error={str(e)}")
        raise HTTPException(status_code=500, detail=f"清空群组统计数据失败: {str(e)}")
 
 
@router.get("/group-stats", response_model=GroupStatsResponse)
async def get_all_groups_overview():
    """
    获取所有群组的统计概览
 
    Returns:
        所有群组的统计概览
    """
    try:
        # 这里可以扩展为获取所有群组的统计信息
        # 目前返回基本信息
        data = {
            "message": "群组统计功能已启用",
            "endpoints": {
                "get_group_stats": "/api/v1/group-stats/{group_id}",
                "get_most_active": "/api/v1/group-stats/{group_id}/most-active",
                "clear_stats": "/api/v1/group-stats/clear"
            }
        }
        
        return GroupStatsResponse(
            success=True,
            message="获取群组统计概览成功",
            data=data
        )
 
    except Exception as e:
        logger.error(f"获取群组统计概览失败: error={str(e)}")
        raise HTTPException(status_code=500, detail=f"获取群组统计概览失败: {str(e)}")