import argparse from datetime import datetime from system_management.scheduler.task_scheduler import TaskScheduler from system_management.scheduler.task_scheduler import TaskManager from config import Config from utils.logger import CrossPlatformLog # 初始化日志 log = CrossPlatformLog.get_logger("TaskManagement") def main(): # 初始化配置和组件 scheduler = TaskScheduler(Config.MYSQL_CONFIG) manager = TaskManager(scheduler) # 解析命令行参数 parser = argparse.ArgumentParser(description="任务管理工具") subparsers = parser.add_subparsers(dest="command", help="可用命令") # 列出任务 list_parser = subparsers.add_parser("list", help="列出所有任务") list_parser.add_argument("--active-only", action="store_true", help="只显示活跃任务") # 查看任务详情 show_parser = subparsers.add_parser("show", help="显示任务详情") show_parser.add_argument("task_id", type=int, help="任务ID") # 更新任务 update_parser = subparsers.add_parser("update", help="更新任务属性") update_parser.add_argument("task_id", type=int, help="任务ID") update_parser.add_argument("--name", help="任务名称") update_parser.add_argument("--type", help="任务类型") update_parser.add_argument("--module", help="模块路径") update_parser.add_argument("--cron", help="Cron表达式") update_parser.add_argument("--timezone", help="时区") # 启用/禁用任务 toggle_parser = subparsers.add_parser("toggle", help="启用/禁用任务") toggle_parser.add_argument("task_id", type=int, help="任务ID") toggle_parser.add_argument("--activate", action="store_true", help="启用任务") toggle_parser.add_argument("--deactivate", action="store_true", help="禁用任务") # 删除任务 delete_parser = subparsers.add_parser("delete", help="删除任务") delete_parser.add_argument("task_id", type=int, help="任务ID") # 手动执行任务 run_parser = subparsers.add_parser("run", help="手动执行任务") run_parser.add_argument("task_id", type=int, help="任务ID") # 添加任务 add_parser = subparsers.add_parser("add", help="添加新任务") add_parser.add_argument("--name", required=True, help="任务名称") add_parser.add_argument("--type", required=True, help="任务类型") add_parser.add_argument("--module", required=True, help="模块路径") add_parser.add_argument("--cron", required=True, help="Cron表达式") add_parser.add_argument("--timezone", default="Asia/Shanghai", help="时区") args = parser.parse_args() # 执行相应命令 if args.command == "list": try: tasks = manager.get_all_tasks(args.active_only) manager.print_task_table(tasks) log.info(f"列出任务完成,共{len(tasks)}个任务") except Exception as e: log.error(f"列出任务失败: {str(e)}", exc_info=True) elif args.command == "show": try: task = manager.get_task_by_id(args.task_id) if task: print("\n===== 任务详情 =====") for key, value in task.items(): print(f"{key}: {value}") print("====================") log.info(f"显示任务详情成功,任务ID: {args.task_id}") else: log.warning(f"未找到任务ID: {args.task_id}") print(f"任务ID {args.task_id} 不存在") except Exception as e: log.error(f"显示任务详情失败,任务ID: {args.task_id}", exc_info=True) elif args.command == "update": try: updates = {} if args.name: updates['task_name'] = args.name if args.type: updates['task_type'] = args.type if args.module: updates['module_path'] = args.module if args.cron: updates['cron_expression'] = args.cron if args.timezone: updates['time_zone'] = args.timezone if not updates: log.warning("未提供任何更新字段") print("请至少指定一个更新字段") return if manager.update_task(args.task_id, updates): log.info(f"任务ID {args.task_id} 更新成功") print(f"任务ID {args.task_id} 更新成功") else: log.warning(f"任务ID {args.task_id} 更新失败") print(f"任务ID {args.task_id} 更新失败") except Exception as e: log.error(f"更新任务失败,任务ID: {args.task_id}", exc_info=True) elif args.command == "toggle": try: if args.activate and args.deactivate: log.warning("不能同时指定 --activate 和 --deactivate") print("不能同时指定 --activate 和 --deactivate") return if not args.activate and not args.deactivate: log.warning("请指定 --activate 或 --deactivate") print("请指定 --activate 或 --deactivate") return if args.activate: success = manager.toggle_task_status(args.task_id, True) action = "启用" else: success = manager.toggle_task_status(args.task_id, False) action = "禁用" if success: log.info(f"任务ID {args.task_id} {action}成功") print(f"任务ID {args.task_id} {action}成功") else: log.warning(f"任务ID {args.task_id} {action}失败") print(f"任务ID {args.task_id} {action}失败") except Exception as e: log.error(f"切换任务状态失败,任务ID: {args.task_id}", exc_info=True) elif args.command == "delete": try: confirm = input(f"确定要删除任务ID {args.task_id} 吗? (y/n) ") if confirm.lower() == 'y': if manager.delete_task(args.task_id): log.info(f"任务ID {args.task_id} 删除成功") print(f"任务ID {args.task_id} 删除成功") else: log.warning(f"任务ID {args.task_id} 删除失败") print(f"任务ID {args.task_id} 删除失败") else: log.info(f"用户取消删除任务ID {args.task_id}") print("操作已取消") except Exception as e: log.error(f"删除任务失败,任务ID: {args.task_id}", exc_info=True) elif args.command == "run": try: log.info(f"开始手动执行任务ID {args.task_id}") print(f"正在手动执行任务ID {args.task_id}...") if manager.run_task_manually(args.task_id): log.info(f"任务ID {args.task_id} 执行成功") print(f"任务ID {args.task_id} 执行成功") else: log.warning(f"任务ID {args.task_id} 执行失败") print(f"任务ID {args.task_id} 执行失败") except Exception as e: log.error(f"手动执行任务失败,任务ID: {args.task_id}", exc_info=True) elif args.command == "add": try: task_id = scheduler.add_task( task_name=args.name, task_type=args.type, module_path=args.module, cron_expression=args.cron, time_zone=args.timezone ) log.info(f"新任务添加成功,ID: {task_id}") print(f"新任务添加成功,ID: {task_id}") except Exception as e: log.error(f"添加任务失败: {str(e)}", exc_info=True) print(f"添加任务失败: {str(e)}") else: parser.print_help() if __name__ == "__main__": main()