feat: add real detail views for stats pages

This commit is contained in:
liuwei
2026-04-13 17:09:21 +08:00
parent 29dc59c3f1
commit 299a32fa16
4 changed files with 182 additions and 5 deletions

View File

@@ -608,3 +608,54 @@ class StatsDBOperator(BaseDBOperator):
"plugin_count": int(result.get("plugin_count") or 0),
"last_used_at": result.get("last_used_at") or "",
}
def get_user_plugin_stats(self, user_id: str, days: int = 30, limit: int = 10) -> List[Dict]:
"""获取指定用户的插件调用统计"""
sql = """
SELECT
plugin_name,
command,
SUM(total_calls) AS total_calls,
SUM(success_calls) AS success_calls,
SUM(failed_calls) AS failed_calls,
MIN(first_used_at) AS first_used_at,
MAX(last_used_at) AS last_used_at
FROM t_user_stats
WHERE user_id = %s
AND last_used_at >= DATE_SUB(NOW(), INTERVAL %s DAY)
GROUP BY plugin_name, command
ORDER BY total_calls DESC, last_used_at DESC
LIMIT %s
"""
rows = self.execute_query(sql, (user_id, days, limit)) or []
for row in rows:
for key in ("first_used_at", "last_used_at"):
dt = row.get(key)
if isinstance(dt, datetime):
row[key] = dt.strftime("%Y-%m-%d %H:%M:%S")
return rows
def get_user_plugin_summary(self, user_id: str, days: int = 30) -> Dict:
"""获取指定用户的插件调用摘要"""
sql = """
SELECT
SUM(total_calls) AS total_calls,
SUM(success_calls) AS success_calls,
SUM(failed_calls) AS failed_calls,
COUNT(DISTINCT plugin_name) AS plugin_count,
MAX(last_used_at) AS last_used_at
FROM t_user_stats
WHERE user_id = %s
AND last_used_at >= DATE_SUB(NOW(), INTERVAL %s DAY)
"""
result = self.execute_query(sql, (user_id, days), fetch_one=True) or {}
dt = result.get("last_used_at")
if isinstance(dt, datetime):
result["last_used_at"] = dt.strftime("%Y-%m-%d %H:%M:%S")
return {
"total_calls": int(result.get("total_calls") or 0),
"success_calls": int(result.get("success_calls") or 0),
"failed_calls": int(result.get("failed_calls") or 0),
"plugin_count": int(result.get("plugin_count") or 0),
"last_used_at": result.get("last_used_at") or "",
}