yj
2025-09-03 f28ac0166536a2a4b68cac685a41ea667f60f7e9
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: