VWED_server/routes/model/task_model.py

221 lines
9.2 KiB
Python
Raw Normal View History

2025-04-30 16:57:46 +08:00
#!/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