diff --git a/app/database.py b/app/database.py index fe62e14..be92ef3 100644 --- a/app/database.py +++ b/app/database.py @@ -22,13 +22,14 @@ class CallbackLog(Base): request_url = Column(String(500), nullable=False) request_headers = Column(JSON, nullable=False) request_body = Column(JSON, nullable=False) - created_at = Column(DateTime, default=datetime.utcnow) + created_at = Column(DateTime, default=datetime.now) class ExternalApiLog(Base): __tablename__ = "external_api_logs" # 重命名表,更通用 id = Column(Integer, primary_key=True, autoincrement=True) + callback_logs_id = Column(Integer, nullable=False) request_url = Column(String(500), nullable=False) request_headers = Column(JSON, nullable=False) request_body = Column(JSON, nullable=False) @@ -36,7 +37,7 @@ class ExternalApiLog(Base): response_headers = Column(JSON) response_body = Column(Text) retry_count = Column(Integer, default=0) # 重试次数 - created_at = Column(DateTime, default=datetime.utcnow) + created_at = Column(DateTime, default=datetime.now) # 创建数据库引擎 diff --git a/app/routes.py b/app/routes.py index 805979e..000b056 100644 --- a/app/routes.py +++ b/app/routes.py @@ -20,8 +20,8 @@ async def log_callback_request( request: Request, site_id: str, callback_data: CallbackRequest -): - """记录回调请求到数据库""" +) -> Optional[int]: + """记录回调请求到数据库,返回记录ID""" import json # 获取客户端IP地址 @@ -97,14 +97,18 @@ async def log_callback_request( logger.info(f"✅ 回调请求记录成功保存到数据库,ID: {callback_log.id}") + # 返回记录ID + return callback_log.id + except Exception as e: logger.error(f"❌ 保存回调请求到数据库失败: {e}", exc_info=True) # 不重新抛出异常,避免影响主业务流程 - pass + return None async def log_external_api_request( db: AsyncSession, + callback_logs_id: int, request_url: str, request_headers: Dict[str, Any], request_body: Dict[str, Any], @@ -115,6 +119,7 @@ async def log_external_api_request( ): """记录外部API请求到数据库""" external_api_log = ExternalApiLog( + callback_logs_id=callback_logs_id, request_url=request_url, request_headers=request_headers, request_body=request_body, @@ -130,7 +135,8 @@ async def log_external_api_request( async def call_external_api_with_retry( db: AsyncSession, request_body: Dict[str, Any], - max_retries: int = None + max_retries: int = None, + callback_logs_id: int = None ) -> tuple[bool, int]: """ 调用外部API并支持重试机制 @@ -153,7 +159,7 @@ async def call_external_api_with_retry( "User-Agent": "AITalkCallbackService/1.0" } - for attempt in range(max_retries + 1): # +1 因为第一次不算重试 + for attempt in range(1, max_retries+1): try: logger.debug(f"📤 第{attempt + 1}次尝试调用外部API") @@ -169,6 +175,7 @@ async def call_external_api_with_retry( # 记录每次尝试的结果 await log_external_api_request( db=db, + callback_logs_id=callback_logs_id, request_url=settings.external_api_url, request_headers=headers, request_body=request_body, @@ -200,6 +207,7 @@ async def call_external_api_with_retry( # 记录网络错误 await log_external_api_request( db=db, + callback_logs_id=callback_logs_id, request_url=settings.external_api_url, request_headers=headers, request_body=request_body, @@ -235,7 +243,7 @@ async def ai_talk_callback( try: # 记录回调请求(包含siteId) - await log_callback_request(db, request, siteId, callback_data) + callback_log_id = await log_callback_request(db, request, siteId, callback_data) # 判断count是否大于等于阈值,如果是直接返回 if callback_data.count >= settings.count_threshold: @@ -259,7 +267,8 @@ async def ai_talk_callback( success, retry_count = await call_external_api_with_retry( db=db, request_body=request_body, - max_retries=settings.external_api_retry_max + max_retries=settings.external_api_retry_max, + callback_logs_id=callback_log_id ) if success: