siyaqi 1 month ago
parent
commit
f934023b92
  1. 10
      vue-fastapi-backend/module_admin/controller/meta_controller.py
  2. 92
      vue-fastapi-backend/module_admin/dao/meta_dao.py
  3. 18
      vue-fastapi-backend/module_admin/entity/do/meta_do.py
  4. 9
      vue-fastapi-backend/module_admin/entity/vo/meta_vo.py
  5. 284
      vue-fastapi-backend/module_admin/service/meta_service.py
  6. 7
      vue-fastapi-frontend/src/api/meta/metaInfo.js
  7. 2
      vue-fastapi-frontend/src/views/dataAsset/assetDetail/index.vue
  8. 691
      vue-fastapi-frontend/src/views/meta/metaInfo/businssRelation.vue
  9. 36
      vue-fastapi-frontend/src/views/meta/metaInfo/index.vue

10
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 utils.response_util import ResponseUtil
from module_admin.service.meta_service import MetaService from module_admin.service.meta_service import MetaService
from module_admin.entity.vo.meta_vo import MetaPageObject, MetaColObject, SuppleModel from module_admin.entity.vo.meta_vo import MetaPageObject, MetaColObject, SuppleModel, MetaBusinessRelShipObject
metaController = APIRouter(prefix='/dasset', dependencies=[Depends(LoginService.get_current_user)]) metaController = APIRouter(prefix='/dasset', dependencies=[Depends(LoginService.get_current_user)])
@ -55,3 +55,11 @@ async def getTableByTableId(request: Request,
query_db: AsyncSession = Depends(get_db)): query_db: AsyncSession = Depends(get_db)):
result = await MetaService.get_table_by_id(query_db, tableId) result = await MetaService.get_table_by_id(query_db, tableId)
return ResponseUtil.success(data=result) return ResponseUtil.success(data=result)
@metaController.get("/meta/business/relation")
async def getBusinessRelationShip(request: Request,
meta_query: MetaBusinessRelShipObject = Depends(MetaBusinessRelShipObject.as_query),
query_db: AsyncSession = Depends(get_db)):
result = await MetaService.getBusinessRelationShip(query_db, meta_query)
return ResponseUtil.success(data=result)

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

