From 307236190c98c13395b114df990eec50a9160251 Mon Sep 17 00:00:00 2001
From: yj <2077506045@qq.com>
Date: 星期三, 27 八月 2025 16:59:48 +0800
Subject: [PATCH] 更新

---
 app/services/friend_ignore_service.py |   40 ++++++++++++--------
 app/api/friend_ignore.py              |   64 ++++++++++++++-----------------
 app/models/contact.py                 |   16 +++++--
 3 files changed, 64 insertions(+), 56 deletions(-)

diff --git a/app/api/friend_ignore.py b/app/api/friend_ignore.py
index 4f8c68a..dc7043c 100644
--- a/app/api/friend_ignore.py
+++ b/app/api/friend_ignore.py
@@ -17,16 +17,19 @@
 
 class AddFriendsRequest(BaseModel):
     """娣诲姞濂藉弸鍒板拷鐣ュ垪琛ㄨ姹傛ā鍨�"""
+
     friends: List[str]
 
 
 class RemoveFriendRequest(BaseModel):
     """浠庡拷鐣ュ垪琛ㄧЩ闄ゅソ鍙嬭姹傛ā鍨�"""
+
     w_id: str
 
 
 class IgnoreListResponse(BaseModel):
     """蹇界暐鍒楄〃鍝嶅簲妯″瀷"""
+
     success: bool
     message: str
     data: Set[str] = None
@@ -37,19 +40,16 @@
 async def get_ignore_list():
     """
     鑾峰彇褰撳墠鐨勫ソ鍙嬪拷鐣ュ垪琛�
-    
+
     Returns:
         蹇界暐鍒楄〃鍝嶅簲
     """
     try:
         ignore_list = friend_ignore_service.get_ignore_list()
         count = friend_ignore_service.get_ignore_list_count()
-        
+
         return IgnoreListResponse(
-            success=True,
-            message="鑾峰彇蹇界暐鍒楄〃鎴愬姛",
-            data=ignore_list,
-            count=count
+            success=True, message="鑾峰彇蹇界暐鍒楄〃鎴愬姛", data=ignore_list, count=count
         )
     except Exception as e:
         logger.error(f"鑾峰彇蹇界暐鍒楄〃澶辫触: {str(e)}")
@@ -60,26 +60,26 @@
 async def add_friends_to_ignore_list(request: AddFriendsRequest):
     """
     娣诲姞濂藉弸鍒板拷鐣ュ垪琛�
-    
+
     Args:
         request: 娣诲姞濂藉弸璇锋眰
-        
+
     Returns:
         鎿嶄綔缁撴灉
     """
     try:
         success = friend_ignore_service.add_friends_to_ignore_list(request.friends)
-        
+
         if success:
             count = friend_ignore_service.get_ignore_list_count()
             return IgnoreListResponse(
                 success=True,
                 message=f"鎴愬姛娣诲姞 {len(request.friends)} 涓ソ鍙嬪埌蹇界暐鍒楄〃",
-                count=count
+                count=count,
             )
         else:
             raise HTTPException(status_code=400, detail="娣诲姞濂藉弸鍒板拷鐣ュ垪琛ㄥけ璐�")
-            
+
     except Exception as e:
         logger.error(f"娣诲姞濂藉弸鍒板拷鐣ュ垪琛ㄥけ璐�: {str(e)}")
         raise HTTPException(status_code=500, detail=f"娣诲姞濂藉弸鍒板拷鐣ュ垪琛ㄥけ璐�: {str(e)}")
@@ -89,26 +89,26 @@
 async def remove_friend_from_ignore_list(request: RemoveFriendRequest):
     """
     浠庡拷鐣ュ垪琛ㄤ腑绉婚櫎濂藉弸
-    
+
     Args:
         request: 绉婚櫎濂藉弸璇锋眰
-        
+
     Returns:
         鎿嶄綔缁撴灉
     """
     try:
         success = friend_ignore_service.remove_friend_from_ignore_list(request.w_id)
-        
+
         if success:
             count = friend_ignore_service.get_ignore_list_count()
             return IgnoreListResponse(
                 success=True,
                 message=f"鎴愬姛浠庡拷鐣ュ垪琛ㄤ腑绉婚櫎濂藉弸: {request.w_id}",
-                count=count
+                count=count,
             )
         else:
             raise HTTPException(status_code=400, detail="浠庡拷鐣ュ垪琛ㄧЩ闄ゅソ鍙嬪け璐�")
-            
+
     except Exception as e:
         logger.error(f"浠庡拷鐣ュ垪琛ㄧЩ闄ゅソ鍙嬪け璐�: {str(e)}")
         raise HTTPException(status_code=500, detail=f"浠庡拷鐣ュ垪琛ㄧЩ闄ゅソ鍙嬪け璐�: {str(e)}")
@@ -118,22 +118,18 @@
 async def clear_ignore_list():
     """
     娓呯┖蹇界暐鍒楄〃
-    
+
     Returns:
         鎿嶄綔缁撴灉
     """
     try:
         success = friend_ignore_service.clear_ignore_list()
