157 lines
4.2 KiB
Python
157 lines
4.2 KiB
Python
"""
|
||
任务二主程序入口
|
||
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
|
||
|
||
|
||
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)
|
||
|
||
try:
|
||
# 解析命令行参数
|
||
args = parse_arguments()
|
||
|
||
# 初始化配置管理器
|
||
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()
|
||
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)
|
||
|
||
# 返回状态码
|
||
return 0 if result["success"] else 1
|
||
|
||
except KeyboardInterrupt:
|
||
print("\n\n用户中断执行")
|
||
return 130
|
||
|
||
except Exception as e:
|
||
print(f"\n✗ 执行失败: {e}")
|
||
import traceback
|
||
traceback.print_exc()
|
||
return 1
|
||
|
||
|
||
if __name__ == "__main__":
|
||
sys.exit(main())
|