156 lines
5.6 KiB
Python
156 lines
5.6 KiB
Python
from typing import Any
|
|
|
|
from sqlalchemy import ColumnElement
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from common.vo import CrudResponseModel, PageModel
|
|
from exceptions.exception import ServiceException
|
|
from module_ai.dao.ai_model_dao import AiModelDao
|
|
from module_ai.entity.vo.ai_model_vo import AiModelModel, AiModelPageQueryModel, DeleteAiModelModel
|
|
from utils.common_util import CamelCaseUtil
|
|
from utils.crypto_util import CryptoUtil
|
|
|
|
|
|
class AiModelService:
|
|
"""
|
|
AI模型管理服务层
|
|
"""
|
|
|
|
@classmethod
|
|
async def get_ai_model_list_services(
|
|
cls,
|
|
query_db: AsyncSession,
|
|
query_object: AiModelPageQueryModel,
|
|
data_scope_sql: ColumnElement,
|
|
is_page: bool = False,
|
|
) -> PageModel | list[dict[str, Any]]:
|
|
"""
|
|
获取AI模型列表信息service
|
|
|
|
:param query_db: orm对象
|
|
:param query_object: 查询参数对象
|
|
:param data_scope_sql: 数据权限对应的查询sql语句
|
|
:param is_page: 是否开启分页
|
|
:return: AI模型列表信息对象
|
|
"""
|
|
ai_model_list_result = await AiModelDao.get_ai_model_list(query_db, query_object, data_scope_sql, is_page)
|
|
rows = ai_model_list_result.rows if isinstance(ai_model_list_result, PageModel) else ai_model_list_result
|
|
|
|
for row in rows:
|
|
if 'apiKey' in row:
|
|
row['apiKey'] = '********' * 3
|
|
|
|
return ai_model_list_result
|
|
|
|
@classmethod
|
|
async def check_ai_model_data_scope_services(
|
|
cls,
|
|
query_db: AsyncSession,
|
|
model_id: int,
|
|
data_scope_sql: ColumnElement,
|
|
) -> CrudResponseModel:
|
|
"""
|
|
校验用户是否有AI模型数据权限service
|
|
|
|
:param query_db: orm对象
|
|
:param model_id: 模型主键
|
|
:param data_scope_sql: 数据权限对应的查询sql语句
|
|
:return: 校验结果
|
|
"""
|
|
ai_models = await AiModelDao.get_ai_model_list(
|
|
query_db, AiModelModel(modelId=model_id), data_scope_sql, is_page=False
|
|
)
|
|
if ai_models:
|
|
return CrudResponseModel(is_success=True, message='校验通过')
|
|
raise ServiceException(message='没有权限访问AI模型数据')
|
|
|
|
@classmethod
|
|
async def add_ai_model_services(cls, query_db: AsyncSession, page_object: AiModelModel) -> CrudResponseModel:
|
|
"""
|
|
新增AI模型信息service
|
|
|
|
:param request: Request对象
|
|
:param query_db: orm对象
|
|
:param page_object: 新增AI模型对象
|
|
:return: 新增AI模型校验结果
|
|
"""
|
|
try:
|
|
if page_object.api_key:
|
|
page_object.api_key = CryptoUtil.encrypt(page_object.api_key)
|
|
await AiModelDao.add_ai_model_dao(query_db, page_object)
|
|
await query_db.commit()
|
|
return CrudResponseModel(is_success=True, message='新增成功')
|
|
except Exception as e:
|
|
await query_db.rollback()
|
|
raise e
|
|
|
|
@classmethod
|
|
async def edit_ai_model_services(cls, query_db: AsyncSession, page_object: AiModelModel) -> CrudResponseModel:
|
|
"""
|
|
编辑AI模型信息service
|
|
|
|
:param query_db: orm对象
|
|
:param page_object: 编辑AI模型对象
|
|
:return: 编辑AI模型校验结果
|
|
"""
|
|
edit_ai_model = page_object.model_dump(exclude_unset=True)
|
|
if page_object.api_key:
|
|
if page_object.api_key == '********' * 3:
|
|
if 'api_key' in edit_ai_model:
|
|
del edit_ai_model['api_key']
|
|
else:
|
|
edit_ai_model['api_key'] = CryptoUtil.encrypt(page_object.api_key)
|
|
|
|
ai_model_info = await cls.ai_model_detail_services(query_db, page_object.model_id)
|
|
if ai_model_info.model_id:
|
|
try:
|
|
await AiModelDao.edit_ai_model_dao(query_db, edit_ai_model)
|
|
await query_db.commit()
|
|
return CrudResponseModel(is_success=True, message='修改成功')
|
|
except Exception as e:
|
|
await query_db.rollback()
|
|
raise e
|
|
else:
|
|
raise ServiceException(message='AI模型不存在')
|
|
|
|
@classmethod
|
|
async def delete_ai_model_services(
|
|
cls, query_db: AsyncSession, page_object: DeleteAiModelModel
|
|
) -> CrudResponseModel:
|
|
"""
|
|
删除AI模型信息service
|
|
|
|
:param query_db: orm对象
|
|
:param page_object: 删除AI模型对象
|
|
:return: 删除AI模型校验结果
|
|
"""
|
|
if page_object.model_ids:
|
|
model_id_list = page_object.model_ids.split(',')
|
|
try:
|
|
for model_id in model_id_list:
|
|
await AiModelDao.delete_ai_model_dao(query_db, AiModelModel(modelId=model_id))
|
|
await query_db.commit()
|
|
return CrudResponseModel(is_success=True, message='删除成功')
|
|
except Exception as e:
|
|
await query_db.rollback()
|
|
raise e
|
|
else:
|
|
raise ServiceException(message='传入AI模型id为空')
|
|
|
|
@classmethod
|
|
async def ai_model_detail_services(cls, query_db: AsyncSession, model_id: int) -> AiModelModel:
|
|
"""
|
|
获取AI模型详细信息service
|
|
|
|
:param query_db: orm对象
|
|
:param model_id: AI模型id
|
|
:return: AI模型id对应的信息
|
|
"""
|
|
ai_model = await AiModelDao.get_ai_model_detail_by_id(query_db, model_id=model_id)
|
|
result = AiModelModel(**CamelCaseUtil.transform_result(ai_model)) if ai_model else AiModelModel()
|
|
|
|
if result.api_key:
|
|
result.api_key = '********' * 3
|
|
|
|
return result
|