feat: 调度简单设置(频率选择器)+ 运行窗口 + 下次运行列

This commit is contained in:
2026-08-11 08:27:33 +08:00
parent c37290e8e3
commit 794f40a880
4 changed files with 222 additions and 26 deletions
+21 -6
View File
@@ -247,15 +247,26 @@ def api_devices():
# ================== API:任务计划 CRUD ==================
def _job_next_run(job):
"""任务下次执行时间,格式化为 "YYYY-MM-DD HH:MM"(Flask 序列化 aware datetime 会变 GMT 格式)。"""
nr = mgr.next_run_of(job)
return nr.strftime("%Y-%m-%d %H:%M") if nr else None
@app.route("/api/jobs")
@login_required
def api_jobs_list():
return jsonify({"ok": True, "jobs": [j.to_dict() for j in mgr.jobs.values()],
jobs = []
for j in mgr.jobs.values():
d = j.to_dict()
d["next_run"] = _job_next_run(j)
jobs.append(d)
return jsonify({"ok": True, "jobs": jobs,
"task_types": list_task_types()})
@app.route("/api/jobs", methods=["POST"])
@login_required
@perm_required(PERM_TASKS)
def api_jobs_create():
data = request.json or {}
name = (data.get("name") or "").strip()
@@ -271,11 +282,13 @@ def api_jobs_create():
schedule=data.get("schedule", {"mode": "once"}),
retry=data.get("retry", {"max_attempts": 1, "delay": 60}),
enabled=data.get("enabled", True))
return jsonify({"ok": True, "msg": "任务已创建", "job": job.to_dict()})
d = job.to_dict()
d["next_run"] = _job_next_run(job)
return jsonify({"ok": True, "msg": "任务已创建", "job": d})
@app.route("/api/jobs/<job_id>", methods=["PUT"])
@login_required
@perm_required(PERM_TASKS)
def api_jobs_update(job_id):
job = mgr.jobs.get(job_id)
if not job:
@@ -288,11 +301,13 @@ def api_jobs_update(job_id):
if "task_type" in fields and not get_task_class(fields["task_type"]):
return jsonify({"ok": False, "error": f"未知任务类型: {fields['task_type']}"}), 400
mgr.update_job(job_id, **fields)
return jsonify({"ok": True, "msg": "任务已更新", "job": job.to_dict()})
d = job.to_dict()
d["next_run"] = _job_next_run(job)
return jsonify({"ok": True, "msg": "任务已更新", "job": d})
@app.route("/api/jobs/<job_id>", methods=["DELETE"])
@login_required
@perm_required(PERM_TASKS)
def api_jobs_delete(job_id):
if mgr.delete_job(job_id):
return jsonify({"ok": True, "msg": "任务已删除"})