#!/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"" 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