"""通过新商务原生任务 HTTP 重跑指定日期,要求已有分区备份并保持任务禁用。""" import argparse import json import time from pathlib import Path from sw_write_verify import Rehearsal def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--runtime", type=Path, required=True) parser.add_argument("--config", type=Path, default=Path("configs/config.yaml")) parser.add_argument("--old-url", default="http://127.0.0.1:18080") parser.add_argument("--new-url", default="http://127.0.0.1:19001") parser.add_argument("--output", type=Path, required=True) parser.add_argument("--date", default="2026-11-03") parser.add_argument("--backup", type=Path, required=True) parser.add_argument("--methods", nargs="+", choices=("swReportDayBackfillTask", "swReportServerDayBackfillTask", "alertTriggerTask"), default=["swReportDayBackfillTask", "swReportServerDayBackfillTask"]) args = parser.parse_args() backup = json.loads(args.backup.read_text(encoding="utf-8")) if backup["date"] != args.date: raise ValueError("已有备份的日期与任务不符") run = Rehearsal(args) ids = [] try: for method in args.methods: name = "迁移核对-" + method + "-" + str(int(time.time())) run.call("new", "admin", "POST", "/timedTask/createTimedTask", {"name": name, "spec": "@daily", "executorType": "method", "methodName": method, "params": {"startDate": args.date, "endDate": args.date, "_execution": {"timeoutSeconds": 1800}}, "enabled": False}) task = run.query("SELECT id,enabled FROM sw9.sys_timed_tasks WHERE name=%s AND deleted_at IS NULL", (name,))[0] ids.append(task["id"]) (args.runtime / "report-rehearsal-task-ids.json").write_text(json.dumps(ids), encoding="utf-8") run.check(method + " 创建且保持禁用", task["enabled"] == 0) started = time.monotonic() run.call("new", "admin", "POST", "/timedTask/triggerTimedTask", {"id": task["id"]}) while time.monotonic() - started < 1830: value = run.call("new", "admin", "GET", f"/timedTask/getTimedTaskLogList?taskId={task['id']}&page=1&pageSize=1")["data"] logs = value.get("list", []) if logs and logs[0].get("status") not in ("running", "pending"): (args.runtime / (method + "-execution.json")).write_text(json.dumps(logs[0], ensure_ascii=False, indent=2), encoding="utf-8") run.check(method + " 真实执行完成", logs[0]["status"] == "success", status=logs[0]["status"], elapsed_seconds=round(time.monotonic() - started, 2)) break time.sleep(2) else: run.check(method + " 等待执行完成", False, reason="timeout") except Exception as error: if all(check["passed"] for check in run.checks): run.check("报表重跑执行异常", False, error_type=type(error).__name__) raise finally: run.db.close() if __name__ == "__main__": main()