From 48baf0ee1c07c528ae33f01d0a791e2be8287a18 Mon Sep 17 00:00:00 2001 From: "si@aidatagov.com" Date: Tue, 12 Aug 2025 02:14:39 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=A0=87=E5=87=86?= =?UTF-8?q?=E5=9B=BE=E8=B0=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/datastd_controller.py | 2 +- .../module_admin/dao/datastd_dao.py | 14 +- .../module_admin/service/datastd_service.py | 132 ++++++++++++++---- 3 files changed, 117 insertions(+), 31 deletions(-) diff --git a/vue-fastapi-backend/module_admin/controller/datastd_controller.py b/vue-fastapi-backend/module_admin/controller/datastd_controller.py index 5f46ec4..52dd0d8 100644 --- a/vue-fastapi-backend/module_admin/controller/datastd_controller.py +++ b/vue-fastapi-backend/module_admin/controller/datastd_controller.py @@ -801,7 +801,7 @@ async def get_code_map_list2( id: str, query_db: AsyncSession = Depends(get_db), ): - code_page_query_result = await DataStdService.get_code_map_list2(query_db, id) + code_page_query_result = await DataStdService.get_code_map_list2(request,query_db, id) logger.info('获取列配置列表成功') return ResponseUtil.success(data=code_page_query_result) # -----------------------------------------------------导入---------------------------------------------------------------------- diff --git a/vue-fastapi-backend/module_admin/dao/datastd_dao.py b/vue-fastapi-backend/module_admin/dao/datastd_dao.py index 914812e..ff2ee7c 100644 --- a/vue-fastapi-backend/module_admin/dao/datastd_dao.py +++ b/vue-fastapi-backend/module_admin/dao/datastd_dao.py @@ -9,7 +9,7 @@ from sqlalchemy.orm import aliased from module_admin.entity.vo.data_ast_content_vo import DataCatalogPageQueryModel, DeleteDataCatalogModel,DataCatalogChild from datetime import datetime from module_admin.entity.do.approval_do import FlowApproval, FlowConfig - +from module_admin.entity.do.meta_do import MetadataFldSuppInfo class DataStdDao: @@ -470,6 +470,18 @@ class DataStdDao: ).scalars().all() return List @classmethod + async def get_meta_field_list_by_onum(cls, db: AsyncSession, onum: str): + + List = ( + await db.execute( + select(MetadataFldSuppInfo) + .where( + MetadataFldSuppInfo.data_dict_id == onum if onum else False + ) + ) + ).scalars().all() + return List + @classmethod async def update_std_dict(cls, db: AsyncSession, update_data: DataStdDictModel): await db.execute(update(DataStdDict), [update_data]) diff --git a/vue-fastapi-backend/module_admin/service/datastd_service.py b/vue-fastapi-backend/module_admin/service/datastd_service.py index 288a02b..1bf5d9c 100644 --- a/vue-fastapi-backend/module_admin/service/datastd_service.py +++ b/vue-fastapi-backend/module_admin/service/datastd_service.py @@ -22,6 +22,8 @@ from module_admin.service.config_service import ConfigService import requests import pandas as pd from config.env import AppConfig +from config.enums import RedisInitKeyConfig + class DataStdService: """ 数据源标准服务层 @@ -1551,42 +1553,114 @@ class DataStdService: "tableData": table_data, "children": children } + # @classmethod + # async def get_code_map_list2(cls, request: Request, query_db: AsyncSession, id: str): + + # check_model = DataStdDictModel() + # dataStdNo=await DataStdDao.get_std_main_by_id(query_db, id) + # cd_type=dataStdNo.src_sys + # check_model.data_std_no=dataStdNo.onum + # hasDict = await request.app.state.redis.get(f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.std.dict') + # # 字典 + # main_list = await DataStdDao.get_data_dict_list_by_info(query_db, check_model) + # # 元数据 + # meta_list = await DataStdDao.get_meta_field_list_by_onum(query_db, dataStdNo.onum) + + # if not main_list: + # return { "children": []} # 如果 A 表没有数据,返回空结构 + + # table_data = [] # 存储表格数据 + # children = [] # 存储图谱数据 + + # for main in main_list: + # # 组织图谱数据(A 表作为父节点) + # node = { + # "id": f"node_{main.onum}", # 使用 get() 方法访问字段 + # "name": main.data_dict_cn_name, # 使用 get() 方法访问字段 + # "label": main.data_dict_eng_name, # 使用 get() 方法访问字段 + # "rate": 1.0, + # "status": "B", + # # "currency": main.get('dataStdNo'), # 使用 get() 方法访问字段 + # "variableValue": "数据字典", + # "variableUp": True, + # "children": [], + # } + + + # children.append(node) + + # return { + # "tableData": table_data, + # "children": children + # } @classmethod - async def get_code_map_list2(cls, query_db: AsyncSession, id: str): + async def get_code_map_list2(cls, request: Request, query_db: AsyncSession, id: str): check_model = DataStdDictModel() - dataStdNo=await DataStdDao.get_std_main_by_id(query_db, id) - cd_type=dataStdNo.src_sys - check_model.data_std_no=dataStdNo.onum - main_list = await DataStdDao.get_data_dict_list_by_info(query_db, check_model) - - if not main_list: - return { "children": []} # 如果 A 表没有数据,返回空结构 - + dataStdNo = await DataStdDao.get_std_main_by_id(query_db, id) + cd_type = dataStdNo.src_sys + check_model.data_std_no = dataStdNo.onum + + # Redis 判断是否有字典层 + hasDict = await request.app.state.redis.get(f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.std.dict') + hasDict = hasDict.decode() if isinstance(hasDict, bytes) else hasDict + table_data = [] # 存储表格数据 - children = [] # 存储图谱数据 - - for main in main_list: - # 组织图谱数据(A 表作为父节点) - node = { - "id": f"node_{main.onum}", # 使用 get() 方法访问字段 - "name": main.data_dict_cn_name, # 使用 get() 方法访问字段 - "label": main.data_dict_eng_name, # 使用 get() 方法访问字段 - "rate": 1.0, - "status": "B", - # "currency": main.get('dataStdNo'), # 使用 get() 方法访问字段 - "variableValue": "数据字典", - "variableUp": True, - "children": [], - } - - - children.append(node) - + children = [] # 存储图谱数据 + + if hasDict == "是": + # 获取字典列表 + main_list = await DataStdDao.get_data_dict_list_by_info(query_db, check_model) + if not main_list: + return {"children": []} + + for main in main_list: + dict_node = { + "id": f"dict_{main.onum}", + "name": main.data_dict_cn_name, + "label": main.data_dict_eng_name, + "rate": 1.0, + "status": "B", + "variableValue": "数据字典", + "variableUp": True, + "children": [], + } + + # 获取该字典的元数据列表 + meta_list = await DataStdDao.get_meta_field_list_by_onum(query_db, main.onum) + for meta in meta_list: + meta_node = { + "id": f"meta_{meta.onum}", + "name": meta.fld_desc, + "label": meta.fld_eng_name+"("+meta.tab_eng_name+")", + "rate": 1.0, + "status": "Y", + "variableValue": "元数据", + "variableUp": False, + } + dict_node["children"].append(meta_node) + + children.append(dict_node) + + else: + # 获取标准直接挂载的元数据列表 + meta_list = await DataStdDao.get_meta_field_list_by_onum(query_db, dataStdNo.onum) + for meta in meta_list: + meta_node = { + "id": f"meta_{meta.onum}", + "name": meta.fld_desc, + "label": meta.fld_eng_name+"("+meta.tab_eng_name+")", + "rate": 1.0, + "status": "Y", + "variableValue": "元数据", + "variableUp": False, + } + children.append(meta_node) + return { "tableData": table_data, "children": children } - + @staticmethod async def get_main_import_template_services(): """ From 9827e6f50616f665e6579e23c0afb4e78f08891c Mon Sep 17 00:00:00 2001 From: siyaqi Date: Thu, 14 Aug 2025 18:33:55 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=AD=97=E5=85=B8=E5=9B=BE=E8=B0=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/datastd_controller.py | 25 +- .../module_admin/service/datastd_service.py | 50 +++- vue-fastapi-frontend/src/api/datastd/std.js | 13 + .../src/views/datastd/main/index.vue | 4 +- .../src/views/datastd/main/stdMap.vue | 2 +- .../src/views/datastd/stddict/index.vue | 26 ++ .../src/views/datastd/stddict/stdMap.vue | 228 ++++++++++++++++++ 7 files changed, 340 insertions(+), 8 deletions(-) create mode 100644 vue-fastapi-frontend/src/views/datastd/stddict/stdMap.vue diff --git a/vue-fastapi-backend/module_admin/controller/datastd_controller.py b/vue-fastapi-backend/module_admin/controller/datastd_controller.py index 52dd0d8..c3789d9 100644 --- a/vue-fastapi-backend/module_admin/controller/datastd_controller.py +++ b/vue-fastapi-backend/module_admin/controller/datastd_controller.py @@ -79,7 +79,18 @@ async def get_std_code_map_list2( is_page=True) return ResponseUtil.success(model_content=code_page_query_result) - +@datastdController.get( + '/stdcode/code/maplistDict', response_model=PageResponseModel, + dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdcode:code:list'))] +) +async def get_std_code_map_dict_list( + request: Request, + code_page_query: DataStdCodePageQueryModel = Depends(DataStdCodePageQueryModel.as_query), + query_db: AsyncSession = Depends(get_db), +): + code_page_query_result = await DataStdService.get_std_dict_map_list_services(query_db, code_page_query, + is_page=True) + return ResponseUtil.success(model_content=code_page_query_result) @datastdController.get('/stdcode/code/listappr', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('datastd:stddict:dict:list'))] ) @@ -804,6 +815,18 @@ async def get_code_map_list2( code_page_query_result = await DataStdService.get_code_map_list2(request,query_db, id) logger.info('获取列配置列表成功') return ResponseUtil.success(data=code_page_query_result) +@datastdController.get( + '/stdcode/code/mapdictlist/{id}', response_model=PageResponseModel, + dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdcode:code:list'))] +) +async def get_dict_map_list2( + request: Request, + id: str, + query_db: AsyncSession = Depends(get_db), +): + code_page_query_result = await DataStdService.get_dict_map_list(request,query_db, id) + logger.info('获取列配置列表成功') + return ResponseUtil.success(data=code_page_query_result) # -----------------------------------------------------导入---------------------------------------------------------------------- @datastdController.post('/stdMain/importTemplate', dependencies=[Depends(CheckUserInterfaceAuth('system:user:import'))]) async def export_std_main_template(request: Request, query_db: AsyncSession = Depends(get_db)): diff --git a/vue-fastapi-backend/module_admin/service/datastd_service.py b/vue-fastapi-backend/module_admin/service/datastd_service.py index 1bf5d9c..52b02a0 100644 --- a/vue-fastapi-backend/module_admin/service/datastd_service.py +++ b/vue-fastapi-backend/module_admin/service/datastd_service.py @@ -122,6 +122,20 @@ class DataStdService: col_list_result = await DataStdDao.get_std_main_map_list(query_db, query_object, is_page) return col_list_result @classmethod + async def get_std_dict_map_list_services( + cls, query_db: AsyncSession, query_object: DataStdMainModel, is_page: bool = False + ): + """ + 获取列配置列表信息service + + :param query_db: orm对象 + :param query_object: 查询参数对象 + :param is_page: 是否开启分页 + :return: 列配置列表信息对象 + """ + col_list_result = await DataStdDao.get_std_main_map_list(query_db, query_object, is_page) + return col_list_result + @classmethod async def get_std_code_by_id_services(cls, query_db: AsyncSession, id: str): """ 获取列配置详细信息service @@ -1630,8 +1644,8 @@ class DataStdService: for meta in meta_list: meta_node = { "id": f"meta_{meta.onum}", - "name": meta.fld_desc, - "label": meta.fld_eng_name+"("+meta.tab_eng_name+")", + "name": meta.fld_eng_name, + "label": meta.mdl_name+"("+meta.tab_eng_name+")", "rate": 1.0, "status": "Y", "variableValue": "元数据", @@ -1647,8 +1661,8 @@ class DataStdService: for meta in meta_list: meta_node = { "id": f"meta_{meta.onum}", - "name": meta.fld_desc, - "label": meta.fld_eng_name+"("+meta.tab_eng_name+")", + "name": meta.fld_eng_name, + "label": meta.mdl_name+"("+meta.tab_eng_name+")", "rate": 1.0, "status": "Y", "variableValue": "元数据", @@ -1660,7 +1674,35 @@ class DataStdService: "tableData": table_data, "children": children } + @classmethod + async def get_dict_map_list(cls, request: Request, query_db: AsyncSession, id: str): + """ + 获取字典的引用关系(固定两层:直接返回元数据节点列表) + :param id: 字典 onum + """ + # 获取该字典直接引用的元数据列表 + meta_list = await DataStdDao.get_meta_field_list_by_onum(query_db, id) + if not meta_list: + return {"children": []} + + children = [] + for meta in meta_list: + meta_node = { + "id": f"meta_{meta.onum}", + "name": meta.fld_eng_name, + "label": f"{meta.mdl_name}({meta.tab_eng_name})", + "rate": 1.0, + "status": "Y", + "variableValue": "元数据", + "variableUp": False, + } + children.append(meta_node) + return { + "tableData": [], + "children": children + } + @staticmethod async def get_main_import_template_services(): """ diff --git a/vue-fastapi-frontend/src/api/datastd/std.js b/vue-fastapi-frontend/src/api/datastd/std.js index db72628..ece12d1 100644 --- a/vue-fastapi-frontend/src/api/datastd/std.js +++ b/vue-fastapi-frontend/src/api/datastd/std.js @@ -37,6 +37,13 @@ export function listStdCodemap2(query) { params: query }) } +export function listDictMap(query) { + return request({ + url: '/default-api/datastd/stdcode/code/maplistDict', + method: 'get', + params: query + }) +} // 查询标准代码项列表 export function listStdCodeItem(query) { return request({ @@ -79,6 +86,12 @@ export function getStdMap(rowId) { method: 'get' }) } +export function getDictMap(rowId) { + return request({ + url: '/default-api/datastd/stdcode/code/mapdictlist/' + parseStrEmpty(rowId), + method: 'get' + }) +} // 新增标准代码 export function addStdCode(data) { return request({ diff --git a/vue-fastapi-frontend/src/views/datastd/main/index.vue b/vue-fastapi-frontend/src/views/datastd/main/index.vue index cc84408..6cec359 100644 --- a/vue-fastapi-frontend/src/views/datastd/main/index.vue +++ b/vue-fastapi-frontend/src/views/datastd/main/index.vue @@ -309,7 +309,7 @@ - + diff --git a/vue-fastapi-frontend/src/views/datastd/main/stdMap.vue b/vue-fastapi-frontend/src/views/datastd/main/stdMap.vue index ebba4b8..891fe48 100644 --- a/vue-fastapi-frontend/src/views/datastd/main/stdMap.vue +++ b/vue-fastapi-frontend/src/views/datastd/main/stdMap.vue @@ -174,7 +174,7 @@ const mockData = ref({ label: "", rate: 1.0, status: "G", - variableValue: "代码", + variableValue: "数据标准", variableUp: true, children:[] diff --git a/vue-fastapi-frontend/src/views/datastd/stddict/index.vue b/vue-fastapi-frontend/src/views/datastd/stddict/index.vue index 6de5a23..1c3b9a2 100644 --- a/vue-fastapi-frontend/src/views/datastd/stddict/index.vue +++ b/vue-fastapi-frontend/src/views/datastd/stddict/index.vue @@ -182,6 +182,19 @@ /> + + + + + + + + @@ -315,6 +333,7 @@ const { std_code_status, std_code_appr } = proxy.useDict( "std_code_appr" ); import { getToken } from "@/utils/auth"; +import stdMap from './stdMap'; // 引入第二个页面组件 const upload = reactive({ // 是否显示弹出层(用户导入) @@ -343,6 +362,8 @@ const queryParams = ref({ const queryStd = ref({ dataStdNo: "", }); +const codeMapId = ref(null); + const single = ref(true); const multiple = ref(true); const dbResoursName = ref(undefined); @@ -433,6 +454,7 @@ const getStdMainSelect = async () => { stdList.value = response.data; }; +const mapVisible = ref(false); const handleQuery = () => { queryParams.value.pageNum = 1; @@ -451,7 +473,11 @@ const resetQuery = () => { }; getList(); }; +const handleMapCodeClick = (row) => { + codeMapId.value=row.onum + mapVisible.value = true; +}; const handleRemove = (row) => { const idsToDelete = row.onum ? [row.onum] : ids.value; const codesToDelete = row.cdNo ? [row.cdNo] : cdNos.value; diff --git a/vue-fastapi-frontend/src/views/datastd/stddict/stdMap.vue b/vue-fastapi-frontend/src/views/datastd/stddict/stdMap.vue new file mode 100644 index 0000000..e0cc5a4 --- /dev/null +++ b/vue-fastapi-frontend/src/views/datastd/stddict/stdMap.vue @@ -0,0 +1,228 @@ + + + + + + +