124 lines
4.6 KiB
Python
Raw Normal View History

2025-03-17 14:58:05 +08:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
任务记录模型模块
包含任务执行记录相关的数据模型
"""
import datetime
from sqlalchemy import Column, Integer, String, Text, DateTime, Boolean, Enum, ForeignKey, JSON
from sqlalchemy.orm import relationship
from data.models.base import BaseModel
from data.models.task import TaskStatus
class TaskRecord(BaseModel):
"""
任务记录模型
表示任务的一次执行记录
"""
__tablename__ = 'task_records'
task_id = Column(Integer, ForeignKey('tasks.id'), nullable=False, comment='任务ID')
version_id = Column(Integer, ForeignKey('task_versions.id'), nullable=True, comment='任务版本ID')
status = Column(Enum(TaskStatus), nullable=False, default=TaskStatus.PENDING, comment='任务状态')
robot_id = Column(Integer, nullable=True, comment='执行机器人ID引用外部机器人系统')
start_time = Column(DateTime, nullable=True, comment='开始时间')
end_time = Column(DateTime, nullable=True, comment='结束时间')
result = Column(JSON, nullable=True, comment='执行结果JSON格式')
error_message = Column(Text, nullable=True, comment='错误信息')
execution_log = Column(Text, nullable=True, comment='执行日志')
is_test = Column(Boolean, default=False, comment='是否为测试执行')
test_environment = Column(String(50), nullable=True, comment='测试环境')
execution_details = Column(JSON, nullable=True, comment='执行详情JSON格式')
performance_metrics = Column(JSON, nullable=True, comment='性能指标JSON格式')
created_by = Column(String(100), nullable=True, comment='创建用户ID')
# 关联关系
task = relationship('Task', back_populates='records')
def __repr__(self):
return f"<TaskRecord(id={self.id}, task_id={self.task_id}, status='{self.status}')>"
def update_status(self, status, error_message=None):
"""
更新任务状态
"""
self.status = status
if status == TaskStatus.RUNNING and not self.start_time:
self.start_time = datetime.datetime.now()
elif status in [TaskStatus.COMPLETED, TaskStatus.CANCELLED, TaskStatus.FAILED]:
self.end_time = datetime.datetime.now()
if status == TaskStatus.FAILED and error_message:
self.error_message = error_message
self.save()
return self
@classmethod
def get_running_tasks(cls):
"""
获取所有正在运行的任务
"""
return cls.query.filter(
cls.status == TaskStatus.RUNNING,
cls.is_deleted == False
).all()
@classmethod
def get_task_history(cls, task_id, page=1, per_page=20):
"""
获取任务的执行历史记录
"""
return cls.query.filter(
cls.task_id == task_id,
cls.is_deleted == False
).order_by(cls.created_at.desc()).paginate(page=page, per_page=per_page)
@classmethod
def get_test_records(cls, task_id, page=1, per_page=20):
"""
获取任务的测试记录
"""
return cls.query.filter(
cls.task_id == task_id,
cls.is_test == True,
cls.is_deleted == False
).order_by(cls.created_at.desc()).paginate(page=page, per_page=per_page)
@classmethod
def create_test_record(cls, task_id, version_id, created_by=None, test_environment='test'):
"""
创建测试记录
"""
from config.database import db_session
record = cls(
task_id=task_id,
version_id=version_id,
status=TaskStatus.PENDING,
is_test=True,
test_environment=test_environment,
created_by=created_by
)
db_session.add(record)
db_session.commit()
# 记录用户操作
from data.models.user_operation import UserOperation, OperationType, TargetType
if created_by:
UserOperation.log_operation(
user_id=created_by,
user_name=None, # 用户名称需要从外部系统获取
operation_type=OperationType.EXECUTE,
target_type=TargetType.TASK,
target_id=task_id,
target_name=None, # 任务名称需要查询
operation_details={
'record_id': record.id,
'is_test': True,
'test_environment': test_environment
}
)
return record