feat: add group detail dashboard insights

This commit is contained in:
liuwei
2026-04-13 11:04:20 +08:00
parent e2b19c0614
commit ec6c1308db
5 changed files with 962 additions and 2 deletions

View File

@@ -743,3 +743,64 @@ class ContactsDBOperator(BaseDBOperator):
except Exception as e:
self.LOG.error(f"获取群{chatroom_id}潜水排行失败: {e}")
return []
def get_group_member_summary(self, chatroom_id: str, inactive_days: int = 30) -> Dict[str, Any]:
"""获取群成员概览摘要"""
try:
sql = """
SELECT
COUNT(*) AS total_members,
SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) AS in_group_members,
SUM(CASE WHEN is_owner = 1 THEN 1 ELSE 0 END) AS owner_count,
SUM(CASE WHEN is_admin = 1 THEN 1 ELSE 0 END) AS admin_count,
SUM(CASE WHEN latest_active_time IS NOT NULL THEN 1 ELSE 0 END) AS spoken_members,
SUM(CASE WHEN latest_active_time IS NULL THEN 1 ELSE 0 END) AS never_spoken_members,
SUM(
CASE
WHEN latest_active_time IS NOT NULL
AND latest_active_time >= DATE_SUB(NOW(), INTERVAL 7 DAY)
THEN 1 ELSE 0
END
) AS active_7d_members,
SUM(
CASE
WHEN latest_active_time IS NOT NULL
AND latest_active_time >= DATE_SUB(NOW(), INTERVAL 30 DAY)
THEN 1 ELSE 0
END
) AS active_30d_members,
SUM(
CASE
WHEN latest_active_time IS NULL
OR latest_active_time < DATE_SUB(NOW(), INTERVAL %s DAY)
THEN 1 ELSE 0
END
) AS inactive_members
FROM t_chatroom_member
WHERE chatroom_id = %s
"""
result = self.execute_query(sql, (inactive_days, chatroom_id), fetch_one=True) or {}
return {
"total_members": int(result.get("total_members") or 0),
"in_group_members": int(result.get("in_group_members") or 0),
"owner_count": int(result.get("owner_count") or 0),
"admin_count": int(result.get("admin_count") or 0),
"spoken_members": int(result.get("spoken_members") or 0),
"never_spoken_members": int(result.get("never_spoken_members") or 0),
"active_7d_members": int(result.get("active_7d_members") or 0),
"active_30d_members": int(result.get("active_30d_members") or 0),
"inactive_members": int(result.get("inactive_members") or 0),
}
except Exception as e:
self.LOG.error(f"获取群{chatroom_id}成员摘要失败: {e}")
return {
"total_members": 0,
"in_group_members": 0,
"owner_count": 0,
"admin_count": 0,
"spoken_members": 0,
"never_spoken_members": 0,
"active_7d_members": 0,
"active_30d_members": 0,
"inactive_members": 0,
}