From a61bd8abfb6bedacccbc1f1cdb01e4f433e58fd7 Mon Sep 17 00:00:00 2001 From: wujingjing <gersonwu@qq.com> Date: 星期一, 24 二月 2025 11:32:15 +0800 Subject: [PATCH] start bug;重复导入文件bug --- src/views/project/yw/systemManage/agentGraph/AgentGraph.vue | 353 ++-------------------------------------------------------- 1 files changed, 12 insertions(+), 341 deletions(-) diff --git a/src/views/project/yw/systemManage/agentGraph/AgentGraph.vue b/src/views/project/yw/systemManage/agentGraph/AgentGraph.vue index 7070cf3..b313478 100644 --- a/src/views/project/yw/systemManage/agentGraph/AgentGraph.vue +++ b/src/views/project/yw/systemManage/agentGraph/AgentGraph.vue @@ -1,74 +1,20 @@ <template> - <div v-loading="firstLoading" class="h-full w-full bg-white relative flex flex-col"> - <!-- <div class="toolbar flex-0 border-x-0 border-b border-t-0 border-gray-200 border-solid flex-items-center"> - <span> - 鏍煎紡 - </span> - </div> --> - <div class="graph flex-auto"> - <div class="h-full" ref="graphRef"></div> - - <div - class="absolute left-4 top-4 z-10 w-16 divide-y-[1.5px] divide-solid divide-gray-100 rounded-lg" - style="box-shadow: 0 0 15px #dbdee6" - > - <div - class="flex-column content-center items-center border-x-0 py-2 hover:bg-gray-200 active:bg-gray-300 cursor-pointer" - @click="toolBarItemClick(item)" - v-for="item in toolBarFunList" - > - <span class="ywifont !text-[20px] mb-1 p-1.5" :class="[`ywicon-${item.icon}`]"></span> - <span>{{ item.label }}</span> - </div> - </div> - <div class="absolute right-2 top-4 py-7 px-5 rounded-lg w-96" style="box-shadow: 0 0 15px #dbdee6" v-if="searchIsShow"> - <span - class="absolute ywifont ywicon-guanbi right-4 top-4 cursor-pointer hover:bg-gray-200 active:bg-gray-300" - @click="closeSearch" - ></span> - <div class="flex-column"> - <span class="mb-5">鏌ユ壘</span> - <el-input v-model="searchValue" @input="debounceSearch" placeholder="杈撳叆鏌ユ壘鍐呭" v-elInputFocus></el-input> - </div> - </div> - - <div class="absolute right-2 top-4 py-7 px-5 rounded-lg w-96" style="box-shadow: 0 0 15px #dbdee6" v-if="layoutIsShow"> - <span - class="absolute ywifont ywicon-guanbi right-4 top-4 cursor-pointer hover:bg-gray-200 active:bg-gray-300" - @click="closeLayout" - ></span> - <div class="flex-column"> - <span class="mb-5">甯冨眬</span> - - <el-select v-model="activeLayout" @change="layoutChange"> - <el-option - v-for="item in Object.keys(customLayoutMap)" - :key="item" - :value="parseInt(item)" - :label="customLayoutMap[item]" - ></el-option> - </el-select> - </div> - </div> - </div> + <div class="h-full" v-loading="firstLoading"> + <TreeGraph v-if="graphData" :data="graphData" class="h-full" :maxCount="maxCount" /> </div> </template> <script setup lang="ts"> -import { Graph, GraphOptions, treeToGraphData } from '@antv/g6'; -import { defaultsDeep } from 'lodash'; import { onMounted, ref } from 'vue'; -import { CustomLayout, OrgTreeItem, customLayoutMap, getLayoutType } from './types'; -import { getMetricAgentListByPost, getMetricNameListByPost } from '/@/api/metrics'; +import TreeGraph from '/@/components/graph/treeGraph/TreeGraph.vue'; import router from '/@/router'; -import { DeepPartial } from '/@/utils/types'; -import { deepClone } from '/@/utils/other'; -const graphRef = ref<HTMLDivElement>(null); - -let graph: Graph; -const firstLoading = ref(false); +import { getMetricAgentListByPost, getMetricNameListByPost } from '/@/api/metrics'; +import { OrgTreeItem } from './types'; const agentId = router.currentRoute.value.query.id as string; +const maxCount = ref(null); +const graphData = ref(null); +const firstLoading = ref(false); const convertOrgTreeToTreeNode = (orgTreeData: OrgTreeItem) => { const treeData = { id: orgTreeData.treeId, @@ -78,172 +24,6 @@ }; return treeData; }; -const getLayoutOption = (layoutType: CustomLayout) => { - let option: DeepPartial<GraphOptions> = {}; - switch (layoutType) { - case CustomLayout.Radial: - option = { - // autoFit: 'view', - edge: { - type: 'cubic-radial', - }, - layout: [ - { - radial: true, - direction: 'RL', - }, - ], - }; - break; - case CustomLayout.Vertical: - option = { - edge: { - type: 'line', - }, - layout: [ - { - direction: 'V', - // getHeight: () => { - // return 20; - // }, - // getWidth: () => { - // return 20; - // }, - // 鍨傜洿闂撮殭 - getVGap: () => { - return 40; - }, - // 姘村钩闂撮殭 - getHGap: () => { - return 10; - }, - }, - ], - }; - break; - default: - option = { - edge: { - type: 'line', - }, - layout: [ - { - direction: 'TB', - // 鍨傜洿闂撮殭 - getVGap: () => { - return 60; - }, - // 姘村钩闂撮殭 - getHGap: () => { - return 10; - }, - }, - ], - }; - break; - } - return option; -}; - -const graphRender = async() => { - await graph.render(); - if (activeLayout.value === CustomLayout.Radial) { - selfAdapt(); - } -}; -const rebuildGraph = (extraOption: DeepPartial<GraphOptions>) => { - const finalOptions = defaultsDeep(extraOption, commonOption); - graph.setOptions(finalOptions); - graphRender(); -}; - -let commonOption: GraphOptions; -const initGraph = async (orgTreeData: OrgTreeItem, layoutType: CustomLayout) => { - const treeNodeData = convertOrgTreeToTreeNode(orgTreeData); - - commonOption = { - container: graphRef.value, - data: treeToGraphData(treeNodeData), - node: { - style: { - size: 20, - labelText: (d) => d.label as string, - labelBackground: true, - }, - state: { - active: { - fill: '#00C9C9', - }, - }, - palette: { - field: 'type', - color: 'tableau', - }, - }, - edge: { - type: 'cubic-radial', - state: { - active: { - lineWidth: 3, - stroke: '#009999', - }, - }, - }, - layout: [ - { - type: 'compact-box', - - getHeight: () => { - return 20; - }, - getWidth: () => { - return 20; - }, - // 鍨傜洿闂撮殭 - getVGap: () => { - return 2; - }, - // 姘村钩闂撮殭 - getHGap: () => { - return 120; - }, - }, - ], - behaviors: [ - 'drag-canvas', - 'zoom-canvas', - // 'drag-element', - { - key: 'hover-activate', - type: 'hover-activate', - degree: 5, - direction: 'in', - inactiveState: 'inactive', - }, - ], - transforms: ['place-radial-labels'], - }; - const extraOption: DeepPartial<GraphOptions> = getLayoutOption(layoutType); - - const finalOption: GraphOptions = defaultsDeep(extraOption, commonOption); - graph = new Graph(finalOption); - graphRender(); -}; - -const getLeaf = (item) => { - if (item.Children && item.Children.length > 0) { - const first = item.Children[0]; - return getLeaf(first); - } else { - return item; - } -}; - -const initEvent = () => { - // graph.on('node:click', ({ cell, e, node, view }) => { - // }); -}; - const getFirstOrgTreeList = async () => { // const res = await GetSMCenterFirstOrgTreeList(); /** @description 缁村害鏁伴噺 */ @@ -299,7 +79,6 @@ level: 2, }; }), - // .filter((item, index) => index === 0), }; dimensionCount += metrics.children.length; @@ -310,123 +89,15 @@ const maxCount = Math.max(dimensionCount, metricsCount); return [resData, maxCount]; }; -const selfAdapt = () => { - setTimeout(() => { - graph.fitView(); - }, 100); -}; - -//#region ====================== 宸ュ叿鏍� ====================== -const enum ToolBarType { - /** @description 甯冨眬 */ - Layout, - /** @description 鎼滅储 */ - Search, - /** @description 鏀惧ぇ */ - ZoomIn, - /** @description 缂╁皬 */ - ZoomOut, - /** @description 鑷�傚簲 */ - Reset, -} -type ToolBarItem = { - icon: string; - label: string; - type: ToolBarType; -}; -const toolBarFunList: ToolBarItem[] = [ - // { - // icon: 'sousuo', - // label: '鎼滅储', - // type: ToolBarType.Search, - // }, - { - icon: 'buju', - label: '甯冨眬', - type: ToolBarType.Layout, - }, - { - icon: 'fangda', - label: '鏀惧ぇ', - type: ToolBarType.ZoomIn, - }, - { - icon: 'suoxiao', - label: '缂╁皬', - type: ToolBarType.ZoomOut, - }, - { - icon: 'zishiying', - label: '鑷�傚簲', - type: ToolBarType.Reset, - }, -]; - -const searchIsShow = ref(false); -const searchValue = ref(''); -const ZOOM_OFFSET = 0.15; -const toolBarItemClick = (item: ToolBarItem) => { - switch (item.type) { - case ToolBarType.Layout: - layoutIsShow.value = true; - break; - case ToolBarType.Search: - searchIsShow.value = true; - break; - case ToolBarType.ZoomIn: - graph.zoomBy(1 + ZOOM_OFFSET); - break; - - case ToolBarType.ZoomOut: - graph.zoomBy(1 - ZOOM_OFFSET); - - break; - - case ToolBarType.Reset: - selfAdapt(); - default: - break; - } -}; - -const debounceSearch = () => {}; -const closeSearch = () => { - searchIsShow.value = false; -}; -//#endregion - -//#region ====================== 甯冨眬 ====================== -const layoutIsShow = ref(false); -const closeLayout = () => { - layoutIsShow.value = false; -}; -const activeLayout = ref<CustomLayout>(); -const layoutChange = (layoutType: CustomLayout) => { - const extraOption = getLayoutOption(layoutType); - rebuildGraph(extraOption); -}; -//#endregion onMounted(async () => { if (!agentId) return; firstLoading.value = true; - const [orgTreeData, maxLevelNodeCount] = await (getFirstOrgTreeList() as any).catch(() => { + const [orgTreeData, maxLevelNodeCount] = await (getFirstOrgTreeList() as any).finally(() => { firstLoading.value = false; }); - setTimeout(() => { - const layoutType = getLayoutType(maxLevelNodeCount); - activeLayout.value = layoutType; - initGraph(orgTreeData as OrgTreeItem, layoutType); - - // initEvent(); - // loadData(orgTreeList as any); - firstLoading.value = false; - }, 100); + maxCount.value = maxLevelNodeCount; + graphData.value = convertOrgTreeToTreeNode(orgTreeData); }); </script> -<style scoped lang="scss"> -:deep(g[data-shape='rect'].x6-node > text:hover) { - // text-decoration: underline; - cursor: pointer; -} -</style> +<style scoped lang="scss"></style> -- Gitblit v1.9.3