@ -494,3 +494,95 @@ class MetaDao:
)).first() )).first()
return CamelCaseUtil.transform_result(result) return CamelCaseUtil.transform_result(result)
@classmethod
async def get_er_relation_by_table(cls, result_db: AsyncSession, ssys_cd: str, mdl_name: str, tab_eng_name: str):
sql = text("select a1.*,case when a2.rela_value = '1' then 'A' when a2.rela_value = '2' then 'B' end AS father "
"from ( select a_ssys_cd,a_mdl_name,a_tab_eng_name,a_fld_eng_name,b_ssys_cd,b_mdl_name,"
"b_tab_eng_name,b_fld_eng_name from t_batch_fld_relation "
"where rela_type = 'sub_flag' and rela_value ='1') a1 "
"left join t_batch_fld_relation a2 "
"on a1.a_ssys_cd = a2.a_ssys_cd and a1.a_mdl_name = a2.a_mdl_name "
"and a1.a_tab_eng_name = a2.a_tab_eng_name "
"and a1.a_fld_eng_name = a2.a_fld_eng_name "
"and a1.b_ssys_cd = a2.b_ssys_cd "
"and a1.b_mdl_name = a2.b_mdl_name "
"and a1.b_tab_eng_name = a2.b_tab_eng_name "
"and a1.b_fld_eng_name = a2.b_fld_eng_name "
"and a2.rela_type = 'set_flag' "
"where ((a1.a_ssys_cd,a1.a_mdl_name,a1.a_tab_eng_name,a1.a_fld_eng_name) in "
"(select ssys_cd,mdl_name,tab_eng_name,clas_value from t_batch_tab_clas)"
"or (a1.b_ssys_cd,a1.b_mdl_name,a1.b_tab_eng_name,a1.b_fld_eng_name) in "
"(select ssys_cd,mdl_name,tab_eng_name,clas_value from t_batch_tab_clas))"
"and ((a1.a_ssys_cd = :sysCode and a1.a_mdl_name = :mdlName and a1.a_tab_eng_name = :tabName)"
" or (a1.b_ssys_cd = :sysCode and a1.b_mdl_name = :mdlName and a1.b_tab_eng_name = :tabName))")
result = (await result_db.execute(sql, {"sysCode": ssys_cd,
"mdlName": mdl_name, "tabName": 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_meta_col_name_list(cls, db: AsyncSession, query_object: MetaColObject):
query_result = (
(
await db.execute(
select(
MetadataFldTabExtractInfo.ssys_cd,
MetadataFldTabExtractInfo.mdl_name,
MetadataFldTabExtractInfo.tab_eng_name,
MetadataFldTabExtractInfo.fld_eng_name,
MetadataFldTabExtractInfo.fld_cn_name,
MetadataFldTabExtractInfo.fld_type,
MetadataFldTabExtractInfo.pk_flag,
).where(
MetadataFldTabExtractInfo.ssys_cd == query_object.ssys_cd,
MetadataFldTabExtractInfo.mdl_name == query_object.mdl_name,
MetadataFldTabExtractInfo.tab_eng_name == query_object.tab_name
).distinct()
)
).all()
)
return [row._asdict() for row in query_result]
@classmethod
async def get_er_relation_by_column(cls, result_db: AsyncSession, column: [], module: str):
sql = text("select a1.*,case when a2.rela_value = '1' then 'A' when a2.rela_value = '2' then 'B' end AS father "
"from ( select a_ssys_cd,a_mdl_name,a_tab_eng_name,a_fld_eng_name,b_ssys_cd,b_mdl_name,"
"b_tab_eng_name,b_fld_eng_name from t_batch_fld_relation "
"where rela_type = 'sub_flag' and rela_value ='1') a1 "
"left join t_batch_fld_relation a2 "
"on a1.a_ssys_cd = a2.a_ssys_cd and a1.a_mdl_name = a2.a_mdl_name "
"and a1.a_tab_eng_name = a2.a_tab_eng_name "
"and a1.a_fld_eng_name = a2.a_fld_eng_name "
"and a1.b_ssys_cd = a2.b_ssys_cd "
"and a1.b_mdl_name = a2.b_mdl_name "
"and a1.b_tab_eng_name = a2.b_tab_eng_name "
"and a1.b_fld_eng_name = a2.b_fld_eng_name "
"and a2.rela_type = 'set_flag' "
"where ((a1.a_ssys_cd,a1.a_mdl_name,a1.a_tab_eng_name,a1.a_fld_eng_name) "
"in (select ssys_cd,mdl_name,tab_eng_name,clas_value from t_batch_tab_clas)"
"or (a1.b_ssys_cd,a1.b_mdl_name,a1.b_tab_eng_name,a1.b_fld_eng_name) "
"in (select ssys_cd,mdl_name,tab_eng_name,clas_value from t_batch_tab_clas))"
"and ((a1.a_ssys_cd = :sysCode and a1.a_mdl_name = :mdlName "
"and a1.a_tab_eng_name = :tabName and a1.a_fld_eng_name = :fldName "
"and a2.rela_value = :rela_value)"
" or (a1.b_ssys_cd = :sysCode and a1.b_mdl_name = :mdlName "
"and a1.b_tab_eng_name = :tabName and a1.b_fld_eng_name = :fldName "
"and a2.rela_value = :rela_value2))")
result = (await result_db.execute(sql, {"sysCode": column['ssys_cd'],
"mdlName": column['mdl_name'], "tabName": column['tab_eng_name'],
"fldName": column['fld_eng_name'],
"rela_value": '2' if module == 'pre' else '1',
"rela_value2": '1' if module == 'pre' else '2'
}))
# 获取列名
columns = result.keys() # 返回列名列表
# 将结果转换为字典列表
result_as_dict = [dict(zip(columns, row)) for row in result.fetchall()]
return result_as_dict

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

@ -185,3 +185,21 @@ class MetaBatchFldClas(Base):
fld_eng_name = Column(String(200, collation='utf8_general_ci'), comment='字段英文名称') fld_eng_name = Column(String(200, collation='utf8_general_ci'), comment='字段英文名称')
clas_onum = Column(String(200, collation='utf8_general_ci'), comment='标签序号') clas_onum = Column(String(200, collation='utf8_general_ci'), comment='标签序号')
clas_value = Column(String(200, collation='utf8_general_ci'), comment='标签值') 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='关系值')

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

@ -54,3 +54,12 @@ class SuppleModel(BaseModel):
rec_stat: Optional[str] = None rec_stat: Optional[str] = None
tab_clas: Optional[str] = None tab_clas: Optional[str] = None
columnInfo: Optional[List[ColumnSuppleModel]] = None columnInfo: Optional[List[ColumnSuppleModel]] = None
@as_query
class MetaBusinessRelShipObject(BaseModel):
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True)
ssys_cd: Optional[str]
mdl_name: Optional[str]
tab_eng_name: Optional[str]
type: Optional[str]

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

@ -1,7 +1,7 @@
import json import json
import uuid import uuid
from module_admin.entity.vo.meta_vo import MetaPageObject, MetaColObject, SuppleModel from module_admin.entity.vo.meta_vo import MetaPageObject, MetaColObject, SuppleModel, MetaBusinessRelShipObject
from module_admin.entity.do.meta_do import MetadataSuppInfo, MetadataFldSuppInfo, MetadataSuppInfoVett, \ from module_admin.entity.do.meta_do import MetadataSuppInfo, MetadataFldSuppInfo, MetadataSuppInfoVett, \
MetadataFldSuppInfoVett, MetadataExtractInfo, MetadataFldTabExtractInfo MetadataFldSuppInfoVett, MetadataExtractInfo, MetadataFldTabExtractInfo
from module_admin.dao.meta_dao import MetaDao from module_admin.dao.meta_dao import MetaDao
@ -207,3 +207,285 @@ class MetaService:
column['batchColClas'] = CamelCaseUtil.transform_result(col_list) column['batchColClas'] = CamelCaseUtil.transform_result(col_list)
table['columnList'] = CamelCaseUtil.transform_result(columnList) table['columnList'] = CamelCaseUtil.transform_result(columnList)
return table return table
@classmethod
async def getBusinessRelationShip(cls, result_db: AsyncSession, meta_query: MetaBusinessRelShipObject):
if meta_query.type == 'op':
# 传递关系
currentNodeList = None
if meta_query.type == 'er':
# er关系
currentNodeList = await MetaDao.get_er_relation_by_table(result_db, meta_query.ssys_cd, meta_query.mdl_name,
meta_query.tab_eng_name)
tableList = []
preTableList = []
nextTableList = []
relationList = []
if currentNodeList is not None and len(currentNodeList) > 0:
for currentNode in currentNodeList:
if len(tableList) > 0:
hasATable = False
hasBTable = False
for tab in tableList:
if tab['ssys_cd'] == currentNode['a_ssys_cd'] and tab['mdl_name'] == \
currentNode['a_mdl_name'] and tab['tab_eng_name'] == currentNode['a_tab_eng_name']:
hasATable = True
if tab['ssys_cd'] == currentNode['b_ssys_cd'] and tab['mdl_name'] == \
currentNode['b_mdl_name'] and tab['tab_eng_name'] == currentNode['b_tab_eng_name']:
hasBTable = True
if not hasATable:
tableList.append({"ssys_cd": currentNode['a_ssys_cd'],
"mdl_name": currentNode['a_mdl_name'],
"tab_eng_name": currentNode['a_tab_eng_name']})
if not hasBTable:
tableList.append({"ssys_cd": currentNode['b_ssys_cd'],
"mdl_name": currentNode['b_mdl_name'],
"tab_eng_name": currentNode['b_tab_eng_name']})
else:
tableList.append({"ssys_cd": currentNode['a_ssys_cd'],
"mdl_name": currentNode['a_mdl_name'],
"tab_eng_name": currentNode['a_tab_eng_name']})
tableList.append({"ssys_cd": currentNode['b_ssys_cd'],
"mdl_name": currentNode['b_mdl_name'],
"tab_eng_name": currentNode['b_tab_eng_name']})
if currentNode['a_tab_eng_name'] == meta_query.tab_eng_name:
if currentNode['father'] == 'A':
# b为下游
hasTable = False
for table in nextTableList:
if table['tab_eng_name'] == currentNode['b_tab_eng_name']:
table['column'].append({'ssys_cd': currentNode['b_ssys_cd'],
'mdl_name': currentNode['b_mdl_name'],
'tab_eng_name': currentNode['b_tab_eng_name'],
'fld_eng_name': currentNode['b_fld_eng_name']})
relationList.append({"source": {"ssys_cd": currentNode['a_ssys_cd'],
"mdl_name": currentNode['a_mdl_name'],
"tab_eng_name": currentNode['a_tab_eng_name'],
"fld_eng_name": currentNode['a_fld_eng_name']},
"target": {'ssys_cd': currentNode['b_ssys_cd'],
'mdl_name': currentNode['b_mdl_name'],
'tab_eng_name': currentNode['b_tab_eng_name'],
'fld_eng_name': currentNode['b_fld_eng_name']}})
hasTable = True
break
if not hasTable:
nextTableList.append({'ssys_cd': currentNode['b_ssys_cd'],
'mdl_name': currentNode['b_mdl_name'],
'tab_eng_name': currentNode['b_tab_eng_name'],
'column': [{'ssys_cd': currentNode['b_ssys_cd'],
'mdl_name': currentNode['b_mdl_name'],
'tab_eng_name': currentNode['b_tab_eng_name'],
'fld_eng_name': currentNode['b_fld_eng_name']}]})
relationList.append({"source": {"ssys_cd": currentNode['a_ssys_cd'],
"mdl_name": currentNode['a_mdl_name'],
"tab_eng_name": currentNode['a_tab_eng_name'],
"fld_eng_name": currentNode['a_fld_eng_name']},
"target": {'ssys_cd': currentNode['b_ssys_cd'],
'mdl_name': currentNode['b_mdl_name'],
'tab_eng_name': currentNode['b_tab_eng_name'],
'fld_eng_name': currentNode['b_fld_eng_name']}})
if currentNode['father'] == 'B':
# b为上游
hasTable = False
for table in preTableList:
if table['tab_eng_name'] == currentNode['b_tab_eng_name']:
table['column'].append({'ssys_cd': currentNode['b_ssys_cd'],
'mdl_name': currentNode['b_mdl_name'],
'tab_eng_name': currentNode['b_tab_eng_name'],
'fld_eng_name': currentNode['b_fld_eng_name']})
relationList.append({"source": {'ssys_cd': currentNode['b_ssys_cd'],
'mdl_name': currentNode['b_mdl_name'],
'tab_eng_name': currentNode['b_tab_eng_name'],
'fld_eng_name': currentNode['b_fld_eng_name']},
"target": {"ssys_cd": currentNode['a_ssys_cd'],
"mdl_name": currentNode['a_mdl_name'],
"tab_eng_name": currentNode['a_tab_eng_name'],
"fld_eng_name": currentNode['a_fld_eng_name']}})
hasTable = True
break
if not hasTable:
preTableList.append({'ssys_cd': currentNode['b_ssys_cd'],
'mdl_name': currentNode['b_mdl_name'],
'tab_eng_name': currentNode['b_tab_eng_name'],
'column': [{'ssys_cd': currentNode['b_ssys_cd'],
'mdl_name': currentNode['b_mdl_name'],
'tab_eng_name': currentNode['b_tab_eng_name'],
'fld_eng_name': currentNode['b_fld_eng_name']}]})
relationList.append({"source": {'ssys_cd': currentNode['b_ssys_cd'],
'mdl_name': currentNode['b_mdl_name'],
'tab_eng_name': currentNode['b_tab_eng_name'],
'fld_eng_name': currentNode['b_fld_eng_name']},
"target": {"ssys_cd": currentNode['a_ssys_cd'],
"mdl_name": currentNode['a_mdl_name'],
"tab_eng_name": currentNode['a_tab_eng_name'],
"fld_eng_name": currentNode['a_fld_eng_name']}})
if currentNode['b_tab_eng_name'] == meta_query.tab_eng_name:
if currentNode['father'] == 'A':
# a 为上游
hasTable = False
for table in preTableList:
if table['tab_eng_name'] == currentNode['a_tab_eng_name']:
table['column'].append({'ssys_cd': currentNode['a_ssys_cd'],
'mdl_name': currentNode['a_mdl_name'],
'tab_eng_name': currentNode['a_tab_eng_name'],
'fld_eng_name': currentNode['a_fld_eng_name']})
relationList.append({"source": {"ssys_cd": currentNode['a_ssys_cd'],
"mdl_name": currentNode['a_mdl_name'],
"tab_eng_name": currentNode['a_tab_eng_name'],
"fld_eng_name": currentNode['a_fld_eng_name']},
"target": {'ssys_cd': currentNode['b_ssys_cd'],
'mdl_name': currentNode['b_mdl_name'],
'tab_eng_name': currentNode['b_tab_eng_name'],
'fld_eng_name': currentNode['b_fld_eng_name']}})
hasTable = True
break
if not hasTable:
preTableList.append({'ssys_cd': currentNode['a_ssys_cd'],
'mdl_name': currentNode['a_mdl_name'],
'tab_eng_name': currentNode['a_tab_eng_name'],
'column': [{'ssys_cd': currentNode['a_ssys_cd'],
'mdl_name': currentNode['a_mdl_name'],
'tab_eng_name': currentNode['a_tab_eng_name'],
'fld_eng_name': currentNode['a_fld_eng_name']}]})
relationList.append({"source": {"ssys_cd": currentNode['a_ssys_cd'],
"mdl_name": currentNode['a_mdl_name'],
"tab_eng_name": currentNode['a_tab_eng_name'],
"fld_eng_name": currentNode['a_fld_eng_name']},
"target": {'ssys_cd': currentNode['b_ssys_cd'],
'mdl_name': currentNode['b_mdl_name'],
'tab_eng_name': currentNode['b_tab_eng_name'],
'fld_eng_name': currentNode['b_fld_eng_name']}})
if currentNode['father'] == 'B':
# a 为下游
hasTable = False
for table in nextTableList:
if table['tab_eng_name'] == currentNode['a_tab_eng_name']:
table['column'].append({'ssys_cd': currentNode['a_ssys_cd'],
'mdl_name': currentNode['a_mdl_name'],
'tab_eng_name': currentNode['a_tab_eng_name'],
'fld_eng_name': currentNode['a_fld_eng_name']})
relationList.append({"source": {'ssys_cd': currentNode['b_ssys_cd'],
'mdl_name': currentNode['b_mdl_name'],
'tab_eng_name': currentNode['b_tab_eng_name'],
'fld_eng_name': currentNode['b_fld_eng_name']},
"target": {"ssys_cd": currentNode['a_ssys_cd'],
"mdl_name": currentNode['a_mdl_name'],
"tab_eng_name": currentNode['a_tab_eng_name'],
"fld_eng_name": currentNode['a_fld_eng_name']}})
hasTable = True
break
if not hasTable:
nextTableList.append({'ssys_cd': currentNode['a_ssys_cd'],
'mdl_name': currentNode['a_mdl_name'],
'tab_eng_name': currentNode['a_tab_eng_name'],
'column': [{'ssys_cd': currentNode['a_ssys_cd'],
'mdl_name': currentNode['a_mdl_name'],
'tab_eng_name': currentNode['a_tab_eng_name'],
'fld_eng_name': currentNode['a_fld_eng_name']}]})
relationList.append({"source": {'ssys_cd': currentNode['b_ssys_cd'],
'mdl_name': currentNode['b_mdl_name'],
'tab_eng_name': currentNode['b_tab_eng_name'],
'fld_eng_name': currentNode['b_fld_eng_name']},
"target": {"ssys_cd": currentNode['a_ssys_cd'],
"mdl_name": currentNode['a_mdl_name'],
"tab_eng_name": currentNode['a_tab_eng_name'],
"fld_eng_name": currentNode['a_fld_eng_name']}})
if len(preTableList) > 0:
for preTable in preTableList:
for column in preTable['column']:
firstNodeList = await MetaDao.get_er_relation_by_column(result_db, column, "pre") # 取上游
for node in firstNodeList:
if node['a_fld_eng_name'] == column['fld_eng_name']:
# a为下游,取b上游
existTable = False
for tab in tableList:
if tab['ssys_cd'] == node['b_ssys_cd'] and tab['mdl_name'] == \
node['b_mdl_name'] and tab['tab_eng_name'] == node['b_tab_eng_name']:
existTable = True
if not existTable:
tableList.append({"ssys_cd": node['b_ssys_cd'],
"mdl_name": node['b_mdl_name'],
"tab_eng_name": node['b_tab_eng_name']})
relationList.append({"source": {'ssys_cd': node['b_ssys_cd'],
'mdl_name': node['b_mdl_name'],
'tab_eng_name': node['b_tab_eng_name'],
'fld_eng_name': node['b_fld_eng_name']},
"target": {"ssys_cd": node['a_ssys_cd'],
"mdl_name": node['a_mdl_name'],
"tab_eng_name": node['a_tab_eng_name'],
"fld_eng_name": node['a_fld_eng_name']}})
if node['b_fld_eng_name'] == column['fld_eng_name']:
# b为下游,取a上游
existTable2 = False
for tab in tableList:
if tab['ssys_cd'] == node['a_ssys_cd'] and tab['mdl_name'] == \
node['a_mdl_name'] and tab['tab_eng_name'] == node['a_tab_eng_name']:
existTable2 = True
if not existTable2:
tableList.append({"ssys_cd": node['a_ssys_cd'],
"mdl_name": node['a_mdl_name'],
"tab_eng_name": node['a_tab_eng_name']})
relationList.append({"source": {"ssys_cd": node['a_ssys_cd'],
"mdl_name": node['a_mdl_name'],
"tab_eng_name": node['a_tab_eng_name'],
"fld_eng_name": node['a_fld_eng_name']},
"target": {'ssys_cd': node['b_ssys_cd'],
'mdl_name': node['b_mdl_name'],
'tab_eng_name': node['b_tab_eng_name'],
'fld_eng_name': node['b_fld_eng_name']}})
if len(nextTableList) > 0:
for preTable in preTableList:
for column in preTable['column']:
lastNodeList = await MetaDao.get_er_relation_by_column(result_db, column, "next") # 取下游
for node in lastNodeList:
if node['a_fld_eng_name'] == column['fld_eng_name']:
existTable = False
for tab in tableList:
if tab['ssys_cd'] == node['b_ssys_cd'] and tab['mdl_name'] == \
node['b_mdl_name'] and tab['tab_eng_name'] == node['b_tab_eng_name']:
existTable = True
if not existTable:
tableList.append({"ssys_cd": node['b_ssys_cd'],
"mdl_name": node['b_mdl_name'],
"tab_eng_name": node['b_tab_eng_name']})
relationList.append({"source": {"ssys_cd": node['a_ssys_cd'],
"mdl_name": node['a_mdl_name'],
"tab_eng_name": node['a_tab_eng_name'],
"fld_eng_name": node['a_fld_eng_name']},
"target": {'ssys_cd': node['b_ssys_cd'],
'mdl_name': node['b_mdl_name'],
'tab_eng_name': node['b_tab_eng_name'],
'fld_eng_name': node['b_fld_eng_name']}})
if node['b_fld_eng_name'] == column['fld_eng_name']:
existTable = False
for tab in tableList:
if tab['ssys_cd'] == node['a_ssys_cd'] and tab['mdl_name'] == \
node['a_mdl_name'] and tab['tab_eng_name'] == node['a_tab_eng_name']:
existTable = True
if not existTable:
tableList.append({"ssys_cd": node['a_ssys_cd'],
"mdl_name": node['a_mdl_name'],
"tab_eng_name": node['a_tab_eng_name']})
relationList.append({"source": {'ssys_cd': node['b_ssys_cd'],
'mdl_name': node['b_mdl_name'],
'tab_eng_name': node['b_tab_eng_name'],
'fld_eng_name': node['b_fld_eng_name']},
"target": {"ssys_cd": node['a_ssys_cd'],
"mdl_name": node['a_mdl_name'],
"tab_eng_name": node['a_tab_eng_name'],
"fld_eng_name": node['a_fld_eng_name']}})
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)
result = CamelCaseUtil.transform_result(meta_result)
table['column'] = result
result = {
"tableList": tableList,
"relation": relationList
}
return result
return None

