118 lines
3.3 KiB
Python
118 lines
3.3 KiB
Python
|
#!/usr/bin/env python
|
|||
|
# -*- coding: utf-8 -*-
|
|||
|
|
|||
|
"""
|
|||
|
块处理器基类模块
|
|||
|
提供所有块处理器的基类和注册功能
|
|||
|
"""
|
|||
|
|
|||
|
from abc import ABC, abstractmethod
|
|||
|
from typing import Dict, List, Any, Optional, Type, Callable
|
|||
|
import json
|
|||
|
import logging
|
|||
|
|
|||
|
# 获取日志记录器
|
|||
|
logger = logging.getLogger(__name__)
|
|||
|
|
|||
|
# 块处理器注册表
|
|||
|
_block_handlers = {}
|
|||
|
|
|||
|
class BlockHandler(ABC):
|
|||
|
"""
|
|||
|
块处理器抽象基类
|
|||
|
所有具体的块处理器都应该继承这个类
|
|||
|
"""
|
|||
|
|
|||
|
@abstractmethod
|
|||
|
async def execute(
|
|||
|
self,
|
|||
|
block: Dict[str, Any],
|
|||
|
input_params: Dict[str, Any],
|
|||
|
context: Any # TaskContext类型,避免循环导入
|
|||
|
) -> Dict[str, Any]:
|
|||
|
"""
|
|||
|
执行块
|
|||
|
|
|||
|
Args:
|
|||
|
block: 块定义
|
|||
|
input_params: 解析后的输入参数
|
|||
|
context: 任务上下文
|
|||
|
|
|||
|
Returns:
|
|||
|
Dict[str, Any]: 执行结果,必须包含success字段
|
|||
|
"""
|
|||
|
pass
|
|||
|
|
|||
|
async def _record_task_log(
|
|||
|
self,
|
|||
|
block: Dict[str, Any],
|
|||
|
result: Dict[str, Any],
|
|||
|
context: Any # TaskContext类型,避免循环导入
|
|||
|
) -> None:
|
|||
|
"""
|
|||
|
记录任务日志
|
|||
|
|
|||
|
Args:
|
|||
|
block: 块定义
|
|||
|
result: 执行结果
|
|||
|
context: 任务上下文
|
|||
|
"""
|
|||
|
from sqlalchemy import insert
|
|||
|
from data.models.tasklog import VWEDTaskLog
|
|||
|
from data.session import get_async_session
|
|||
|
import uuid
|
|||
|
from datetime import datetime
|
|||
|
|
|||
|
try:
|
|||
|
# 创建任务日志记录
|
|||
|
task_log_id = str(uuid.uuid4())
|
|||
|
|
|||
|
# 自定义JSON序列化器,处理datetime对象和bytes对象
|
|||
|
def json_serializer(obj):
|
|||
|
if isinstance(obj, datetime):
|
|||
|
return obj.isoformat()
|
|||
|
if isinstance(obj, bytes):
|
|||
|
return obj.decode('utf-8', errors='backslashreplace')
|
|||
|
raise TypeError(f"Object of type {type(obj)} is not JSON serializable")
|
|||
|
|
|||
|
async with get_async_session() as session:
|
|||
|
stmt = insert(VWEDTaskLog).values(
|
|||
|
id=task_log_id,
|
|||
|
level=1 if result.get("success", False) else 3, # 1: 信息, 3: 错误
|
|||
|
message=json.dumps(result, ensure_ascii=False, default=json_serializer),
|
|||
|
task_block_id=block.get("id", "unknown"),
|
|||
|
task_id=context.task_def_id,
|
|||
|
task_record_id=context.task_record_id
|
|||
|
)
|
|||
|
await session.execute(stmt)
|
|||
|
await session.commit()
|
|||
|
except Exception as e:
|
|||
|
logger.error(f"记录任务日志失败: {str(e)}")
|
|||
|
|
|||
|
|
|||
|
# 注册装饰器
|
|||
|
def register_handler(block_type: str):
|
|||
|
"""
|
|||
|
注册块处理器的装饰器
|
|||
|
|
|||
|
Args:
|
|||
|
block_type: 块类型
|
|||
|
"""
|
|||
|
def decorator(cls):
|
|||
|
_block_handlers[block_type] = cls()
|
|||
|
return cls
|
|||
|
return decorator
|
|||
|
|
|||
|
|
|||
|
# 获取块处理器
|
|||
|
def get_block_handler(block_type: str) -> Optional[BlockHandler]:
|
|||
|
"""
|
|||
|
获取块处理器
|
|||
|
|
|||
|
Args:
|
|||
|
block_type: 块类型
|
|||
|
|
|||
|
Returns:
|
|||
|
Optional[BlockHandler]: 对应的块处理器,如果不存在则返回None
|
|||
|
"""
|
|||
|
return _block_handlers.get(block_type)
|