VWED_server/routes/model/script_model.py

163 lines
8.0 KiB
Python
Raw Normal View History

2025-04-30 16:57:46 +08:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
在线脚本管理API模型定义
包含请求和响应的数据模型
"""
from typing import Dict, List, Optional, Any, Union
from pydantic import BaseModel, Field, RootModel
from datetime import datetime
# 请求模型
class ScriptListParams(BaseModel):
"""脚本列表查询参数"""
page: int = Field(1, description="页码默认为1")
pageSize: int = Field(20, description="每页记录数默认为20")
name: Optional[str] = Field(None, description="脚本名称,支持模糊查询")
status: Optional[int] = Field(None, description="脚本状态(1:启用, 0:禁用)")
folderPath: Optional[str] = Field(None, description="脚本所在目录路径")
tags: Optional[str] = Field(None, description="标签,支持模糊查询")
isPublic: Optional[int] = Field(None, description="是否公开(1:是, 0:否)")
createdBy: Optional[str] = Field(None, description="创建者")
startTime: Optional[str] = Field(None, description="创建时间范围的开始时间")
endTime: Optional[str] = Field(None, description="创建时间范围的结束时间")
sortField: str = Field("updated_on", description="排序字段")
sortOrder: str = Field("desc", description="排序方式(asc/desc)")
class CreateScriptRequest(BaseModel):
"""创建脚本请求"""
folderPath: Optional[str] = Field("/", description="脚本所在目录路径,默认为根目录")
fileName: str = Field(..., description="脚本文件名,必须以.py结尾")
code: str = Field(..., description="脚本代码内容")
name: Optional[str] = Field(None, description="脚本名称,默认使用文件名(不含扩展名)")
description: Optional[str] = Field(None, description="脚本功能描述")
status: Optional[int] = Field(1, description="状态(1:启用, 0:禁用)")
isPublic: Optional[int] = Field(1, description="是否公开(1:是, 0:否)")
tags: Optional[str] = Field(None, description="标签,用于分类查询")
testParams: Optional[str] = Field(None, description="测试参数(JSON格式)")
class UpdateScriptRequest(BaseModel):
"""更新脚本请求"""
folderPath: Optional[str] = Field(None, description="脚本所在目录路径")
fileName: Optional[str] = Field(None, description="脚本文件名,必须以.py结尾")
code: Optional[str] = Field(None, description="脚本代码内容")
name: Optional[str] = Field(None, description="脚本名称")
description: Optional[str] = Field(None, description="脚本功能描述")
status: Optional[int] = Field(None, description="状态(1:启用, 0:禁用)")
isPublic: Optional[int] = Field(None, description="是否公开(1:是, 0:否)")
tags: Optional[str] = Field(None, description="标签,用于分类查询")
testParams: Optional[str] = Field(None, description="测试参数(JSON格式)")
changeLog: Optional[str] = Field(None, description="版本变更说明")
class RunScriptRequest(BaseModel):
"""运行脚本请求"""
params: Optional[Dict[str, Any]] = Field(None, description="脚本执行参数JSON对象")
taskRecordId: Optional[str] = Field(None, description="关联的任务记录ID")
blockRecordId: Optional[str] = Field(None, description="关联的任务块记录ID")
class StopScriptRequest(BaseModel):
"""停止脚本执行请求"""
logId: str = Field(..., description="脚本执行日志ID")
class RestoreScriptVersionRequest(BaseModel):
"""恢复脚本版本请求"""
changeLog: Optional[str] = Field(None, description="版本变更说明")
# 响应模型
class ScriptInfo(BaseModel):
"""脚本信息"""
id: str = Field(..., description="脚本ID")
name: str = Field(..., description="脚本名称")
folderPath: str = Field(..., description="脚本所在目录路径")
fileName: str = Field(..., description="脚本文件名")
description: Optional[str] = Field(None, description="脚本功能描述")
version: int = Field(..., description="当前版本号")
status: int = Field(..., description="状态(1:启用, 0:禁用)")
isPublic: bool = Field(..., description="是否公开")
tags: Optional[str] = Field(None, description="标签")
createdBy: Optional[str] = Field(None, description="创建者")
createdOn: Optional[str] = Field(None, description="创建时间")
updatedBy: Optional[str] = Field(None, description="最后更新者")
updatedOn: Optional[str] = Field(None, description="最后更新时间")
class ScriptDetail(ScriptInfo):
"""脚本详情,包含代码内容"""
code: str = Field(..., description="脚本代码内容")
testParams: Optional[str] = Field(None, description="测试参数(JSON格式)")
class ScriptVersionInfo(BaseModel):
"""脚本版本信息"""
id: str = Field(..., description="版本记录ID")
scriptId: str = Field(..., description="关联的脚本ID")
version: int = Field(..., description="版本号")
changeLog: Optional[str] = Field(None, description="版本变更说明")
createdBy: Optional[str] = Field(None, description="创建者")
createdOn: Optional[str] = Field(None, description="创建时间")
class ScriptVersionDetail(ScriptVersionInfo):
"""脚本版本详情,包含代码内容"""
code: str = Field(..., description="该版本代码")
class ScriptLogInfo(BaseModel):
"""脚本执行日志信息"""
id: str = Field(..., description="日志ID")
scriptId: str = Field(..., description="关联的脚本ID")
version: int = Field(..., description="使用的脚本版本")
taskRecordId: Optional[str] = Field(None, description="关联的任务记录ID")
blockRecordId: Optional[str] = Field(None, description="关联的任务块记录ID")
inputParams: Optional[str] = Field(None, description="输入参数(JSON格式)")
outputResult: Optional[str] = Field(None, description="输出结果(JSON格式)")
status: int = Field(..., description="执行状态(1:成功, 0:失败)")
errorMessage: Optional[str] = Field(None, description="错误信息")
executionTime: Optional[int] = Field(None, description="执行耗时(毫秒)")
startedOn: Optional[str] = Field(None, description="开始时间")
endedOn: Optional[str] = Field(None, description="结束时间")
class ScriptLogDetail(ScriptLogInfo):
"""脚本执行日志详情"""
scriptName: Optional[str] = Field(None, description="脚本名称")
code: Optional[str] = Field(None, description="执行的脚本代码")
class FolderNode(BaseModel):
"""脚本目录节点"""
name: str = Field(..., description="目录名称")
path: str = Field(..., description="目录路径")
children: List["FolderNode"] = Field(default_factory=list, description="子目录")
class ScriptCreateResponse(BaseModel):
"""创建脚本响应"""
id: str = Field(..., description="脚本ID")
class ScriptUpdateResponse(BaseModel):
"""更新脚本响应"""
version: int = Field(..., description="脚本版本号")
class ScriptRunResponse(BaseModel):
"""运行脚本响应"""
logId: str = Field(..., description="脚本执行日志ID")
result: Dict[str, Any] = Field(..., description="脚本执行结果")
executionTime: int = Field(..., description="执行耗时(毫秒)")
class ScriptListResponse(BaseModel):
"""脚本列表响应"""
total: int = Field(..., description="总记录数")
list: List[ScriptInfo] = Field(..., description="脚本列表")
class ScriptVersionListResponse(BaseModel):
"""脚本版本列表响应"""
total: int = Field(..., description="总记录数")
list: List[ScriptVersionInfo] = Field(..., description="脚本版本列表")
class ScriptLogListResponse(BaseModel):
"""脚本执行日志列表响应"""
total: int = Field(..., description="总记录数")
list: List[ScriptLogInfo] = Field(..., description="脚本执行日志列表")
class FolderTreeResponse(RootModel):
"""脚本目录树响应"""
root: List[FolderNode] = Field(..., description="目录树")
# 解决循环引用
FolderNode.update_forward_refs()