Files
kra-new/scripts/sw_run_report_tasks.py
T

59 lines
3.1 KiB
Python

"""通过新商务原生任务 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()