Browse Source

元数据模块增加安全等级

master
xueyinfei 4 months ago
parent
commit
7499f35002
  1. 91
      vue-fastapi-backend/module_admin/controller/metadata_config_controller.py
  2. 153
      vue-fastapi-backend/module_admin/dao/datastd_dao.py
  3. 4
      vue-fastapi-backend/module_admin/dao/meta_dao.py
  4. 43
      vue-fastapi-backend/module_admin/dao/metadata_config_dao.py
  5. 23
      vue-fastapi-backend/module_admin/entity/do/datastd_do.py
  6. 2
      vue-fastapi-backend/module_admin/entity/do/meta_do.py
  7. 1
      vue-fastapi-backend/module_admin/entity/vo/meta_vo.py
  8. 37
      vue-fastapi-backend/module_admin/service/approval_service.py
  9. 17
      vue-fastapi-backend/module_admin/service/meta_service.py
  10. 8
      vue-fastapi-backend/module_admin/service/metadata_config_service.py
  11. 8
      vue-fastapi-frontend/src/api/metadataConfig/metadataConfig.js
  12. 42
      vue-fastapi-frontend/src/views/meta/metaInfo/index.vue
  13. 13
      vue-fastapi-frontend/src/views/system/flow/index.vue

91
vue-fastapi-backend/module_admin/controller/metadata_config_controller.py

