124 lines
4.6 KiB
Python
124 lines
4.6 KiB
Python
|
#!/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
|