-        
+
         if success:
-            return IgnoreListResponse(
-                success=True,
-                message="鎴愬姛娓呯┖蹇界暐鍒楄〃",
-                count=0
-            )
+            return IgnoreListResponse(success=True, message="鎴愬姛娓呯┖蹇界暐鍒楄〃", count=0)
         else:
             raise HTTPException(status_code=400, detail="娓呯┖蹇界暐鍒楄〃澶辫触")
-            
+
     except Exception as e:
         logger.error(f"娓呯┖蹇界暐鍒楄〃澶辫触: {str(e)}")
         raise HTTPException(status_code=500, detail=f"娓呯┖蹇界暐鍒楄〃澶辫触: {str(e)}")
@@ -143,26 +139,24 @@
 async def sync_contacts_and_rebuild_ignore_list():
     """
     閲嶆柊鍚屾鑱旂郴浜哄苟閲嶅缓蹇界暐鍒楄〃
-    
+
     Returns:
         鎿嶄綔缁撴灉
     """
     try:
         if not settings.ecloud_w_id:
             raise HTTPException(status_code=400, detail="鏈厤缃甧cloud_w_id")
-            
+
         success = contact_sync_service.sync_contacts_on_startup(settings.ecloud_w_id)
-        
+
         if success:
             count = friend_ignore_service.get_ignore_list_count()
             return IgnoreListResponse(
-                success=True,
-                message="鑱旂郴浜哄悓姝ュ畬鎴愶紝蹇界暐鍒楄〃宸查噸寤�",
-                count=count
+                success=True, message="鑱旂郴浜哄悓姝ュ畬鎴愶紝蹇界暐鍒楄〃宸查噸寤�", count=count
             )
         else:
             raise HTTPException(status_code=400, detail="鑱旂郴浜哄悓姝ュけ璐�")
-            
+
     except Exception as e:
         logger.error(f"鑱旂郴浜哄悓姝ュけ璐�: {str(e)}")
         raise HTTPException(status_code=500, detail=f"鑱旂郴浜哄悓姝ュけ璐�: {str(e)}")
@@ -185,7 +179,7 @@
         return {
             "success": True,
             "data": status_info,
-            "message": f"w_id {w_id} 鐘舵�佹鏌ュ畬鎴�"
+            "message": f"w_id {w_id} 鐘舵�佹鏌ュ畬鎴�",
         }
 
     except Exception as e:
@@ -208,7 +202,7 @@
             "success": True,
             "data": whitelist,
             "count": len(whitelist),
-            "message": "鑾峰彇鐧藉悕鍗曟垚鍔�"
+            "message": "鑾峰彇鐧藉悕鍗曟垚鍔�",
         }
 
     except Exception as e:
@@ -231,9 +225,9 @@
                 "ignore_enabled": settings.friend_ignore_enabled,
                 "whitelist": settings.friend_ignore_whitelist,
                 "whitelist_count": len(settings.friend_ignore_whitelist),
-                "ignore_list_count": friend_ignore_service.get_ignore_list_count()
+                "ignore_list_count": friend_ignore_service.get_ignore_list_count(),
             },
-            "message": "鑾峰彇閰嶇疆淇℃伅鎴愬姛"
+            "message": "鑾峰彇閰嶇疆淇℃伅鎴愬姛",
         }
 
     except Exception as e:
diff --git a/app/models/contact.py b/app/models/contact.py
index b6b3491..0eb3c0d 100644
--- a/app/models/contact.py
+++ b/app/models/contact.py
@@ -1,6 +1,7 @@
 """
 鑱旂郴浜轰俊鎭ā鍨�
 """
+
 from sqlalchemy import Column, String, Integer, DateTime, Text
 from sqlalchemy.sql import func
 from .database import Base
@@ -8,10 +9,13 @@
 
 class Contact(Base):
     """鑱旂郴浜轰俊鎭〃"""
+
     __tablename__ = "contacts"
-    
+
     id = Column(Integer, primary_key=True, index=True, autoincrement=True)
-    wc_id = Column(String(100), unique=True, index=True, nullable=False, comment="寰俊ID/缇D")
+    wc_id = Column(
+        String(100), unique=True, index=True, nullable=False, comment="寰俊ID/缇D"
+    )
     user_name = Column(String(100), nullable=True, comment="寰俊鐢ㄦ埛鍚�")
     nick_name = Column(String(100), nullable=True, comment="鏄电О")
     remark = Column(String(100), nullable=True, comment="澶囨敞")
@@ -23,9 +27,11 @@
     small_head = Column(String(500), nullable=True, comment="灏忓ご鍍廢RL")
     label_list = Column(Text, nullable=True, comment="鏍囩鍒楄〃")
     v1 = Column(String(200), nullable=True, comment="v1鏁版嵁")
-    
+    work_wc_id = Column(String(100), nullable=True, comment="浼佷笟寰俊id")
     created_at = Column(DateTime, default=func.now(), comment="鍒涘缓鏃堕棿")
