fix: 修复定时任务模型字段与数据库表不匹配的问题
All checks were successful
continuous-integration/drone/push Build is passing
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:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user