run_grade_plan_groups.py 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #!/usr/bin/env python3
  2. """批量执行 demand_grade_plan_group 分级任务。
  3. 与定时任务共用 supply_infra.scheduler.jobs.grade_demand_pool.grade_demand_pool。
  4. Usage:
  5. .venv/bin/python scripts/run_grade_plan_groups.py
  6. .venv/bin/python scripts/run_grade_plan_groups.py --biz-dt 20260721
  7. .venv/bin/python scripts/run_grade_plan_groups.py --biz-dt 20260721 --workers 5
  8. .venv/bin/python scripts/run_grade_plan_groups.py --biz-dt 20260721 --with-orchestrate
  9. """
  10. from __future__ import annotations
  11. import argparse
  12. import json
  13. import logging
  14. import sys
  15. from pathlib import Path
  16. _ROOT = Path(__file__).resolve().parents[1]
  17. if str(_ROOT) not in sys.path:
  18. sys.path.insert(0, str(_ROOT))
  19. from supply_infra.scheduler.plan_group_batch import MAX_DEMANDS_PER_BATCH
  20. from supply_infra.scheduler.jobs.grade_demand_pool import grade_demand_pool
  21. logger = logging.getLogger(__name__)
  22. def main(argv: list[str] | None = None) -> int:
  23. parser = argparse.ArgumentParser(description="批量执行 demand_grade_plan_group 分级任务")
  24. parser.add_argument("--biz-dt", default="20260721", help="业务日期 YYYYMMDD,默认 20260721")
  25. parser.add_argument(
  26. "--max-demands-per-batch",
  27. type=int,
  28. default=MAX_DEMANDS_PER_BATCH,
  29. help=f"每个 Agent 子批次最多处理的需求条数,默认 {MAX_DEMANDS_PER_BATCH}",
  30. )
  31. parser.add_argument("--workers", type=int, default=5, help="并发执行的 plan_group 数")
  32. parser.add_argument(
  33. "--max-rounds",
  34. type=int,
  35. default=0,
  36. help="最多执行轮数,0 表示直到没有 pending 任务",
  37. )
  38. parser.add_argument(
  39. "--with-orchestrate",
  40. action="store_true",
  41. help="执行前先跑统筹 Agent 生成/补充计划",
  42. )
  43. parser.add_argument(
  44. "--json",
  45. action="store_true",
  46. help="最终以 JSON 打印摘要",
  47. )
  48. args = parser.parse_args(argv)
  49. logging.basicConfig(
  50. level=logging.INFO,
  51. format="%(asctime)s %(levelname)s %(name)s: %(message)s",
  52. )
  53. result = grade_demand_pool(
  54. str(args.biz_dt).strip(),
  55. workers=max(1, int(args.workers)),
  56. max_demands_per_batch=max(1, min(int(args.max_demands_per_batch), MAX_DEMANDS_PER_BATCH)),
  57. with_orchestrate=bool(args.with_orchestrate),
  58. max_rounds=max(0, int(args.max_rounds)),
  59. )
  60. if args.json:
  61. print(json.dumps(result, ensure_ascii=False, indent=2, default=str))
  62. else:
  63. print("\n=== 批量分级完成 ===")
  64. print(f"biz_dt={result.get('biz_dt')}")
  65. print(f"完成任务组={result.get('groups_run')}")
  66. print(f"已分级: {result.get('graded_before')} -> {result.get('graded_after')}")
  67. print(f"任务状态: {(result.get('group_status') or result.get('plan_execution', {}).get('final_snapshot', {}).get('group_status'))}")
  68. print(f"是否全部完成: {result.get('success')}")
  69. return 0 if result.get("success") else 1
  70. if __name__ == "__main__":
  71. raise SystemExit(main())