完善通讯录群详情展示:补齐群公告/群主/群管理信息
变更项: 1. 数据层新增群资料聚合查询,直接复用 is_owner/is_admin 字段返回群主与管理员列表。 2. 同步群信息时兼容提取群公告并落库,历史库启动时自动补齐 chat_room_announcement 字段。 3. 新增 /contacts/api/group_profile/<roomid> 接口,统一返回群公告、群主、管理员、成员数。 4. 通讯录群详情弹窗新增群主/群成员数/群管理/群公告展示,并在打开详情时自动加载。 5. 补充群成员精简查询头像字段,更新初始化 SQL 中 t_chatrooms 公告字段定义。
This commit is contained in:
@@ -101,6 +101,7 @@ class ContactsDBOperator(BaseDBOperator):
|
||||
remark_quan_pin VARCHAR(256) COMMENT '备注全拼',
|
||||
chat_room_notify TINYINT COMMENT '群通知',
|
||||
chat_room_owner VARCHAR(64) COMMENT '群主微信ID',
|
||||
chat_room_announcement TEXT COMMENT '群公告内容',
|
||||
small_head_img_url TEXT COMMENT '群头像URL',
|
||||
member_list TEXT COMMENT '成员列表(JSON)',
|
||||
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
@@ -108,6 +109,11 @@ class ContactsDBOperator(BaseDBOperator):
|
||||
UNIQUE KEY `idx_chatroom_id` (`chatroom_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='微信群信息表';
|
||||
""")
|
||||
# 兼容历史库:老版本表可能没有群公告字段,这里启动时自动补齐。
|
||||
self.execute_update("""
|
||||
ALTER TABLE t_chatrooms
|
||||
ADD COLUMN IF NOT EXISTS chat_room_announcement TEXT COMMENT '群公告内容'
|
||||
""")
|
||||
self.LOG.info("成功创建或确认微信群信息表存在")
|
||||
except Exception as e:
|
||||
self.LOG.error(f"创建微信联系人表或群成员表失败: {e}")
|
||||
@@ -516,6 +522,15 @@ class ContactsDBOperator(BaseDBOperator):
|
||||
return val.get("string", default)
|
||||
return val if val is not None else default
|
||||
|
||||
# 群公告在不同协议/版本里字段名不一致,这里做一次兼容提取,避免前端拿不到内容。
|
||||
announcement = (
|
||||
get_str('ChatRoomAnnouncement')
|
||||
or get_str('Announcement')
|
||||
or get_str('Annoucement')
|
||||
or get_str('AnnouncementContent')
|
||||
or get_str('chatRoomAnnouncement')
|
||||
)
|
||||
|
||||
data = {
|
||||
'chatroom_id': get_str('UserName'),
|
||||
'nick_name': get_str('NickName',"未知群名"),
|
||||
@@ -527,6 +542,7 @@ class ContactsDBOperator(BaseDBOperator):
|
||||
'remark_quan_pin': get_str('RemarkQuanPin'),
|
||||
'chat_room_notify': chatroom_data.get('ChatRoomNotify', 0),
|
||||
'chat_room_owner': chatroom_data.get('ChatRoomOwner', ''),
|
||||
'chat_room_announcement': announcement,
|
||||
'small_head_img_url': chatroom_data.get('SmallHeadImgUrl', ''),
|
||||
# 成员列表可选存储为JSON字符串
|
||||
'member_list': json.dumps(chatroom_data.get('NewChatroomData', {}).get('ChatRoomMember', []),
|
||||
@@ -673,7 +689,11 @@ class ContactsDBOperator(BaseDBOperator):
|
||||
def get_chatroom_small_member_list(self, chatroom_id: str) -> List[dict]:
|
||||
"""获取群成员列表"""
|
||||
try:
|
||||
sql = "SELECT wxid,nick_name,display_name,status,latest_active_time FROM t_chatroom_member WHERE chatroom_id = %s"
|
||||
sql = """
|
||||
SELECT wxid, nick_name, display_name, status, latest_active_time, small_head_img_url
|
||||
FROM t_chatroom_member
|
||||
WHERE chatroom_id = %s
|
||||
"""
|
||||
results = self.execute_query(sql, (chatroom_id,))
|
||||
|
||||
for row in results:
|
||||
@@ -685,6 +705,65 @@ class ContactsDBOperator(BaseDBOperator):
|
||||
self.LOG.error(f"获取群{chatroom_id}成员列表失败: {e}")
|
||||
return []
|
||||
|
||||
def get_chatroom_profile(self, chatroom_id: str) -> Dict[str, Any]:
|
||||
"""获取群资料(群公告、群主、管理员、成员数)用于通讯录详情展示。"""
|
||||
try:
|
||||
# 先取群基础信息 + 群主展示名 + 成员数。
|
||||
info_sql = """
|
||||
SELECT
|
||||
c.chatroom_id,
|
||||
c.nick_name,
|
||||
c.chat_room_owner,
|
||||
c.chat_room_announcement,
|
||||
COALESCE(NULLIF(owner_member.display_name, ''), owner_member.nick_name, c.chat_room_owner, '') AS owner_name,
|
||||
(
|
||||
SELECT COUNT(*)
|
||||
FROM t_chatroom_member m
|
||||
WHERE m.chatroom_id = c.chatroom_id AND m.status = 1
|
||||
) AS member_count
|
||||
FROM t_chatrooms c
|
||||
LEFT JOIN t_chatroom_member owner_member
|
||||
ON owner_member.chatroom_id = c.chatroom_id
|
||||
AND owner_member.wxid = c.chat_room_owner
|
||||
WHERE c.chatroom_id = %s
|
||||
LIMIT 1
|
||||
"""
|
||||
info = self.execute_query(info_sql, (chatroom_id,), fetch_one=True) or {}
|
||||
|
||||
# 使用既有身份字段 is_admin 组装管理员列表,直接复用现有数据。
|
||||
admin_sql = """
|
||||
SELECT
|
||||
wxid,
|
||||
COALESCE(NULLIF(display_name, ''), nick_name, wxid) AS display_name
|
||||
FROM t_chatroom_member
|
||||
WHERE chatroom_id = %s AND is_admin = 1 AND status = 1
|
||||
ORDER BY display_name
|
||||
"""
|
||||
admins = self.execute_query(admin_sql, (chatroom_id,)) or []
|
||||
|
||||
return {
|
||||
"chatroom_id": chatroom_id,
|
||||
"nick_name": info.get("nick_name", ""),
|
||||
"owner_wxid": info.get("chat_room_owner", "") or "",
|
||||
"owner_name": info.get("owner_name", "") or "",
|
||||
"announcement": info.get("chat_room_announcement", "") or "",
|
||||
"member_count": int(info.get("member_count") or 0),
|
||||
"admin_count": len(admins),
|
||||
"admins": admins,
|
||||
}
|
||||
except Exception as e:
|
||||
self.LOG.error(f"获取群{chatroom_id}资料失败: {e}")
|
||||
return {
|
||||
"chatroom_id": chatroom_id,
|
||||
"nick_name": "",
|
||||
"owner_wxid": "",
|
||||
"owner_name": "",
|
||||
"announcement": "",
|
||||
"member_count": 0,
|
||||
"admin_count": 0,
|
||||
"admins": [],
|
||||
}
|
||||
|
||||
# 获取群成员的昵称信息
|
||||
def get_chatroom_member_list_name_all(self) -> List[dict]:
|
||||
"""获取群成员列表"""
|
||||
|
||||
@@ -121,6 +121,7 @@ create or replace table message_archive.t_chatrooms
|
||||
remark_quan_pin varchar(256) null comment '备注全拼',
|
||||
chat_room_notify tinyint null comment '群通知',
|
||||
chat_room_owner varchar(64) null comment '群主微信ID',
|
||||
chat_room_announcement text null comment '群公告内容',
|
||||
small_head_img_url text null comment '群头像URL',
|
||||
member_list text null comment '成员列表(JSON)',
|
||||
create_time datetime default current_timestamp() not null comment '创建时间',
|
||||
|
||||
Reference in New Issue
Block a user