diff --git a/vue-fastapi-backend/module_admin/dao/datastd_dao.py b/vue-fastapi-backend/module_admin/dao/datastd_dao.py index d9b54ef..8bc2f2d 100644 --- a/vue-fastapi-backend/module_admin/dao/datastd_dao.py +++ b/vue-fastapi-backend/module_admin/dao/datastd_dao.py @@ -7,6 +7,7 @@ from utils.page_util import PageUtil from sqlalchemy.orm import aliased from module_admin.entity.vo.data_ast_content_vo import DataCatalogPageQueryModel, DeleteDataCatalogModel,DataCatalogChild from datetime import datetime +from module_admin.entity.do.approval_do import FlowApproval, FlowConfig class DataStdDao: @@ -1010,36 +1011,67 @@ class DataStdDao: @classmethod async def check_std_main_waiting(cls, oldInstId: str, db: AsyncSession): - filters = [ - DataStdMainAppr.oldInstId == oldInstId, - or_( - DataStdMainAppr.approStatus == "waiting", - DataStdMainAppr.approStatus == "pending" - ) - ] - + """ + 检查 std_main_appr 的第一条记录是否存在待审批状态(pending 或 waiting) + """ + # 1. 查询 DataStdMainAppr 中的所有记录(按时间倒序) query = ( select(DataStdMainAppr) - .where(*filters) + .where(DataStdMainAppr.oldInstId == oldInstId) .order_by(desc(DataStdMainAppr.create_time)) ) - - return await PageUtil.paginate(db, query, 0, 0, False) - @classmethod - async def check_std_dict_waiting(cls, oldInstId: str, db: AsyncSession): - filters = [ - DataStdDictAppr.oldInstId == oldInstId, - or_( - DataStdDictAppr.approStatus == "waiting", - DataStdDictAppr.approStatus == "pending" + result = await db.execute(query) + first_record = result.scalars().first() + + if not first_record: + return None # 或 raise 自定义异常,例如“未找到审批记录” + + # 2. 获取 instid,去 FlowApproval 中查询是否存在 pending 或 waiting 状态 + instid = first_record.flowId + + approval_query = ( + select(FlowApproval) + .where( + FlowApproval.businessId == instid, + FlowApproval.status.in_(["pending", "waiting"]) ) - ] + ) + approval_result = await db.execute(approval_query) + approval = approval_result.scalars().first() + # 返回 FlowApproval 对象或布尔值 + return approval # 或 return approval is not None + @classmethod + async def check_std_dict_waiting(cls, oldInstId: str, db: AsyncSession): + """ + 检查 std_main_appr 的第一条记录是否存在待审批状态(pending 或 waiting) + """ + # 1. 查询 DataStdDictAppr 中的所有记录(按时间倒序) query = ( select(DataStdDictAppr) - .where(*filters) + .where(DataStdDictAppr.oldInstId == oldInstId) .order_by(desc(DataStdDictAppr.create_time)) ) + result = await db.execute(query) + first_record = result.scalars().first() + + if not first_record: + return None # 或 raise 自定义异常,例如“未找到审批记录” + + # 2. 获取 instid,去 FlowApproval 中查询是否存在 pending 或 waiting 状态 + instid = first_record.flowId + + approval_query = ( + select(FlowApproval) + .where( + FlowApproval.businessId == instid, + FlowApproval.status.in_(["pending", "waiting"]) + ) + ) + approval_result = await db.execute(approval_query) + approval = approval_result.scalars().first() + + # 返回 FlowApproval 对象或布尔值 + return approval # 或 return approval is not None - return await PageUtil.paginate(db, query, 0, 0, False) \ No newline at end of file diff --git a/vue-fastapi-backend/module_admin/dao/metadata_config_dao.py b/vue-fastapi-backend/module_admin/dao/metadata_config_dao.py index 4eeba6b..e9068df 100644 --- a/vue-fastapi-backend/module_admin/dao/metadata_config_dao.py +++ b/vue-fastapi-backend/module_admin/dao/metadata_config_dao.py @@ -33,9 +33,19 @@ class MetadataConfigDao: select(MetadataClas).where( MetadataClas.clas_name == clas.clas_name if clas.clas_name else True, MetadataClas.clas_eff_flag == clas.clas_eff_flag if clas.clas_eff_flag else True, + MetadataClas.clas_onum == clas.clas_onum if clas.clas_onum else True, ) ) return result.scalars().first() + @classmethod + async def get_clas_by_onum(cls, db: AsyncSession, clas_onum: int): + """ + 根据主键 clas_onum 获取分类信息 + """ + result = await db.execute( + select(MetadataClas).where(MetadataClas.clas_onum == clas_onum) + ) + return result.scalar_one_or_none() @classmethod async def get_metadata_clas_list(cls, db: AsyncSession, query_object, is_page: bool = False): @@ -108,7 +118,14 @@ class MetadataConfigDao: db_sec = MetadataSec(**sec.model_dump()) db.add(db_sec) await db.flush() - return db_sec + return db_sec + @classmethod + async def get_by_sec_level_summary(cls, query_db: AsyncSession, sec_level_summary: str, exclude_onum: str = None): + stmt = select(MetadataSec).where(MetadataSec.sec_level_summary == sec_level_summary) + if exclude_onum: + stmt = stmt.where(MetadataSec.onum != exclude_onum) + result = await query_db.execute(stmt) + return result.scalars().first() @classmethod async def edit_metadata_sec_dao(cls, db: AsyncSession, onum: str, update_data: dict): diff --git a/vue-fastapi-backend/module_admin/service/approval_service.py b/vue-fastapi-backend/module_admin/service/approval_service.py index c43fae9..6c65aa2 100644 --- a/vue-fastapi-backend/module_admin/service/approval_service.py +++ b/vue-fastapi-backend/module_admin/service/approval_service.py @@ -272,7 +272,7 @@ class ApprovalService: @classmethod async def cancel_apply_services(cls, query_db: AsyncSession, flow_id: str, current_user: CurrentUserModel): - flow = await ApprovalDao.get_flow_by_idAndUser(flow_id, current_user.user.user_name) + flow = await ApprovalDao.get_flow_by_idAndUser(query_db,flow_id, current_user.user.user_name) if flow is None: raise ServiceException(message=f'所操作的流程不存在') if flow.status == 'succeed' or flow.status == 'rejected': diff --git a/vue-fastapi-backend/module_admin/service/datastd_service.py b/vue-fastapi-backend/module_admin/service/datastd_service.py index 9f942bf..9064355 100644 --- a/vue-fastapi-backend/module_admin/service/datastd_service.py +++ b/vue-fastapi-backend/module_admin/service/datastd_service.py @@ -1253,8 +1253,8 @@ class DataStdService: # 将 DataStdMainModel 转换为 DataStdMainApprModel,保留字段原始名 watingList=await DataStdDao.check_std_main_waiting(model.onum, query_db) - if len(watingList)>0 : # 如果 watingList 存在,意味着标准正在审批中 - raise ServiceException(message="标准正在审批中,请等待审批完成") + if watingList : # 如果 watingList 存在,意味着标准正在审批中 + raise ServiceException(message="数据标准正在审批中,请等待审批完成") lastAppr =await DataStdDao.get_last_std_main_appr_by_id(query_db,model.onum) if lastAppr is None: lastAppr=DataStdDictApprModel() @@ -1280,8 +1280,8 @@ class DataStdService: model.data_dict_stat="1" watingList=await DataStdDao.check_std_dict_waiting(model.onum, query_db) - if len(watingList)>0 : # 如果 watingList 存在,意味着标准正在审批中 - raise ServiceException(message="标准正在审批中,请等待审批完成") + if watingList : # 如果 watingList 存在,意味着标准正在审批中 + raise ServiceException(message="数据字典正在审批中,请等待审批完成") lastAppr =await DataStdDao.get_last_std_dict_appr_by_id(query_db,model.onum) if lastAppr is None: lastAppr=DataStdDictApprModel() @@ -1309,8 +1309,8 @@ class DataStdService: col_info = await cls.get_std_main_by_id(query_db, col_id) if col_info: watingList=await DataStdDao.check_std_main_waiting(col_info.onum,query_db ) - if len(watingList)>0 : # 如果 watingList 存在,意味着标准正在审批中 - raise ServiceException(message="标准正在审批中,请等待审批完成") + if watingList : # 如果 watingList 存在,意味着标准正在审批中 + raise ServiceException(message="数据标准正在审批中,请等待审批完成") apprModel = DataStdMainApprModel(**col_info.model_dump(exclude_unset=True, by_alias=True)) apprModel.changeType="delete" apprModel.onum=str(uuid.uuid4()) @@ -1339,8 +1339,8 @@ class DataStdService: col_info = await cls.get_std_dict_by_id_services(query_db, col_id) if col_info: watingList=await DataStdDao.check_std_dict_waiting(col_info.onum,query_db ) - if len(watingList)>0 : # 如果 watingList 存在,意味着标准正在审批中 - raise ServiceException(message="标准正在审批中,请等待审批完成") + if watingList : # 如果 watingList 存在,意味着标准正在审批中 + raise ServiceException(message="数据字典正在审批中,请等待审批完成") apprModel = DataStdDictApprModel(**col_info.model_dump(exclude_unset=True, by_alias=True)) apprModel.changeType="delete" apprModel.onum=str(uuid.uuid4()) diff --git a/vue-fastapi-backend/module_admin/service/metadata_config_service.py b/vue-fastapi-backend/module_admin/service/metadata_config_service.py index d015c55..9ede624 100644 --- a/vue-fastapi-backend/module_admin/service/metadata_config_service.py +++ b/vue-fastapi-backend/module_admin/service/metadata_config_service.py @@ -7,7 +7,7 @@ SecuBizConfigQueryModel,SecuBizPermiConfigModel, SecuBizPermiConfigQueryModel,\ TaskBizConfigAddModel, TaskBizConfigQueryModel,TaskBizConfigModel,TaskBizConfigRelaModel from utils.common_util import CamelCaseUtil from module_admin.entity.do.metadata_config_do import SecuBizConfigRela,TaskBizConfigRela # ORM 类 -from exceptions.exception import ServiceException +from exceptions.exception import ServiceException,ServiceWarning import uuid from module_admin.entity.vo.dataSource_vo import ProcessDefinition,ParmScheduleVo,ProcessInstancePage,ParmSchedule from typing import List @@ -43,36 +43,54 @@ class MetadataConfigService: cls, query_db: AsyncSession, page_object: MetadataClasModel ): """ - 新增元数据分类 + 新增元数据分类,带 clas_onum 主键唯一性校验 """ try: + # 校验 clas_onum 是否已存在 + existing = await MetadataConfigDao.get_clas_by_onum(query_db, page_object.clas_onum) + if existing: + raise ServiceException(message=f"主键重复,clas_onum={page_object.clas_onum} 已存在") + await MetadataConfigDao.add_metadata_clas_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_metadata_clas_services( cls, query_db: AsyncSession, page_object: MetadataClasModel ): """ - 编辑元数据分类 + 编辑元数据分类,包含 clas_onum 唯一性校验(如果主键被修改) """ edit_data = page_object.model_dump(exclude_unset=True) - info = await cls.get_metadata_clas_detail_services(query_db, page_object.clas_onum) - if info.clas_onum: - try: - await MetadataConfigDao.edit_metadata_clas_dao(query_db, page_object.clas_onum, edit_data) - await query_db.commit() - return CrudResponseModel(is_success=True, message="更新成功") - except Exception as e: - await query_db.rollback() - raise e - else: + + # 当前记录旧主键(假设表单传入) + original_onum = page_object.original_clas_onum # 你需要在 model 中加上这个字段 + + # 查询当前记录是否存在 + existing = await cls.get_metadata_clas_detail_services(query_db, original_onum) + if not existing: raise ServiceException(message="元数据标签不存在") - + + # 如果修改了 clas_onum,则校验唯一性 + if page_object.clas_onum != original_onum: + duplicated = await MetadataConfigDao.get_clas_by_onum(query_db, page_object.clas_onum) + if duplicated: + raise ServiceException(message=f"clas_onum={page_object.clas_onum} 已存在,不能重复") + + try: + await MetadataConfigDao.edit_metadata_clas_dao(query_db, original_onum, edit_data) + await query_db.commit() + return CrudResponseModel(is_success=True, message="更新成功") + except Exception as e: + await query_db.rollback() + raise e + + @classmethod async def delete_metadata_clas_services( cls, query_db: AsyncSession, clas_ids: str @@ -121,14 +139,19 @@ class MetadataConfigService: 新增数据安全配置 """ try: - page_object.onum=str(uuid.uuid4()) + # 校验 secLevelSummary 是否已存在 + existing = await MetadataConfigDao.get_by_sec_level_summary( query_db, page_object.sec_level_summary,page_object.onum) + if existing: + raise ServiceWarning(message=page_object.sec_level_summary+"该等级简称已存在,不能重复") + + page_object.onum = str(uuid.uuid4()) await MetadataConfigDao.add_metadata_sec_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_metadata_sec_services(cls, query_db: AsyncSession, page_object: MetadataSecModel): """ @@ -138,6 +161,11 @@ class MetadataConfigService: info = await cls.get_metadata_sec_detail_services(query_db, page_object.onum) if info.onum: try: + # 校验 secLevelSummary 是否重复(排除当前记录) + existing = await MetadataConfigDao.get_by_sec_level_summary( query_db, page_object.sec_level_summary,page_object.onum) + if existing: + raise ServiceWarning(message=page_object.sec_level_summary+"该等级简称已存在,不能重复") + await MetadataConfigDao.edit_metadata_sec_dao(query_db, page_object.onum, edit_data) await query_db.commit() return CrudResponseModel(is_success=True, message="更新成功") @@ -147,6 +175,7 @@ class MetadataConfigService: else: raise ServiceException(message="数据安全配置不存在") + @classmethod async def delete_metadata_sec_services(cls, query_db: AsyncSession, onum_list: str): """ diff --git a/vue-fastapi-frontend/src/views/meta/metasercurity/MetaSecurityRow.vue b/vue-fastapi-frontend/src/views/meta/metasercurity/MetaSecurityRow.vue index e9a5215..3bde4ec 100644 --- a/vue-fastapi-frontend/src/views/meta/metasercurity/MetaSecurityRow.vue +++ b/vue-fastapi-frontend/src/views/meta/metasercurity/MetaSecurityRow.vue @@ -507,6 +507,8 @@ onMounted(() => { getList(); getDeptTree(); getRoleOrUserList(); + changeMetaSecurityObj(form.value.objType); + }); watch(dbResoursName, (val) => { if (val) { diff --git a/vue-fastapi-frontend/src/views/metadataConfig/bizConfig/index.vue b/vue-fastapi-frontend/src/views/metadataConfig/bizConfig/index.vue index 649ada6..f87bbe9 100644 --- a/vue-fastapi-frontend/src/views/metadataConfig/bizConfig/index.vue +++ b/vue-fastapi-frontend/src/views/metadataConfig/bizConfig/index.vue @@ -57,6 +57,7 @@ stripe > +