TaskPulse/backend/app/models/execution.py
Steven 521cf0269c feat: initial TaskPulse release
AI Agent 定时任务跟踪、监控、状态看板系统。

- FastAPI + Vue3 单体应用
- AI Agent 一键接入(批量注册 API)
- 暗色主题 Dashboard
- 后台调度器 + 超时告警
- 飞书/邮件/Webhook 多渠道通知
- Base URL 可配置
- Gunicorn 生产部署
2026-06-14 22:39:23 +08:00

31 lines
1.6 KiB
Python

"""SQLAlchemy models — TaskExecution."""
from datetime import datetime
from sqlalchemy import DateTime, ForeignKey, Integer, String, Text, func
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.database import Base
class TaskExecution(Base):
__tablename__ = "task_executions"
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
task_id: Mapped[int] = mapped_column(ForeignKey("scheduled_tasks.id", ondelete="CASCADE"), nullable=False)
agent_id: Mapped[int] = mapped_column(ForeignKey("agents.id", ondelete="CASCADE"), nullable=False)
status: Mapped[str] = mapped_column(String(32), default="running", comment="running / success / failed")
started_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now(), comment="开始时间")
finished_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True, comment="结束时间")
duration_ms: Mapped[int | None] = mapped_column(Integer, nullable=True, comment="耗时(毫秒)")
result: Mapped[str | None] = mapped_column(Text, nullable=True, comment="执行结果摘要 (JSON)")
log: Mapped[str | None] = mapped_column(Text, nullable=True, comment="执行日志")
error_message: Mapped[str | None] = mapped_column(Text, nullable=True, comment="错误信息")
created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())
task = relationship("ScheduledTask", back_populates="executions")
agent = relationship("Agent")
def __repr__(self) -> str:
return f"<TaskExecution #{self.id} task={self.task_id} status={self.status}>"