app/services/contact_sync.py | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/services/friend_ignore_service.py | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/services/message_processor.py | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/services/silence_service.py | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
logs/app.log | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
app/services/contact_sync.py
@@ -133,6 +133,9 @@ existing_contact.small_head = contact_data.get("smallHead") existing_contact.label_list = contact_data.get("labelList") existing_contact.v1 = contact_data.get("v1") # 只有当新的workWcId不为空时才更新 if contact_data.get("workWcId"): existing_contact.work_wc_id = contact_data.get("workWcId") updated_count += 1 logger.debug(f"更新联系人信息: wc_id={wc_id}, nick_name={contact_data.get('nickName')}") else: @@ -150,6 +153,7 @@ small_head=contact_data.get("smallHead"), label_list=contact_data.get("labelList"), v1=contact_data.get("v1"), work_wc_id=contact_data.get("workWcId"), # 添加企业微信ID ) db.add(new_contact) saved_count += 1 @@ -158,6 +162,10 @@ # 提交事务 db.commit() logger.info(f"联系人信息保存完成: 新增={saved_count}, 更新={updated_count}") # 同步联系人后更新Redis忽略列表 self._update_redis_ignore_list(db) return True except Exception as e: @@ -166,6 +174,45 @@ db.rollback() return False def _update_redis_ignore_list(self, db: Session) -> bool: """ 同步联系人后更新Redis忽略列表 将数据库中contacts表中work_wc_id不为空的记录的work_wc_id作为wc_id添加到Redis忽略列表 Args: db: 数据库会话 Returns: 更新成功返回True,失败返回False """ try: # 查询所有work_wc_id不为空且不为空字符串的联系人 contacts_with_work_wc_id = db.query(Contact).filter( Contact.work_wc_id.isnot(None) & (Contact.work_wc_id != "") ).all() if not contacts_with_work_wc_id: logger.info("没有找到work_wc_id不为空的联系人") return True # 提取所有work_wc_id work_wc_ids = [contact.work_wc_id for contact in contacts_with_work_wc_id] logger.info(f"找到 {len(work_wc_ids)} 个work_wc_id不为空的联系人") # 将这些work_wc_id添加到Redis忽略列表 success = friend_ignore_service.add_friends_to_ignore_list(work_wc_ids) if success: logger.info(f"成功将 {len(work_wc_ids)} 个work_wc_id添加到Redis忽略列表") else: logger.error("添加work_wc_id到Redis忽略列表失败") return success except Exception as e: logger.error(f"更新Redis忽略列表异常: error={str(e)}") return False # 全局联系人同步服务实例 contact_sync_service = ContactSyncService() app/services/friend_ignore_service.py
@@ -77,10 +77,7 @@ logger.info("好友列表为空,无需添加到忽略列表") return True # 清空现有的忽略列表 redis_queue.redis_client.delete(self.ignore_list_key) # 批量添加好友w_id到忽略列表 # 批量添加好友w_id到忽略列表(不清空现有列表) redis_queue.redis_client.sadd(self.ignore_list_key, *friends) logger.info(f"已将 {len(friends)} 个好友添加到忽略列表") app/services/message_processor.py
@@ -94,7 +94,7 @@ # 异常情况下返回原始content return callback_data.get("data", {}).get("content", "") def parse_at_mentions(self, ai_answer: str) -> Tuple[str, List[str]]: def parse_at_mentions(self, ai_answer: str, from_user: str) -> Tuple[str, List[str]]: """ 解析AI回复中的@字符,提取客服名称 @@ -130,10 +130,17 @@ db.query(Contact).filter(Contact.nick_name == name).first() ) if contact: at_wc_ids.append(contact.wc_id) logger.info( f"找到客服联系人: name={name}, wc_id={contact.wc_id}" ) # 如果from_user包含@openim表示是企业微信,使用work_wc_id if "@openim" in from_user: at_wc_ids.append(contact.work_wc_id) logger.info( f"找到客服联系人-微信: name={name}, wc_id={contact.work_wc_id}" ) else: at_wc_ids.append(contact.wc_id) logger.info( f"找到客服联系人-企业微信: name={name}, wc_id={contact.wc_id}" ) else: logger.warning(f"未找到客服联系人: name={name}") @@ -371,12 +378,14 @@ return False # 3.2 获取群组中发言次数最多的用户昵称 most_active_nickname = ( group_stats_service.get_most_active_user_nickname(from_group) ) logger.info( f"群组最活跃用户昵称: group={from_group}, nickname={most_active_nickname}" ) # most_active_nickname = ( # group_stats_service.get_most_active_user_nickname(from_group) # ) # logger.info( # f"群组最活跃用户昵称: group={from_group}, nickname={most_active_nickname}" # ) # 获取默认客服名称 nickname = settings.customer_service_default_name # 3.3 获取用户在当前群组的conversation_id conversation_id = redis_queue.get_conversation_id(from_user, from_group) @@ -386,7 +395,7 @@ query=content, user=from_user, conversation_id=conversation_id, nick_name=most_active_nickname, nick_name=nickname, ) if silence_service.is_silence_active(from_group): @@ -475,7 +484,7 @@ success = False if ai_answer: # 解析AI回复中的@字符 processed_answer, at_wc_ids = self.parse_at_mentions(ai_answer) processed_answer, at_wc_ids = self.parse_at_mentions(ai_answer, from_user) # 判断AI回复是否是结束字符串 is_end_str = self.is_end_str(ai_answer) # 发送消息,最多重试3次 @@ -495,10 +504,15 @@ ) else: # 如果该群组静默模式未激活,激活静默模式 silence_service.activate_silence_mode(from_group) logger.info( flag = silence_service.activate_silence_mode(from_group) if flag: logger.info( f"AI回复@客服,群组静默模式已激活: fromUser={from_user}, fromGroup={from_group}" ) ) else: logger.info( f"AI回复@客服,未激活静默模式: fromUser={from_user}, fromGroup={from_group}" ) success = True break else: app/services/silence_service.py
@@ -75,7 +75,7 @@ # 检查是否为测试群组,如果是则不激活静默模式 if self.is_test_group(group_id): logger.info(f"测试群组不激活静默模式: group_id={group_id}") return True return False if not settings.silence_mode_enabled: logger.debug("静默模式功能已禁用") logs/app.log
@@ -1,3 +1,10 @@ 2025-08-26 15:35:24 | INFO | __main__:<module>:132 - 启动E云管家-DifyAI对接服务 2025-08-26 15:55:13 | INFO | __main__:<module>:132 - 启动E云管家-DifyAI对接服务 2025-08-26 16:08:41 | INFO | __main__:<module>:132 - 启动E云管家-DifyAI对接服务 2025-08-27 17:06:10 | INFO | __main__:<module>:132 - 启动E云管家-DifyAI对接服务 2025-08-27 17:15:21 | INFO | __main__:<module>:132 - 启动E云管家-DifyAI对接服务 2025-08-27 17:20:38 | INFO | __main__:<module>:132 - 启动E云管家-DifyAI对接服务 2025-08-27 17:20:55 | INFO | __main__:<module>:132 - 启动E云管家-DifyAI对接服务 2025-08-27 17:24:47 | INFO | __main__:<module>:132 - 启动E云管家-DifyAI对接服务 2025-08-27 17:25:26 | INFO | __main__:<module>:132 - 启动E云管家-DifyAI对接服务 2025-08-27 17:37:52 | INFO | __main__:<module>:132 - 启动E云管家-DifyAI对接服务 2025-08-27 17:42:02 | INFO | __main__:<module>:132 - 启动E云管家-DifyAI对接服务 2025-08-27 18:01:43 | INFO | __main__:<module>:132 - 启动E云管家-DifyAI对接服务 2025-08-27 18:11:34 | INFO | __main__:<module>:132 - 启动E云管家-DifyAI对接服务