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
>
+
@@ -349,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/sec/index.vue b/vue-fastapi-frontend/src/views/metadataConfig/sec/index.vue
index d5be39a..9b3bbb8 100644
--- a/vue-fastapi-frontend/src/views/metadataConfig/sec/index.vue
+++ b/vue-fastapi-frontend/src/views/metadataConfig/sec/index.vue
@@ -159,6 +159,7 @@ const form = reactive({
const rules = {
secEffFlag: [{ required: true, message: '请选择有效标志', trigger: 'change' }],
+ secLevelSummary: [{ required: true, message: '请输入等级简称', trigger: 'blur' }],
secLevelName: [{ required: true, message: '请输入等级名称', trigger: 'blur' }]
}
@@ -223,7 +224,7 @@ function submitForm() {
const submitData = { ...form }
delete submitData.updTime // updTime一般后端自动处理
- try {
+
if (title.value.includes('新增')) {
await addMetadataSec(submitData)
ElMessage.success('新增成功')
@@ -233,9 +234,7 @@ 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/conf.vue b/vue-fastapi-frontend/src/views/system/flow/conf.vue
index e6d296e..6375cef 100644
--- a/vue-fastapi-frontend/src/views/system/flow/conf.vue
+++ b/vue-fastapi-frontend/src/views/system/flow/conf.vue
@@ -62,7 +62,12 @@ import { listRole } from "@/api/system/role";
import {getFlowConfList,saveFlowConfig } from "@/api/flow/flow";
const { proxy } = getCurrentInstance();
-const moduleList = ref([{'module':'metaDataInfo','text':'元数据'},{'module':'dataStdMain','text':'数据标准'},{'module':'dataStdDict','text':'数据字典'},{'module':'dataStdCode','text':'标准代码'},{'module':'other','text':'其他模块(敬请期待)'}])
+const moduleList = ref([{'module':'metaDataInfo','text':'元数据'},
+ {'module':'dataStdMain','text':'数据标准'},
+ {'module':'dataStdDict','text':'数据字典'},
+ {'module':'dataStdCode','text':'标准代码'},
+ {'module':'dataAssetMain','text':'数据资产'},
+ {'module':'other','text':'其他模块(敬请期待)'}])
let graph = null
const roleList = ref([])
const data = ref([])
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()
})
}