aps-agent/scripts/gen_planner_e2e_fixtures.py

65 lines
2.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ============================================================
# 生成计划员视口 E2E 的离线桩数据:现场 world.json → 一组接口原始响应 JSON
# 用法:python scripts/gen_planner_e2e_fixtures.py <world.json> <输出目录>
# 例:python scripts/gen_planner_e2e_fixtures.py `
# server/data/tenants/<tenant>/projects/<project>/world.json $env:TEMP\aps-planner-fix
#
# 只读:仅读取 world.json,并调用网关端点用的同一批域函数生成响应体。
# 不手写任何业务数字,也不写回项目数据。
# 产物目录交给 apps/web/e2e/planner-real-data-views.spec.ts 的 E2E_PLANNER_FIXTURES 使用。
# ============================================================
from __future__ import annotations
import json
import os
import sys
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from server.aps_domain.analytics import (
build_compare_table,
build_kpi_dashboard,
build_utilization_report,
)
from server.aps_domain.flex import capacity_analysis, flex_gantt_view, flex_overview
from server.aps_domain.planning import build_plan_buckets
from server.aps_domain.views import due_view, gantt_view, load_view, world_summary
def build_payloads(world: dict) -> dict:
return {
"world-summary.json": world_summary(world),
"world-gantt.json": gantt_view(world),
"world-load.json": load_view(world, 14),
"world-due.json": {"rows": due_view(world)},
"flex-gantt.json": flex_gantt_view(world),
"flex-capacity.json": capacity_analysis(world),
"flex-world.json": flex_overview(world),
"analytics-kpi.json": build_kpi_dashboard(world),
"analytics-util.json": build_utilization_report(world, "flex", 7),
"analytics-compare.json": build_compare_table(world, track="both"),
"plan-buckets.json": build_plan_buckets(
world, mode="HYBRID", horizon_days=90, include_forecast=True, capacity_mode="FINITE"
),
"timeline.json": {"versions": [], "checkpoints": []},
}
def main(argv: list[str]) -> int:
if len(argv) != 3:
print(__doc__)
return 2
world_path, out_dir = argv[1], argv[2]
with open(world_path, encoding="utf-8") as fh:
world = json.load(fh)
os.makedirs(out_dir, exist_ok=True)
for name, body in build_payloads(world).items():
with open(os.path.join(out_dir, name), "w", encoding="utf-8") as fh:
json.dump(body, fh, ensure_ascii=False)
print("wrote", name, len(json.dumps(body, ensure_ascii=False)), "bytes")
return 0
if __name__ == "__main__":
raise SystemExit(main(sys.argv))