operations_project/apps/accounts/services/goal_service.py
2025-05-13 18:36:06 +08:00

102 lines
3.3 KiB
Python

import logging
from django.conf import settings
from datetime import datetime
from apps.accounts.models import UserGoal
from apps.gmail.models import GmailConversation, ConversationSummary
from apps.chat.models import ChatHistory
from apps.common.services.ai_service import AIService
logger = logging.getLogger(__name__)
def get_active_goal(user):
"""
获取用户最新的活跃目标
Args:
user: 用户对象
Returns:
UserGoal: 用户目标对象或None
"""
return UserGoal.objects.filter(user=user, is_active=True).order_by('-updated_at').first()
def get_conversation_summary(conversation_id):
"""
获取对话摘要
Args:
conversation_id: 对话ID
Returns:
str: 摘要内容或None
"""
try:
# 先检查持久化存储的摘要
try:
conversation = GmailConversation.objects.get(conversation_id=conversation_id)
summary = ConversationSummary.objects.get(conversation=conversation)
return summary.content
except (GmailConversation.DoesNotExist, ConversationSummary.DoesNotExist):
pass
# 如果没有持久化的摘要,尝试生成简单摘要
chat_history = ChatHistory.objects.filter(conversation_id=conversation_id).order_by('-created_at')[:5]
if not chat_history:
return None
# 生成简单摘要(最近几条消息)
messages = []
for msg in chat_history:
if len(messages) < 3: # 只取最新的3条
role = "用户" if msg.role == "user" else "达人"
content = msg.content
if len(content) > 100:
content = content[:100] + "..."
messages.append(f"{role}: {content}")
if messages:
return "最近对话: " + " | ".join(reversed(messages))
return None
except Exception as e:
logger.error(f"获取对话摘要失败: {str(e)}")
return None
def get_last_message(conversation_id):
"""
获取对话中最后一条对方发送的消息
Args:
conversation_id: 对话ID
Returns:
str: 最后一条消息内容或None
"""
try:
# 获取对话中最后一条对方(达人)发送的消息
last_message = ChatHistory.objects.filter(
conversation_id=conversation_id,
role='assistant' # 达人的消息
).order_by('-created_at').first()
if last_message:
return last_message.content
return None
except Exception as e:
logger.error(f"获取最后一条消息失败: {str(e)}")
return None
def generate_recommended_reply(user, goal_description, conversation_summary, last_message):
"""
根据用户目标、对话摘要和最后一条消息生成推荐话术
Args:
user: 用户对象
goal_description: 用户目标描述
conversation_summary: 对话摘要
last_message: 达人最后发送的消息内容
Returns:
tuple: (推荐话术内容, 错误信息)
"""
# 直接调用AIService生成回复
return AIService.generate_email_reply(goal_description, conversation_summary, last_message)