fix: 修复定时任务模型字段与数据库表不匹配的问题
All checks were successful
continuous-integration/drone/push Build is passing

- task_type -> execution_type
- status -> is_enabled
- 移除不存在的字段 webhook_method, webhook_headers, script_timeout
- time_points/input_params 适配 JSON 类型
This commit is contained in:
2026-01-28 16:45:58 +08:00
parent 104487f082
commit d9fa9708ce
3 changed files with 66 additions and 81 deletions

View File

@@ -21,15 +21,13 @@ router = APIRouter(prefix="/api/scheduled-tasks", tags=["scheduled-tasks"])
class TaskCreate(BaseModel):
tenant_id: Optional[str] = None
task_name: str
task_type: str = 'script'
task_desc: Optional[str] = None
execution_type: str = 'script'
schedule_type: str = 'simple'
time_points: Optional[List[str]] = None
cron_expression: Optional[str] = None
webhook_url: Optional[str] = None
webhook_method: Optional[str] = 'POST'
webhook_headers: Optional[dict] = None
script_content: Optional[str] = None
script_timeout: Optional[int] = 300
input_params: Optional[dict] = None
retry_count: Optional[int] = 0
retry_interval: Optional[int] = 60
@@ -40,21 +38,19 @@ class TaskCreate(BaseModel):
class TaskUpdate(BaseModel):
tenant_id: Optional[str] = None
task_name: Optional[str] = None
task_type: Optional[str] = None
task_desc: Optional[str] = None
execution_type: Optional[str] = None
schedule_type: Optional[str] = None
time_points: Optional[List[str]] = None
cron_expression: Optional[str] = None
webhook_url: Optional[str] = None
webhook_method: Optional[str] = None
webhook_headers: Optional[dict] = None
script_content: Optional[str] = None
script_timeout: Optional[int] = None
input_params: Optional[dict] = None
retry_count: Optional[int] = None
retry_interval: Optional[int] = None
alert_on_failure: Optional[bool] = None
alert_webhook: Optional[str] = None
status: Optional[int] = None
is_enabled: Optional[bool] = None
class SecretCreate(BaseModel):
@@ -91,7 +87,8 @@ async def list_tasks(
if tenant_id:
query = query.filter(ScheduledTask.tenant_id == tenant_id)
if status is not None:
query = query.filter(ScheduledTask.status == status)
is_enabled = status == 1
query = query.filter(ScheduledTask.is_enabled == is_enabled)
total = query.count()
items = query.order_by(desc(ScheduledTask.created_at)).offset((page - 1) * size).limit(size).all()
@@ -117,21 +114,19 @@ async def create_task(data: TaskCreate, db: Session = Depends(get_db)):
task = ScheduledTask(
tenant_id=data.tenant_id,
task_name=data.task_name,
task_type=data.task_type,
task_desc=data.task_desc,
execution_type=data.execution_type,
schedule_type=data.schedule_type,
time_points=json.dumps(data.time_points) if data.time_points else None,
time_points=data.time_points,
cron_expression=data.cron_expression,
webhook_url=data.webhook_url,
webhook_method=data.webhook_method,
webhook_headers=json.dumps(data.webhook_headers) if data.webhook_headers else None,
script_content=data.script_content,
script_timeout=data.script_timeout,
input_params=json.dumps(data.input_params) if data.input_params else None,
input_params=data.input_params,
retry_count=data.retry_count,
retry_interval=data.retry_interval,
alert_on_failure=1 if data.alert_on_failure else 0,
alert_on_failure=data.alert_on_failure,
alert_webhook=data.alert_webhook,
status=1
is_enabled=True
)
db.add(task)
@@ -156,41 +151,37 @@ async def update_task(task_id: int, data: TaskUpdate, db: Session = Depends(get_
task.tenant_id = data.tenant_id
if data.task_name is not None:
task.task_name = data.task_name
if data.task_type is not None:
task.task_type = data.task_type
if data.task_desc is not None:
task.task_desc = data.task_desc
if data.execution_type is not None:
task.execution_type = data.execution_type
if data.schedule_type is not None:
task.schedule_type = data.schedule_type
if data.time_points is not None:
task.time_points = json.dumps(data.time_points)
task.time_points = data.time_points
if data.cron_expression is not None:
task.cron_expression = data.cron_expression
if data.webhook_url is not None:
task.webhook_url = data.webhook_url
if data.webhook_method is not None:
task.webhook_method = data.webhook_method
if data.webhook_headers is not None:
task.webhook_headers = json.dumps(data.webhook_headers)
if data.script_content is not None:
task.script_content = data.script_content
if data.script_timeout is not None:
task.script_timeout = data.script_timeout
if data.input_params is not None:
task.input_params = json.dumps(data.input_params)
task.input_params = data.input_params
if data.retry_count is not None:
task.retry_count = data.retry_count
if data.retry_interval is not None:
task.retry_interval = data.retry_interval
if data.alert_on_failure is not None:
task.alert_on_failure = 1 if data.alert_on_failure else 0
task.alert_on_failure = data.alert_on_failure
if data.alert_webhook is not None:
task.alert_webhook = data.alert_webhook
if data.status is not None:
task.status = data.status
if data.is_enabled is not None:
task.is_enabled = data.is_enabled
db.commit()
# 更新调度器
if task.status == 1:
if task.is_enabled:
scheduler_service.add_task(task.id)
else:
scheduler_service.remove_task(task.id)
@@ -224,15 +215,15 @@ async def toggle_task(task_id: int, db: Session = Depends(get_db)):
if not task:
raise HTTPException(status_code=404, detail="任务不存在")
task.status = 0 if task.status == 1 else 1
task.is_enabled = not task.is_enabled
db.commit()
if task.status == 1:
if task.is_enabled:
scheduler_service.add_task(task.id)
else:
scheduler_service.remove_task(task.id)
return {"success": True, "status": task.status}
return {"success": True, "status": 1 if task.is_enabled else 0}
@router.post("/{task_id}/run")
@@ -492,15 +483,22 @@ async def delete_secret(secret_id: int, db: Session = Depends(get_db)):
def format_task(task: ScheduledTask, include_content: bool = False) -> dict:
"""格式化任务数据"""
time_points = task.time_points
if isinstance(time_points, str):
try:
time_points = json.loads(time_points)
except:
time_points = []
data = {
"id": task.id,
"tenant_id": task.tenant_id,
"task_name": task.task_name,
"task_type": task.task_type,
"task_type": task.execution_type, # 前端使用 task_type
"schedule_type": task.schedule_type,
"time_points": json.loads(task.time_points) if task.time_points else [],
"time_points": time_points or [],
"cron_expression": task.cron_expression,
"status": task.status,
"status": 1 if task.is_enabled else 0, # 前端使用 status
"last_run_at": task.last_run_at,
"last_run_status": task.last_run_status,
"retry_count": task.retry_count,
@@ -513,11 +511,14 @@ def format_task(task: ScheduledTask, include_content: bool = False) -> dict:
if include_content:
data["webhook_url"] = task.webhook_url
data["webhook_method"] = task.webhook_method
data["webhook_headers"] = json.loads(task.webhook_headers) if task.webhook_headers else None
data["script_content"] = task.script_content
data["script_timeout"] = task.script_timeout
data["input_params"] = json.loads(task.input_params) if task.input_params else None
input_params = task.input_params
if isinstance(input_params, str):
try:
input_params = json.loads(input_params)
except:
input_params = None
data["input_params"] = input_params
return data