feat: add group detail dashboard insights
This commit is contained in:
@@ -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,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user