Browse Source

字典图谱

master
siyaqi 4 weeks ago
parent
commit
9827e6f506
  1. 25
      vue-fastapi-backend/module_admin/controller/datastd_controller.py
  2. 50
      vue-fastapi-backend/module_admin/service/datastd_service.py
  3. 13
      vue-fastapi-frontend/src/api/datastd/std.js
  4. 4
      vue-fastapi-frontend/src/views/datastd/main/index.vue
  5. 2
      vue-fastapi-frontend/src/views/datastd/main/stdMap.vue
  6. 26
      vue-fastapi-frontend/src/views/datastd/stddict/index.vue
  7. 228
      vue-fastapi-frontend/src/views/datastd/stddict/stdMap.vue

25
vue-fastapi-backend/module_admin/controller/datastd_controller.py

@ -79,7 +79,18 @@ async def get_std_code_map_list2(
is_page=True) is_page=True)
return ResponseUtil.success(model_content=code_page_query_result) 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, @datastdController.get('/stdcode/code/listappr', response_model=PageResponseModel,
dependencies=[Depends(CheckUserInterfaceAuth('datastd:stddict:dict:list'))] 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) code_page_query_result = await DataStdService.get_code_map_list2(request,query_db, id)
logger.info('获取列配置列表成功') logger.info('获取列配置列表成功')
return ResponseUtil.success(data=code_page_query_result) 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'))]) @datastdController.post('/stdMain/importTemplate', dependencies=[Depends(CheckUserInterfaceAuth('system:user:import'))])
async def export_std_main_template(request: Request, query_db: AsyncSession = Depends(get_db)): async def export_std_main_template(request: Request, query_db: AsyncSession = Depends(get_db)):

50
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) col_list_result = await DataStdDao.get_std_main_map_list(query_db, query_object, is_page)
return col_list_result return col_list_result
@classmethod @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): async def get_std_code_by_id_services(cls, query_db: AsyncSession, id: str):
""" """
获取列配置详细信息service 获取列配置详细信息service
@ -1630,8 +1644,8 @@ class DataStdService:
for meta in meta_list: for meta in meta_list:
meta_node = { meta_node = {
"id": f"meta_{meta.onum}", "id": f"meta_{meta.onum}",
"name": meta.fld_desc, "name": meta.fld_eng_name,
"label": meta.fld_eng_name+""+meta.tab_eng_name+"", "label": meta.mdl_name+""+meta.tab_eng_name+"",
"rate": 1.0, "rate": 1.0,
"status": "Y", "status": "Y",
"variableValue": "元数据", "variableValue": "元数据",
@ -1647,8 +1661,8 @@ class DataStdService:
for meta in meta_list: for meta in meta_list:
meta_node = { meta_node = {
"id": f"meta_{meta.onum}", "id": f"meta_{meta.onum}",
"name": meta.fld_desc, "name": meta.fld_eng_name,
"label": meta.fld_eng_name+""+meta.tab_eng_name+"", "label": meta.mdl_name+""+meta.tab_eng_name+"",
"rate": 1.0, "rate": 1.0,
"status": "Y", "status": "Y",
"variableValue": "元数据", "variableValue": "元数据",
@ -1660,7 +1674,35 @@ class DataStdService:
"tableData": table_data, "tableData": table_data,
"children": children "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 @staticmethod
async def get_main_import_template_services(): 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 params: query
}) })
} }
export function listDictMap(query) {
return request({
url: '/default-api/datastd/stdcode/code/maplistDict',
method: 'get',
params: query
})
}
// 查询标准代码项列表 // 查询标准代码项列表
export function listStdCodeItem(query) { export function listStdCodeItem(query) {
return request({ return request({
@ -79,6 +86,12 @@ export function getStdMap(rowId) {
method: 'get' method: 'get'
}) })
} }
export function getDictMap(rowId) {
return request({
url: '/default-api/datastd/stdcode/code/mapdictlist/' + parseStrEmpty(rowId),
method: 'get'
})
}
// 新增标准代码 // 新增标准代码
export function addStdCode(data) { export function addStdCode(data) {
return request({ 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="dataStdBusiOwnershipPrsn" width="150"></el-table-column>
<el-table-column label="技术认责部门" prop="dataStdItOwnershipDept" 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="技术认责人员" prop="dataStdItOwnershipPrsn" width="150"></el-table-column>
<el-table-column label="引用字典" align="center" > <el-table-column label="标准引用" align="center" >
<template #default="scope"> <template #default="scope">
<el-link <el-link
@ -318,7 +318,7 @@
@click="handleMapCodeClick(scope.row)" @click="handleMapCodeClick(scope.row)"
style="cursor: pointer" style="cursor: pointer"
> >
<span >引用字典</span> <span >标准引用</span>
</el-link> </el-link>
</template> </template>
</el-table-column> </el-table-column>

2
vue-fastapi-frontend/src/views/datastd/main/stdMap.vue

@ -174,7 +174,7 @@ const mockData = ref({
label: "", label: "",
rate: 1.0, rate: 1.0,
status: "G", status: "G",
variableValue: "代码", variableValue: "数据标准",
variableUp: true, variableUp: true,
children:[] children:[]

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

@ -182,6 +182,19 @@
/> />
</template> </template>
</el-table-column> </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 <el-table-column
label="业务认责部门" label="业务认责部门"
width="120" width="120"
@ -292,6 +305,11 @@
v-model:visible="stdVisible" v-model:visible="stdVisible"
@refresh="getList" @refresh="getList"
/> />
<el-dialog v-model="mapVisible" width="1200px">
<!-- 引入第三个页面组件 -->
<std-map ref="showMapCodeDialog" v-if="mapVisible" :codeId="codeMapId"/>
</el-dialog>
</div> </div>
</template> </template>
@ -315,6 +333,7 @@ const { std_code_status, std_code_appr } = proxy.useDict(
"std_code_appr" "std_code_appr"
); );
import { getToken } from "@/utils/auth"; import { getToken } from "@/utils/auth";
import stdMap from './stdMap'; //
const upload = reactive({ const upload = reactive({
// //
@ -343,6 +362,8 @@ const queryParams = ref({
const queryStd = ref({ const queryStd = ref({
dataStdNo: "", dataStdNo: "",
}); });
const codeMapId = ref(null);
const single = ref(true); const single = ref(true);
const multiple = ref(true); const multiple = ref(true);
const dbResoursName = ref(undefined); const dbResoursName = ref(undefined);
@ -433,6 +454,7 @@ const getStdMainSelect = async () => {
stdList.value = response.data; stdList.value = response.data;
}; };
const mapVisible = ref(false);
const handleQuery = () => { const handleQuery = () => {
queryParams.value.pageNum = 1; queryParams.value.pageNum = 1;
@ -451,7 +473,11 @@ const resetQuery = () => {
}; };
getList(); getList();
}; };
const handleMapCodeClick = (row) => {
codeMapId.value=row.onum
mapVisible.value = true;
};
const handleRemove = (row) => { const handleRemove = (row) => {
const idsToDelete = row.onum ? [row.onum] : ids.value; const idsToDelete = row.onum ? [row.onum] : ids.value;
const codesToDelete = row.cdNo ? [row.cdNo] : cdNos.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