7
vue-fastapi-frontend/src/api/meta/metaInfo.js

@ -47,6 +47,13 @@ export function postMetaSupp(data){
data: data data: data
}) })
} }
export function getMetaDataRelship(data){
return request({
url:'/default-api/dasset/meta/business/relation',
method: 'get',
params: data
})
}

2
vue-fastapi-frontend/src/views/dataAsset/assetDetail/index.vue

@ -301,7 +301,7 @@ const handleDelete = (row) => {
} }
const handleExport = () => { const handleExport = () => {
proxy.download("/system/dataAsset/export", { proxy.download("/default-api/system/dataAsset/export", {
...queryParams.value, ...queryParams.value,
}, `dataAsset_${new Date().getTime()}.xlsx`); }, `dataAsset_${new Date().getTime()}.xlsx`);
} }

691
vue-fastapi-frontend/src/views/meta/metaInfo/businssRelation.vue

@ -0,0 +1,691 @@
<template>
<div id="businessRelationG6" style="width: 100%;height: 100%;overflow: auto;position: relative"></div>
<div id="g6mini-container"></div>
</template>
<script setup>
import G6 from '@antv/g6';
import {watch} from "vue";
const props = defineProps({
data: {
type: Object,
default: () => {}
},
})
const g6data = ref([])
function initG6(){
const {
Util,
registerBehavior,
registerEdge,
registerNode
} = G6;
const isInBBox = (point, bbox) => {
const {
x,
y
} = point;
const {
minX,
minY,
maxX,
maxY
} = bbox;
return x < maxX && x > minX && y > minY && y < maxY;
};
const itemHeight = 20;
registerBehavior("dice-er-scroll", {
getDefaultCfg() {
return {
multiple: true,
};
},
getEvents() {
return {
itemHeight,
wheel: "scorll",
click: "click",
"node:mousemove": "move",
"node:mousedown": "mousedown",
"node:mouseup": "mouseup"
};
},
scorll(e) {
// e.preventDefault();
const {
graph
} = this;
const nodes = graph.getNodes().filter((n) => {
const bbox = n.getBBox();
return isInBBox(graph.getPointByClient(e.clientX, e.clientY), bbox);
});
const x = e.deltaX || e.movementX;
let y = e.deltaY || e.movementY;
if (!y && navigator.userAgent.indexOf('Firefox') > -1) y = (-e.wheelDelta * 125) / 3
if (nodes) {
const edgesToUpdate = new Set();
nodes.forEach((node) => {
return;
const model = node.getModel();
if (model.attrs.length < 2) {
return;
}
const idx = model.startIndex || 0;
let startX = model.startX || 0.5;
let startIndex = idx + y * 0.02;
startX -= x;
if (startIndex < 0) {
startIndex = 0;
}
if (startX > 0) {
startX = 0;
}
if (startIndex > model.attrs.length - 1) {
startIndex = model.attrs.length - 1;
}
graph.updateItem(node, {
startIndex,
startX,
});
node.getEdges().forEach(edge => edgesToUpdate.add(edge))
});
// G6 update the related edges when graph.updateItem with a node according to the new properties
// here you need to update the related edges manualy since the new properties { startIndex, startX } for the nodes are custom, and cannot be recognized by G6
edgesToUpdate.forEach(edge => edge.refresh())
}
},
click(e) {
const {
graph
} = this;
const item = e.item;
const shape = e.shape;
if (!item) {
return;
}
if (shape.get("name") === "collapse") {
graph.updateItem(item, {
collapsed: true,
size: [300, 50],
});
setTimeout(() => graph.layout(), 100);
} else if (shape.get("name") === "expand") {
graph.updateItem(item, {
collapsed: false,
size: [300, 80],
});
setTimeout(() => graph.layout(), 100);
}
},
mousedown(e) {
this.isMousedown = true;
},
mouseup(e) {
this.isMousedown = false;
},
move(e) {
if (this.isMousedown) return;
const name = e.shape.get("name");
const item = e.item;
if (name && name.startsWith("item")) {
this.graph.updateItem(item, {
selectedIndex: Number(name.split("-")[1]),
});
} else {
this.graph.updateItem(item, {
selectedIndex: NaN,
});
}
},
});
registerEdge("dice-er-edge", {
draw(cfg, group) {
const edge = group.cfg.item;
const sourceNode = edge.getSource().getModel();
const targetNode = edge.getTarget().getModel();
const sourceIndex = sourceNode.attrs.findIndex(
(e) => e.key === cfg.sourceKey
);
const sourceStartIndex = sourceNode.startIndex || 0;
let sourceY = 15;
if (!sourceNode.collapsed && sourceIndex > sourceStartIndex - 1) {
sourceY = 30 + (sourceIndex - sourceStartIndex + 0.5) * itemHeight;
sourceY = Math.min(sourceY, 80);
}
const targetIndex = targetNode.attrs.findIndex(
(e) => e.key === cfg.targetKey
);
const targetStartIndex = targetNode.startIndex || 0;
let targetY = 15;
if (!targetNode.collapsed && targetIndex > targetStartIndex - 1) {
targetY = (targetIndex - targetStartIndex + 0.5) * itemHeight + 30;
targetY = Math.min(targetY, 80);
}
const startPoint = {
...cfg.startPoint
};
const endPoint = {
...cfg.endPoint
};
startPoint.y = startPoint.y + sourceY;
endPoint.y = endPoint.y + targetY;
let shape;
if (sourceNode.id !== targetNode.id) {
shape = group.addShape("path", {
attrs: {
stroke: "#5B8FF9",
path: [
["M", startPoint.x, startPoint.y],
[
"C",
endPoint.x / 3 + (2 / 3) * startPoint.x,
startPoint.y,
endPoint.x / 3 + (2 / 3) * startPoint.x,
endPoint.y,
endPoint.x,
endPoint.y,
],
],
endArrow: true,
},
// must be assigned in G6 3.3 and later versions. it can be any string you want, but should be unique in a custom item type
name: "path-shape",
});
} else if (!sourceNode.collapsed) {
let gap = Math.abs((startPoint.y - endPoint.y) / 3);
if (startPoint["index"] === 1) {
gap = -gap;
}
shape = group.addShape("path", {
attrs: {
stroke: "#5B8FF9",
path: [
["M", startPoint.x, startPoint.y],
[
"C",
startPoint.x - gap,
startPoint.y,
startPoint.x - gap,
endPoint.y,
startPoint.x,
endPoint.y,
],
],
endArrow: true,
},
// must be assigned in G6 3.3 and later versions. it can be any string you want, but should be unique in a custom item type
name: "path-shape",
});
}
return shape;
},
afterDraw(cfg, group) {
const labelCfg = cfg.labelCfg || {};
const edge = group.cfg.item;
const sourceNode = edge.getSource().getModel();
const targetNode = edge.getTarget().getModel();
if (sourceNode.collapsed && targetNode.collapsed) {
return;
}
const path = group.find(
(element) => element.get("name") === "path-shape"
);
const labelStyle = Util.getLabelPosition(path, 0.5, 0, 0, true);
const label = group.addShape("text", {
attrs: {
...labelStyle,
text: cfg.label || '',
fill: "#000",
textAlign: "center",
stroke: "#fff",
lineWidth: 1,
},
});
label.rotateAtStart(labelStyle.rotate);
},
});
registerNode("dice-er-box", {
draw(cfg, group) {
const width = 250;
const {
attrs = [],
startIndex = 0,
selectedIndex,
collapsed,
icon,
} = cfg;
const list = attrs;
const itemCount = list.length;
const boxStyle = {
stroke: "#096DD9",
radius: 4,
};
const afterList = list.slice(
Math.floor(startIndex),
Math.floor(startIndex + itemCount - 1)
);
const offsetY = (0.5 - (startIndex % 1)) * itemHeight + 30;
group.addShape("rect", {
attrs: {
fill: boxStyle.stroke,
height: 30,
width,
radius: [boxStyle.radius, boxStyle.radius, 0, 0],
},
draggable: true,
});
let fontLeft = 12;
if (icon && icon.show !== false) {
group.addShape("image", {
attrs: {
x: 8,
y: 8,
height: 16,
width: 16,
...icon,
},
});
fontLeft += 18;
}
group.addShape("text", {
attrs: {
y: 22,
x: fontLeft,
fill: "#fff",
text: cfg.label,
fontSize: 12,
fontWeight: 500,
},
});
group.addShape("rect", {
attrs: {
x: 0,
y: collapsed ? 30 : (list.length ) * itemHeight+15,
height: 15,
width,
fill: "#eee",
radius: [0, 0, boxStyle.radius, boxStyle.radius],
cursor: "pointer",
},
// must be assigned in G6 3.3 and later versions. it can be any string you want, but should be unique in a custom item type
name: collapsed ? "expand" : "collapse",
});
group.addShape("text", {
attrs: {
x: width / 2 - 6,
y: (collapsed ? 30 : (list.length ) * itemHeight+15) + 12,
text: collapsed ? "+" : "-",
width,
fill: "#000",
radius: [0, 0, boxStyle.radius, boxStyle.radius],
cursor: "pointer",
},
// must be assigned in G6 3.3 and later versions. it can be any string you want, but should be unique in a custom item type
name: collapsed ? "expand" : "collapse",
});
const keyshape = group.addShape("rect", {
attrs: {
x: 0,
y: 0,
width,
height: collapsed ? 45 : (list.length ) * itemHeight+15 + 15,
...boxStyle,
},
draggable: true,
});
if (collapsed) {
return keyshape;
}
const listContainer = group.addGroup({});
listContainer.setClip({
type: "rect",
attrs: {
x: -8,
y: 30,
width: width + 16,
height: (list.length ) * itemHeight+15 - 30,
},
});
listContainer.addShape({
type: "rect",
attrs: {
x: 1,
y: 30,
width: width - 2,
height: (list.length ) * itemHeight+15 - 30,
fill: "#fff",
},
draggable: true,
});
if (list.length > itemCount) {
const barStyle = {
width: 4,
padding: 0,
boxStyle: {
stroke: "#00000022",
},
innerStyle: {
fill: "#00000022",
},
};
listContainer.addShape("rect", {
attrs: {
y: 30,
x: width - barStyle.padding - barStyle.width,
width: barStyle.width,
height: (list.length ) * itemHeight- 30,
...barStyle.boxStyle,
},
});
const indexHeight =
afterList.length > itemCount ?
(afterList.length / list.length) * (list.length ) * itemHeight :
10;
listContainer.addShape("rect", {
attrs: {
y: 30 +
barStyle.padding +
(startIndex / list.length) * ( (list.length ) * itemHeight - 30),
x: width - barStyle.padding - barStyle.width,
width: barStyle.width,
height: Math.min( (list.length ) * itemHeight, indexHeight),
...barStyle.innerStyle,
},
});
}
if (afterList) {
afterList.forEach((e, i) => {
const isSelected =
Math.floor(startIndex) + i === Number(selectedIndex);
let {
key = "", type
} = e;
if (type) {
key += " - " + type;
}
const label = key;
listContainer.addShape("rect", {
attrs: {
x: 1,
y: i * itemHeight - itemHeight / 2 + offsetY,
width: width - 4,
height: itemHeight,
radius: 2,
lineWidth: 1,
cursor: "pointer",
},
// must be assigned in G6 3.3 and later versions. it can be any string you want, but should be unique in a custom item type
name: `item-${Math.floor(startIndex) + i}-content`,
draggable: true,
});
if (!cfg.hideDot) {
listContainer.addShape("circle", {
attrs: {
x: 0,
y: i * itemHeight + offsetY,
r: 3,
stroke: boxStyle.stroke,
fill: "white",
radius: 2,
lineWidth: 1,
cursor: "pointer",
},
});
listContainer.addShape("circle", {
attrs: {
x: width,
y: i * itemHeight + offsetY,
r: 3,
stroke: boxStyle.stroke,
fill: "white",
radius: 2,
lineWidth: 1,
cursor: "pointer",
},
});
}
listContainer.addShape("text", {
attrs: {
x: 12,
y: i * itemHeight + offsetY + 6,
text: label,
fontSize: 12,
fill: "#000",
fontFamily: "Avenir,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol",
full: e,
fontWeight: isSelected ? 500 : 100,
cursor: "pointer",
},
// must be assigned in G6 3.3 and later versions. it can be any string you want, but should be unique in a custom item type
name: `item-${Math.floor(startIndex) + i}`,
});
});
}
return keyshape;
},
getAnchorPoints() {
return [
[0, 0],
[1, 0],
];
},
});
const dataTransform = (data) => {
const nodes = [];
const edges = [];
data.map((node) => {
nodes.push({
...node
});
if (node.attrs) {
node.attrs.forEach((attr) => {
if (attr.relation) {
attr.relation.forEach((relation) => {
edges.push({
source: node.id,
target: relation.nodeId,
sourceKey: attr.key,
targetKey: relation.key,
label: relation.label,
});
});
}
});
}
});
return {
nodes,
edges,
};
}
const container = document.getElementById("businessRelationG6");
const mini_container = document.getElementById("g6mini-container");
const width = container.scrollWidth;
const height = ((container.height || 500) - 20);
// minimap
const minimap = new G6.Minimap({
size: [200, 200],
container: mini_container,
type: 'delegate',
});
const graph = new G6.Graph({
container: container,
plugins: [minimap],
width,
height,
defaultNode: {
size: [300, 200],
type: 'dice-er-box',
color: '#5B8FF9',
style: {
fill: '#9EC9FF',
lineWidth: 3,
},
labelCfg: {
style: {
fill: 'black',
fontSize: 20,
},
},
},
defaultEdge: {
type: 'dice-er-edge',
style: {
stroke: '#e2e2e2',
lineWidth: 4,
endArrow: true,
},
},
modes: {
default: ['dice-er-scroll', 'drag-node', 'drag-canvas', 'zoom-canvas'],
},
layout: {
type: 'dagre',
rankdir: 'LR',
align: 'UL',
controlPoints: true,
nodesep:1,
ranksep:1
},
animate: true,
// fitView: true
})
console.log(g6data.value)
graph.data(dataTransform(g6data.value))
graph.render();
}
watch(
() => props.data,
(val) => {
console.log(props.data)
console.log(val)
g6data.value = []
if (props.data.tableList && props.data.tableList.length>0){
for (let i = 0; i < props.data.tableList.length; i++) {
let table = props.data.tableList[i]
let g6Tab = {
id: table.ssys_cd+"-"+table.mdl_name+"-"+table.tab_eng_name,
label: table.tab_eng_name,
attrs:[],
collapsed:true
}
for (let j = 0; j < table.column.length; j++) {
g6Tab.attrs.push({
key: table.column[j].fldEngName,
type: table.column[j].fldType
})
}
g6data.value.push(g6Tab)
}
if (props.data.relation && props.data.relation.length>0){
for (let i = 0; i < props.data.relation.length; i++) {
let relation = props.data.relation[i]
let key = relation.target.fld_eng_name
let tableKey = relation.source.ssys_cd+"-"+relation.source.mdl_name+"-"+relation.source.tab_eng_name
let nodeId = relation.target.ssys_cd+"-"+relation.target.mdl_name+"-"+relation.target.tab_eng_name
if (g6data.value.length > 0){
for (let j = 0; j < g6data.value.length; j++) {
if (g6data.value[j].id === tableKey){
for (let k = 0; k < g6data.value[j].attrs.length; k++) {
if (g6data.value[j].attrs[k].key === relation.source.fld_eng_name){
if (g6data.value[j].attrs[k].relation && g6data.value[j].attrs[k].relation.length>0){
let hasRelation = false
for (let l = 0; l < g6data.value[j].attrs[k].relation.length; l++) {
if (g6data.value[j].attrs[k].relation[l].key === key && g6data.value[j].attrs[k].relation[l].nodeId === nodeId){
hasRelation = true
}
}
if (!hasRelation){
g6data.value[j].attrs[k].relation.push({
key: key,
nodeId: nodeId
})
}
}else {
g6data.value[j].attrs[k].relation = [{
key: key,
nodeId: nodeId
}]
}
}
}
}
}
}
}
}
let g6 = document.getElementById("businessRelationG6")
if (g6){
g6.innerHTML=''
initG6()
}
}
},
{ deep: true,immediate: true }
)
</script>
<style scoped lang="scss">
#g6mini-container{
position: absolute !important;
right: 20px;
bottom: 20px;
border: 1px solid #e2e2e2;
border-radius: 4px;
background-color: rgba(255, 255, 255, 0.9);
z-index: 10;
}
</style>

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

