From 1b4718fd610c7bc408fcc1d7acaae0477ea33625 Mon Sep 17 00:00:00 2001 From: xueyinfei <1207092115@qq.com> Date: Fri, 25 Jul 2025 14:04:43 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=80=E7=BC=98=E8=A7=A3=E6=9E=90=E4=B8=8E?= =?UTF-8?q?=E5=AD=98=E5=82=A8=E8=BF=87=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/meta_controller.py | 18 +- .../module_admin/dao/meta_dao.py | 34 +- .../module_admin/entity/do/meta_do.py | 38 +- .../module_admin/entity/vo/meta_vo.py | 8 + .../module_admin/service/meta_service.py | 95 ++- vue-fastapi-frontend/src/api/meta/metaInfo.js | 13 + .../components/codemirror/SQLCodeMirror.vue | 8 +- .../src/views/meta/metaInfo/bloodRelation.vue | 737 ++++++++++++++++++ .../src/views/meta/metaInfo/index.vue | 52 +- 9 files changed, 954 insertions(+), 49 deletions(-) create mode 100644 vue-fastapi-frontend/src/views/meta/metaInfo/bloodRelation.vue diff --git a/vue-fastapi-backend/module_admin/controller/meta_controller.py b/vue-fastapi-backend/module_admin/controller/meta_controller.py index 8538fa2..e6e27a5 100644 --- a/vue-fastapi-backend/module_admin/controller/meta_controller.py +++ b/vue-fastapi-backend/module_admin/controller/meta_controller.py @@ -6,7 +6,7 @@ from module_admin.service.login_service import LoginService from utils.response_util import ResponseUtil from module_admin.service.meta_service import MetaService -from module_admin.entity.vo.meta_vo import MetaPageObject, MetaColObject, SuppleModel, MetaBusinessRelShipObject +from module_admin.entity.vo.meta_vo import MetaPageObject, MetaColObject, SuppleModel, MetaBusinessRelShipObject, MetaProcQueryObject metaController = APIRouter(prefix='/dasset', dependencies=[Depends(LoginService.get_current_user)]) @@ -63,3 +63,19 @@ async def getBusinessRelationShip(request: Request, query_db: AsyncSession = Depends(get_db)): result = await MetaService.getBusinessRelationShip(query_db, meta_query) return ResponseUtil.success(data=result) + + +@metaController.get("/meta/business/proc") +async def getBusinessProc(request: Request, + meta_query: MetaProcQueryObject = Depends(MetaProcQueryObject.as_query), + query_db: AsyncSession = Depends(get_db)): + result = await MetaService.getMetaProc(query_db, meta_query) + return ResponseUtil.success(data=result) + + +@metaController.get("/meta/blood/relation/{procId}") +async def getBloodRelationShip(request: Request, + procId: int, + query_db: AsyncSession = Depends(get_db)): + result = await MetaService.getBloodRelationShip(query_db, procId) + return ResponseUtil.success(data=result) diff --git a/vue-fastapi-backend/module_admin/dao/meta_dao.py b/vue-fastapi-backend/module_admin/dao/meta_dao.py index df65d24..88c0edc 100644 --- a/vue-fastapi-backend/module_admin/dao/meta_dao.py +++ b/vue-fastapi-backend/module_admin/dao/meta_dao.py @@ -2,7 +2,8 @@ from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select, text, cast, Integer, and_, or_, outerjoin, func, join, update, desc from module_admin.entity.vo.meta_vo import MetaPageObject, MetaColObject from module_admin.entity.do.meta_do import MetadataExtractInfo, MetadataSuppInfo, MetadataFldTabExtractInfo, \ - MetadataFldSuppInfo, MetadataClas, MetadataSuppInfoVett, MetadataFldSuppInfoVett, MetaBatchTabClas, MetaBatchFldClas + MetadataFldSuppInfo, MetadataClas, MetadataSuppInfoVett, MetadataFldSuppInfoVett, MetaBatchTabClas,\ + MetaBatchFldClas, MetaBloodAnalysis from utils.common_util import CamelCaseUtil import uuid from utils.page_util import PageUtil @@ -191,7 +192,7 @@ class MetaDao: MetadataFldTabExtractInfo.ssys_cd == query_object.ssys_cd, MetadataFldTabExtractInfo.mdl_name == query_object.mdl_name, MetadataFldTabExtractInfo.tab_eng_name == query_object.tab_name - ).distinct() + ).distinct().order_by(MetadataFldTabExtractInfo.fld_no) ) ).all() ) @@ -432,6 +433,7 @@ class MetaDao: MetadataFldTabExtractInfo.mdl_name == mdlName, MetadataFldTabExtractInfo.tab_eng_name == tabEngName, MetadataFldTabExtractInfo.fld_eng_name == fldEngName).distinct() + .order_by(MetadataFldTabExtractInfo.fld_no) ) ).scalars().first() ) @@ -519,11 +521,12 @@ class MetaDao: MetadataFldTabExtractInfo.fld_cn_name, MetadataFldTabExtractInfo.fld_type, MetadataFldTabExtractInfo.pk_flag, + MetadataFldTabExtractInfo.fld_no ).where( MetadataFldTabExtractInfo.ssys_cd == query_object.ssys_cd, MetadataFldTabExtractInfo.mdl_name == query_object.mdl_name, MetadataFldTabExtractInfo.tab_eng_name == query_object.tab_name - ).distinct() + ).distinct().order_by(MetadataFldTabExtractInfo.fld_no) ) ).all() ) @@ -644,3 +647,28 @@ class MetaDao: # 将结果转换为字典列表 result_as_dict = [dict(zip(columns, row)) for row in result.fetchall()] return result_as_dict + + @classmethod + async def get_proc_by_table(cls, result_db: AsyncSession, ssys_cd: str, mdl_name: str, tab_eng_name: str): + sql = text("select onum, proc_text from t_metadata_data_lineage_info" + " where onum in (" + "select proId from meta_blood_analysis " + "where targetSysCd = :ssysCd and targetMdlName = :mdlName and targetTableName= :tableName)") + result = (await result_db.execute(sql, {"ssysCd": ssys_cd, "mdlName": mdl_name, "tableName": tab_eng_name})) + # 获取列名 + columns = result.keys() # 返回列名列表 + # 将结果转换为字典列表 + result_as_dict = [dict(zip(columns, row)) for row in result.fetchall()] + return result_as_dict + + + @classmethod + async def get_blood_by_procId(cls, result_db: AsyncSession, procId: int): + query_result = ( + ( + await result_db.execute( + select(MetaBloodAnalysis).where(MetaBloodAnalysis.proId == procId).distinct() + ) + ).scalars().all() + ) + return query_result diff --git a/vue-fastapi-backend/module_admin/entity/do/meta_do.py b/vue-fastapi-backend/module_admin/entity/do/meta_do.py index 5a5f991..c85a5af 100644 --- a/vue-fastapi-backend/module_admin/entity/do/meta_do.py +++ b/vue-fastapi-backend/module_admin/entity/do/meta_do.py @@ -188,19 +188,25 @@ class MetaBatchFldClas(Base): clas_value = Column(String(200, collation='utf8_general_ci'), comment='标签值') -# class MetaBatchFldRelation(Base): -# __tablename__ = 't_batch_fld_relation' -# a_ssys_cd = Column(String(50, collation='utf8_general_ci'), comment='a系统代码') -# a_data_whs_name = Column(String(50, collation='utf8_general_ci'), comment='a数据库名称') -# a_mdl_name = Column(String(50, collation='utf8_general_ci'), comment='a模式名称') -# a_tab_no = Column(Integer, comment='a表编号') -# a_tab_eng_name = Column(String(200, collation='utf8_general_ci'), comment='a表英文名称') -# a_fld_eng_name = Column(String(200, collation='utf8_general_ci'), comment='a字段英文名称') -# b_ssys_cd = Column(String(50, collation='utf8_general_ci'), comment='b源系统代码') -# b_data_whs_name = Column(String(50, collation='utf8_general_ci'), comment='b数据库名称') -# b_mdl_name = Column(String(50, collation='utf8_general_ci'), comment='b数据库名称') -# b_tab_no = Column(Integer, comment='b表编号') -# b_tab_eng_name = Column(String(200, collation='utf8_general_ci'), comment='b表英文名称') -# b_fld_eng_name = Column(String(200, collation='utf8_general_ci'), comment='b表英文名称') -# rela_type = Column(String(200, collation='utf8_general_ci'), comment='关系类型') -# rela_value = Column(String(200, collation='utf8_general_ci'), comment='关系值') +class MetaBloodAnalysis(Base): + """字段标签表""" + __tablename__ = 'meta_blood_analysis' + + id = Column(String(50, collation='utf8_general_ci'), primary_key=True, comment='id') + proId = Column(Integer, comment='存储过程ID') + proName = Column(String(100, collation='utf8_general_ci'), comment='存储过程名称') + targetSysCd = Column(String(100, collation='utf8_general_ci'), comment='目标系统') + targetMdlName = Column(String(100, collation='utf8_general_ci'), comment='目标模式') + targetTableName = Column(String(100, collation='utf8_general_ci'), comment='目标表') + targetTableCnName = Column(String(100, collation='utf8_general_ci'), comment='目标表中文名') + targetColName = Column(String(100, collation='utf8_general_ci'), comment='目标字段名') + targetColCnName = Column(String(100, collation='utf8_general_ci'), comment='目标字段中文名') + targetColType = Column(String(100, collation='utf8_general_ci'), comment='目标字段类型') + sourceSysCd = Column(String(100, collation='utf8_general_ci'), comment='源系统代码') + sourceMdlName = Column(String(100, collation='utf8_general_ci'), comment='源系统模式') + sourceTableName = Column(String(100, collation='utf8_general_ci'), comment='源系统表名') + sourceTableCnName = Column(String(100, collation='utf8_general_ci'), comment='源系统表中文名') + sourceColName = Column(String(100, collation='utf8_general_ci'), comment='源系统字段名') + sourceColCnName = Column(String(100, collation='utf8_general_ci'), comment='源系统字段中文名') + sourceColType = Column(String(100, collation='utf8_general_ci'), comment='源系统字段类型') + diff --git a/vue-fastapi-backend/module_admin/entity/vo/meta_vo.py b/vue-fastapi-backend/module_admin/entity/vo/meta_vo.py index dfe312c..f1faf66 100644 --- a/vue-fastapi-backend/module_admin/entity/vo/meta_vo.py +++ b/vue-fastapi-backend/module_admin/entity/vo/meta_vo.py @@ -63,3 +63,11 @@ class MetaBusinessRelShipObject(BaseModel): mdl_name: Optional[str] tab_eng_name: Optional[str] type: Optional[str] + + +@as_query +class MetaProcQueryObject(BaseModel): + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + ssys_cd: Optional[str] + mdl_name: Optional[str] + tab_eng_name: Optional[str] diff --git a/vue-fastapi-backend/module_admin/service/meta_service.py b/vue-fastapi-backend/module_admin/service/meta_service.py index 0730c90..9306785 100644 --- a/vue-fastapi-backend/module_admin/service/meta_service.py +++ b/vue-fastapi-backend/module_admin/service/meta_service.py @@ -1,7 +1,8 @@ import json import uuid -from module_admin.entity.vo.meta_vo import MetaPageObject, MetaColObject, SuppleModel, MetaBusinessRelShipObject +from module_admin.entity.vo.meta_vo import MetaPageObject, MetaColObject, SuppleModel, MetaBusinessRelShipObject, \ + MetaProcQueryObject from module_admin.entity.do.meta_do import MetadataSuppInfo, MetadataFldSuppInfo, MetadataSuppInfoVett, \ MetadataFldSuppInfoVett, MetadataExtractInfo, MetadataFldTabExtractInfo from module_admin.dao.meta_dao import MetaDao @@ -267,16 +268,16 @@ class MetaService: 'tab_eng_name': nextNode['b_tab_eng_name'], 'fld_eng_name': nextNode['b_fld_eng_name']}, "endArrow": True} if nextNode['father'] == 'A' else \ - {"source": {'ssys_cd': nextNode['b_ssys_cd'], - 'mdl_name': nextNode['b_mdl_name'], - 'tab_eng_name': nextNode['b_tab_eng_name'], - 'fld_eng_name': nextNode['b_fld_eng_name']}, - "target": {"ssys_cd": nextNode['a_ssys_cd'], - "mdl_name": nextNode['a_mdl_name'], - "tab_eng_name": nextNode['a_tab_eng_name'], - "fld_eng_name": nextNode['a_fld_eng_name']}, - "endArrow": True - } + {"source": {'ssys_cd': nextNode['b_ssys_cd'], + 'mdl_name': nextNode['b_mdl_name'], + 'tab_eng_name': nextNode['b_tab_eng_name'], + 'fld_eng_name': nextNode['b_fld_eng_name']}, + "target": {"ssys_cd": nextNode['a_ssys_cd'], + "mdl_name": nextNode['a_mdl_name'], + "tab_eng_name": nextNode['a_tab_eng_name'], + "fld_eng_name": nextNode['a_fld_eng_name']}, + "endArrow": True + } relationList.append(relation) if currentNode['father'] == 'B': # b为上游, 取b字段的上上游 @@ -296,15 +297,15 @@ class MetaService: 'mdl_name': preNode['b_mdl_name'], 'tab_eng_name': preNode['b_tab_eng_name'], 'fld_eng_name': preNode['b_fld_eng_name']}, - "endArrow": True} if preNode['father'] == 'A' else\ - { "source": {'ssys_cd': preNode['b_ssys_cd'], - 'mdl_name': preNode['b_mdl_name'], - 'tab_eng_name': preNode['b_tab_eng_name'], - 'fld_eng_name': preNode['b_fld_eng_name']}, - "target": {"ssys_cd": preNode['a_ssys_cd'], "mdl_name": preNode['a_mdl_name'], - "tab_eng_name": preNode['a_tab_eng_name'], - "fld_eng_name": preNode['a_fld_eng_name']}, - "endArrow": True} + "endArrow": True} if preNode['father'] == 'A' else \ + {"source": {'ssys_cd': preNode['b_ssys_cd'], + 'mdl_name': preNode['b_mdl_name'], + 'tab_eng_name': preNode['b_tab_eng_name'], + 'fld_eng_name': preNode['b_fld_eng_name']}, + "target": {"ssys_cd": preNode['a_ssys_cd'], "mdl_name": preNode['a_mdl_name'], + "tab_eng_name": preNode['a_tab_eng_name'], + "fld_eng_name": preNode['a_fld_eng_name']}, + "endArrow": True} relationList.append(relation) if currentNode['b_tab_eng_name'] == meta_query.tab_eng_name: if currentNode['father'] == 'A': @@ -439,3 +440,57 @@ class MetaService: currentNodeList = await MetaDao.get_er_relation_by_column(result_db, col, module) return currentNodeList return None + + @classmethod + async def getMetaProc(cls, result_db: AsyncSession, meta_query: MetaProcQueryObject): + result = await MetaDao.get_proc_by_table(result_db, meta_query.ssys_cd, meta_query.mdl_name, + meta_query.tab_eng_name) + return result + + @classmethod + async def getBloodRelationShip(cls, result_db: AsyncSession, procId: int): + bloodRelations = await MetaDao.get_blood_by_procId(result_db, procId) + tableList = [] + if bloodRelations is not None and len(bloodRelations) > 0: + for blood in bloodRelations: + if len(tableList) > 0: + exists1 = any(item["ssys_cd"].lower() == blood.targetSysCd.lower() + and item["mdl_name"].lower() == blood.targetMdlName.lower() + and item["tab_eng_name"].lower() == blood.targetTableName.lower() + for item in tableList) + if not exists1: + tableList.append({"ssys_cd": blood.targetSysCd.lower(), + "mdl_name": blood.targetMdlName.lower(), + "tab_eng_name": blood.targetTableName.lower()}) + exists2 = any(item["ssys_cd"].lower() == blood.sourceSysCd.lower() + and item["mdl_name"].lower() == blood.sourceMdlName.lower() + and item["tab_eng_name"].lower() == blood.sourceTableName.lower() + for item in tableList) + if not exists2: + tableList.append({"ssys_cd": blood.sourceSysCd.lower(), + "mdl_name": blood.sourceMdlName.lower(), + "tab_eng_name": blood.sourceTableName.lower()}) + else: + tableList.append({"ssys_cd": blood.targetSysCd.lower(), + "mdl_name": blood.targetMdlName.lower(), + "tab_eng_name": blood.targetTableName.lower()}) + tableList.append({"ssys_cd": blood.sourceSysCd.lower(), + "mdl_name": blood.sourceMdlName.lower(), + "tab_eng_name": blood.sourceTableName.lower()}) + if len(tableList) > 0: + for table in tableList: + query_object = MetaColObject() + query_object.ssys_cd = table['ssys_cd'] + query_object.mdl_name = table['mdl_name'] + query_object.tab_name = table['tab_eng_name'] + meta_result = await MetaDao.get_meta_col_name_list(result_db, query_object) + result1 = CamelCaseUtil.transform_result(meta_result) + tableCnName = await MetaDao.get_meta_table_cn_name(result_db, table['ssys_cd'], table['mdl_name'], + table['tab_eng_name']) + table['tab_cn_name'] = tableCnName + table['column'] = result1 + result = { + "relation": bloodRelations, + "tableList": tableList + } + return result diff --git a/vue-fastapi-frontend/src/api/meta/metaInfo.js b/vue-fastapi-frontend/src/api/meta/metaInfo.js index 0e2eca6..f389b78 100644 --- a/vue-fastapi-frontend/src/api/meta/metaInfo.js +++ b/vue-fastapi-frontend/src/api/meta/metaInfo.js @@ -54,6 +54,19 @@ export function getMetaDataRelship(data){ params: data }) } +export function getMetaDataBloodRelship(data){ + return request({ + url:'/default-api/dasset/meta/blood/relation/'+data, + method: 'get', + }) +} +export function getProcData(param){ + return request({ + url:'/default-api/dasset/meta/business/proc', + method: 'get', + params: param + }) +} diff --git a/vue-fastapi-frontend/src/components/codemirror/SQLCodeMirror.vue b/vue-fastapi-frontend/src/components/codemirror/SQLCodeMirror.vue index 638bef5..51c9e38 100644 --- a/vue-fastapi-frontend/src/components/codemirror/SQLCodeMirror.vue +++ b/vue-fastapi-frontend/src/components/codemirror/SQLCodeMirror.vue @@ -1,5 +1,5 @@ + + \ No newline at end of file diff --git a/vue-fastapi-frontend/src/views/meta/metaInfo/index.vue b/vue-fastapi-frontend/src/views/meta/metaInfo/index.vue index f5d59a1..a869e97 100644 --- a/vue-fastapi-frontend/src/views/meta/metaInfo/index.vue +++ b/vue-fastapi-frontend/src/views/meta/metaInfo/index.vue @@ -334,9 +334,13 @@ - 血缘关系 + +
+ +
+
- + @@ -565,12 +569,13 @@