VWED_server/services/template_service.py
2025-04-30 16:57:46 +08:00

184 lines
6.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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