""" 任务二主程序入口 TAPD状态实时同步至腾讯智能表格 功能: 1. 命令行参数解析 2. 单次执行模式 3. 执行结果统计 """ import sys import argparse from pathlib import Path from datetime import datetime # 将项目根目录添加到 Python 路径 project_root = Path(__file__).parent.parent sys.path.insert(0, str(project_root)) from src.token_manager import TokenManager from src2.config import Task2ConfigManager from src2.sync_service import run_once from src2.logger import get_task2_logger def parse_arguments(): """解析命令行参数""" parser = argparse.ArgumentParser( description='TAPD状态同步工具 - 将TAPD需求状态同步到腾讯智能表格', formatter_class=argparse.RawDescriptionHelpFormatter, epilog=""" 示例用法: # 执行一次同步 python src2/main.py # 指定配置文件 python src2/main.py --config /path/to/config.ini # 测试模式(显示详细信息) python src2/main.py --test # 手动传入access_token python src2/main.py --token YOUR_ACCESS_TOKEN """ ) parser.add_argument( '-c', '--config', default=None, help='配置文件路径(默认: config/config_task2.ini)' ) parser.add_argument( '-t', '--token', default=None, help='手动传入access_token(默认自动获取)' ) parser.add_argument( '--test', action='store_true', help='启用测试模式,显示详细的API调用信息' ) return parser.parse_args() def print_result_summary(result: dict): """打印执行结果摘要""" print("\n" + "=" * 60) print("执行结果摘要") print("=" * 60) if result["success"]: print("状态: ✓ 成功") else: print("状态: ✗ 失败") if result.get("error_message"): print(f"错误: {result['error_message']}") print(f"\n子表统计:") print(f" 处理子表: {result['sheets_processed']} 个") print(f" 跳过子表: {result['sheets_skipped']} 个") print(f"\n记录统计:") print(f" 包含链接: {result['records_with_link']} 条") print(f" 同步成功: {result['records_synced']} 条") print(f" 需要更新: {result['records_updated']} 条") print(f" 同步失败: {result['records_failed']} 条") # 显示各子表详情 if result.get("sheet_results"): print(f"\n子表详情:") for sheet in result["sheet_results"]: status = "跳过" if sheet["skipped"] else "完成" print(f" - {sheet['sheet_title']}: {status}") if sheet["skipped"]: print(f" 原因: {sheet['skip_reason']}") else: print(f" 链接: {sheet['records_with_link']} | " f"更新: {sheet['records_updated']} | " f"失败: {sheet['records_failed']}") print("=" * 60) def main(): """主函数""" print("\n" + "=" * 60) print("TAPD状态同步工具 (任务二)") print(f"执行时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") print("=" * 60) logger = None try: # 解析命令行参数 args = parse_arguments() logger = get_task2_logger() logger.start_sync( trigger="task2_main_manual", metadata={ "entry": "src2/main.py:main", "test_mode": args.test, "manual_token": bool(args.token), }, ) # 初始化配置管理器 print("\n正在加载配置...") config_manager = Task2ConfigManager(config_path=args.config) config_manager.print_config() # 获取access_token access_token = args.token if access_token is None: print("正在获取access_token...") token_manager = TokenManager(logger=logger) access_token = token_manager.get_token() print(f" ✓ access_token获取成功") # 执行同步 print("\n开始执行同步...") result = run_once( config_manager=config_manager, access_token=access_token, test_mode=args.test ) # 打印结果摘要 print_result_summary(result) logger.end_sync_with_stats( stats={ "docs_total": result.get("docs_total", 0), "docs_success": result.get("docs_success", 0), "docs_failed": result.get("docs_failed", 0), "sheets_processed": result.get("sheets_processed", 0), "sheets_skipped": result.get("sheets_skipped", 0), "total_records": result.get("total_records", 0), "records_with_link": result.get("records_with_link", 0), "records_synced": result.get("records_synced", 0), "records_updated": result.get("records_updated", 0), "records_failed": result.get("records_failed", 0), }, success=result.get("success", False), error_message=result.get("error_message"), extra={"source": "task2_main_manual"}, ) # 返回状态码 return 0 if result["success"] else 1 except KeyboardInterrupt: print("\n\n用户中断执行") if logger and logger.get_active_sync_id(): logger.end_sync_with_stats( stats={}, success=False, error_message="KeyboardInterrupt", extra={"source": "task2_main_manual"}, ) return 130 except Exception as e: print(f"\n✗ 执行失败: {e}") import traceback traceback.print_exc() if logger and logger.get_active_sync_id(): logger.end_sync_with_stats( stats={}, success=False, error_message=str(e), extra={ "source": "task2_main_manual", "exception_type": type(e).__name__, }, ) return 1 if __name__ == "__main__": sys.exit(main())