import mysql.connector from database import DB_CONFIG def get_conversations_by_user_id(user_id, page=1, size=20, sort_by="update_time", sort_order="desc"): """ 根据用户ID获取对话列表 参数: user_id (str): 用户ID page (int): 当前页码 size (int): 每页大小 sort_by (str): 排序字段 sort_order (str): 排序方式 (asc/desc) 返回: tuple: (对话列表, 总数) """ try: conn = mysql.connector.connect(**DB_CONFIG) cursor = conn.cursor(dictionary=True) # 直接使用user_id作为tenant_id tenant_id = user_id print(f"查询用户ID: {user_id}, 租户ID: {tenant_id}") # 查询总记录数 count_sql = """ SELECT COUNT(*) as total FROM dialog d WHERE d.tenant_id = %s """ cursor.execute(count_sql, (tenant_id,)) total = cursor.fetchone()["total"] print(f"查询到总记录数: {total}") # 计算分页偏移量 offset = (page - 1) * size # 确定排序方向 sort_direction = "DESC" if sort_order.lower() == "desc" else "ASC" # 执行分页查询 query = f""" SELECT d.id, d.name, d.create_date, d.update_date, d.tenant_id FROM dialog d WHERE d.tenant_id = %s ORDER BY d.{sort_by} {sort_direction} LIMIT %s OFFSET %s """ print(f"执行查询: {query}") print(f"参数: tenant_id={tenant_id}, size={size}, offset={offset}") cursor.execute(query, (tenant_id, size, offset)) results = cursor.fetchall() print(f"查询结果数量: {len(results)}") # 获取每个对话的最新消息 conversations = [] for dialog in results: # 查询对话的所有消息 conv_query = """ SELECT id, message, name FROM conversation WHERE dialog_id = %s ORDER BY create_date DESC """ cursor.execute(conv_query, (dialog["id"],)) conv_results = cursor.fetchall() latest_message = "" conversation_name = dialog["name"] # 默认使用dialog的name if conv_results and len(conv_results) > 0: # 获取最新的一条对话记录 latest_conv = conv_results[0] # 如果conversation有name,优先使用conversation的name if latest_conv and latest_conv.get("name"): conversation_name = latest_conv["name"] if latest_conv and latest_conv["message"]: # 获取最后一条消息内容 messages = latest_conv["message"] if messages and len(messages) > 0: # 检查消息类型,处理字符串和字典两种情况 if isinstance(messages[-1], dict): latest_message = messages[-1].get("content", "") elif isinstance(messages[-1], str): latest_message = messages[-1] else: latest_message = str(messages[-1]) conversations.append( { "id": dialog["id"], "name": conversation_name, "latestMessage": latest_message[:100] + "..." if len(latest_message) > 100 else latest_message, "createTime": dialog["create_date"].strftime("%Y-%m-%d %H:%M:%S") if dialog["create_date"] else "", "updateTime": dialog["update_date"].strftime("%Y-%m-%d %H:%M:%S") if dialog["update_date"] else "", } ) # 关闭连接 cursor.close() conn.close() return conversations, total except mysql.connector.Error as err: print(f"数据库错误: {err}") # 更详细的错误日志 import traceback traceback.print_exc() return [], 0 except Exception as e: print(f"未知错误: {e}") import traceback traceback.print_exc() return [], 0 def get_messages_by_conversation_id(conversation_id, page=1, size=30): """ 获取特定对话的详细信息 参数: conversation_id (str): 对话ID page (int): 当前页码 size (int): 每页大小 返回: tuple: (对话详情, 总数) """ try: conn = mysql.connector.connect(**DB_CONFIG) cursor = conn.cursor(dictionary=True) # 查询对话信息 query = """ SELECT * FROM conversation WHERE dialog_id = %s ORDER BY create_date DESC """ cursor.execute(query, (conversation_id,)) result = cursor.fetchall() # 确保读取所有结果 if not result: print(f"未找到对话ID: {conversation_id}") cursor.close() conn.close() return None, 0 # 获取第一条记录作为对话详情 conversation = None if len(result) > 0: conversation = { "id": result[0]["id"], "dialogId": result[0].get("dialog_id", ""), "createTime": result[0]["create_date"].strftime("%Y-%m-%d %H:%M:%S") if result[0].get("create_date") else "", "updateTime": result[0]["update_date"].strftime("%Y-%m-%d %H:%M:%S") if result[0].get("update_date") else "", "messages": result[0].get("message", []), } # 打印调试信息 print(f"获取到对话详情: ID={conversation_id}") print(f"消息长度: {len(conversation['messages']) if conversation and conversation.get('messages') else 0}") # 关闭连接 cursor.close() conn.close() # 返回对话详情和消息总数 total = len(conversation["messages"]) if conversation and conversation.get("messages") else 0 return conversation, total except mysql.connector.Error as err: print(f"数据库错误: {err}") # 更详细的错误日志 import traceback traceback.print_exc() return None, 0 except Exception as e: print(f"未知错误: {e}") import traceback traceback.print_exc() return None, 0 def get_conversation_detail(conversation_id): """ 获取特定对话的详细信息 参数: conversation_id (str): 对话ID 返回: dict: 对话详情 """ try: conn = mysql.connector.connect(**DB_CONFIG) cursor = conn.cursor(dictionary=True) # 查询对话信息 query = """ SELECT c.*, d.name as dialog_name, d.icon as dialog_icon FROM conversation c LEFT JOIN dialog d ON c.dialog_id = d.id WHERE c.id = %s """ cursor.execute(query, (conversation_id,)) result = cursor.fetchone() if not result: print(f"未找到对话ID: {conversation_id}") return None # 格式化对话详情 conversation = { "id": result["id"], "name": result.get("name", ""), "dialogId": result.get("dialog_id", ""), "dialogName": result.get("dialog_name", ""), "dialogIcon": result.get("dialog_icon", ""), "createTime": result["create_date"].strftime("%Y-%m-%d %H:%M:%S") if result.get("create_date") else "", "updateTime": result["update_date"].strftime("%Y-%m-%d %H:%M:%S") if result.get("update_date") else "", "messages": result.get("message", []), } # 打印调试信息 print(f"获取到对话详情: ID={conversation_id}") print(f"消息数量: {len(conversation['messages']) if conversation['messages'] else 0}") # 关闭连接 cursor.close() conn.close() return conversation except mysql.connector.Error as err: print(f"数据库错误: {err}") # 更详细的错误日志 import traceback traceback.print_exc() return None except Exception as e: print(f"未知错误: {e}") import traceback traceback.print_exc() return None