From bdcb04c94955e6e61d0a22eb65cc76267b1a4448 Mon Sep 17 00:00:00 2001 From: "si@aidatagov.com" Date: Sun, 20 Jul 2025 00:02:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=A1=E6=89=B9=E6=B5=81=E7=A8=8B=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module_admin/dao/datastd_dao.py | 74 +++++++++++++------ .../module_admin/dao/metadata_config_dao.py | 10 +++ .../module_admin/service/approval_service.py | 2 +- .../module_admin/service/datastd_service.py | 16 ++-- .../service/metadata_config_service.py | 46 ++++++++---- .../views/metadataConfig/bizConfig/index.vue | 1 - .../metadataConfig/bizPermiConfig/index.vue | 1 - .../src/views/metadataConfig/clas/index.vue | 1 - .../metadataConfig/taskBizConfig/index.vue | 1 - .../src/views/system/flow/index.vue | 3 +- 10 files changed, 106 insertions(+), 49 deletions(-) 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 e22b9fe..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): 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 1610175..9ede624 100644 --- a/vue-fastapi-backend/module_admin/service/metadata_config_service.py +++ b/vue-fastapi-backend/module_admin/service/metadata_config_service.py @@ -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 diff --git a/vue-fastapi-frontend/src/views/metadataConfig/bizConfig/index.vue b/vue-fastapi-frontend/src/views/metadataConfig/bizConfig/index.vue index 98dcd2e..f87bbe9 100644 --- a/vue-fastapi-frontend/src/views/metadataConfig/bizConfig/index.vue +++ b/vue-fastapi-frontend/src/views/metadataConfig/bizConfig/index.vue @@ -350,7 +350,6 @@ function submitForm() { open.value = false getList() } catch (error) { - ElMessage.error('操作失败,请重试') } }) } diff --git a/vue-fastapi-frontend/src/views/metadataConfig/bizPermiConfig/index.vue b/vue-fastapi-frontend/src/views/metadataConfig/bizPermiConfig/index.vue index f6e0266..1198031 100644 --- a/vue-fastapi-frontend/src/views/metadataConfig/bizPermiConfig/index.vue +++ b/vue-fastapi-frontend/src/views/metadataConfig/bizPermiConfig/index.vue @@ -331,7 +331,6 @@ function submitForm() { open.value = false getList() } catch (error) { - ElMessage.error('操作失败,请重试') } }) } diff --git a/vue-fastapi-frontend/src/views/metadataConfig/clas/index.vue b/vue-fastapi-frontend/src/views/metadataConfig/clas/index.vue index bb8afeb..014f907 100644 --- a/vue-fastapi-frontend/src/views/metadataConfig/clas/index.vue +++ b/vue-fastapi-frontend/src/views/metadataConfig/clas/index.vue @@ -249,7 +249,6 @@ function submitForm() { open.value = false getList() } catch (error) { - ElMessage.error('操作失败,请重试') } }) } diff --git a/vue-fastapi-frontend/src/views/metadataConfig/taskBizConfig/index.vue b/vue-fastapi-frontend/src/views/metadataConfig/taskBizConfig/index.vue index 701214b..b011c0b 100644 --- a/vue-fastapi-frontend/src/views/metadataConfig/taskBizConfig/index.vue +++ b/vue-fastapi-frontend/src/views/metadataConfig/taskBizConfig/index.vue @@ -569,7 +569,6 @@ function submitForm() { open.value = false getList() } catch { - ElMessage.error('操作失败,请重试') } }) } diff --git a/vue-fastapi-frontend/src/views/system/flow/index.vue b/vue-fastapi-frontend/src/views/system/flow/index.vue index 074517b..0dfb3a7 100644 --- a/vue-fastapi-frontend/src/views/system/flow/index.vue +++ b/vue-fastapi-frontend/src/views/system/flow/index.vue @@ -743,7 +743,8 @@ function getIconUrlAndShape(data,row){ } function cancelFlow(row){ cancelMyFlow(row.id).then(res=>{ - proxy.$modal.success("撤销成功"); + proxy.$modal.msgSuccess("撤销成功"); + getList() }) }