first commit

This commit is contained in:
2026-06-25 17:41:06 +08:00
commit b2f23a933b
370 changed files with 30526 additions and 0 deletions
+75
View File
@@ -0,0 +1,75 @@
from typing import Optional
from typing import Dict, Any, Union
from datetime import datetime
from pydantic import BaseModel, Field, ConfigDict
from app.models.enums import TaskStatus, TaskType
class DecodeTaskParams(BaseModel):
filename: str = Field(..., description="文件名")
sheet_name: str = Field(..., description="工作表名称")
decode_type: str = Field(..., description="解码类型")
header: str = Field(..., description="解析列")
model: Optional[str] = Field(None, description="模型名称")
class DecodeTaskResult(BaseModel):
filename: str = Field(..., description="结果保存文件名")
spend: float = Field(..., description="任务耗时")
rows: int = Field(..., description="解析行数")
class TaskResponse(BaseModel):
id: int
name: str
type: TaskType # ← Pydantic 会自动转为字符串
params: dict
status: TaskStatus # ← 同上
result: Optional[dict]
class Config:
from_attributes=True
use_enum_values = True # ← 关键!将 Enum 转为值(如 'pending'
# 或者在 Pydantic v2 中:
# model_config = ConfigDict(use_enum_values=True)
class TaskModel(BaseModel):
name: str
type: TaskType # Enum: e.g., "decode", "upload", etc.
params: Dict[str, Any] # 存储原始参数字典
status: TaskStatus
result: Optional[Dict[str, Any]] = None
@classmethod
def create_decode_task(
cls,
name: str,
params: DecodeTaskParams,
status: TaskStatus = TaskStatus.PENDING
) -> "TaskModel":
"""创建解码任务的工厂方法"""
return cls(
name=name,
type=TaskType.DECODE_ORDER,
params=params.dict(),
status=status
)
def get_params(self) -> BaseModel:
"""反序列化 params 为具体模型"""
if self.type == TaskType.DECODE_ORDER:
return DecodeTaskParams(**self.params)
raise ValueError(f"Unknown task type: {self.type}")
def set_result(self, result: Union[DecodeTaskResult]) -> None:
"""设置结果(自动序列化)"""
if self.type == TaskType.DECODE_ORDER:
self.result = result.dict()
else:
raise ValueError(f"Unsupported result for task type: {self.type}")
def get_result(self) -> Optional[BaseModel]:
"""反序列化 result 为具体模型"""
if self.result is None:
return None
if self.type == TaskType.DECODE_ORDER:
return DecodeTaskResult(**self.result)
raise ValueError(f"Unknown task type: {self.type}")