@ -308,7 +308,23 @@
</el-table> </el-table>
</div> </div>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="业务关系" name="businessRelation">业务关系</el-tab-pane> <el-tab-pane label="业务关系" name="businessRelation">
<div v-if="activeColumnTab=== 'businessRelation'" style="height: calc(100vh - 395px);">
<div style="position: absolute;top:10px;left: 10px;z-index: 10">
<el-form>
<el-form-item label="关系选择:">
<el-select v-model="businessOptionSelect" style="width: 120px">
<el-option value="op" label="传递关系"></el-option>
<el-option value="er" label="ER关系"></el-option>
</el-select>
</el-form-item>
</el-form>
</div>
<div style="width: 100%;height: 100%">
<businss-relation :data="businessRelation"></businss-relation>
</div>
</div>
</el-tab-pane>
<el-tab-pane label="血缘关系" name="bloodRelation">血缘关系</el-tab-pane> <el-tab-pane label="血缘关系" name="bloodRelation">血缘关系</el-tab-pane>
<el-tab-pane label="存储过程" name="proc"> <el-tab-pane label="存储过程" name="proc">
<SQLCodeMirror v-if="activeColumnTab === 'proc'" :data="procStr"></SQLCodeMirror> <SQLCodeMirror v-if="activeColumnTab === 'proc'" :data="procStr"></SQLCodeMirror>
@ -540,10 +556,11 @@
</template> </template>
<script setup name="Meta"> <script setup name="Meta">
import {getDataSourceList, getMetaDataList, getColumnList, getMetaClasList, postMetaSupp} from "@/api/meta/metaInfo" import {getDataSourceList, getMetaDataList, getColumnList, getMetaClasList, postMetaSupp, getMetaDataRelship} from "@/api/meta/metaInfo"
import { ref, nextTick, computed, watch, reactive, onMounted } from 'vue' import { ref, nextTick, computed, watch, reactive, onMounted } from 'vue'
import SQLCodeMirror from "@/components/codemirror/SQLCodeMirror.vue"; import SQLCodeMirror from "@/components/codemirror/SQLCodeMirror.vue";
import cache from "@/plugins/cache"; import cache from "@/plugins/cache";
import BusinssRelation from "./businssRelation.vue";
const data = reactive({ const data = reactive({
queryParams:{ queryParams:{
@ -605,14 +622,29 @@
const database = ref(""); const database = ref("");
const procStr = ref(""); const procStr = ref("");
const activeColumnTab = ref("column"); const activeColumnTab = ref("column");
const businessOptionSelect = ref("er");
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const changedColumns = ref([]) const changedColumns = ref([])
const businessRelation = ref([])
function changeColumnTab(){ function changeColumnTab(){
if (activeColumnTab.value === 'businessRelation'){
let data = {
ssysCd: currentMetaData.value.ssysCd,
mdlName: currentMetaData.value.mdlName,
tabEngName: currentMetaData.value.tabEngName,
type: businessOptionSelect.value
}
getMetaDataRelship(data).then(res=>{
console.log(res)
businessRelation.value = res.data
})
}
if (activeColumnTab.value === 'proc'){ if (activeColumnTab.value === 'proc'){
procStr.value = "--基金量化产品监管报送存储过程:ADS.SP_ADS_SAC_QNTPRD_ALL\n" + procStr.value = "--基金量化产品监管报送存储过程:ADS.SP_ADS_SAC_QNTPRD_ALL\n" +
"CREATE OR REPLACE PROCEDURE ADS.SP_ADS_SAC_QNTPRD_ALL(I_BUSI_DATE VARCHAR2, O_RET_CODE OUT NUMBER, O_RET_MSG OUT VARCHAR2) AS V_STATUS NUMBER DEFAULT 0; --状态,0:成功,-1失败 \n V_ETL_NAME VARCHAR2(50) DEFAULT 'ADS.SP_ADS_SAC_QNTPRD_ALL'; V_ETL_NAME_CN VARCHAR2(100) DEFAULT '量化产品监管报送报表总调度'; ----ETL中文名称 V_ETL_TYPE NUMBER DEFAULT 1; --ETL类型,0:采集,1:转换 V_START_TIME DATE DEFAULT SYSDATE; --开始时间 V_MSG VARCHAR2(1000) DEFAULT '成功'; ----ETL信息 V_SOURCE_TABLE VARCHAR2(200) DEFAULT 'ADS.SP_ADS_SAC_QNTPRD_DTL,ADS.SP_ADS_SAC_QNTPRD_AGGR'; V_DEST_TABLE VARCHAR2(200) DEFAULT 'ADS.T_ADS_SAC_QNTPRD_DTL_M_M_OC,ADS.T_ADS_SAC_QNTPRD_AGGR_M_M_OC'; V_SRC_CNT NUMBER DEFAULT 0; --源数据量 V_DEST_CNT NUMBER DEFAULT 0; --目标新增数据量 V_CNT NUMBER; V_SOURCE_CODE VARCHAR2(4) ; V_DATE DATE DEFAULT TO_DATE(I_BUSI_DATE,'YYYY-MM-DD'); --每月第一个交易日 V_RET_CODE NUMBER; V_RET_MSG VARCHAR2(4000); BEGIN O_RET_CODE := 0; O_RET_MSG := 'SUCCESS'; --每个月第一个交易日更新数据 SELECT T.TM_SH_FST_TRDY_FLAG INTO V_CNT FROM DWS.T_DWS_DIM_DATE_OC T WHERE T.D_DATE= V_DATE; IF V_CNT = 0 THEN RETURN; END IF; --加载明细表数据 ADS.SP_ADS_SAC_QNTPRD_DTL (I_BUSI_DATE => I_BUSI_DATE, --每月第一个交易日 O_RET_CODE => V_RET_CODE, O_RET_MSG => V_RET_MSG ) ; IF V_RET_CODE <> 0 THEN O_RET_CODE := V_RET_CODE; O_RET_MSG := V_RET_MSG; RETURN; END IF; --加载汇总表数据 ADS.SP_ADS_SAC_QNTPRD_AGGR(I_BUSI_DATE => I_BUSI_DATE, --每月第一个交易日 O_RET_CODE => V_RET_CODE, O_RET_MSG => V_RET_MSG ) ; IF V_RET_CODE <> 0 THEN O_RET_CODE := V_RET_CODE; O_RET_MSG := V_RET_MSG; RETURN; END IF; --日志:判断是否源表目标表的数量是否相同,如不相同则修改日志校验MSG --日志:写日志 DWS.SP_DWT_LOG(I_ETL_NAME => V_ETL_NAME, I_ETL_NAME_CN => V_ETL_NAME_CN, I_ETL_TYPE => V_ETL_TYPE, I_START_TIME => V_START_TIME, I_END_TIME => SYSDATE, I_STATUS => V_STATUS, I_MSG => V_MSG, I_SOURCE_TABLES => V_SOURCE_TABLE, I_DEST_TABLES => V_DEST_TABLE, I_SRC_CNT => V_SRC_CNT, I_DEST_CNT => V_DEST_CNT, I_VERI_SRC_CNT => NULL, I_VERI_DEST_CNT => NULL, I_VERI_MSG => NULL, I_VERI_STATUS => NULL, I_BUSI_DATE => I_BUSI_DATE); EXCEPTION WHEN OTHERS THEN O_RET_CODE := -1; O_RET_MSG := SQLCODE || ',' || SQLERRM; ROLLBACK; V_STATUS := -1; V_MSG := O_RET_MSG; DWS.SP_DWT_LOG(I_ETL_NAME => V_ETL_NAME, I_ETL_NAME_CN => V_ETL_NAME_CN, I_ETL_TYPE => V_ETL_TYPE, I_START_TIME => V_START_TIME, I_END_TIME => SYSDATE, I_STATUS => V_STATUS, I_MSG => V_MSG, I_SOURCE_TABLES => V_SOURCE_TABLE, I_DEST_TABLES => V_DEST_TABLE, I_SRC_CNT => V_SRC_CNT, I_DEST_CNT => V_DEST_CNT, I_VERI_SRC_CNT => NULL, I_VERI_DEST_CNT => NULL, I_VERI_MSG => NULL, I_VERI_STATUS => NULL, I_BUSI_DATE => I_BUSI_DATE); END;" "CREATE OR REPLACE PROCEDURE ADS.SP_ADS_SAC_QNTPRD_ALL(I_BUSI_DATE VARCHAR2, O_RET_CODE OUT NUMBER, O_RET_MSG OUT VARCHAR2) AS V_STATUS NUMBER DEFAULT 0; --状态,0:成功,-1失败 \n V_ETL_NAME VARCHAR2(50) DEFAULT 'ADS.SP_ADS_SAC_QNTPRD_ALL'; V_ETL_NAME_CN VARCHAR2(100) DEFAULT '量化产品监管报送报表总调度'; ----ETL中文名称 V_ETL_TYPE NUMBER DEFAULT 1; --ETL类型,0:采集,1:转换 V_START_TIME DATE DEFAULT SYSDATE; --开始时间 V_MSG VARCHAR2(1000) DEFAULT '成功'; ----ETL信息 V_SOURCE_TABLE VARCHAR2(200) DEFAULT 'ADS.SP_ADS_SAC_QNTPRD_DTL,ADS.SP_ADS_SAC_QNTPRD_AGGR'; V_DEST_TABLE VARCHAR2(200) DEFAULT 'ADS.T_ADS_SAC_QNTPRD_DTL_M_M_OC,ADS.T_ADS_SAC_QNTPRD_AGGR_M_M_OC'; V_SRC_CNT NUMBER DEFAULT 0; --源数据量 V_DEST_CNT NUMBER DEFAULT 0; --目标新增数据量 V_CNT NUMBER; V_SOURCE_CODE VARCHAR2(4) ; V_DATE DATE DEFAULT TO_DATE(I_BUSI_DATE,'YYYY-MM-DD'); --每月第一个交易日 V_RET_CODE NUMBER; V_RET_MSG VARCHAR2(4000); BEGIN O_RET_CODE := 0; O_RET_MSG := 'SUCCESS'; --每个月第一个交易日更新数据 SELECT T.TM_SH_FST_TRDY_FLAG INTO V_CNT FROM DWS.T_DWS_DIM_DATE_OC T WHERE T.D_DATE= V_DATE; IF V_CNT = 0 THEN RETURN; END IF; --加载明细表数据 ADS.SP_ADS_SAC_QNTPRD_DTL (I_BUSI_DATE => I_BUSI_DATE, --每月第一个交易日 O_RET_CODE => V_RET_CODE, O_RET_MSG => V_RET_MSG ) ; IF V_RET_CODE <> 0 THEN O_RET_CODE := V_RET_CODE; O_RET_MSG := V_RET_MSG; RETURN; END IF; --加载汇总表数据 ADS.SP_ADS_SAC_QNTPRD_AGGR(I_BUSI_DATE => I_BUSI_DATE, --每月第一个交易日 O_RET_CODE => V_RET_CODE, O_RET_MSG => V_RET_MSG ) ; IF V_RET_CODE <> 0 THEN O_RET_CODE := V_RET_CODE; O_RET_MSG := V_RET_MSG; RETURN; END IF; --日志:判断是否源表目标表的数量是否相同,如不相同则修改日志校验MSG --日志:写日志 DWS.SP_DWT_LOG(I_ETL_NAME => V_ETL_NAME, I_ETL_NAME_CN => V_ETL_NAME_CN, I_ETL_TYPE => V_ETL_TYPE, I_START_TIME => V_START_TIME, I_END_TIME => SYSDATE, I_STATUS => V_STATUS, I_MSG => V_MSG, I_SOURCE_TABLES => V_SOURCE_TABLE, I_DEST_TABLES => V_DEST_TABLE, I_SRC_CNT => V_SRC_CNT, I_DEST_CNT => V_DEST_CNT, I_VERI_SRC_CNT => NULL, I_VERI_DEST_CNT => NULL, I_VERI_MSG => NULL, I_VERI_STATUS => NULL, I_BUSI_DATE => I_BUSI_DATE); EXCEPTION WHEN OTHERS THEN O_RET_CODE := -1; O_RET_MSG := SQLCODE || ',' || SQLERRM; ROLLBACK; V_STATUS := -1; V_MSG := O_RET_MSG; DWS.SP_DWT_LOG(I_ETL_NAME => V_ETL_NAME, I_ETL_NAME_CN => V_ETL_NAME_CN, I_ETL_TYPE => V_ETL_TYPE, I_START_TIME => V_START_TIME, I_END_TIME => SYSDATE, I_STATUS => V_STATUS, I_MSG => V_MSG, I_SOURCE_TABLES => V_SOURCE_TABLE, I_DEST_TABLES => V_DEST_TABLE, I_SRC_CNT => V_SRC_CNT, I_DEST_CNT => V_DEST_CNT, I_VERI_SRC_CNT => NULL, I_VERI_DEST_CNT => NULL, I_VERI_MSG => NULL, I_VERI_STATUS => NULL, I_BUSI_DATE => I_BUSI_DATE); END;"
} }
} }
function confirmTableTags(){ function confirmTableTags(){
currentMetaData.value.tags = JSON.parse(JSON.stringify(tableTags.value)) currentMetaData.value.tags = JSON.parse(JSON.stringify(tableTags.value))

Loading…
Cancel
Save