#!/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()