优化群管理详情页展示与群成员统计口径

1. 群成员列表仅展示仍在群内的成员,排除已退群用户,避免僵尸成员与成员明细口径不一致。

2. 群成员列表按最后发言时间倒序排序,最近活跃成员优先展示,未发言成员排在后面。

3. 群详情启用功能区域的最后消息改为紧凑预览,图片、视频、链接、表情、XML、系统消息统一显示标记,不再直接展示原始内容。

4. 群功能权限区域默认折叠,需手动展开后再查看和操作,降低详情弹窗的信息噪音。

5. 进群欢迎配置区域默认折叠,需手动展开后再查看和编辑群级差异化欢迎配置。
This commit is contained in:
liuwei
2026-04-30 14:12:01 +08:00
parent 889afecde6
commit 23b5d5bef0
2 changed files with 97 additions and 10 deletions

View File

@@ -732,12 +732,23 @@ class ContactsDBOperator(BaseDBOperator):
return []
# 新增获取群成员列表接口
def get_chatroom_small_member_list(self, chatroom_id: str) -> List[dict]:
"""获取群成员列表"""
"""获取群成员列表
说明:
1. 群详情页的成员列表只展示当前仍在群内的成员,已退群成员不再返回;
2. 成员需要按最后发言时间倒序展示,方便后台优先看到最近活跃的人;
3. 从未发言的成员排在后面,避免把“无活跃记录”的成员顶到前面。
"""
try:
sql = """
SELECT wxid, nick_name, display_name, status, latest_active_time, small_head_img_url
FROM t_chatroom_member
WHERE chatroom_id = %s
AND status = 1
ORDER BY
CASE WHEN latest_active_time IS NULL THEN 1 ELSE 0 END ASC,
latest_active_time DESC,
COALESCE(NULLIF(display_name, ''), nick_name, wxid) ASC
"""
results = self.execute_query(sql, (chatroom_id,))
@@ -916,6 +927,7 @@ class ContactsDBOperator(BaseDBOperator):
, CASE WHEN latest_active_time IS NULL THEN 1 ELSE 0 END AS never_spoken
FROM t_chatroom_member
WHERE chatroom_id = %s
AND status = 1
AND (latest_active_time IS NULL OR latest_active_time <= DATE_SUB(NOW(), INTERVAL %s DAY))
ORDER BY inactivity_days DESC
LIMIT %s
@@ -931,12 +943,18 @@ class ContactsDBOperator(BaseDBOperator):
return []
def get_group_member_summary(self, chatroom_id: str, inactive_days: int = 30) -> Dict[str, Any]:
"""获取群成员概览摘要"""
"""获取群成员概览摘要
说明:
1. 群运营看板里的成员统计口径应当只基于“当前仍在群内”的成员;
2. 已退群成员如果继续参与统计,会导致僵尸成员数、活跃覆盖率等指标失真;
3. 因此这里统一过滤 status = 1确保详情页数字与成员列表保持一致。
"""
try:
sql = """
SELECT
COUNT(*) AS total_members,
SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) AS in_group_members,
COUNT(*) 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,
@@ -964,6 +982,7 @@ class ContactsDBOperator(BaseDBOperator):
) AS inactive_members
FROM t_chatroom_member
WHERE chatroom_id = %s
AND status = 1
"""
result = self.execute_query(sql, (inactive_days, chatroom_id), fetch_one=True) or {}
return {