Files
zcglxt/backend_new/app/services/system_config_service.py

299 lines
8.5 KiB
Python
Raw 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.
"""
系统配置服务层
"""
from typing import Optional, List, Dict, Any
from sqlalchemy.ext.asyncio import AsyncSession
from app.crud.system_config import system_config_crud
from app.schemas.system_config import SystemConfigCreate, SystemConfigUpdate
import json
class SystemConfigService:
"""系统配置服务类"""
async def get_config(self, db: AsyncSession, config_id: int) -> Optional[Dict[str, Any]]:
"""
获取配置详情
Args:
db: 数据库会话
config_id: 配置ID
Returns:
配置信息
"""
config = await system_config_crud.get(db, config_id)
if not config:
return None
return {
"id": config.id,
"config_key": config.config_key,
"config_name": config.config_name,
"config_value": config.config_value,
"value_type": config.value_type,
"category": config.category,
"description": config.description,
"is_system": config.is_system,
"is_encrypted": config.is_encrypted,
"validation_rule": config.validation_rule,
"options": config.options,
"default_value": config.default_value,
"sort_order": config.sort_order,
"is_active": config.is_active,
"created_at": config.created_at,
"updated_at": config.updated_at,
"updated_by": config.updated_by,
}
async def get_config_by_key(
self,
db: AsyncSession,
config_key: str,
default: Any = None
) -> Any:
"""
根据键获取配置值
Args:
db: 数据库会话
config_key: 配置键
default: 默认值
Returns:
配置值
"""
return await system_config_crud.get_value(db, config_key, default)
async def get_configs(
self,
db: AsyncSession,
*,
skip: int = 0,
limit: int = 20,
keyword: Optional[str] = None,
category: Optional[str] = None,
is_active: Optional[bool] = None,
is_system: Optional[bool] = None
) -> Dict[str, Any]:
"""
获取配置列表
Args:
db: 数据库会话
skip: 跳过条数
limit: 返回条数
keyword: 搜索关键词
category: 配置分类
is_active: 是否启用
is_system: 是否系统配置
Returns:
配置列表和总数
"""
items, total = await system_config_crud.get_multi(
db,
skip=skip,
limit=limit,
keyword=keyword,
category=category,
is_active=is_active,
is_system=is_system
)
return {
"items": [
{
"id": item.id,
"config_key": item.config_key,
"config_name": item.config_name,
"config_value": item.config_value,
"value_type": item.value_type,
"category": item.category,
"description": item.description,
"is_system": item.is_system,
"is_encrypted": item.is_encrypted,
"options": item.options,
"default_value": item.default_value,
"sort_order": item.sort_order,
"is_active": item.is_active,
"created_at": item.created_at,
"updated_at": item.updated_at,
}
for item in items
],
"total": total
}
async def get_configs_by_category(
self,
db: AsyncSession,
category: str,
is_active: bool = True
) -> List[Dict[str, Any]]:
"""
根据分类获取配置
Args:
db: 数据库会话
category: 配置分类
is_active: 是否启用
Returns:
配置列表
"""
items = await system_config_crud.get_by_category(db, category, is_active=is_active)
return [
{
"config_key": item.config_key,
"config_name": item.config_name,
"config_value": item.config_value,
"value_type": item.value_type,
"description": item.description,
}
for item in items
]
async def get_categories(self, db: AsyncSession) -> List[Dict[str, Any]]:
"""
获取所有配置分类
Args:
db: 数据库会话
Returns:
分类列表
"""
return await system_config_crud.get_categories(db)
async def create_config(
self,
db: AsyncSession,
obj_in: SystemConfigCreate,
creator_id: Optional[int] = None
) -> Dict[str, Any]:
"""
创建配置
Args:
db: 数据库会话
obj_in: 创建数据
creator_id: 创建人ID
Returns:
创建的配置信息
"""
# 检查键是否已存在
existing = await system_config_crud.get_by_key(db, obj_in.config_key)
if existing:
raise ValueError(f"配置键 {obj_in.config_key} 已存在")
# 转换为字典
obj_in_data = obj_in.model_dump()
# 处理复杂类型
if obj_in.options:
obj_in_data["options"] = json.loads(obj_in.options.model_dump_json()) if isinstance(obj_in.options, dict) else obj_in.options
config = await system_config_crud.create(db, obj_in=obj_in_data)
return {
"id": config.id,
"config_key": config.config_key,
"config_name": config.config_name,
"category": config.category,
}
async def update_config(
self,
db: AsyncSession,
config_id: int,
obj_in: SystemConfigUpdate,
updater_id: Optional[int] = None
) -> Dict[str, Any]:
"""
更新配置
Args:
db: 数据库会话
config_id: 配置ID
obj_in: 更新数据
updater_id: 更新人ID
Returns:
更新的配置信息
"""
config = await system_config_crud.get(db, config_id)
if not config:
raise ValueError("配置不存在")
# 系统配置不允许修改某些字段
if config.is_system:
if obj_in.config_key and obj_in.config_key != config.config_key:
raise ValueError("系统配置不允许修改配置键")
if obj_in.value_type and obj_in.value_type != config.value_type:
raise ValueError("系统配置不允许修改值类型")
if obj_in.category and obj_in.category != config.category:
raise ValueError("系统配置不允许修改分类")
# 转换为字典过滤None值
update_data = obj_in.model_dump(exclude_unset=True)
# 处理复杂类型
if update_data.get("options"):
update_data["options"] = json.loads(update_data["options"].model_dump_json()) if isinstance(update_data["options"], dict) else update_data["options"]
update_data["updated_by"] = updater_id
config = await system_config_crud.update(db, db_obj=config, obj_in=update_data)
return {
"id": config.id,
"config_key": config.config_key,
"config_name": config.config_name,
"config_value": config.config_value,
}
async def batch_update_configs(
self,
db: AsyncSession,
configs: Dict[str, Any],
updater_id: Optional[int] = None
) -> Dict[str, Any]:
"""
批量更新配置
Args:
db: 数据库会话
configs: 配置键值对
updater_id: 更新人ID
Returns:
更新结果
"""
updated = await system_config_crud.batch_update(
db,
configs=configs,
updater_id=updater_id
)
return {
"count": len(updated),
"configs": [item.config_key for item in updated]
}
async def delete_config(self, db: AsyncSession, config_id: int) -> None:
"""
删除配置
Args:
db: 数据库会话
config_id: 配置ID
"""
await system_config_crud.delete(db, config_id=config_id)
# 创建全局实例
system_config_service = SystemConfigService()