@ -37,8 +37,8 @@ from utils.page_util import PageResponseModel
from utils.log_util import logger
from module_admin.service.login_service import LoginService
from module_admin.entity.vo.user_vo import CurrentUserModel
from module_admin.entity.vo.metatask_vo import DeleteMetataskModel,OperaMetataskModel
from module_admin.entity.vo.dataSource_vo import ProcessDefinition,ParmScheduleVo,ProcessInstancePage
from module_admin.entity.vo.metatask_vo import DeleteMetataskModel, OperaMetataskModel
from module_admin.entity.vo.dataSource_vo import ProcessDefinition, ParmScheduleVo, ProcessInstancePage
metadataConfigController = APIRouter(prefix='/metadataConfig')
@ -122,6 +122,16 @@ async def get_metadata_sec_list(
return ResponseUtil.success(model_content=result)
@metadataConfigController.get('/sec/optionList', response_model=PageResponseModel)
async def get_metadata_sec_list(
request: Request,
query_db: AsyncSession = Depends(get_db),
):
result = await MetadataConfigService.get_metadata_sec_option_list_services(query_db)
logger.info('获取数据安全配置列表成功')
return ResponseUtil.success(data=result)
@metadataConfigController.post('/sec')
@ValidateFields(validate_model='add_metadata_sec')
async def add_metadata_sec(
@ -366,7 +376,7 @@ async def get_busi_label_detail(
@metadataConfigController.get('/dataopLabel/list', response_model=PageResponseModel)
async def get_dataop_label_list(
request: Request,
query: BatchDataopLabelConfigModel=Depends(BatchDataopLabelModelPageQueryModel.as_query),
query: BatchDataopLabelConfigModel = Depends(BatchDataopLabelModelPageQueryModel.as_query),
query_db: AsyncSession = Depends(get_db),
):
result = await BatchLabelConfigService.get_dataop_vo_services(query_db, query, is_page=True)
@ -435,7 +445,7 @@ async def get_datatype_label_list(
query_db: AsyncSession = Depends(get_db),
):
result = await BatchLabelConfigService.get_datatype_list_services(query_db, query,False)
result = await BatchLabelConfigService.get_datatype_list_services(query_db, query, False)
logger.info('获取数据类型标签配置列表成功')
return ResponseUtil.success(data=result)
@ -492,6 +502,8 @@ async def get_datatype_label_detail(
result = await BatchLabelConfigService.get_datatype_detail_services(query_db, onum)
logger.info(f'获取数据类型标签配置 onum={onum} 详情成功')
return ResponseUtil.success(data=result)
@metadataConfigController.get("/datasecConfig/list", response_model=PageResponseModel)
async def get_datasec_config_list(
request: Request,
@ -513,7 +525,7 @@ async def add_datasec_config(
):
model.create_by = current_user.user.user_name
model.create_time = datetime.now()
result = await DatasecConfigService.add_datasec_services(query_db, model,current_user,request)
result = await DatasecConfigService.add_datasec_services(query_db, model, current_user, request)
logger.info(result.message)
return ResponseUtil.success(msg=result.message)
@ -528,7 +540,7 @@ async def edit_datasec_config(
):
model.update_by = current_user.user.user_name
model.update_time = datetime.now()
result = await DatasecConfigService.edit_datasec_services(query_db, model,current_user,request)
result = await DatasecConfigService.edit_datasec_services(query_db, model, current_user, request)
logger.info(result.message)
return ResponseUtil.success(msg=result.message)
@ -543,13 +555,17 @@ async def edit_datasec_config(
# logger.info(result.message)
# return ResponseUtil.success(msg=result.message)
@metadataConfigController.delete('/datasecConfig/{metatask_ids}/{ds_ids}')
async def delete_system_config(request: Request, metatask_ids: str,ds_ids:str, query_db: AsyncSession = Depends(get_db),current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
delete_config = DeleteMetataskModel(metatask_ids=metatask_ids,ds_ids=ds_ids)
delete_config_result = await DatasecConfigService.delete_datasec_services(request, query_db, delete_config,current_user)
async def delete_system_config(request: Request, metatask_ids: str, ds_ids: str,
query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
delete_config = DeleteMetataskModel(metatask_ids=metatask_ids, ds_ids=ds_ids)
delete_config_result = await DatasecConfigService.delete_datasec_services(request, query_db, delete_config,
current_user)
logger.info(delete_config_result.message)
return ResponseUtil.success(msg=delete_config_result.message)
@metadataConfigController.get("/datasecConfig/{onum}", response_model=DatasecConfigModel)
async def get_datasec_config_detail(
request: Request,
@ -559,6 +575,8 @@ async def get_datasec_config_detail(
result = await DatasecConfigService.get_datasec_detail_services(query_db, onum)
logger.info(f"获取数据安全参数配置 onum={onum} 详情成功")
return ResponseUtil.success(data=result)
@metadataConfigController.put('/upOrdown')
async def up_or_down_meta_metatask(
request: Request,
@ -566,10 +584,12 @@ async def up_or_down_meta_metatask(
query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user),
):
edit_config_result = await DatasecConfigService.up_or_down_metatask_services(request, query_db,current_user, DownOrUpdate.id,DownOrUpdate.type)
edit_config_result = await DatasecConfigService.up_or_down_metatask_services(request, query_db, current_user,
DownOrUpdate.id, DownOrUpdate.type)
logger.info(edit_config_result.message)
return ResponseUtil.success(msg=edit_config_result.message)
# 元数据任务调度
@metadataConfigController.put('/DS')
async def DS_meta_metatask(
@ -578,24 +598,25 @@ async def DS_meta_metatask(
query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user)
):
edit_config_result = await DatasecConfigService.ds_metatask_services(request, query_db, process,current_user)
edit_config_result = await DatasecConfigService.ds_metatask_services(request, query_db, process, current_user)
return ResponseUtil.success(msg=edit_config_result)
@metadataConfigController.get('/DS/{id}')
@metadataConfigController.get('/DS/{id}')
async def DS_meta_metatask_detail(
request: Request,
id: int,
query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user)
):
process=ParmScheduleVo()
process.processDefinitionCode=id
edit_config_result = await DatasecConfigService.ds_metatask_detail(request, query_db, process,current_user)
process = ParmScheduleVo()
process.processDefinitionCode = id
edit_config_result = await DatasecConfigService.ds_metatask_detail(request, query_db, process, current_user)
return ResponseUtil.success(data=edit_config_result)
@metadataConfigController.delete('/DS')
async def DS_meta_metatask_delete(
request: Request,
@ -603,10 +624,11 @@ async def DS_meta_metatask_delete(
query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user)
):
edit_config_result = await DatasecConfigService.ds_metatask_delete(request, query_db, process,current_user)
edit_config_result = await DatasecConfigService.ds_metatask_delete(request, query_db, process, current_user)
return ResponseUtil.success(msg=edit_config_result)
# ----------元数据标签调度任务 ----------
@metadataConfigController.get('/taskBizConfig/list', response_model=PageResponseModel)
@ -639,7 +661,7 @@ async def add_task_biz_config(
):
item.create_by = current_user.user.user_name
item.create_time = datetime.now()
result = await MetadataConfigService.add_task_biz_config_services(db, item,current_user,request)
result = await MetadataConfigService.add_task_biz_config_services(db, item, current_user, request)
return ResponseUtil.success(msg=result.message)
@ -653,7 +675,7 @@ async def edit_task_biz_config(
):
item.update_by = current_user.user.user_name
item.update_time = datetime.now()
result = await MetadataConfigService.edit_task_biz_config_services(db, item,current_user,request)
result = await MetadataConfigService.edit_task_biz_config_services(db, item, current_user, request)
return ResponseUtil.success(msg=result.message)
@ -662,15 +684,22 @@ async def edit_task_biz_config(
# result = await MetadataConfigService.delete_task_biz_config_services(db, onums)
# return ResponseUtil.success(msg=result.message)
@metadataConfigController.delete('/taskBizConfig/{metatask_ids}/{ds_ids}')
async def delete_task_biz_config(request: Request, metatask_ids: str,ds_ids:str, query_db: AsyncSession = Depends(get_db),current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
delete_config = DeleteMetataskModel(metatask_ids=metatask_ids,ds_ids=ds_ids)
delete_config_result = await MetadataConfigService.delete_task_biz_config_services(request, query_db, delete_config,current_user)
async def delete_task_biz_config(request: Request, metatask_ids: str, ds_ids: str,
query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
delete_config = DeleteMetataskModel(metatask_ids=metatask_ids, ds_ids=ds_ids)
delete_config_result = await MetadataConfigService.delete_task_biz_config_services(request, query_db, delete_config,
current_user)
logger.info(delete_config_result.message)
return ResponseUtil.success(msg=delete_config_result.message)
@metadataConfigController.get('/taskBizConfig/detail')
async def get_task_biz_config_detail(onum: str, db: AsyncSession = Depends(get_db)):
data = await MetadataConfigService.get_task_biz_config_detail_services(db, onum)
return ResponseUtil.success(data=data)
@metadataConfigController.get('/taskBizConfigRela/list/{bizOnum}')
async def get_task_biz_rela_config_list(
bizOnum: int,
@ -679,6 +708,8 @@ async def get_task_biz_rela_config_list(
ai_chat_list_result = await MetadataConfigService.get_task_biz_config_rela_list_services(query_db, bizOnum)
logger.info('获取成功')
return ResponseUtil.success(data=ai_chat_list_result)
@metadataConfigController.put('/taskBiz/upOrdown')
async def task_biz_up_or_down_meta_metatask(
request: Request,
@ -686,13 +717,12 @@ async def task_biz_up_or_down_meta_metatask(
query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user),
):
edit_config_result = await MetadataConfigService.up_or_down_metatask_services(request, query_db,current_user, DownOrUpdate.id,DownOrUpdate.type)
edit_config_result = await MetadataConfigService.up_or_down_metatask_services(request, query_db, current_user,
DownOrUpdate.id, DownOrUpdate.type)
logger.info(edit_config_result.message)
return ResponseUtil.success(msg=edit_config_result.message)
@metadataConfigController.put('/taskBiz/DS')
async def task_biz_DS_meta_metatask(
request: Request,
@ -700,11 +730,11 @@ async def task_biz_DS_meta_metatask(
query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user)
):
edit_config_result = await MetadataConfigService.ds_metatask_services(request, query_db, process,current_user)
edit_config_result = await MetadataConfigService.ds_metatask_services(request, query_db, process, current_user)
return ResponseUtil.success(msg=edit_config_result)
@metadataConfigController.delete('/taskBiz/DS')
async def task_biz_DS_meta_metatask_delete(
request: Request,
@ -712,7 +742,6 @@ async def task_biz_DS_meta_metatask_delete(
query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user)
):
edit_config_result = await MetadataConfigService.ds_metatask_delete(request, query_db, process,current_user)
edit_config_result = await MetadataConfigService.ds_metatask_delete(request, query_db, process, current_user)
return ResponseUtil.success(msg=edit_config_result)

153
vue-fastapi-backend/module_admin/dao/datastd_dao.py

@ -1,12 +1,14 @@
from sqlalchemy import delete, select, update, desc,or_,not_
from sqlalchemy import delete, select, update, desc, or_, not_, and_
from sqlalchemy.ext.asyncio import AsyncSession
from module_admin.entity.do.datastd_do import DataStdCode,DataStdDict,DataAstContent,DataAstContentRela,DataStdMain,DataStdMainAppr,DataStdDictAppr,DataStdCodeAppr
from module_admin.entity.do.datastd_do import DataStdCode, DataStdDict, DataAstContent, DataAstContentRela, DataStdMain, \
DataStdMainAppr, DataStdDictAppr, DataStdCodeAppr
from module_admin.entity.vo.datastd_vo import DataStdCodeModel, DataStdDictModel, DataStdMainModel, \
DataStdMainApprModel, DataStdDictApprModel, DataStdCodeApprModel, StdDictNoPageParam
from module_admin.entity.do.dept_do import SysDept
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 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
@ -15,14 +17,15 @@ class DataStdDao:
# ----------------------------------------------------------------数据标准模块----------------------------------------------------------------------------------------------------
@classmethod
async def get_std_code_appr_list(cls, flowId:str,db: AsyncSession):
async def get_std_code_appr_list(cls, flowId: str, db: AsyncSession):
filters = []
filters.append(DataStdCodeAppr.flowId == flowId)
filters.append(DataStdCodeAppr.class_id == "code")
query = select(DataStdCodeAppr).where(*filters).order_by(desc(DataStdCodeAppr.create_time))
return await PageUtil.paginate(db, query, 0, 0, False)
@classmethod
async def get_std_code_appr_list_Flow(cls, flowId:str,db: AsyncSession):
async def get_std_code_appr_list_Flow(cls, flowId: str, db: AsyncSession):
filters = []
filters.append(DataStdCodeAppr.flowId == flowId)
query = select(DataStdCodeAppr).where(*filters).order_by(desc(DataStdCodeAppr.create_time))
@ -103,23 +106,23 @@ class DataStdDao:
if query_object.cd_val_cn_mean:
filters.append(DataStdCodeAppr.cd_val_cn_mean.like(f"%{query_object.cd_val_cn_mean}%"))
if query_object.cd_no:
filters.append( or_(
filters.append(or_(
DataStdCodeAppr.cd_val_cn_mean.like(f"%{query_object.cd_no}%"),
DataStdCodeAppr.cd_no.like(f"%{query_object.cd_no}%")
))
if query_object.cd_val_stat:
filters.append(DataStdCodeAppr.cd_val_stat==query_object.cd_val_stat)
filters.append(DataStdCodeAppr.cd_val_stat == query_object.cd_val_stat)
if query_object.src_sys:
filters.append(DataStdCodeAppr.src_sys==query_object.src_sys)
filters.append(DataStdCodeAppr.src_sys == query_object.src_sys)
if query_object.cd_type:
filters.append(DataStdCodeAppr.cd_type==query_object.cd_type)
filters.append(DataStdCodeAppr.cd_type == query_object.cd_type)
if query_object.class_id:
filters.append(DataStdCodeAppr.class_id==query_object.class_id)
if query_object.class_id=='codeItem' and not query_object.parent_id:
filters.append(1==2)
filters.append(DataStdCodeAppr.class_id == query_object.class_id)
if query_object.class_id == 'codeItem' and not query_object.parent_id:
filters.append(1 == 2)
if query_object.parent_id:
filters.append(DataStdCodeAppr.parent_id==query_object.parent_id)
filters.append(DataStdCodeAppr.parent_id == query_object.parent_id)
# 构建查询语句
query = (
select(DataStdCodeAppr)
@ -132,8 +135,9 @@ class DataStdDao:
db, query, query_object.page_num, query_object.page_size, is_page
)
return col_list
@classmethod
async def get_last_std_code_appr_by_id(cls,db: AsyncSession, Id: str ):
async def get_last_std_code_appr_by_id(cls, db: AsyncSession, Id: str):
result = await db.execute(
select(DataStdCodeAppr)
.where(
@ -144,6 +148,7 @@ class DataStdDao:
.limit(1)
)
return result.scalar_one_or_none()
@classmethod
async def get_std_code_list_all(cls, query_db: AsyncSession):
"""
@ -154,6 +159,7 @@ class DataStdDao:
stmt = select(DataStdCode).where(DataStdCode.class_id == 'code') # 只查有效的
result = await query_db.execute(stmt)
return result.scalars().all()
@classmethod
async def get_std_main_list_import(cls, query_db: AsyncSession):
"""
@ -161,9 +167,10 @@ class DataStdDao:
:param session: 异步数据库会话
:return: List[DataStdCode]
"""
stmt = select(DataStdMain).where(1== 1) # 只查有效的
stmt = select(DataStdMain).where(1 == 1) # 只查有效的
result = await query_db.execute(stmt)
return result.scalars().all()
@classmethod
async def get_std_code_map_list(cls, db: AsyncSession, query_object: DataStdCodeModel, is_page: bool = False):
# 构建查询条件
@ -174,7 +181,7 @@ class DataStdDao:
c3 = aliased(DataStdCode) # 别名 c3 表示映射的代码
c4 = aliased(DataStdCode) # 别名 c4 表示映射父级代码
if query_object.parent_id:
if query_object.cd_type =='sys':
if query_object.cd_type == 'sys':
filters.append(c1.parent_id == query_object.parent_id)
else:
filters.append(c3.parent_id == query_object.parent_id)
@ -207,6 +214,7 @@ class DataStdDao:
db, query, query_object.page_num, query_object.page_size, is_page
)
return col_list
@classmethod
async def get_std_main_map_list(cls, db: AsyncSession, query_object: DataStdDictModel, is_page: bool = False):
# 构建查询条件
@ -238,6 +246,7 @@ class DataStdDao:
db, query, query_object.page_num, query_object.page_size, is_page
)
return col_list
@classmethod
async def get_data_code_list_by_info(cls, db: AsyncSession, query_object: DataStdCodeModel):
List = (
@ -256,6 +265,7 @@ class DataStdDao:
)
).scalars().all()
return List
@classmethod
async def get_data_code_by_info(cls, db: AsyncSession, query_object: DataStdCodeModel):
List = (
@ -273,6 +283,7 @@ class DataStdDao:
)
).scalars().first()
return List
@classmethod
async def get_std_code_by_id(cls, db: AsyncSession, Id: str):
col = (
@ -282,6 +293,7 @@ class DataStdDao:
)
).scalars().first()
return col
@classmethod
async def get_std_code_appr_by_id(cls, db: AsyncSession, Id: str):
col = (
@ -293,7 +305,7 @@ class DataStdDao:
return col
@classmethod
async def add_std_code(cls, db: AsyncSession,model:DataStdCodeModel):
async def add_std_code(cls, db: AsyncSession, model: DataStdCodeModel):
col = DataStdCode(
**model.model_dump()
)
@ -302,7 +314,7 @@ class DataStdDao:
return col
@classmethod
async def add_std_code_appr(cls, db: AsyncSession,model:DataStdCodeApprModel):
async def add_std_code_appr(cls, db: AsyncSession, model: DataStdCodeApprModel):
col = DataStdCodeAppr(
**model.model_dump()
)
@ -313,6 +325,7 @@ class DataStdDao:
@classmethod
async def delete_std_code(cls, db: AsyncSession, Id: str):
await db.execute(delete(DataStdCode).where(DataStdCode.onum == Id))
@classmethod
async def update_std_code_appr(cls, db: AsyncSession, update_data: DataStdCodeApprModel):
@ -341,6 +354,7 @@ class DataStdDao:
return existing_code_item is not None
return True
# ----------------------------------------------------------------数据字典----------------------------------------------------------------------------------------------------
@classmethod
async def get_std_dict_list(cls, db: AsyncSession, query_object: DataStdDictModel, is_page: bool = False):
@ -390,10 +404,10 @@ class DataStdDao:
DataStdDict.data_dict_data_type,
DataStdDict.data_std_no,
DataStdDict.data_dict_stat,
DataStdMain.data_std_cn_name.label("data_std_cn_name") ,
DataStdMain.data_std_it_ownership_dept.label("data_std_it_ownership_dept") ,
DataStdMain.data_std_busi_ownership_dept.label("data_std_busi_ownership_dept") ,
DataStdMain.data_std_it_ownership_prsn.label("data_std_it_ownership_prsn") ,
DataStdMain.data_std_cn_name.label("data_std_cn_name"),
DataStdMain.data_std_it_ownership_dept.label("data_std_it_ownership_dept"),
DataStdMain.data_std_busi_ownership_dept.label("data_std_busi_ownership_dept"),
DataStdMain.data_std_it_ownership_prsn.label("data_std_it_ownership_prsn"),
DataStdMain.data_std_busi_ownership_prsn.label("data_std_busi_ownership_prsn")
)
@ -438,9 +452,8 @@ class DataStdDao:
list = (await db.execute(query)).fetchall()
return list
@classmethod
async def add_std_dict(cls, db: AsyncSession,model:DataStdDictModel):
async def add_std_dict(cls, db: AsyncSession, model: DataStdDictModel):
col = DataStdDict(
**model.model_dump()
)
@ -451,6 +464,7 @@ class DataStdDao:
@classmethod
async def delete_std_dict(cls, db: AsyncSession, Id: str):
await db.execute(delete(DataStdDict).where(DataStdDict.onum == Id))
@classmethod
async def get_std_dict_list_all(cls, db: AsyncSession, query_object: DataStdDict):
filters = []
@ -458,6 +472,7 @@ class DataStdDao:
filters.append(DataStdDict.data_std_no.like(f"%{query_object.data_std_no}%"))
query = select(DataStdDict).where(*filters).order_by(desc(DataStdDict.create_time))
return await PageUtil.paginate(db, query, 0, 0, False)
@classmethod
async def get_data_dict_list_by_info(cls, db: AsyncSession, query_object: DataStdDictModel):
List = (
@ -469,6 +484,7 @@ class DataStdDao:
)
).scalars().all()
return List
@classmethod
async def update_std_dict(cls, db: AsyncSession, update_data: DataStdDictModel):
@ -484,6 +500,7 @@ class DataStdDao:
)
).scalars().first()
return col
@classmethod
async def get_data_dict_by_info(cls, db: AsyncSession, query_object: DataStdDictModel):
List = (
@ -500,8 +517,27 @@ class DataStdDao:
)
).scalars().first()
return List
@classmethod
async def get_data_dict_by_id(cls, db: AsyncSession, id: str):
List = (
await db.execute(
select(DataStdMain.data_sec_lvl).select_from(DataStdMain)
.join(
DataStdDict,
and_(
DataStdDict.data_std_no == DataStdMain.data_std_no,
), isouter=True
)
.where(
DataStdDict.onum == id
)
)
).scalars().first()
return List
@classmethod
async def get_data_sec_lvl_by_dict_id(cls, db: AsyncSession, id: str):
List = (
await db.execute(
select(DataStdDict)
@ -511,6 +547,7 @@ class DataStdDao:
)
).scalars().first()
return List
# 数据标准目录
@classmethod
@ -523,7 +560,8 @@ class DataStdDao:
:return: 目录信息对象
"""
catalog_info = (
(await db.execute(select(DataAstContent).where(DataAstContent.content_onum == content_onum , DataAstContent.content_stat == 1)))
(await db.execute(select(DataAstContent).where(DataAstContent.content_onum == content_onum,
DataAstContent.content_stat == 1)))
.scalars()
.first()
)
@ -600,7 +638,6 @@ class DataStdDao:
db.add(db_catalog)
await db.flush()
# 处理子关系(统一转换为 ORM 模型)
for child in catalog2.get('children', []):
# 如果是 Pydantic 模型实例,先转换为字典
@ -620,6 +657,7 @@ class DataStdDao:
await db.flush()
return db_catalog
@classmethod
async def edit_catalog_leaf_dao(cls, db: AsyncSession, catalog: dict):
"""
@ -639,6 +677,7 @@ class DataStdDao:
)
await db.execute(stmt)
@classmethod
async def edit_catalog_child_dao(cls, db: AsyncSession, catalog: dict):
"""
@ -662,7 +701,7 @@ class DataStdDao:
leaf_node_flag=catalog['leaf_node_flag'],
upd_prsn=catalog['upd_prsn'],
upd_time=datetime.now()
) )
))
await db.execute(stmt)
@ -719,7 +758,6 @@ class DataStdDao:
)
)
await cls.update_leaf_node_flag(db)
@classmethod
@ -735,11 +773,12 @@ class DataStdDao:
stmt = (
update(DataAstContent)
.where(DataAstContent.content_onum == moved_catalog_data['content_onum'] , DataAstContent.supr_content_onum == moved_catalog_data['supr_content_onum'])
.where(DataAstContent.content_onum == moved_catalog_data['content_onum'],
DataAstContent.supr_content_onum == moved_catalog_data['supr_content_onum'])
.values(
supr_content_onum=moved_catalog_data['supr_content_onum_after'],
upd_time=datetime.now()
) )
))
await db.execute(stmt)
await cls.update_leaf_node_flag(db)
@ -766,7 +805,8 @@ class DataStdDao:
# await db.execute(stmt)
stmt1 = (
update(DataAstContentRela)
.where( DataAstContentRela.content_onum == merge_catalog_data['content_onum'] and DataAstContentRela.rela_status == 1 )
.where(DataAstContentRela.content_onum == merge_catalog_data[
'content_onum'] and DataAstContentRela.rela_status == 1)
.values(
content_onum=merge_catalog_data['content_onum_after'],
rela_eff_begn_date=datetime.now()
@ -776,12 +816,14 @@ class DataStdDao:
stmt2 = (
update(DataAstContent)
.where(DataAstContent.content_onum == merge_catalog_data['content_onum'] , DataAstContent.supr_content_onum == merge_catalog_data['supr_content_onum'])
.values( content_stat = '0' )
.where(DataAstContent.content_onum == merge_catalog_data['content_onum'],
DataAstContent.supr_content_onum == merge_catalog_data['supr_content_onum'])
.values(content_stat='0')
)
await db.execute(stmt2)
await cls.update_leaf_node_flag(db)
@classmethod
async def removerel_data_ast_catalog_dao(cls, db: AsyncSession, removerel_catalog_data: dict):
"""
@ -794,15 +836,15 @@ class DataStdDao:
stmt = (
update(DataAstContentRela)
.where(DataAstContentRela.rela_onum == removerel_catalog_data['rela_onum'] , DataAstContentRela.content_onum == removerel_catalog_data['content_onum'])
.where(DataAstContentRela.rela_onum == removerel_catalog_data['rela_onum'],
DataAstContentRela.content_onum == removerel_catalog_data['content_onum'])
.values(
rela_status=removerel_catalog_data['rela_status']
) )
))
await db.execute(stmt)
await cls.update_leaf_node_flag(db)
@classmethod
async def moverel_data_ast_catalog_dao(cls, db: AsyncSession, moverel_catalog_data: dict):
"""
@ -815,16 +857,19 @@ class DataStdDao:
stmt = (
update(DataAstContentRela)
.where(DataAstContentRela.rela_onum == moverel_catalog_data['rela_onum'] , DataAstContentRela.content_onum == moverel_catalog_data['content_onum'])
.where(DataAstContentRela.rela_onum == moverel_catalog_data['rela_onum'],
DataAstContentRela.content_onum == moverel_catalog_data['content_onum'])
.values(
content_onum=moverel_catalog_data['content_onum_after'],
rela_eff_end_date=datetime.now()
) )
))
await db.execute(stmt)
await cls.update_leaf_node_flag(db)
@classmethod
async def get_catalog_list(cls, db: AsyncSession, query_object: DataCatalogPageQueryModel, user_id: int, is_page: bool = False):
async def get_catalog_list(cls, db: AsyncSession, query_object: DataCatalogPageQueryModel, user_id: int,
is_page: bool = False):
"""
根据查询参数获取数据资产目录列表
@ -834,11 +879,11 @@ class DataStdDao:
:return: 数据资产目录分页列表
"""
# 修改子查询部分
subquery_t1 = (
select(DataAstContentRela)
.where(DataAstContentRela.upd_prsn == query_object.upd_prsn, DataAstContentRela.content_onum == '2' and DataAstContentRela.rela_status == '1')
.where(DataAstContentRela.upd_prsn == query_object.upd_prsn,
DataAstContentRela.content_onum == '2' and DataAstContentRela.rela_status == '1')
.union_all(
select(DataAstContentRela)
.where(DataAstContentRela.content_onum != '2' and DataAstContentRela.rela_status == '1')
@ -881,7 +926,8 @@ class DataStdDao:
)
return data_ast_list
#------------------------------------------------------------数据标准(658行)-------------------------------------------------------------------------------------------------
# ------------------------------------------------------------数据标准(658行)-------------------------------------------------------------------------------------------------
@classmethod
async def get_std_main_list(cls, db: AsyncSession, query_object: DataStdMainModel, is_page: bool = False):
filters = []
@ -942,6 +988,7 @@ class DataStdDao:
.order_by(desc(DataStdMain.create_time))
)
return await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page)
@classmethod
async def get_std_main_list_all(cls, db: AsyncSession, query_object: DataStdMainModel):
filters = []
@ -993,27 +1040,32 @@ class DataStdDao:
.order_by(desc(DataStdMain.create_time))
)
return await PageUtil.paginate(db, query, 0, 0, False)
@classmethod
async def add_std_main(cls, db: AsyncSession, model: DataStdMainModel):
col = DataStdMain(**model.model_dump())
db.add(col)
await db.flush()
return col
@classmethod
async def add_std_main_appr(cls, db: AsyncSession, model: DataStdMainApprModel):
col = DataStdMainAppr(**model.model_dump())
db.add(col)
await db.flush()
return col
@classmethod
async def add_std_dict_appr(cls, db: AsyncSession, model: DataStdDictApprModel):
col = DataStdDictAppr(**model.model_dump())
db.add(col)
await db.flush()
return col
@classmethod
async def delete_std_main(cls, db: AsyncSession, Id: str):
await db.execute(delete(DataStdMain).where(DataStdMain.onum == Id))
@classmethod
async def delete_std_dict_appr(cls, db: AsyncSession, Id: str):
await db.execute(delete(DataStdDictAppr).where(DataStdDictAppr.onum == Id))
@ -1023,6 +1075,7 @@ class DataStdDao:
update_dict = update_data.model_dump(exclude_unset=True)
await db.execute(update(DataStdMain), [update_dict])
await db.flush()
@classmethod
async def update_std_dict_appr(cls, db: AsyncSession, update_data: DataStdDictApprModel):
update_dict = update_data.model_dump(exclude_unset=True)
@ -1048,6 +1101,7 @@ class DataStdDao:
)
)
return col.scalars().first()
@classmethod
async def get_std_main_appr_list_all(cls, db: AsyncSession, query_object: DataStdMainApprModel):
filters = []
@ -1070,13 +1124,14 @@ class DataStdDao:
return await PageUtil.paginate(db, query, 0, 0, False)
@classmethod
async def get_std_main_appr_list(cls, flowId:str,db: AsyncSession):
async def get_std_main_appr_list(cls, flowId: str, db: AsyncSession):
filters = []
filters.append(DataStdMainAppr.flowId == flowId)
query = select(DataStdMainAppr).where(*filters).order_by(desc(DataStdMainAppr.create_time))
return await PageUtil.paginate(db, query, 0, 0, False)
@classmethod
async def get_std_dict_appr_list(cls, flowId:str,db: AsyncSession):
async def get_std_dict_appr_list(cls, flowId: str, db: AsyncSession):
filters = []
filters.append(DataStdDictAppr.flowId == flowId)
query = select(DataStdDictAppr).where(*filters).order_by(desc(DataStdDictAppr.create_time))
@ -1086,12 +1141,14 @@ class DataStdDao:
async def get_std_main_appr_by_id(cls, db: AsyncSession, Id: str):
col = await db.execute(select(DataStdMainAppr).where(DataStdMainAppr.onum == Id))
return col.scalars().first()
@classmethod
async def get_std_dict_appr_by_id(cls, db: AsyncSession, Id: str):
col = await db.execute(select(DataStdDictAppr).where(DataStdDictAppr.onum == Id))
return col.scalars().first()
@classmethod
async def get_last_std_main_appr_by_id(cls,db: AsyncSession, Id: str ):
async def get_last_std_main_appr_by_id(cls, db: AsyncSession, Id: str):
result = await db.execute(
select(DataStdMainAppr)
.where(
@ -1102,8 +1159,9 @@ class DataStdDao:
.limit(1)
)
return result.scalar_one_or_none()
@classmethod
async def get_last_std_dict_appr_by_id(cls,db: AsyncSession, Id: str ):
async def get_last_std_dict_appr_by_id(cls, db: AsyncSession, Id: str):
result = await db.execute(
select(DataStdDictAppr)
.where(
@ -1153,6 +1211,7 @@ class DataStdDao:
# 返回 FlowApproval 对象或布尔值
return approval # 或 return approval is not None
@classmethod
async def check_std_dict_waiting(cls, oldInstId: str, db: AsyncSession):
"""
@ -1185,5 +1244,3 @@ class DataStdDao:
# 返回 FlowApproval 对象或布尔值
return approval # 或 return approval is not None

4
vue-fastapi-backend/module_admin/dao/meta_dao.py

@ -178,6 +178,7 @@ class MetaDao:
MetadataFldSuppInfo.fld_clas,
MetadataFldSuppInfo.fld_null_rate,
MetadataFldSuppInfo.data_dict_id,
MetadataFldSuppInfo.data_sec_lvl,
DataStdDict.data_dict_cn_name.label('data_dict_name'),
MetadataFldSuppInfo.rec_stat.label('supp_rec_stat'),
MetadataFldSuppInfo.upd_time.label('supp_upd_time')
@ -329,6 +330,7 @@ class MetaDao:
"fld_clas": vett_info.fld_clas,
"fld_null_rate": vett_info.fld_null_rate,
"data_dict_id": vett_info.data_dict_id,
"data_sec_lvl": vett_info.data_sec_lvl,
"rec_stat": vett_info.rec_stat,
"upd_time": vett_info.upd_time,
"rec_subm_prsn": vett_info.rec_subm_prsn,
@ -389,6 +391,7 @@ class MetaDao:
fld_clas=column.fld_clas,
fld_null_rate=column.fld_null_rate,
data_dict_id=column.data_dict_id,
data_sec_lvl=column.data_sec_lvl,
rec_stat=column.rec_stat,
upd_time=column.upd_time if column.upd_time else datetime.now(),
)
@ -409,6 +412,7 @@ class MetaDao:
suppColumn.fld_clas = column.fld_clas
suppColumn.fld_null_rate = column.fld_null_rate
suppColumn.data_dict_id = column.data_dict_id
suppColumn.data_sec_lvl = column.data_sec_lvl
suppColumn.rec_stat = column.rec_stat
suppColumn.upd_time = column.upd_time
db.add(suppColumn)

43
vue-fastapi-backend/module_admin/dao/metadata_config_dao.py

@ -1,9 +1,10 @@
from datetime import datetime, time
from sqlalchemy import delete, select, update,and_
from sqlalchemy import delete, select, update, and_
from sqlalchemy.ext.asyncio import AsyncSession
from module_admin.entity.do.meta_do import MetadataClas,MetadataExtractInfo # ORM 类
from module_admin.entity.do.metadata_config_do import MetadataSec,SecuBizConfig,SecuBizPermiConfig,SecuBizConfigRela,DatasecConfig ,\
TaskBizConfigRela,TaskBizConfig
from module_admin.entity.do.meta_do import MetadataClas, MetadataExtractInfo # ORM 类
from module_admin.entity.do.metadata_config_do import MetadataSec, SecuBizConfig, SecuBizPermiConfig, SecuBizConfigRela, \
DatasecConfig, \
TaskBizConfigRela, TaskBizConfig
# ORM 类
from typing import List
@ -11,6 +12,7 @@ from sqlalchemy.orm import joinedload
from sqlalchemy.sql import true
from utils.page_util import PageUtil
class MetadataConfigDao:
"""
标签信息数据库操作层
@ -37,6 +39,7 @@ class MetadataConfigDao:
)
)
return result.scalars().first()
@classmethod
async def get_clas_by_onum(cls, db: AsyncSession, clas_onum: int):
"""
@ -55,7 +58,8 @@ class MetadataConfigDao:
query = select(MetadataClas).where(
MetadataClas.clas_pri_clas.like(f"%{query_object.clas_pri_clas}%") if query_object.clas_pri_clas else True,
MetadataClas.clas_scd_clas.like(f"%{query_object.clas_scd_clas}%") if query_object.clas_scd_clas else True,
MetadataClas.clas_thre_clas.like(f"%{query_object.clas_thre_clas}%") if query_object.clas_thre_clas else True,
MetadataClas.clas_thre_clas.like(
f"%{query_object.clas_thre_clas}%") if query_object.clas_thre_clas else True,
MetadataClas.clas_name.like(f"%{query_object.clas_name}%") if query_object.clas_name else True,
MetadataClas.clas_eff_flag == query_object.clas_eff_flag if query_object.clas_eff_flag else True,
MetadataClas.upd_time.between(
@ -94,6 +98,7 @@ class MetadataConfigDao:
删除标签信息支持批量
"""
await db.execute(delete(MetadataClas).where(MetadataClas.clas_onum.in_(clas_onum_list)))
@classmethod
async def get_sec_detail_by_id(cls, db: AsyncSession, onum: str):
result = await db.execute(select(MetadataSec).where(MetadataSec.onum == onum))
@ -102,7 +107,8 @@ class MetadataConfigDao:
@classmethod
async def get_metadata_sec_list(cls, db: AsyncSession, query_object, is_page: bool = False):
query = select(MetadataSec).where(
MetadataSec.sec_level_name.like(f"%{query_object.sec_level_name}%") if query_object.sec_level_name else True,
MetadataSec.sec_level_name.like(
f"%{query_object.sec_level_name}%") if query_object.sec_level_name else True,
MetadataSec.sec_eff_flag == query_object.sec_eff_flag if query_object.sec_eff_flag else True,
MetadataSec.upd_time.between(
datetime.combine(datetime.strptime(query_object.begin_time, '%Y-%m-%d'), time(0, 0, 0)),
@ -113,12 +119,19 @@ class MetadataConfigDao:
from utils.page_util import PageUtil
return await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page)
@classmethod
async def get_metadata_sec_option_list(cls, db: AsyncSession):
query = select(MetadataSec).where(MetadataSec.sec_eff_flag == '1').order_by(MetadataSec.sec_level_summary)
result = (await db.execute(query)).scalars().all()
return result
@classmethod
async def add_metadata_sec_dao(cls, db: AsyncSession, sec):
db_sec = MetadataSec(**sec.model_dump())
db.add(db_sec)
await db.flush()
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)
@ -136,6 +149,7 @@ class MetadataConfigDao:
@classmethod
async def delete_metadata_sec_dao(cls, db: AsyncSession, onum_list: list[str]):
await db.execute(delete(MetadataSec).where(MetadataSec.onum.in_(onum_list)))
# ------------- t_secu_biz_config 相关方法 --------------
@classmethod
@ -173,6 +187,7 @@ class MetadataConfigDao:
@classmethod
async def delete_biz_config(cls, db: AsyncSession, onum_list: list[int]):
await db.execute(delete(SecuBizConfig).where(SecuBizConfig.onum.in_(onum_list)))
@classmethod
async def add_biz_permi_config_batch(cls, db: AsyncSession, records: List[SecuBizPermiConfig]):
orm_objs = []
@ -190,6 +205,7 @@ class MetadataConfigDao:
)
orm_objs.append(orm_obj)
db.add_all(orm_objs)
# ------------- t_secu_biz_permi_config 相关方法 --------------
@classmethod
@ -247,6 +263,7 @@ class MetadataConfigDao:
return await PageUtil.paginate(
db, query, query_object.page_num, query_object.page_size, is_page
)
@classmethod
async def add_biz_permi_config(cls, db: AsyncSession, obj):
db_obj = SecuBizPermiConfig(**obj.model_dump())
@ -263,17 +280,21 @@ class MetadataConfigDao:
@classmethod
async def delete_biz_permi_config(cls, db: AsyncSession, onum_list: list[int]):
await db.execute(delete(SecuBizPermiConfig).where(SecuBizPermiConfig.onum.in_(onum_list)))
# ----------------------------------biz_confg_rela------------------------------
# ----------------------------------biz_confg_rela------------------------------
@classmethod
async def delete_biz_rela_dao(cls, db: AsyncSession, biz_onum: int):
await db.execute(delete(SecuBizConfigRela).where(SecuBizConfigRela.biz_onum == biz_onum) )
await db.execute(delete(SecuBizConfigRela).where(SecuBizConfigRela.biz_onum == biz_onum))
@classmethod
async def delete_biz_rela_batch(cls, db: AsyncSession, bonum_list: list[int]):
await db.execute(delete(SecuBizConfigRela).where(SecuBizConfigRela.biz_onum.in_(bonum_list)) )
await db.execute(delete(SecuBizConfigRela).where(SecuBizConfigRela.biz_onum.in_(bonum_list)))
@classmethod
async def add_batch_biz_rela_dao(cls, db: AsyncSession, rela_list: List[SecuBizConfigRela]):
db.add_all(rela_list)
await db.flush()
@classmethod
async def get_biz_rela_by_biz_id(cls, db: AsyncSession, biz_onum: int):
result = await db.execute(
@ -282,6 +303,7 @@ class MetadataConfigDao:
.where(SecuBizConfigRela.biz_onum == biz_onum)
)
return result.scalars().all()
@classmethod
async def get_detail_by_id(cls, db: AsyncSession, onum: int):
"""
@ -333,7 +355,8 @@ class MetadataConfigDao:
批量删除任务配置
"""
await db.execute(delete(DatasecConfig).where(DatasecConfig.onum.in_(onum_list)))
# ----------------------------------元数据标签调度------------------------------
# ----------------------------------元数据标签调度------------------------------
@classmethod
async def get_task_biz_config_list(cls, db: AsyncSession, query_object, is_page: bool = False):
query = select(TaskBizConfig).where(

23
vue-fastapi-backend/module_admin/entity/do/datastd_do.py

@ -1,8 +1,9 @@
from sqlalchemy import Column, Integer, String, DateTime,Text, DateTime,Date, BigInteger
from sqlalchemy import Column, Integer, String, DateTime, Text, DateTime, Date, BigInteger
from config.database import Base
from datetime import datetime
from sqlalchemy.dialects.mysql import MEDIUMTEXT
# 数据标准模块相关表
class DataStdCode(Base):
@ -23,7 +24,8 @@ class DataStdCode(Base):
src_sys = Column(String(50), default=None, comment='归属系统')
class_id = Column(String(10), default=None, comment='代码类型(code:代码 codeItem:代码项)')
parent_id = Column(String(50), default=None, comment='父id')
code_map_id = Column(String(50), default=None,comment='标准代码Id')
code_map_id = Column(String(50), default=None, comment='标准代码Id')
class DataStdCodeAppr(Base):
"""
@ -43,12 +45,14 @@ class DataStdCodeAppr(Base):
src_sys = Column(String(50), default=None, comment='归属系统')
class_id = Column(String(10), default=None, comment='代码类型(code:代码 codeItem:代码项)')
parent_id = Column(String(50), default=None, comment='父id')
code_map_id = Column(String(50), default=None,comment='标准代码Id')
code_map_id = Column(String(50), default=None, comment='标准代码Id')
changeType = Column(String(10), default=None, comment='变更类型')
flowId = Column(String(50), default=None, comment='审批Id')
oldInstId = Column(String(50), default=None, comment='原始正式id')
compareId = Column(String(50), default=None, comment='原始数据id(用于对比差异)')
approStatus = Column(String(10), default=None, comment='审批状态(waiting,申请中,pending审核中,succeed,rejected已审核,canceled已取消)')
approStatus = Column(String(10), default=None,
comment='审批状态(waiting,申请中,pending审核中,succeed,rejected已审核,canceled已取消)')
class DataStdDict(Base):
"""
@ -73,6 +77,7 @@ class DataStdDict(Base):
src_sys_tab_fld_name = Column(MEDIUMTEXT, default=None, comment='来源系统表字段名')
data_dict_stat = Column(String(1), default=None, comment='字典状态(1:有效 0:无效)')
class DataStdDictAppr(Base):
"""
标准字典审批表 (Standard Code Table)
@ -99,7 +104,9 @@ class DataStdDictAppr(Base):
flowId = Column(String(50), default=None, comment='审批Id')
oldInstId = Column(String(50), default=None, comment='原始正式id')
compareId = Column(String(50), default=None, comment='原始数据id(用于对比差异)')
approStatus = Column(String(10), default=None, comment='审批状态(waiting,申请中,pending审核中,succeed,rejected已审核,canceled已取消)')
approStatus = Column(String(10), default=None,
comment='审批状态(waiting,申请中,pending审核中,succeed,rejected已审核,canceled已取消)')
class DataAstContent(Base):
__tablename__ = "t_data_std_content"
@ -115,8 +122,6 @@ class DataAstContent(Base):
upd_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间')
class DataAstContentRela(Base):
__tablename__ = "t_data_std_content_rela"
@ -194,5 +199,5 @@ class DataStdMainAppr(Base):
flowId = Column(String(50), default=None, comment='审批Id')
oldInstId = Column(String(50), default=None, comment='原始正式id')
compareId = Column(String(50), default=None, comment='原始数据id(用于对比差异)')
approStatus = Column(String(10), default=None, comment='审批状态(waiting,申请中,pending审核中,succeed,rejected已审核,canceled已取消)')
approStatus = Column(String(10), default=None,
comment='审批状态(waiting,申请中,pending审核中,succeed,rejected已审核,canceled已取消)')

2
vue-fastapi-backend/module_admin/entity/do/meta_do.py

@ -130,6 +130,7 @@ class MetadataFldSuppInfo(Base):
fld_clas = Column(Text, comment='字段分类')
fld_null_rate = Column(String(50, collation='utf8_general_ci'), comment='字段空值率')
data_dict_id = Column(String(50, collation='utf8_general_ci'), comment='数据字典ID')
data_sec_lvl = Column(String(50, collation='utf8_general_ci'), comment='字段安全等级')
rec_stat = Column(String(50, collation='utf8_general_ci'), comment='记录状态')
upd_time = Column(DateTime, comment='更新时间')
@ -153,6 +154,7 @@ class MetadataFldSuppInfoVett(Base):
fld_clas = Column(Text, comment='字段分类')
fld_null_rate = Column(String(50, collation='utf8_general_ci'), comment='字段空值率')
data_dict_id = Column(String(50, collation='utf8_general_ci'), comment='数据字典ID')
data_sec_lvl = Column(String(50, collation='utf8_general_ci'), comment='字段安全等级')
rec_stat = Column(String(50, collation='utf8_general_ci'), comment='记录状态')
upd_time = Column(DateTime, comment='更新时间')
rec_subm_prsn = Column(String(255, collation='utf8_general_ci'), comment='记录提交人')

1
vue-fastapi-backend/module_admin/entity/vo/meta_vo.py

@ -41,6 +41,7 @@ class ColumnSuppleModel(BaseModel):
fld_null_rate: Optional[str] = None
rec_stat: Optional[str] = None
data_dict_id: Optional[str] = None
data_sec_lvl: Optional[str] = None
class SuppleModel(BaseModel):

37
vue-fastapi-backend/module_admin/service/approval_service.py

@ -4,7 +4,8 @@ import uuid
from typing import Optional
from sqlalchemy.ext.asyncio import AsyncSession
from module_admin.entity.vo.common_vo import CrudResponseModel
from module_admin.entity.vo.approval_vo import ApplyModel, OperateModel, ApprovalQueryObject, EditObjectModel, SaveConfModel
from module_admin.entity.vo.approval_vo import ApplyModel, OperateModel, ApprovalQueryObject, EditObjectModel, \
SaveConfModel
from module_admin.entity.vo.user_vo import CurrentUserModel
from module_admin.entity.do.approval_do import FlowApproval
from exceptions.exception import ServiceException, ServiceWarning
@ -15,9 +16,9 @@ from module_admin.dao.user_dao import UserDao
from module_admin.dao.meta_dao import MetaDao
from module_admin.dao.datastd_dao import DataStdDao
from module_admin.dao.dataast_dao import DataAstDao
from module_admin.entity.vo.dataast_vo import DataAstApprModel,DataAstInfoModel
from module_admin.entity.vo.datastd_vo import DataStdCodeModel,DataStdDictModel,DataStdMainModel,DataStdMainApprModel,DataStdDictApprModel,DataStdDictModel,DataStdCodeApprModel
from module_admin.entity.vo.dataast_vo import DataAstApprModel, DataAstInfoModel
from module_admin.entity.vo.datastd_vo import DataStdCodeModel, DataStdDictModel, DataStdMainModel, \
DataStdMainApprModel, DataStdDictApprModel, DataStdDictModel, DataStdCodeApprModel
class ApprovalService:
@ -138,6 +139,7 @@ class ApprovalService:
else:
await MetaDao.updateMetadataSuppInfo(suppTable.onum, table, result_db)
return CrudResponseModel(is_success=True, message='操作成功')
@classmethod
async def syncStdMainInfo(cls, result_db: AsyncSession, suppId: str, operateType: str):
apprList = await DataStdDao.get_std_main_appr_list(suppId, result_db)
@ -147,7 +149,7 @@ class ApprovalService:
appr_model = DataStdMainApprModel.model_validate(appr)
change_type = appr_model.changeType
if operateType =='succeed':
if operateType == 'succeed':
if change_type == "add":
# 将 DataStdMainApprModel 转换为 DataStdMainModel
main_model = DataStdMainModel(**appr_model.model_dump(exclude_unset=True, by_alias=True))
@ -167,7 +169,6 @@ class ApprovalService:
appr_model.approStatus = operateType
await DataStdDao.update_std_main_appr(result_db, appr_model)
return CrudResponseModel(is_success=True, message='操作成功')
@classmethod
@ -179,7 +180,7 @@ class ApprovalService:
appr_model = DataStdDictApprModel.model_validate(appr)
change_type = appr_model.changeType
if operateType =='succeed':
if operateType == 'succeed':
if change_type == "add":
# 将 DataStdDictApprModel 转换为 DataStdDictModel
main_model = DataStdDictModel(**appr_model.model_dump(exclude_unset=True, by_alias=True))
@ -200,7 +201,6 @@ class ApprovalService:
appr_model.approStatus = operateType
await DataStdDao.update_std_dict_appr(result_db, appr_model)
return CrudResponseModel(is_success=True, message='操作成功')
@classmethod
@ -212,7 +212,7 @@ class ApprovalService:
appr_model = DataStdCodeApprModel.model_validate(appr)
change_type = appr_model.changeType
if operateType =='succeed':
if operateType == 'succeed':
if change_type == "add":
main_model = DataStdCodeModel(**appr_model.model_dump(exclude_unset=True, by_alias=True))
@ -235,6 +235,7 @@ class ApprovalService:
await DataStdDao.update_std_code_appr(result_db, main_appro_model.model_dump(exclude_unset=True))
return CrudResponseModel(is_success=True, message='操作成功')
@classmethod
async def syncDataAstInfo(cls, result_db: AsyncSession, suppId: str, operateType: str):
apprList = await DataAstDao.get_dataast_appr_list_Flow(suppId, result_db)
@ -243,14 +244,13 @@ class ApprovalService:
# 将 SQLAlchemy 模型实例转换为 Pydantic 模型实例
appr_model = DataAstApprModel.model_validate(appr)
change_type = appr_model.changeType
if operateType =='succeed':
if operateType == 'succeed':
if change_type == "add":
# logger.info(f"发现新增类型变更,准备添加数据资产,AST_NO: {appr_model.ast_no}")
main_model = DataAstInfoModel(**appr_model.model_dump(exclude_unset=True, by_alias=True))
await DataAstDao.add_dataast_data(result_db, main_model)
# logger.info(f"数据资产添加成功,AST_NO: {main_model.ast_no}")
# 更新 approStatus 状态
appr_model.approStatus = operateType
main_appro_model = DataStdCodeApprModel(**appr_model.model_dump(exclude_unset=True, by_alias=True))
@ -259,8 +259,6 @@ class ApprovalService:
return CrudResponseModel(is_success=True, message='操作成功')
@classmethod
async def get_flow_list_services(cls, query_db: AsyncSession, query_param: ApprovalQueryObject,
current_user: CurrentUserModel):
@ -282,27 +280,27 @@ class ApprovalService:
for item in approval_list:
nextRoles = json.loads(item.nextStepRole)
nextUsers = json.loads(item.nextStepUser)
if len(nextRoles)>0 and len(nextUsers) > 0:
if len(nextRoles) > 0 and len(nextUsers) > 0:
if current_user.user.user_name in nextUsers:
count = count+1
count = count + 1
break
if any(element in set(current_user.roles) for element in nextRoles):
count = count+1
count = count + 1
break
if len(nextRoles) > 0 and len(nextUsers) == 0:
if any(element in set(current_user.roles) for element in nextRoles):
count = count+1
count = count + 1
break
if len(nextRoles) == 0 and len(nextUsers) > 0:
if current_user.user.user_name in nextUsers:
count = count+1
count = count + 1
break
return count
@classmethod
async def cancel_apply_services(cls, query_db: AsyncSession, flow_id: str,
current_user: CurrentUserModel):
flow = await ApprovalDao.get_flow_by_idAndUser(query_db,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':
@ -335,4 +333,3 @@ class ApprovalService:
await ApprovalDao.add_flow_config(query_db, confDict)
await query_db.commit()
return CrudResponseModel(is_success=True, message='操作成功')

17
vue-fastapi-backend/module_admin/service/meta_service.py

@ -46,8 +46,13 @@ class MetaService:
table['batchTabClas'] = CamelCaseUtil.transform_result(tab_list)
return meta_rel_list
else:
# meta_rel_list = MetaDao.get_meta_rel_list(result_db, query_object, data_scope_sql)
return None
meta_rel_list = await MetaDao.get_meta_rel_list(result_db, query_object)
if meta_rel_list and len(meta_rel_list.rows) > 0:
for table in meta_rel_list.rows:
tab_list = await MetaDao.get_meta_tab_clas(result_db, table['ssysCd'], table['mdlName'],
table['tabEngName'])
table['batchTabClas'] = CamelCaseUtil.transform_result(tab_list)
return meta_rel_list
@classmethod
async def get_meta_col_list_services(cls, result_db: AsyncSession, query_object: MetaColObject):
@ -57,6 +62,10 @@ class MetaService:
fld_list = await MetaDao.get_meta_fld_clas(result_db, column['ssysCd'], column['mdlName'],
column['tabEngName'], column['fldEngName'])
column['batchFldClas'] = CamelCaseUtil.transform_result(fld_list)
if column['dataSecLvl'] is None and column['dataDictId'] is not None:
# 获取数据标准的安全等级
data_sec_lvl = await DataStdDao.get_data_sec_lvl_by_dict_id(result_db, column['dataDictId'])
column['dataSecLvl'] = data_sec_lvl
return result
@classmethod
@ -99,7 +108,7 @@ class MetaService:
supple.tab_eng_name,
column.fld_eng_name, result_db)
data_dict_name = ''
if oldColumn.data_dict_id and oldColumn.data_dict_id != '':
if oldColumn and oldColumn.data_dict_id and oldColumn.data_dict_id != '':
oldDict = await DataStdDao.get_data_dict_by_id(result_db, oldColumn.data_dict_id)
data_dict_name = oldDict.data_dict_cn_name if oldDict else ''
columnInfo = await MetaDao.get_meta_column(supple.ssys_cd, supple.mdl_name, supple.tab_eng_name,
@ -117,6 +126,7 @@ class MetaService:
suppColumnInfo.fld_clas = column.fld_clas
suppColumnInfo.fld_null_rate = column.fld_null_rate
suppColumnInfo.data_dict_id = column.data_dict_id
suppColumnInfo.data_sec_lvl = column.data_sec_lvl
suppColumnInfo.rec_stat = column.rec_stat
suppColumnInfo.rec_subm_prsn = current_user.user.user_name
suppColumnInfo.apply_time = applyTime
@ -174,6 +184,7 @@ class MetaService:
fldClas=column.fld_clas if column and column.fld_clas else None,
fldNullRate=column.fld_null_rate if column and column.fld_null_rate else None,
dataDictId=column.data_dict_id if column and column.data_dict_id else None,
dataSecLvl=column.data_sec_lvl if column and column.data_sec_lvl else None,
dataDictName=dictName,
recStat=column.rec_stat if column and column.rec_stat else None,
updTime=column.upd_time.isoformat() if column and column.upd_time else None

8
vue-fastapi-backend/module_admin/service/metadata_config_service.py

@ -133,6 +133,14 @@ class MetadataConfigService:
result = await MetadataConfigDao.get_metadata_sec_list(query_db, query_object, is_page)
return result
@classmethod
async def get_metadata_sec_option_list_services(cls, query_db: AsyncSession):
"""
查询数据安全配置列表
"""
result = await MetadataConfigDao.get_metadata_sec_option_list(query_db)
return CamelCaseUtil.transform_result(result)
@classmethod
async def add_metadata_sec_services(cls, query_db: AsyncSession, page_object: MetadataSecModel):
"""

8
vue-fastapi-frontend/src/api/metadataConfig/metadataConfig.js

@ -53,6 +53,14 @@ export function listMetadataSec(query) {
})
}
// 查询数据安全配置列表,不带分页
export function listMetadataSecOptions() {
return request({
url: '/default-api/metadataConfig/sec/optionList',
method: 'get'
})
}
// 查询数据安全配置详情
export function getMetadataSec(secId) {
return request({

42
vue-fastapi-frontend/src/views/meta/metaInfo/index.vue

@ -313,6 +313,7 @@
</template>
</el-table-column>
<el-table-column label="引用字典/标准" align="center" prop="dataDictName"></el-table-column>
<el-table-column label="安全等级" align="center" prop="dataSecLvl"></el-table-column>
<el-table-column label="更新时间" align="center" prop="suppUpdTime" width="180">
<template #default="scope">
<template v-if="scope.row.suppUpdTime && scope.row.suppUpdTime !== ''">
@ -521,6 +522,21 @@
</el-option>
</el-select>
</el-form-item>
<el-form-item label="安全等级">
<el-select
v-model="currentColumnData.dataSecLvl"
filterable
style="width: 192px"
placeholder="请输入关键词"
:loading="loading">
<el-option
v-for="item in secLvlOptions"
:key="item.onum"
:label="item.secLevelSummary + ' - ' + item.secLevelName"
:value="item.secLevelSummary">
</el-option>
</el-select>
</el-form-item>
</el-form>
<el-form :model="currentColumnTag" :inline="true" label-width="100px">
<el-form-item label="一级分类:" prop="userName">
@ -738,6 +754,7 @@
import cache from "@/plugins/cache";
import BusinssRelation from "./businssRelation.vue";
import BloodRelation from "./bloodRelation.vue";
import {listMetadataSecOptions} from "@/api/metadataConfig/metadataConfig.js";
const data = reactive({
queryParams:{
@ -823,6 +840,7 @@
"clasScdClas": ""
});
const stddictOptions = ref([])
const secLvlOptions = ref([])
function changeColumnTab(){
if (activeColumnTab.value === 'businessRelation'){
@ -858,6 +876,11 @@
})
}
}
function remoteSecLvl(){
listMetadataSecOptions().then(res=>{
secLvlOptions.value = res.data
})
}
function generateDemoData(){
let param ={
dataAstSrc: currentMetaData.value.ssysCd,
@ -965,6 +988,10 @@
columnList.value[i].dataDictName = currentColumnData.value.dataDictName
changed = true
}
if (columnList.value[i].dataSecLvl !== currentColumnData.value.dataSecLvl){
columnList.value[i].dataSecLvl = currentColumnData.value.dataSecLvl
changed = true
}
if (currentColumnData.value.showFldClas && currentColumnData.value.showFldClas.length > 0){
let showFldClas = currentColumnData.value.showFldClas
let fldClas = []
@ -1037,8 +1064,21 @@
}
columnInfoDialog.value = false
if (changed){
if (changedColumns.value.length>0){
let hasCol = false
for (let i = 0; i < changedColumns.value.length; i++) {
if (changedColumns.value[i].fldEngName === currentColumnData.value.fldEngName){
changedColumns.value[i] = currentColumnData.value
hasCol = true
}
}
if (!hasCol){
changedColumns.value.push(currentColumnData.value)
}
}else{
changedColumns.value.push(currentColumnData.value)
}
}
}
function addTableTag(){
let json = JSON.parse(JSON.stringify(currentTableTag.value))
@ -1188,6 +1228,7 @@
metaClasList.value = res.data
})
remoteStddict()
remoteSecLvl()
}
function showColumnDialog(row) {
let tableData = JSON.parse(JSON.stringify(row))
@ -1501,6 +1542,7 @@
fldClas: JSON.stringify(column.showFldClas),
fldNullRate: column.fldNullRate,
dataDictId: column.dataDictId,
dataSecLvl: column.dataSecLvl,
recStat: column.recStat
})
}

13
vue-fastapi-frontend/src/views/system/flow/index.vue

@ -344,6 +344,12 @@
<span v-else style="color: red">{{scope.row.dataDictName}}</span>
</template>
</el-table-column>
<el-table-column label="安全等级" align="center" prop="dataSecLvl">
<template #default="scope">
<span v-if="oldColumnList[scope.$index].dataSecLvl === newColumnList[scope.$index].dataSecLvl">{{scope.row.dataSecLvl}}</span>
<span v-else style="color: red">{{scope.row.dataSecLvl}}</span>
</template>
</el-table-column>
</el-table>
</div>
<br><br>
@ -524,6 +530,12 @@
<span v-else style="color: red">{{scope.row.dataDictName}}</span>
</template>
</el-table-column>
<el-table-column label="安全等级" align="center" prop="dataSecLvl">
<template #default="scope">
<span v-if="oldColumnList[scope.$index].dataSecLvl === newColumnList[scope.$index].dataSecLvl">{{scope.row.dataSecLvl}}</span>
<span v-else style="color: red">{{scope.row.dataSecLvl}}</span>
</template>
</el-table-column>
</el-table>
</div>
</el-dialog>
@ -983,6 +995,7 @@ function showBusinessDataDialog(row){
fldCnName:column.fldCnName,
fldType:column.fldType,
dataDictName: col.dataDictName,
dataSecLvl: col.dataSecLvl,
showColClas: showNewColClas
})
}

Loading…
Cancel
Save