Browse Source

Merge remote-tracking branch 'origin/master'

master
xueyinfei 4 weeks ago
parent
commit
c412a36cef
  1. 27
      vue-fastapi-backend/module_admin/controller/datastd_controller.py
  2. 14
      vue-fastapi-backend/module_admin/dao/datastd_dao.py
  3. 172
      vue-fastapi-backend/module_admin/service/datastd_service.py
  4. 13
      vue-fastapi-frontend/src/api/datastd/std.js
  5. 4
      vue-fastapi-frontend/src/views/datastd/main/index.vue
  6. 2
      vue-fastapi-frontend/src/views/datastd/main/stdMap.vue
  7. 26
      vue-fastapi-frontend/src/views/datastd/stddict/index.vue
  8. 228
      vue-fastapi-frontend/src/views/datastd/stddict/stdMap.vue

27
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'))]
)
@ -801,7 +812,19 @@ 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)
@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)
# -----------------------------------------------------导入----------------------------------------------------------------------

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

@ -11,7 +11,7 @@ from module_admin.entity.vo.data_ast_content_vo import DataCatalogPageQueryModel
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:
@ -486,6 +486,18 @@ class DataStdDao:
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])

172
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:
"""
数据源标准服务层
@ -120,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
@ -1551,41 +1567,141 @@ 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_eng_name,
"label": meta.mdl_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_eng_name,
"label": meta.mdl_name+""+meta.tab_eng_name+"",
"rate": 1.0,
"status": "Y",
"variableValue": "元数据",
"variableUp": False,
}
children.append(meta_node)
return {
"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():

13
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({

4
vue-fastapi-frontend/src/views/datastd/main/index.vue

@ -309,7 +309,7 @@
<el-table-column label="业务认责人员" prop="dataStdBusiOwnershipPrsn" width="150"></el-table-column>
<el-table-column label="技术认责部门" prop="dataStdItOwnershipDept" width="150"></el-table-column>
<el-table-column label="技术认责人员" prop="dataStdItOwnershipPrsn" width="150"></el-table-column>
<el-table-column label="引用字典" align="center" >
<el-table-column label="标准引用" align="center" >
<template #default="scope">
<el-link
@ -318,7 +318,7 @@
@click="handleMapCodeClick(scope.row)"
style="cursor: pointer"
>
<span >引用字典</span>
<span >标准引用</span>
</el-link>
</template>
</el-table-column>

2
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:[]

26
vue-fastapi-frontend/src/views/datastd/stddict/index.vue

@ -182,6 +182,19 @@
/>
</template>
</el-table-column>
<el-table-column label="字典引用" align="center" >
<template #default="scope">
<el-link
type="primary"
:underline="true"
@click="handleMapCodeClick(scope.row)"
style="cursor: pointer"
>
<span >字典引用</span>
</el-link>
</template>
</el-table-column>
<el-table-column
label="业务认责部门"
width="120"
@ -292,6 +305,11 @@
v-model:visible="stdVisible"
@refresh="getList"
/>
<el-dialog v-model="mapVisible" width="1200px">
<!-- 引入第三个页面组件 -->
<std-map ref="showMapCodeDialog" v-if="mapVisible" :codeId="codeMapId"/>
</el-dialog>
</div>
</template>
@ -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;

228
vue-fastapi-frontend/src/views/datastd/stddict/stdMap.vue

@ -0,0 +1,228 @@
<template>
<el-tabs v-model="activeName" style="margin-top: 8px">
<el-tab-pane label="图谱" name="1">
<treeNodeg6 ref="treeGraph" :mockData="mockData" />
</el-tab-pane>
<el-tab-pane label="表格" name="2">
<el-form :model="form" ref="formRef" label-width="120px" >
<div class="form-container">
<el-row :gutter="20">
<!-- 代码归属 -->
<el-col :span="8">
<span class="info-text" >
字典系统:{{ getSrcSysName(form.srcSys) }}
</span>
</el-col>
<!-- 代码编号 -->
<el-col :span="8">
<span class="info-text">字典英文名称: {{ form.dataDictEngName || '暂无字典英文名称' }}</span>
</el-col>
<!-- 代码名称 -->
<el-col :span="8">
<span class="info-text">字典中文名称: {{ form.dataDictCnName || '暂无字典中文名称' }}</span>
</el-col>
</el-row>
</div>
</el-form>
<!-- 表格展示 -->
<el-table
v-loading="loading"
:data="tableData"
@selection-change="handleSelectionChange"
border
style="width: 100%"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="字典编号" prop="dataStdNo" align="center" />
<el-table-column label="字典英文名称" prop="dataDictEngName" align="center" />
<el-table-column label="字典中文名称" prop="dataDictCnName" align="center" />
<el-table-column label="字典编号" prop="dataDictNo" align="center" />
<el-table-column label="字典英文名称" prop="dataDictEngName" align="center" />
<el-table-column label="字典中文名称" prop="dataDictCnName" align="center" />
</el-table>
</el-tab-pane>
</el-tabs>
</template>
<script setup>
import { ref, reactive, onMounted, toRefs } from 'vue';
import { listDictMap,getDictMap,getStdDict} from "@/api/datastd/std"; //
import treeNodeg6 from "../stdcode/treeNodeg6.vue";
const { proxy } = getCurrentInstance();
const { std_code_status } = proxy.useDict("std_code_status");
import useUserStore from '@/store/modules/user'; //
const userStore = useUserStore(); //
const dsSysList = userStore.dsSysList; // 访
const props = defineProps({
codeId: {
type: Object,
required: false
},
});
const getSrcSysName = (id) => {
const match = dsSysList.find(item => item.id === id);
return match ? match.name : id;
};
const queryParams = ref({
cdNo: '',
onum: props.codeId,
cdValCnMean: '',
cdType: '',
sysName: '',
sysId: '',
pageNum: 1,
pageSize: 100
});
const form = ref({
id: "",
cdNo: '',
cdValCnMean: '',
cdType: 'company',
cdValStat: '',
sysName: '',
classId: 'code',
codeMapId: '',
codeMapName: '',
codeMapNum: '',
});
const activeName = ref("1"); //
const tableData = ref([]);
const selections = ref([]);
const loading = ref(false);
const showSys = ref(false);
const multiple = ref(false);
//
if (props.codeId) {
form.value = { ...props.rowData };
if (form.value.cdType == "sys") {
showSys.value = true;
} else {
showSys.value = false;
}
}
//
const getList = async () => {
loading.value = true;
console.log(queryParams.value,"queryParams.value")
const response = await listDictMap(queryParams.value);
tableData.value = response.rows.map(item => ({ ...item}));
loading.value = false;
};
const handleCodeClick = (row) => {
console.log('点击了字典代码名称', row);
};
const handleSelectionChange = (selection) => {
multiple.value = selection.length > 0;
selections.value = selection; //
console.log(selections.value,"子页面选中")
};
//
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
defineExpose({
selections
});
const treeGraph = ref(null);
const mockData = ref({
id: "g1",
name: "",
count: 123456,
label: "",
rate: 1.0,
status: "G",
variableValue: "代码",
variableUp: true,
children:[]
});
onMounted(() => {
nextTick(() => {
getStdDict(props.codeId).then(response => {
form.value = response.data;
mockData.value.variableValue="数据字典"
mockData.value.name=form.value.dataDictCnName
mockData.value.label=form.value.dataDictEngName
getDictMap(form.value.onum).then(response => {
mockData.value.children = response.data.children;
tableData.value = response.data.tableData;
if (treeGraph.value) {
treeGraph.value.refreshGraph();
}
});
getList();
});
});
});
</script>
<style scoped>
.app-container {
padding: 20px;
}
.query-form-container {
margin-bottom: 20px;
}
.el-table .el-input {
width: 100%;
}
.form-container {
margin-bottom: 20px;
}
.info-text {
font-size: 18px; /* 调整字体大小 */
line-height: 1.6; /* 行高,使文字更易于阅读 */
color: #333; /* 字体颜色 */
font-weight: 500; /* 设置字体加粗 */
display: inline-block;
width: 100%;
}
</style>
Loading…
Cancel
Save