299 lines
8.5 KiB
Python
299 lines
8.5 KiB
Python
"""
|
||
系统配置服务层
|
||
"""
|
||
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()
|