大改,未验证

This commit is contained in:
2026-03-20 16:50:26 +08:00
parent c7ee292c4f
commit e14e3ee7a5
36 changed files with 1419 additions and 4805 deletions

View File

@@ -11,7 +11,7 @@ from datetime import datetime, timedelta
from sqlalchemy.orm import Session
from ..core.database import db_manager
from ..core.models import Conversation, WorkOrder, WorkOrderSuggestion, KnowledgeEntry
from ..core.models import Conversation, WorkOrder, WorkOrderSuggestion, KnowledgeEntry, ChatSession
from ..core.redis_manager import redis_manager
from src.config.unified_config import get_config
from sqlalchemy import and_, or_, desc
@@ -45,7 +45,8 @@ class ConversationHistoryManager:
response_time: Optional[float] = None,
knowledge_used: Optional[List[int]] = None,
ip_address: Optional[str] = None,
invocation_method: Optional[str] = None
invocation_method: Optional[str] = None,
session_id: Optional[str] = None
) -> int:
"""保存对话记录到数据库和Redis"""
conversation_id = 0
@@ -54,6 +55,7 @@ class ConversationHistoryManager:
# 保存到数据库
with db_manager.get_session() as session:
conversation = Conversation(
session_id=session_id,
work_order_id=work_order_id,
user_message=user_message,
assistant_response=assistant_response,
@@ -715,3 +717,130 @@ class ConversationHistoryManager:
except Exception as e:
logger.error(f"获取对话分析数据失败: {e}")
return {}
# ==================== 会话管理方法 ====================
def get_sessions_paginated(
self,
page: int = 1,
per_page: int = 20,
status: Optional[str] = None,
search: str = '',
date_filter: str = ''
) -> Dict[str, Any]:
"""分页获取会话列表"""
try:
with db_manager.get_session() as session:
query = session.query(ChatSession)
if status:
query = query.filter(ChatSession.status == status)
if search:
query = query.filter(
or_(
ChatSession.title.contains(search),
ChatSession.session_id.contains(search),
ChatSession.user_id.contains(search)
)
)
if date_filter:
now = datetime.now()
if date_filter == 'today':
start_date = now.replace(hour=0, minute=0, second=0, microsecond=0)
elif date_filter == 'week':
start_date = now - timedelta(days=7)
elif date_filter == 'month':
start_date = now - timedelta(days=30)
else:
start_date = None
if start_date:
query = query.filter(ChatSession.created_at >= start_date)
total = query.count()
sessions_list = query.order_by(
ChatSession.updated_at.desc()
).offset((page - 1) * per_page).limit(per_page).all()
result = []
for s in sessions_list:
result.append(s.to_dict())
return {
'sessions': result,
'page': page,
'per_page': per_page,
'total': total,
'total_pages': (total + per_page - 1) // per_page
}
except Exception as e:
logger.error(f"获取会话列表失败: {e}")
return {'sessions': [], 'page': page, 'per_page': per_page, 'total': 0, 'total_pages': 0}
def get_session_messages(
self,
session_id: str,
limit: int = 100,
offset: int = 0
) -> Dict[str, Any]:
"""获取某个会话的所有消息(按时间正序)"""
try:
with db_manager.get_session() as session:
# 获取会话元数据
chat_session = session.query(ChatSession).filter(
ChatSession.session_id == session_id
).first()
if not chat_session:
return {'error': '会话不存在'}
# 获取消息
messages = session.query(Conversation).filter(
Conversation.session_id == session_id
).order_by(Conversation.timestamp.asc()).offset(offset).limit(limit).all()
message_list = []
for msg in messages:
message_list.append({
'id': msg.id,
'user_message': msg.user_message,
'assistant_response': msg.assistant_response,
'timestamp': msg.timestamp.isoformat() if msg.timestamp else None,
'confidence_score': msg.confidence_score,
'response_time': msg.response_time,
'knowledge_used': json.loads(msg.knowledge_used) if msg.knowledge_used else [],
})
return {
'session': chat_session.to_dict(),
'messages': message_list,
'total': len(message_list)
}
except Exception as e:
logger.error(f"获取会话消息失败: {e}")
return {'error': str(e)}
def delete_session(self, session_id: str) -> bool:
"""删除会话及其所有消息"""
try:
with db_manager.get_session() as session:
# 删除关联消息
session.query(Conversation).filter(
Conversation.session_id == session_id
).delete(synchronize_session=False)
# 删除会话
session.query(ChatSession).filter(
ChatSession.session_id == session_id
).delete(synchronize_session=False)
session.commit()
logger.info(f"删除会话成功: {session_id}")
return True
except Exception as e:
logger.error(f"删除会话失败: {e}")
return False