diff --git a/vue-fastapi-backend/module_admin/dao/data_ast_content_dao.py b/vue-fastapi-backend/module_admin/dao/data_ast_content_dao.py index 423d591..f05f0f3 100644 --- a/vue-fastapi-backend/module_admin/dao/data_ast_content_dao.py +++ b/vue-fastapi-backend/module_admin/dao/data_ast_content_dao.py @@ -9,6 +9,7 @@ from module_admin.entity.do.user_do import SysUser from module_admin.entity.vo.data_ast_content_vo import DataCatalogPageQueryModel, DeleteDataCatalogModel,DataCatalogChild,DataAstBookmarkRelaRequest,DataAstIndxRequest,DataAstIndxResponse from utils.page_util import PageUtil from utils.log_util import logger +from exceptions.exception import ServiceException class DataCatalogDAO: @@ -176,7 +177,33 @@ class DataCatalogDAO: ) return data_ast_list - + @classmethod + async def check_duplicate_catalog(cls, db: AsyncSession, catalog1: dict, exclude_content_onum: int = None): + """ + 校验同一父节点下是否已存在相同名称的目录(可排除指定 content_onum) + + :param db: ORM 对象 + :param catalog1: 主目录对象(DataAstContent) + :param exclude_content_onum: 可选,编辑时排除自己 + :return: 如果存在重复目录,抛出 ServiceException + """ + query = select(DataAstContent).where( + and_( + DataAstContent.supr_content_onum == catalog1.get("supr_content_onum"), + DataAstContent.content_name == catalog1.get("content_name") + ) + ) + + if exclude_content_onum: + query = query.where(DataAstContent.content_onum != exclude_content_onum) + + result = await db.execute(query) + exist_catalog = result.scalars().first() + if exist_catalog: + raise ServiceException( + message=f"同一父节点下已存在名称为“{catalog1.get('content_name')}”的目录" + ) + @classmethod async def add_catalog_dao(cls, db: AsyncSession, catalog1: dict, catalog2: dict): """ diff --git a/vue-fastapi-backend/module_admin/service/data_ast_content_service.py b/vue-fastapi-backend/module_admin/service/data_ast_content_service.py index c102a84..c7d4282 100644 --- a/vue-fastapi-backend/module_admin/service/data_ast_content_service.py +++ b/vue-fastapi-backend/module_admin/service/data_ast_content_service.py @@ -156,10 +156,14 @@ class DataCatalogService: child["rela_eff_end_date"] = datetime(year=2999, month=12, day=31, hour=0, minute=0, second=0).strftime("%Y-%m-%d %H:%M:%S"), # 设置默认值,2999-12-31 child["upd_prsn"] = request.upd_prsn, child["rela_status"] = "1" - + await DataCatalogDAO.check_duplicate_catalog(query_db, catalog_data1) new_catalog = await DataCatalogDAO.add_catalog_dao(query_db, catalog_data1, catalog_data2) await query_db.commit() return CrudResponseModel(is_success=True, message='新增成功', data=new_catalog) + except ServiceException as e: + await query_db.rollback() + # 直接抛出,不再重新包装,保留 DAO 层信息 + raise e except Exception as e: await query_db.rollback() raise ServiceException(message=f"创建目录时发生错误: {str(e)}") @@ -224,9 +228,14 @@ class DataCatalogService: child["upd_prsn"] = request.upd_prsn child["rela_status"] = "1" + await DataCatalogDAO.check_duplicate_catalog(query_db, catalog_data, exclude_content_onum=request.content_onum) await DataCatalogDAO.edit_catalog_child_dao(query_db, catalog_data) await query_db.commit() return CrudResponseModel(is_success=True, message='更新成功') + except ServiceException as e: + await query_db.rollback() + # 直接抛出,不再重新包装,保留 DAO 层信息 + raise e except Exception as e: await query_db.rollback() raise ServiceException(message=f"更新目录时发生错误: {str(e)}")