-    updated_at = Column(DateTime, default=func.now(), onupdate=func.now(), comment="鏇存柊鏃堕棿")
-    
+    updated_at = Column(
+        DateTime, default=func.now(), onupdate=func.now(), comment="鏇存柊鏃堕棿"
+    )
+
     def __repr__(self):
         return f"<Contact(wc_id='{self.wc_id}', nick_name='{self.nick_name}')>"
diff --git a/app/services/friend_ignore_service.py b/app/services/friend_ignore_service.py
index 2b0123f..2a8f71d 100644
--- a/app/services/friend_ignore_service.py
+++ b/app/services/friend_ignore_service.py
@@ -30,9 +30,14 @@
         """
         try:
             with next(get_db()) as db:
-                contact = db.query(Contact).filter(Contact.nick_name == nickname).first()
+                contact = (
+                    db.query(Contact).filter(Contact.nick_name == nickname).first()
+                )
                 if contact:
-                    return contact.wc_id
+                    wc_id = contact.wc_id
+                    if contact.work_wc_id:
+                        wc_id += f",{contact.work_wc_id}"
+                    return wc_id
                 else:
                     logger.warning(f"鏈壘鍒版樀绉颁负 '{nickname}' 鐨勮仈绯讳汉")
                     return None
@@ -74,10 +79,10 @@
 
             # 娓呯┖鐜版湁鐨勫拷鐣ュ垪琛�
             redis_queue.redis_client.delete(self.ignore_list_key)
-            
+
             # 鎵归噺娣诲姞濂藉弸w_id鍒板拷鐣ュ垪琛�
             redis_queue.redis_client.sadd(self.ignore_list_key, *friends)
-            
+
             logger.info(f"宸插皢 {len(friends)} 涓ソ鍙嬫坊鍔犲埌蹇界暐鍒楄〃")
             return True
 
@@ -111,21 +116,26 @@
 
             # 妫�鏌ユ槸鍚﹀湪鐧藉悕鍗曚腑锛堥�氳繃鏄电О锛�
             whitelist_wids = self._get_whitelist_wids()
-            if w_id in whitelist_wids:
+
+            if any(w_id in wids for wids in whitelist_wids):
                 logger.info(f"w_id鍦ㄧ櫧鍚嶅崟涓紝涓嶅拷鐣ユ秷鎭�: w_id={w_id}")
                 return False
 
             # 妫�鏌ユ槸鍚﹀湪蹇界暐鍒楄〃涓�
-            is_in_ignore_list = redis_queue.redis_client.sismember(self.ignore_list_key, w_id)
+            is_in_ignore_list = redis_queue.redis_client.sismember(
+                self.ignore_list_key, w_id
+            )
 
             if is_in_ignore_list:
                 # 濡傛灉鍦ㄥ拷鐣ュ垪琛ㄤ腑锛屾鏌ユ槸鍚﹀湪娴嬭瘯缇ょ粍涓�
                 if group_id and silence_service.is_test_group(group_id):
-                    logger.info(f"娴嬭瘯缇ょ粍涓殑濂藉弸娑堟伅涓嶈蹇界暐: w_id={w_id}, group_id={group_id}")
+                    logger.info(
+                        f"娴嬭瘯缇ょ粍涓殑濂藉弸娑堟伅涓嶈蹇界暐: w_id={w_id}, group_id={group_id}"
+                    )
                     return False
-                
+
                 logger.info(f"w_id鍦ㄥ拷鐣ュ垪琛ㄤ腑锛屽拷鐣ユ秷鎭�: w_id={w_id}")
-                
+
             return is_in_ignore_list
 
         except Exception as e:
@@ -233,7 +243,7 @@
                 "in_ignore_list": False,
                 "final_ignored": False,
                 "reason": "",
-                "whitelist_nicknames": settings.friend_ignore_whitelist
+                "whitelist_nicknames": settings.friend_ignore_whitelist,
             }
 
             if not settings.friend_ignore_enabled:
@@ -244,7 +254,9 @@
                 info["reason"] = "鍦ㄧ櫧鍚嶅崟涓紝涓嶄細琚拷鐣�"
                 return info
 
-            info["in_ignore_list"] = redis_queue.redis_client.sismember(self.ignore_list_key, w_id)
+            info["in_ignore_list"] = redis_queue.redis_client.sismember(
+                self.ignore_list_key, w_id
+            )
 
             if info["in_ignore_list"]:
                 info["final_ignored"] = True
@@ -256,11 +268,7 @@
 
         except Exception as e:
             logger.error(f"鑾峰彇蹇界暐鐘舵�佷俊鎭紓甯�: w_id={w_id}, error={str(e)}")
-            return {
-                "w_id": w_id,
-                "error": str(e),
-                "final_ignored": False
-            }
+            return {"w_id": w_id, "error": str(e), "final_ignored": False}
 
 
 # 鍏ㄥ眬濂藉弸蹇界暐鏈嶅姟瀹炰緥

--
Gitblit v1.9.1