From c907b1518c204dda3dd673fe57bc72935d6c2591 Mon Sep 17 00:00:00 2001 From: aaron <> Date: Sun, 30 Mar 2025 12:08:07 +0800 Subject: [PATCH] update --- app/api/endpoints/wecom.py | 182 +++++++++++++++++++++++++++++++++---- app/core/wecomclient.py | 19 +++- jobs.sqlite | Bin 24576 -> 24576 bytes 3 files changed, 178 insertions(+), 23 deletions(-) diff --git a/app/api/endpoints/wecom.py b/app/api/endpoints/wecom.py index b0bd205..814ca74 100644 --- a/app/api/endpoints/wecom.py +++ b/app/api/endpoints/wecom.py @@ -18,6 +18,7 @@ from sqlalchemy.orm import Session from app.core.response import error_response, success_response, ResponseModel from pydantic import BaseModel from app.models.wecom_external_chat import WecomExternalChatDB, WecomExternalChatInfo, WecomExternalChatMemberDB, WecomExternalChatMemberInfo +from datetime import datetime router = APIRouter() @@ -133,26 +134,80 @@ async def wechat_corp_callback( update_detail = msg_root.find('UpdateDetail').text join_user_id = None - if update_detail == 'add_member' and msg_root.find('JoinScene') is not None: + quit_user_ids = [] + + # 处理成员加入事件 + if update_detail == 'add_member': logger.info(f"有新成员加入群聊") - # 获取加入的成员ID - join_user_id_elem = msg_root.find('JoinUserID') - if join_user_id_elem is not None: - join_user_id = join_user_id_elem.text + join_scene_elem = msg_root.find('JoinScene') + join_scene = int(join_scene_elem.text) if join_scene_elem is not None else 0 + logger.info(f"加入场景: {join_scene}") + + # 获取加入成员列表 + mem_change_list = msg_root.find('MemChangeList') + if mem_change_list is not None: + for item in mem_change_list.findall('Item'): + join_user_id = item.text + if join_user_id: + logger.info(f"从MemChangeList中获取到新加入成员: {join_user_id}") + # 处理群聊变更事件 - 添加单个成员 + await wecom_client.handle_chat_change_event( + chat_id=chat_id, + change_type=change_type, + update_detail=update_detail, + join_user_id=join_user_id + ) + logger.info(f"发送欢迎消息到群聊:{chat_id}") + await wecom_client.send_welcome_message(chat_id) + + # 兼容旧格式,如果找不到MemChangeList,尝试JoinUserID + elif msg_root.find('JoinUserID') is not None: + join_user_id = msg_root.find('JoinUserID').text + if join_user_id: + logger.info(f"从JoinUserID中获取到新加入成员: {join_user_id}") + # 处理群聊变更事件 - 添加单个成员 + await wecom_client.handle_chat_change_event( + chat_id=chat_id, + change_type=change_type, + update_detail=update_detail, + join_user_id=join_user_id + ) + logger.info(f"发送欢迎消息到群聊:{chat_id}") + await wecom_client.send_welcome_message(chat_id) + + # 处理成员离开事件 + elif update_detail == 'del_member': + logger.info(f"有成员离开群聊") + quit_scene_elem = msg_root.find('QuitScene') + quit_scene = int(quit_scene_elem.text) if quit_scene_elem is not None else 0 + + # 获取离开成员列表 + mem_change_list = msg_root.find('MemChangeList') + if mem_change_list is not None: + for item in mem_change_list.findall('Item'): + quit_user_id = item.text + if quit_user_id: + quit_user_ids.append(quit_user_id) + # 处理成员离开 + await wecom_client.handle_chat_change_event( + chat_id=chat_id, + change_type=change_type, + update_detail=update_detail, + join_user_id=quit_user_id # 复用这个参数名来表示离开的用户ID + ) + + logger.info(f"离开场景: {quit_scene}, 离开成员: {quit_user_ids}") - logger.info(f"chat_id: {chat_id}, change_type: {change_type}, update_detail: {update_detail}, join_user_id: {join_user_id}") + logger.info(f"chat_id: {chat_id}, change_type: {change_type}, update_detail: {update_detail}, join_user_id: {join_user_id}, quit_user_ids: {quit_user_ids}") - # 处理群聊变更事件 - await wecom_client.handle_chat_change_event( - chat_id=chat_id, - change_type=change_type, - update_detail=update_detail, - join_user_id=join_user_id - ) - - if update_detail == 'add_member' and join_user_id: - logger.info(f"发送欢迎消息到群聊:{chat_id}") - await wecom_client.send_welcome_message(chat_id) + # 处理其他群聊变更事件(不是add_member和del_member) + if update_detail != 'add_member' and update_detail != 'del_member': + # 其他群聊变更事件 + await wecom_client.handle_chat_change_event( + chat_id=chat_id, + change_type=change_type, + update_detail=update_detail + ) return Response(content="success", media_type="text/plain") @@ -307,6 +362,23 @@ async def chat_dashboard( text-decoration: none; } .btn:hover { background-color: #286090; } + .stats { + background-color: #f5f5f5; + border: 1px solid #ddd; + border-radius: 4px; + padding: 15px; + margin-bottom: 20px; + } + .stat-item { + display: inline-block; + margin-right: 30px; + font-size: 16px; + } + .stat-number { + font-size: 24px; + font-weight: bold; + color: #337ab7; + }

企业微信外部群聊信息

+ +
+
+
总群聊数
+
-
+
+
+
总成员数
+
-
+
+
+
活跃群聊数
+
-
+
+
""" if not chats: @@ -392,4 +502,40 @@ async def chat_dashboard( """ - return Response(content=html, media_type="text/html") \ No newline at end of file + return Response(content=html, media_type="text/html") + +@router.get("/chat-stats", response_model=ResponseModel) +async def get_chat_stats( + db: Session = Depends(get_db), + current_user: UserDB = Depends(get_current_user) +): + """获取企业微信外部群聊统计数据""" + try: + # 检查是否为管理员 + if current_user.userid != settings.PLATFORM_USER_ID: + return error_response(code=403, message="权限不足") + + # 计算统计数据 + total_chats = db.query(WecomExternalChatDB).count() + active_chats = db.query(WecomExternalChatDB).filter(WecomExternalChatDB.is_active == True).count() + total_members = db.query(WecomExternalChatMemberDB).count() + + # 获取今日新增成员数 + today = datetime.now().date() + today_start = datetime.combine(today, datetime.min.time()) + today_members = db.query(WecomExternalChatMemberDB).filter( + WecomExternalChatMemberDB.join_time >= today_start + ).count() + + # 返回统计数据 + stats = { + "total_chats": total_chats, + "active_chats": active_chats, + "total_members": total_members, + "today_members": today_members + } + + return success_response(message="获取统计数据成功", data=stats) + except Exception as e: + logger.exception("获取统计数据异常") + return error_response(code=500, message=f"获取统计数据失败: {str(e)}") \ No newline at end of file diff --git a/app/core/wecomclient.py b/app/core/wecomclient.py index 45b08ed..e1ca932 100644 --- a/app/core/wecomclient.py +++ b/app/core/wecomclient.py @@ -249,7 +249,7 @@ class WecomClient: chat_id: 群聊ID change_type: 变更类型 create/update/dismiss update_detail: 变更详情 add_member/del_member/change_owner/change_name/change_notice - join_user_id: 加入的用户ID + join_user_id: 加入/离开的用户ID Returns: bool: 处理是否成功 @@ -278,7 +278,7 @@ class WecomClient: member_count=len(chat_info.get("member_list", [])), notice=chat_info.get("notice") ) - chat_db = WecomExternalChatDB(**chat_create.dict()) + chat_db = WecomExternalChatDB(**chat_create.model_dump()) db.add(chat_db) db.commit() @@ -306,7 +306,7 @@ class WecomClient: name=user_info.get("name") if user_info else None, unionid=user_info.get("unionid") if user_info else None ) - member_db = WecomExternalChatMemberDB(**member_create.dict()) + member_db = WecomExternalChatMemberDB(**member_create.model_dump()) db.add(member_db) db.commit() @@ -330,7 +330,7 @@ class WecomClient: member_count=len(chat_info.get("member_list", [])), notice=chat_info.get("notice") ) - chat_db = WecomExternalChatDB(**chat_create.dict()) + chat_db = WecomExternalChatDB(**chat_create.model_dump()) db.add(chat_db) db.commit() @@ -354,7 +354,7 @@ class WecomClient: name=user_info.get("name") if user_info else None, unionid=user_info.get("unionid") if user_info else None ) - member_db = WecomExternalChatMemberDB(**member_create.dict()) + member_db = WecomExternalChatMemberDB(**member_create.model_dump()) db.add(member_db) db.commit() @@ -378,6 +378,8 @@ class WecomClient: if not join_user_id: return False + logger.info(f"处理成员离开群聊事件: 群ID={chat_id}, 成员ID={join_user_id}") + # 删除成员记录 member_db = db.query(WecomExternalChatMemberDB).filter( WecomExternalChatMemberDB.chat_id == chat_id, @@ -385,14 +387,20 @@ class WecomClient: ).first() if member_db: + logger.info(f"从数据库中删除成员记录: {member_db.user_id}, 姓名: {member_db.name}") db.delete(member_db) db.commit() + else: + logger.warning(f"未找到要删除的成员记录: chat_id={chat_id}, user_id={join_user_id}") # 更新群成员数量 chat_db = db.query(WecomExternalChatDB).filter(WecomExternalChatDB.chat_id == chat_id).first() if chat_db: chat_db.member_count = max(0, chat_db.member_count - 1) + logger.info(f"更新群成员数量: {chat_db.member_count}") db.commit() + else: + logger.warning(f"未找到群聊记录: chat_id={chat_id}") return True @@ -403,6 +411,7 @@ class WecomClient: if chat_db: chat_db.is_active = False db.commit() + logger.info(f"群聊解散: {chat_id}") return True diff --git a/jobs.sqlite b/jobs.sqlite index 2fa3dbfe0c14e0b896b625c9b6859a7b344eedab..2ce557e297f0ede658a54057c5f45aae1dae12d0 100644 GIT binary patch delta 19 acmZoTz}Rqrae_2s;zSu|#>9;Y3*rGr7Y6bG delta 19 acmZoTz}Rqrae_2s;6xc`#=wmU3*rGqCkE00