VWED_server/services/template_service.py

184 lines
6.0 KiB
Python
Raw Permalink Normal View History

2025-04-30 16:57:46 +08:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
任务模板服务层
处理任务模板相关的业务逻辑
"""
from sqlalchemy.orm import Session
from typing import List, Dict, Any, Optional
from sqlalchemy import and_, desc
from data.models.tasktemplate import VWEDTaskTemplate
from utils.logger import get_logger
# 设置日志
logger = get_logger("services.template_service")
class TemplateService:
"""
任务模板服务类
提供任务模板的相关业务操作
"""
@staticmethod
def get_template_list(
db: Session,
page: int = 1,
page_size: int = 10,
template_name: Optional[str] = None,
status: Optional[int] = None
) -> Dict[str, Any]:
"""
获取任务模板列表
Args:
db: 数据库会话
page: 页码从1开始
page_size: 每页记录数
template_name: 模板名称模糊匹配
status: 状态过滤0-未启用1-启用完成
Returns:
Dict[str, Any]: 包含模板列表和总数的字典
"""
try:
# 构建查询条件
query = db.query(VWEDTaskTemplate)
# 添加筛选条件
if template_name:
query = query.filter(VWEDTaskTemplate.template_name.like(f'%{template_name}%'))
if status is not None:
query = query.filter(VWEDTaskTemplate.template_if_enable == status)
# 计算总数
total = query.count()
# 添加默认按创建时间倒序排序
query = query.order_by(desc(VWEDTaskTemplate.created_at))
# 分页处理
offset = (page - 1) * page_size
templates = query.offset(offset).limit(page_size).all()
# 格式化返回结果
result = []
for template in templates:
result.append({
"id": template.id,
"templateName": template.template_name,
"templateDescription": template.template_description,
"status": template.template_if_enable
})
return {
"total": total,
"list": result
}
except Exception as e:
logger.error(f"获取任务模板列表失败: {str(e)}")
raise Exception(f"获取任务模板列表失败: {str(e)}")
@staticmethod
def enable_template(db: Session, template_id: str) -> None:
"""
启用指定的任务模板
当一个模板被启用时之前已启用的模板会自动被禁用
确保系统中始终只有一个处于激活状态的模板
Args:
db: 数据库会话
template_id: 模板ID
Raises:
Exception: 如果模板不存在或启用过程出错
"""
try:
# 检查模板是否存在
template = db.query(VWEDTaskTemplate).filter(VWEDTaskTemplate.id == template_id).first()
if not template:
raise Exception(f"模板不存在: {template_id}")
# 检查模板是否已经启用
if template.template_if_enable == 1:
raise Exception(f"该模板已处于启用状态: {template_id}")
# 禁用所有模板
db.query(VWEDTaskTemplate).update({"template_if_enable": 0})
# 启用当前模板
template.template_if_enable = 1
db.commit()
logger.info(f"模板启用成功: {template_id}")
except Exception as e:
db.rollback() # 回滚事务
logger.error(f"模板启用失败: {str(e)}")
raise Exception(f"模板启用失败: {str(e)}")
@staticmethod
def get_template_by_id(db: Session, template_id: str) -> Optional[Dict[str, Any]]:
"""
根据ID获取任务模板详情
Args:
db: 数据库会话
template_id: 模板ID
Returns:
Optional[Dict[str, Any]]: 模板详情如果不存在则返回None
"""
try:
template = db.query(VWEDTaskTemplate).filter(VWEDTaskTemplate.id == template_id).first()
if not template:
return None
return {
"id": template.id,
"templateName": template.template_name,
"templateDescription": template.template_description,
"status": template.template_if_enable,
"templateDir": template.template_dir
}
except Exception as e:
logger.error(f"获取任务模板详情失败: {str(e)}")
raise Exception(f"获取任务模板详情失败: {str(e)}")
@staticmethod
def get_enabled_template(db: Session) -> Optional[Dict[str, Any]]:
"""
获取当前启用的任务模板
Args:
db: 数据库会话
Returns:
Optional[Dict[str, Any]]: 启用的模板详情如果不存在则返回None
"""
try:
template = db.query(VWEDTaskTemplate).filter(
VWEDTaskTemplate.template_if_enable == 1
).first()
if not template:
return None
return {
"id": template.id,
"templateName": template.template_name,
"templateDescription": template.template_description,
"status": template.template_if_enable,
"templateDir": template.template_dir
}
except Exception as e:
logger.error(f"获取启用的任务模板失败: {str(e)}")
raise Exception(f"获取启用的任务模板失败: {str(e)}")