221 lines
9.2 KiB
Python
221 lines
9.2 KiB
Python
#!/usr/bin/env python
|
||
# -*- coding: utf-8 -*-
|
||
|
||
"""
|
||
天风任务API模型模块
|
||
包含天风任务管理API的请求和响应数据模型
|
||
"""
|
||
|
||
from typing import Optional, List, Dict, Any
|
||
import re
|
||
from pydantic import BaseModel, Field, validator
|
||
from routes.model.task_edit_model import TaskInputParam
|
||
from routes.model.base import PageResult, PaginationParams, SortParams
|
||
|
||
class CreateTaskRequest(BaseModel):
|
||
"""创建任务请求模型"""
|
||
label: str = Field(..., description="任务名称", min_length=2, max_length=50)
|
||
taskType: int = Field(..., description="任务类型:1-普通任务,2-定时任务")
|
||
mapId: Optional[str] = Field(..., description="地图ID")
|
||
remark: Optional[str] = Field(None, description="任务备注")
|
||
period: Optional[int] = Field(None, description="周期时间(毫秒),定时任务必填")
|
||
delay: Optional[int] = Field(3000, description="延迟时间(毫秒),默认3000")
|
||
releaseSites: Optional[bool] = Field(True, description="是否释放站点,默认true")
|
||
token: Optional[str] = Field(None, description="用户token值,用于认证")
|
||
tenantId: str = Field("default", description="租户ID,用于多租户隔离")
|
||
|
||
@validator('label')
|
||
def label_must_not_be_empty_or_whitespace(cls, v):
|
||
"""验证任务名称不为空且不只包含空白字符"""
|
||
if not v or v.strip() == "":
|
||
raise ValueError('任务名称不能为空')
|
||
|
||
# 检查是否只包含空白字符
|
||
if re.match(r'^\s+$', v):
|
||
raise ValueError('任务名称不能只包含空格')
|
||
|
||
# 检查是否包含特殊字符
|
||
if re.search(r'[<>:"/\\|?*]', v):
|
||
raise ValueError('任务名称不能包含特殊字符 < > : " / \\ | ? *')
|
||
|
||
return v.strip()
|
||
|
||
@validator('taskType')
|
||
def validate_task_type(cls, v):
|
||
"""验证任务类型"""
|
||
if v not in [1, 2]:
|
||
raise ValueError('任务类型必须为1(普通任务)或2(定时任务)')
|
||
return v
|
||
|
||
@validator('period', always=True)
|
||
def validate_period(cls, v, values):
|
||
"""验证周期时间"""
|
||
if 'taskType' in values and values['taskType'] == 2 and not v:
|
||
raise ValueError('定时任务必须指定周期时间')
|
||
return v
|
||
|
||
class TaskDefCreateRequest(BaseModel):
|
||
"""任务定义创建请求模型"""
|
||
label: str = Field(..., description="任务名称", min_length=2, max_length=50)
|
||
task_type: int = Field(..., description="任务类型:1-普通任务,2-定时任务")
|
||
remark: Optional[str] = Field(None, description="任务备注")
|
||
period: Optional[int] = Field(None, description="周期时间(毫秒),定时任务必填")
|
||
delay: Optional[int] = Field(3000, description="延迟时间(毫秒),默认3000")
|
||
release_sites: Optional[bool] = Field(True, description="是否释放站点,默认true")
|
||
token: Optional[str] = Field(None, description="用户token值,用于认证")
|
||
tenant_id: str = Field("default", description="租户ID,用于多租户隔离")
|
||
category_id: Optional[str] = Field(None, description="分类ID")
|
||
template_id: Optional[str] = Field(None, description="模板ID")
|
||
|
||
@validator('label')
|
||
def label_must_not_be_empty_or_whitespace(cls, v):
|
||
"""验证任务名称不为空且不只包含空白字符"""
|
||
if not v or v.strip() == "":
|
||
raise ValueError('任务名称不能为空')
|
||
|
||
# 检查是否只包含空白字符
|
||
if re.match(r'^\s+$', v):
|
||
raise ValueError('任务名称不能只包含空格')
|
||
|
||
# 检查是否包含特殊字符
|
||
if re.search(r'[<>:"/\\|?*]', v):
|
||
raise ValueError('任务名称不能包含特殊字符 < > : " / \\ | ? *')
|
||
|
||
return v.strip()
|
||
|
||
@validator('task_type')
|
||
def validate_task_type(cls, v):
|
||
"""验证任务类型"""
|
||
if v not in [1, 2]:
|
||
raise ValueError('任务类型必须为1(普通任务)或2(定时任务)')
|
||
return v
|
||
|
||
@validator('period', always=True)
|
||
def validate_period(cls, v, values):
|
||
"""验证周期时间"""
|
||
if 'task_type' in values and values['task_type'] == 2 and not v:
|
||
raise ValueError('定时任务必须指定周期时间')
|
||
return v
|
||
|
||
class TaskDefUpdateRequest(BaseModel):
|
||
"""任务定义更新请求模型"""
|
||
label: Optional[str] = Field(None, description="任务名称", min_length=2, max_length=50)
|
||
task_type: Optional[int] = Field(None, description="任务类型:1-普通任务,2-定时任务")
|
||
remark: Optional[str] = Field(None, description="任务备注")
|
||
period: Optional[int] = Field(None, description="周期时间(毫秒),定时任务必填")
|
||
delay: Optional[int] = Field(None, description="延迟时间(毫秒)")
|
||
release_sites: Optional[bool] = Field(None, description="是否释放站点")
|
||
category_id: Optional[str] = Field(None, description="分类ID")
|
||
template_id: Optional[str] = Field(None, description="模板ID")
|
||
|
||
@validator('label')
|
||
def label_must_not_be_empty_or_whitespace(cls, v):
|
||
"""验证任务名称不为空且不只包含空白字符"""
|
||
if v is None:
|
||
return v
|
||
|
||
if v.strip() == "":
|
||
raise ValueError('任务名称不能为空')
|
||
|
||
# 检查是否只包含空白字符
|
||
if re.match(r'^\s+$', v):
|
||
raise ValueError('任务名称不能只包含空格')
|
||
|
||
# 检查是否包含特殊字符
|
||
if re.search(r'[<>:"/\\|?*]', v):
|
||
raise ValueError('任务名称不能包含特殊字符 < > : " / \\ | ? *')
|
||
|
||
return v.strip()
|
||
|
||
@validator('task_type')
|
||
def validate_task_type(cls, v):
|
||
"""验证任务类型"""
|
||
if v is None:
|
||
return v
|
||
|
||
if v not in [1, 2]:
|
||
raise ValueError('任务类型必须为1(普通任务)或2(定时任务)')
|
||
return v
|
||
|
||
class DeleteTaskRequest(BaseModel):
|
||
"""删除任务请求模型"""
|
||
ids: List[str] = Field(..., description="要删除的任务ID数组")
|
||
|
||
@validator('ids')
|
||
def ids_must_not_be_empty(cls, v):
|
||
"""验证ID列表不为空"""
|
||
if not v:
|
||
raise ValueError('删除任务ID列表不能为空')
|
||
return v
|
||
|
||
class RunTaskRequest(BaseModel):
|
||
"""运行任务请求模型"""
|
||
taskId: str = Field(..., description="要运行的任务ID")
|
||
params: List[TaskInputParam] = Field(..., description="任务运行参数,根据任务定义中的inputParams字段确定")
|
||
priority: Optional[int] = Field(1, description="任务优先级,默认为1")
|
||
|
||
class ExportBatchRequest(BaseModel):
|
||
"""批量导出任务请求模型"""
|
||
ids: List[str] = Field(..., description="要导出的任务ID数组")
|
||
|
||
@validator('ids')
|
||
def ids_must_not_be_empty(cls, v):
|
||
"""验证ID列表不为空"""
|
||
if not v:
|
||
raise ValueError('导出任务ID列表不能为空')
|
||
return v
|
||
|
||
class BatchTaskRequest(BaseModel):
|
||
"""批量任务操作请求模型"""
|
||
operation: str = Field(..., description="操作类型:delete-删除,update_status-更新状态")
|
||
ids: List[str] = Field(..., description="要操作的任务ID数组")
|
||
status: Optional[str] = Field(None, description="当操作类型为update_status时,指定要更新的状态")
|
||
|
||
@validator('operation')
|
||
def validate_operation(cls, v):
|
||
"""验证操作类型"""
|
||
if v not in ["delete", "update_status"]:
|
||
raise ValueError('操作类型必须为delete或update_status')
|
||
return v
|
||
|
||
@validator('ids')
|
||
def ids_must_not_be_empty(cls, v):
|
||
"""验证ID列表不为空"""
|
||
if not v:
|
||
raise ValueError('操作任务ID列表不能为空')
|
||
return v
|
||
|
||
@validator('status', always=True)
|
||
def validate_status(cls, v, values):
|
||
"""验证状态值"""
|
||
if 'operation' in values and values['operation'] == 'update_status' and not v:
|
||
raise ValueError('更新状态操作必须指定状态值')
|
||
return v
|
||
|
||
class BatchTaskResponse(BaseModel):
|
||
"""批量任务操作响应模型"""
|
||
success_count: int = Field(..., description="成功处理的任务数量")
|
||
failed_ids: List[str] = Field(..., description="处理失败的任务ID列表")
|
||
|
||
class TaskResponse(BaseModel):
|
||
"""任务响应模型"""
|
||
id: str = Field(..., description="任务ID")
|
||
label: str = Field(..., description="任务名称")
|
||
version: int = Field(..., description="任务版本号")
|
||
status: int = Field(..., description="任务状态")
|
||
createDate: Any = Field(None, description="创建日期")
|
||
|
||
class TaskRunResponse(BaseModel):
|
||
"""任务运行响应模型"""
|
||
taskRecordId: str = Field(..., description="任务记录ID")
|
||
status: int = Field(..., description="任务状态")
|
||
createTime: Any = Field(..., description="创建时间")
|
||
|
||
class TaskListParams(PaginationParams, SortParams):
|
||
"""任务列表查询参数模型"""
|
||
keyword: Optional[str] = Field(None, description="关键字搜索(任务名称)")
|
||
status: Optional[int] = Field(None, description="任务状态筛选")
|
||
|
||
class TaskListResponse(PageResult[TaskResponse]):
|
||
"""任务列表响应模型"""
|
||
pass |