|
@@ -15,6 +15,7 @@
|
|
|
:key="item.id"
|
|
:key="item.id"
|
|
|
:data="item"
|
|
:data="item"
|
|
|
:level="level"
|
|
:level="level"
|
|
|
|
|
+ :selected-org-id="selectedOrgId"
|
|
|
@click-node="querySafetyTeamData"
|
|
@click-node="querySafetyTeamData"
|
|
|
@create-node="handleCreateSafetySystem"
|
|
@create-node="handleCreateSafetySystem"
|
|
|
@edit-node="handleEditSafetySystem"
|
|
@edit-node="handleEditSafetySystem"
|
|
@@ -34,11 +35,19 @@
|
|
|
/>
|
|
/>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- <div class="search-table-container table-content">
|
|
|
|
|
|
|
+ <div class="search-table-container table-content" :class="{ 'zoom-mode': isChartZoomed }">
|
|
|
|
|
|
|
|
- <div class="chart">
|
|
|
|
|
|
|
+ <div class="chart" ref="chartContainerRef">
|
|
|
<!-- 架构图 -->
|
|
<!-- 架构图 -->
|
|
|
<OrgChart :treeData="treeData" @node-click="handleNodeClick" />
|
|
<OrgChart :treeData="treeData" @node-click="handleNodeClick" />
|
|
|
|
|
+ <div class="chart-actions">
|
|
|
|
|
+ <el-button v-if="!isChartFullscreen" size="small" @click="toggleChartZoom">
|
|
|
|
|
+ {{ isChartZoomed ? '恢复布局' : '放大模式' }}
|
|
|
|
|
+ </el-button>
|
|
|
|
|
+ <el-button size="small" @click="toggleChartFullscreen">
|
|
|
|
|
+ {{ isChartFullscreen ? '退出全屏' : '全屏查看' }}
|
|
|
|
|
+ </el-button>
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
<TeamDetailDrawer ref="teamDetailDrawerRef" :selected-team-id="selectedTeamId" />
|
|
<TeamDetailDrawer ref="teamDetailDrawerRef" :selected-team-id="selectedTeamId" />
|
|
|
|
|
|
|
@@ -149,7 +158,7 @@
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
|
- import { onMounted, reactive, ref } from 'vue';
|
|
|
|
|
|
|
+ import { onBeforeUnmount, onMounted, reactive, ref, nextTick } from 'vue';
|
|
|
import { ElMessage, ElMessageBox } from 'element-plus';
|
|
import { ElMessage, ElMessageBox } from 'element-plus';
|
|
|
import BasicTable from '@/components/BasicTable.vue';
|
|
import BasicTable from '@/components/BasicTable.vue';
|
|
|
import useTableConfig from '@/hooks/useTableConfigHook';
|
|
import useTableConfig from '@/hooks/useTableConfigHook';
|
|
@@ -207,6 +216,9 @@ const position = ref('left')
|
|
|
});
|
|
});
|
|
|
const teamDetailDrawerRef = ref<InstanceType<typeof TeamDetailDrawer>>();
|
|
const teamDetailDrawerRef = ref<InstanceType<typeof TeamDetailDrawer>>();
|
|
|
const selectedTeamId = ref<number | null>(null);
|
|
const selectedTeamId = ref<number | null>(null);
|
|
|
|
|
+ const chartContainerRef = ref<HTMLElement | null>(null);
|
|
|
|
|
+ const isChartFullscreen = ref(false);
|
|
|
|
|
+ const isChartZoomed = ref(false);
|
|
|
const handleNodeClick = (nodeData: any) => {
|
|
const handleNodeClick = (nodeData: any) => {
|
|
|
const id = nodeData?.id?.replace('org-', '')
|
|
const id = nodeData?.id?.replace('org-', '')
|
|
|
console.log(nodeData, 'canshu')
|
|
console.log(nodeData, 'canshu')
|
|
@@ -215,7 +227,37 @@ const position = ref('left')
|
|
|
teamDetailDrawerRef.value?.drawerShow();
|
|
teamDetailDrawerRef.value?.drawerShow();
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
+ async function toggleChartFullscreen() {
|
|
|
|
|
+ const el = chartContainerRef.value;
|
|
|
|
|
+ if (!el) return;
|
|
|
|
|
+
|
|
|
|
|
+ if (document.fullscreenElement === el) {
|
|
|
|
|
+ await document.exitFullscreen();
|
|
|
|
|
+ await triggerChartResize();
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ await el.requestFullscreen();
|
|
|
|
|
+ await triggerChartResize();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ async function toggleChartZoom() {
|
|
|
|
|
+ isChartZoomed.value = !isChartZoomed.value;
|
|
|
|
|
+ await triggerChartResize();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ function syncFullscreenState() {
|
|
|
|
|
+ isChartFullscreen.value = document.fullscreenElement === chartContainerRef.value;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ async function triggerChartResize() {
|
|
|
|
|
+ await nextTick();
|
|
|
|
|
+ // 图表容器尺寸变化后,主动触发一次 resize,确保图谱立即自适应
|
|
|
|
|
+ window.dispatchEvent(new Event('resize'));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
const activeName = ref('');
|
|
const activeName = ref('');
|
|
|
|
|
+ const selectedOrgId = ref<string>('');
|
|
|
// 日期范围(用于日期选择器)
|
|
// 日期范围(用于日期选择器)
|
|
|
const dateRange = ref<[string, string] | string>('');
|
|
const dateRange = ref<[string, string] | string>('');
|
|
|
const level = ref(1)
|
|
const level = ref(1)
|
|
@@ -359,7 +401,8 @@ const formatTreeData = (tree)=> {
|
|
|
// 默认选择第一个组织
|
|
// 默认选择第一个组织
|
|
|
if(res[0].orgId){
|
|
if(res[0].orgId){
|
|
|
treeNodePreview(res[0])
|
|
treeNodePreview(res[0])
|
|
|
- // activeName.value = String(res[0].orgId)
|
|
|
|
|
|
|
+ activeName.value = String(res[0].orgId)
|
|
|
|
|
+ selectedOrgId.value = String(res[0].orgId)
|
|
|
tableQuery.queryParam.classifyName = res[0].orgId
|
|
tableQuery.queryParam.classifyName = res[0].orgId
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -411,7 +454,8 @@ const formatTreeData = (tree)=> {
|
|
|
const querySafetyTeamData = (value) => {
|
|
const querySafetyTeamData = (value) => {
|
|
|
// console.log('查询', value);
|
|
// console.log('查询', value);
|
|
|
tableQuery.queryParam.classifyName = value.orgId;
|
|
tableQuery.queryParam.classifyName = value.orgId;
|
|
|
- // activeName.value = String(value.orgId)
|
|
|
|
|
|
|
+ activeName.value = String(value.orgId)
|
|
|
|
|
+ selectedOrgId.value = String(value.orgId)
|
|
|
treeNodePreview(value)
|
|
treeNodePreview(value)
|
|
|
safetyOrgDetail(value.orgId)
|
|
safetyOrgDetail(value.orgId)
|
|
|
getTableData();
|
|
getTableData();
|
|
@@ -590,6 +634,7 @@ const formatTreeData = (tree)=> {
|
|
|
});
|
|
});
|
|
|
};
|
|
};
|
|
|
onMounted(async () => {
|
|
onMounted(async () => {
|
|
|
|
|
+ document.addEventListener('fullscreenchange', syncFullscreenState);
|
|
|
fetchSafetyOrganizationTeamList()
|
|
fetchSafetyOrganizationTeamList()
|
|
|
// 默认读取第一个架构组织的员工数据
|
|
// 默认读取第一个架构组织的员工数据
|
|
|
const res = await getSafetySystemList();
|
|
const res = await getSafetySystemList();
|
|
@@ -600,6 +645,10 @@ const formatTreeData = (tree)=> {
|
|
|
safetyOrgDetail(orgId)
|
|
safetyOrgDetail(orgId)
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
|
|
|
+
|
|
|
|
|
+ onBeforeUnmount(() => {
|
|
|
|
|
+ document.removeEventListener('fullscreenchange', syncFullscreenState);
|
|
|
|
|
+ });
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
|
<style scoped lang="scss">
|
|
<style scoped lang="scss">
|
|
@@ -674,11 +723,34 @@ const formatTreeData = (tree)=> {
|
|
|
margin-bottom:16px;
|
|
margin-bottom:16px;
|
|
|
}
|
|
}
|
|
|
.chart {
|
|
.chart {
|
|
|
|
|
+ position: relative;
|
|
|
height:260px;
|
|
height:260px;
|
|
|
background-color: #f1f7ff;
|
|
background-color: #f1f7ff;
|
|
|
border-radius: 4px;
|
|
border-radius: 4px;
|
|
|
overflow: hidden;
|
|
overflow: hidden;
|
|
|
}
|
|
}
|
|
|
|
|
+ .chart:fullscreen {
|
|
|
|
|
+ height: 100%;
|
|
|
|
|
+ padding: 12px;
|
|
|
|
|
+ background: #ffffff;
|
|
|
|
|
+ border-radius: 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ .chart-actions {
|
|
|
|
|
+ position: absolute;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ gap: 8px;
|
|
|
|
|
+ right: 12px;
|
|
|
|
|
+ bottom: 12px;
|
|
|
|
|
+ z-index: 2;
|
|
|
|
|
+ }
|
|
|
|
|
+ .table-content.zoom-mode {
|
|
|
|
|
+ .chart {
|
|
|
|
|
+ height: 420px;
|
|
|
|
|
+ }
|
|
|
|
|
+ .content {
|
|
|
|
|
+ height: calc(100% - 420px - 32px);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
.content {
|
|
.content {
|
|
|
height: calc(100% - 260px - 32px);
|
|
height: calc(100% - 260px - 32px);
|
|
|
overflow-y: auto;
|
|
overflow-y: auto;
|