更新 schedules.py
This commit is contained in:
@@ -145,20 +145,28 @@ def update_user_schedule(schedule_id, **kwargs):
|
|||||||
updates.append("updated_at = ?")
|
updates.append("updated_at = ?")
|
||||||
params.append(now_str)
|
params.append(now_str)
|
||||||
|
|
||||||
# enabled 状态下,关键字段变更后要重算 next_run_at,确保索引驱动不会跑偏
|
# 关键字段变更后重算 next_run_at,确保索引驱动不会跑偏
|
||||||
should_recompute_next = will_enabled == 1 and any(
|
#
|
||||||
key in kwargs for key in ["enabled", "schedule_time", "weekdays", "random_delay"]
|
# 需求:当用户修改“执行时间/执行日期/随机±15分钟”后,即使今天已经执行过,也允许按新配置在今天再次触发。
|
||||||
)
|
# 做法:这些关键字段发生变更时,重算 next_run_at 时忽略 last_run_at 的“同日仅一次”限制。
|
||||||
|
config_changed = any(key in kwargs for key in ["schedule_time", "weekdays", "random_delay"])
|
||||||
|
enabled_toggled = "enabled" in kwargs
|
||||||
|
should_recompute_next = config_changed or (enabled_toggled and will_enabled == 1)
|
||||||
if should_recompute_next:
|
if should_recompute_next:
|
||||||
next_dt = compute_next_run_at(
|
next_dt = compute_next_run_at(
|
||||||
now=now_dt,
|
now=now_dt,
|
||||||
schedule_time=str(next_time or "08:00"),
|
schedule_time=str(next_time or "08:00"),
|
||||||
weekdays=str(next_weekdays or "1,2,3,4,5"),
|
weekdays=str(next_weekdays or "1,2,3,4,5"),
|
||||||
random_delay=int(next_random_delay or 0),
|
random_delay=int(next_random_delay or 0),
|
||||||
last_run_at=str(current_last_run_at or "") if current_last_run_at else None,
|
last_run_at=None if config_changed else (str(current_last_run_at or "") if current_last_run_at else None),
|
||||||
)
|
)
|
||||||
updates.append("next_run_at = ?")
|
updates.append("next_run_at = ?")
|
||||||
params.append(format_cst(next_dt))
|
params.append(format_cst(next_dt))
|
||||||
|
|
||||||
|
# 若本次显式禁用任务,则 next_run_at 清空(与 toggle 行为保持一致)
|
||||||
|
if enabled_toggled and will_enabled == 0:
|
||||||
|
updates.append("next_run_at = ?")
|
||||||
|
params.append(None)
|
||||||
params.append(schedule_id)
|
params.append(schedule_id)
|
||||||
|
|
||||||
sql = f"UPDATE user_schedules SET {', '.join(updates)} WHERE id = ?"
|
sql = f"UPDATE user_schedules SET {', '.join(updates)} WHERE id = ?"
|
||||||
@@ -187,7 +195,7 @@ def toggle_user_schedule(schedule_id, enabled):
|
|||||||
if enabled:
|
if enabled:
|
||||||
cursor.execute(
|
cursor.execute(
|
||||||
"""
|
"""
|
||||||
SELECT schedule_time, weekdays, random_delay, last_run_at
|
SELECT schedule_time, weekdays, random_delay, last_run_at, next_run_at
|
||||||
FROM user_schedules
|
FROM user_schedules
|
||||||
WHERE id = ?
|
WHERE id = ?
|
||||||
""",
|
""",
|
||||||
@@ -195,15 +203,28 @@ def toggle_user_schedule(schedule_id, enabled):
|
|||||||
)
|
)
|
||||||
row = cursor.fetchone()
|
row = cursor.fetchone()
|
||||||
if row:
|
if row:
|
||||||
schedule_time, weekdays, random_delay, last_run_at = row[0], row[1], row[2], row[3]
|
schedule_time, weekdays, random_delay, last_run_at, existing_next_run_at = (
|
||||||
next_dt = compute_next_run_at(
|
row[0],
|
||||||
now=now_dt,
|
row[1],
|
||||||
schedule_time=str(schedule_time or "08:00"),
|
row[2],
|
||||||
weekdays=str(weekdays or "1,2,3,4,5"),
|
row[3],
|
||||||
random_delay=int(random_delay or 0),
|
row[4],
|
||||||
last_run_at=str(last_run_at or "") if last_run_at else None,
|
|
||||||
)
|
)
|
||||||
next_run_at = format_cst(next_dt)
|
|
||||||
|
existing_next_run_at = str(existing_next_run_at or "").strip() or None
|
||||||
|
# 若 next_run_at 已经被“修改配置”逻辑预先计算好且仍在未来,则优先沿用,
|
||||||
|
# 避免 last_run_at 的“同日仅一次”限制阻塞用户把任务调整到今天再次触发。
|
||||||
|
if existing_next_run_at and existing_next_run_at > now_str:
|
||||||
|
next_run_at = existing_next_run_at
|
||||||
|
else:
|
||||||
|
next_dt = compute_next_run_at(
|
||||||
|
now=now_dt,
|
||||||
|
schedule_time=str(schedule_time or "08:00"),
|
||||||
|
weekdays=str(weekdays or "1,2,3,4,5"),
|
||||||
|
random_delay=int(random_delay or 0),
|
||||||
|
last_run_at=str(last_run_at or "") if last_run_at else None,
|
||||||
|
)
|
||||||
|
next_run_at = format_cst(next_dt)
|
||||||
|
|
||||||
cursor.execute(
|
cursor.execute(
|
||||||
"""
|
"""
|
||||||
|
|||||||
Reference in New Issue
Block a user