diff --git a/config/config_task2.ini b/config/config_task2.ini index aa4f271..bf34859 100644 --- a/config/config_task2.ini +++ b/config/config_task2.ini @@ -19,4 +19,4 @@ sync_interval = 30 # 企业微信应用ID agentid = 1000615 # 接收人列表(用户ID,多个用|分隔,@all表示全部成员) -receivers = 046364 +receivers = 04636 4 diff --git a/config/token_cache.json b/config/token_cache.json index 3f6bc44..7740686 100644 --- a/config/token_cache.json +++ b/config/token_cache.json @@ -1,4 +1,4 @@ { - "access_token": "LKCPU6VM1ckPpMUcnhs_71hNs0gn9zhRO5yZvSshEQ4_ISK4g74xBH8B9YBicKkOxdn9CIxvJ_Pt3Hg7L9tyKdgNibMproAE90aS9YWg83dAcjZHv-vt7_flcvMMC3ytOaHy1PiKuJZ2YWk137ojcXpYv_6GHLdXpiTMyyEPjmuWQrSmV0k20q3m_c_lD-XhX_uUrbGs9ag8d21JhJx-2H2H_yXHurXu3K1EdSbePdQ", - "fetch_time": 1768366140.5126395 + "access_token": "wTDckSfv2tq6P_xM2lBqSirg8qEsUHRjLqisLLQxNX4ZDEhOxXhR9v5dLF0nV5obkkTSa87p1R_Cu-FLcVp439_xVYbFb66ENSmuJcTT-2sYoJ_4JkSbAPmfKy_8-6jqF995MOmJcoCbZU1PdB0QbLyIWe_U1du7nnZ3o0uqFdPI_cAVa1EWPLjWNvkxYrjW5rVWBIPwPvlK7VaACfsSzevBwvEO89-UbHBrZLn07dI", + "fetch_time": 1768380602.07453 } \ No newline at end of file diff --git a/src/main.py b/src/main.py index 1a10f70..7377a0c 100644 --- a/src/main.py +++ b/src/main.py @@ -20,6 +20,7 @@ from src.mapper import FieldMapper, BugCreationResult from src.token_manager import TokenManager from src.status_mapper import BugStatusMapper from src.wework_notifier import WeWorkNotifier +from src.api_logger import get_logger def parse_arguments(): @@ -388,6 +389,17 @@ def create_tapd_bugs(valid_records: list, workspace_id: str, reporter: str, test error_msg = f"字段映射失败: {e}" print(f" ✗ {error_msg}") + # 记录失败日志 + logger = get_logger() + logger.log_api_call( + api_type="task1", + operation="create_bug_failure", + request_data={"record_id": record_id, "title": title}, + response_data={}, + success=False, + error_message=error_msg + ) + result = BugCreationResult( record_id=record_id, success=False, @@ -400,6 +412,17 @@ def create_tapd_bugs(valid_records: list, workspace_id: str, reporter: str, test error_msg = f"TAPD API调用失败: {e}" print(f" ✗ {error_msg}") + # 记录失败日志 + logger = get_logger() + logger.log_api_call( + api_type="task1", + operation="create_bug_failure", + request_data={"record_id": record_id, "title": title}, + response_data={}, + success=False, + error_message=error_msg + ) + result = BugCreationResult( record_id=record_id, success=False, @@ -412,6 +435,17 @@ def create_tapd_bugs(valid_records: list, workspace_id: str, reporter: str, test error_msg = f"未预期的错误: {type(e).__name__}: {e}" print(f" ✗ {error_msg}") + # 记录失败日志 + logger = get_logger() + logger.log_api_call( + api_type="task1", + operation="create_bug_failure", + request_data={"record_id": record_id, "title": title}, + response_data={}, + success=False, + error_message=error_msg + ) + result = BugCreationResult( record_id=record_id, success=False, @@ -638,11 +672,26 @@ def run_once(config_manager: ConfigManager, access_token: str, verbose: bool = F for invalid_record in validation_result['invalid_records']: record_data = invalid_record['record_data'] missing_fields = invalid_record['missing_fields'] + error_msg = f"校验失败,缺失字段: {', '.join(missing_fields)}" + + # 记录校验失败日志 + logger = get_logger() + logger.log_api_call( + api_type="task1", + operation="validation_failure", + request_data={ + "record_id": record_data.get('record_id', '未知'), + "title": record_data.get('标题', '(无标题)') + }, + response_data={}, + success=False, + error_message=error_msg + ) validation_failed_result = BugCreationResult( record_id=record_data.get('record_id', '未知'), success=False, - error_message=f"校验失败,缺失字段: {', '.join(missing_fields)}" + error_message=error_msg ) validation_failed_results.append(validation_failed_result) diff --git a/src2/smartsheet.py b/src2/smartsheet.py new file mode 100644 index 0000000..f2febf6 --- /dev/null +++ b/src2/smartsheet.py @@ -0,0 +1,45 @@ +""" +任务二专用的智能表格API模块 +继承自任务一的 SmartSheetAPI,使用任务二专用的日志记录器 + +设计说明: +- 继承 src.smartsheet.SmartSheetAPI 的所有功能 +- 重写 __init__ 方法,使用 get_task2_logger() 替代 get_logger() +- 确保所有智能表格 API 调用日志写入 logs2/ 目录 +""" + +import sys +from pathlib import Path + +# 将项目根目录添加到 Python 路径 +project_root = Path(__file__).parent.parent +sys.path.insert(0, str(project_root)) + +from src.smartsheet import SmartSheetAPI +from src2.logger import get_task2_logger + + +class SmartSheetAPITask2(SmartSheetAPI): + """任务二专用的智能表格API类""" + + def __init__(self, access_token: str, docid: str, test_mode: bool = False): + """ + 初始化智能表格API(任务二专用) + + Args: + access_token: 企业微信access_token + docid: 智能表格文档ID + test_mode: 是否启用测试模式(显示API返回结果) + """ + # 调用父类初始化 + super().__init__(access_token, docid, test_mode) + + # 替换为任务二专用的日志记录器 + self.logger = get_task2_logger() + + +if __name__ == "__main__": + print("=== 任务二智能表格API模块 ===\n") + print("此模块继承自 src.smartsheet.SmartSheetAPI") + print("使用任务二专用的日志记录器,日志写入 logs2/ 目录") + print("\n请通过 SmartSheetSync 类使用此模块") diff --git a/src2/smartsheet_sync.py b/src2/smartsheet_sync.py index 475b1f5..a1e15ce 100644 --- a/src2/smartsheet_sync.py +++ b/src2/smartsheet_sync.py @@ -18,7 +18,7 @@ from typing import Dict, List, Any, Optional, Tuple project_root = Path(__file__).parent.parent sys.path.insert(0, str(project_root)) -from src.smartsheet import SmartSheetAPI +from src2.smartsheet import SmartSheetAPITask2 from src2.link_parser import parse_tapd_link, extract_story_id from src2.logger import get_task2_logger @@ -58,7 +58,7 @@ class SmartSheetSync: docid: 智能表格文档ID test_mode: 是否启用测试模式 """ - self.api = SmartSheetAPI(access_token, docid, test_mode) + self.api = SmartSheetAPITask2(access_token, docid, test_mode) self.logger = get_task2_logger() self.test_mode = test_mode diff --git a/src2/sync_service.py b/src2/sync_service.py index 9303a4b..63f4842 100644 --- a/src2/sync_service.py +++ b/src2/sync_service.py @@ -357,6 +357,18 @@ class SyncService: # 检查链接解析结果 if not record_info["parse_success"]: record_result["error_message"] = record_info.get("parse_error", "链接解析失败") + # 记录链接解析失败日志 + self.logger.log_api_call( + api_type="task2", + operation="link_parse_failure", + request_data={ + "record_id": record_info["record_id"], + "tapd_link": record_info["tapd_link"] + }, + response_data={}, + success=False, + error_message=record_result["error_message"] + ) return record_result story_id = record_info["story_id"] @@ -400,6 +412,18 @@ class SyncService: except Exception as e: record_result["error_message"] = str(e) + # 记录TAPD查询失败日志 + self.logger.log_api_call( + api_type="task2", + operation="sync_record_failure", + request_data={ + "record_id": record_info["record_id"], + "story_id": story_id + }, + response_data={}, + success=False, + error_message=record_result["error_message"] + ) return record_result @@ -518,6 +542,19 @@ class SyncService: except Exception as e: result["failed"] += 1 + error_msg = str(e) + # 记录持续同步失败日志 + self.logger.log_api_call( + api_type="task2", + operation="continuous_sync_failure", + request_data={ + "record_id": record_info["record_id"], + "story_id": record_info["story_id"] + }, + response_data={}, + success=False, + error_message=error_msg + ) if self.test_mode: print(f" ✗ 记录 {record_info['record_id']} 更新失败: {e}")