feat: 调度简单设置(频率选择器)+ 运行窗口 + 下次运行列
This commit is contained in:
+21
-6
@@ -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": "任务已删除"})
|
||||
|
||||
Reference in New Issue
Block a user