#!/usr/bin/env python # -*- coding: utf-8 -*- """ 任务版本模型模块 包含任务版本相关的数据模型 """ from sqlalchemy import Column, Integer, String, Text, Boolean, ForeignKey, JSON from sqlalchemy.orm import relationship from data.models.base import BaseModel class TaskVersion(BaseModel): """ 任务版本模型 表示任务的一个版本 """ __tablename__ = 'task_versions' task_id = Column(Integer, ForeignKey('tasks.id'), nullable=False, comment='任务ID') version = Column(String(20), nullable=False, comment='版本号') content = Column(JSON, nullable=True, comment='任务内容(JSON格式)') flow_data = Column(JSON, nullable=True, comment='流程数据(JSON格式)') remark = Column(String(500), nullable=True, comment='版本备注') source_code = Column(Text, nullable=True, comment='生成的源代码') source_code_type = Column(String(20), default='javascript', comment='源代码类型') is_compiled = Column(Boolean, default=False, comment='是否已编译') compiled_code = Column(Text, nullable=True, comment='编译后的代码') created_by = Column(String(100), nullable=True, comment='创建用户ID') # 关联关系 task = relationship('Task', back_populates='versions') flow_blocks = relationship('TaskFlowBlock', back_populates='version') def __repr__(self): return f"" @classmethod def get_latest_version(cls, task_id): """ 获取任务的最新版本 """ return cls.query.filter( cls.task_id == task_id, cls.is_deleted == False ).order_by(cls.created_at.desc()).first() @classmethod def create_version(cls, task_id, content, flow_data=None, remark=None, source_code=None, created_by=None): """ 创建新版本 """ from config.database import db_session # 获取任务 from data.models.task import Task task = Task.query.get(task_id) if not task or task.is_deleted: return None # 获取最新版本号 latest_version = cls.get_latest_version(task_id) if latest_version: # 版本号加0.1 try: version_num = float(latest_version.version) + 0.1 version = f"{version_num:.1f}" except ValueError: # 如果版本号不是数字格式,则使用时间戳 import time version = str(int(time.time())) else: # 第一个版本 version = "1.0" # 创建新版本 version_obj = cls( task_id=task_id, version=version, content=content, flow_data=flow_data, remark=remark, source_code=source_code, created_by=created_by ) db_session.add(version_obj) db_session.commit() # 更新任务的当前版本 task.current_version_id = version_obj.id task.updated_by = created_by 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.CREATE, target_type=TargetType.TASK_VERSION, target_id=version_obj.id, target_name=f"{task.name} v{version}", operation_details={ 'task_id': task_id, 'version': version, 'remark': remark } ) return version_obj def update_source_code(self, source_code, source_code_type='javascript', updated_by=None): """ 更新源代码 """ from config.database import db_session self.source_code = source_code self.source_code_type = source_code_type self.is_compiled = False # 重置编译状态 self.compiled_code = None db_session.commit() # 记录用户操作 from data.models.user_operation import UserOperation, OperationType, TargetType if updated_by: UserOperation.log_operation( user_id=updated_by, user_name=None, # 用户名称需要从外部系统获取 operation_type=OperationType.UPDATE, target_type=TargetType.TASK_VERSION, target_id=self.id, target_name=f"{self.task.name} v{self.version}", operation_details={ 'action': 'update_source_code', 'source_code_type': source_code_type } ) return self