| 
					
				 | 
			
			
				@@ -1,22 +1,41 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 <template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  <div class="scene-box"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  <div class="scene-box" v-if="routerParam !== 'home'"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  <!-- <div class="scene-box"> --> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     <div class="device-header">智能通风管控系统</div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    <div class="device-select-box"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      <a-tree 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        :show-line="true" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        :tree-data="treeData" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        @select="onSelect" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      > 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      </a-tree> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    <div class="select-node" :class="{ 'node-select-show': !treeShow, 'node-select-hide': treeShow, }"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      <SvgIcon class="is-expansion-icon put-away-icon" size="38" name="expansion" @click="showTree(true)" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      <span class="title">{{ treeNodeTitle }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    <div class="device-select" :class="{ 'device-select-show': treeShow, 'device-select-hide': !treeShow, }"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      <SvgIcon class="is-expansion-icon expansion-icon" size="28" name="put-away" @click="showTree(false)" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      <div class="device-select-box"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <a-tree 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          :show-line="true" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          :tree-data="treeData" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          v-model:selectedKeys="selectedKeys" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          v-model:expandedKeys="expandedKeys" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          @select="onSelect" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        > 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        </a-tree> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      </div>   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     <div class="bottom-tabs-box" @mousedown="setDivHeight" id="monitorBox"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      <div class="to-small" @click="toHome"></div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      <div class="device-button-group" v-if="deviceList.length > 0"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <div class="device-button" :class="{ 'device-active': deviceActive == device.deviceType }" v-for="(device, index) in deviceList" :key="index" @click="monitorChange(index)">{{ device.deviceName }}</div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <div class="enter-detail" @click="goDetail()"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          <send-outlined /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          {{ treeNodeTitle }}详情 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       <a-tabs class="tabs-box" v-model:activeKey="activeKey" @change="tabChange" > 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         <a-tab-pane key="1" tab="实时监测"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <template v-if="deviceType == 'fan'"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          <template v-if="deviceType == 'fan' && activeKey == '1'"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             <GroupMonitorTable :dataSource="dataSource" :columnsType="`${deviceType}_monitor`" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           </template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <template v-else> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          <template v-else-if = "activeKey == '1'"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             <MonitorTable 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              ref="monitorTable" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               :columnsType="`${deviceType}_monitor`" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               :dataSource="dataSource" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               design-scope="device_monitor" 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -43,113 +62,180 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         </a-tab-pane> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         <a-tab-pane key="2" tab="历史数据"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           <div class="tab-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <HistoryTable :columns-type="`${deviceType}_history`" :device-type="deviceType" :device-list-api="getDeviceList.bind(null, { devicekind : deviceType})" designScope="device-history" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <HistoryTable ref="historyTable" v-if="activeKey == '2'" :sysId="systemID" :columns-type="`${deviceType}`" :device-type="deviceType" :device-list-api="getDeviceList.bind(null, { strtype : deviceType, sysId: systemID })" designScope="device-history" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         </a-tab-pane> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         <a-tab-pane key="3" tab="报警历史"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           <div class="tab-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <AlarmHistoryTable columns-type="alarm_history" :device-type="deviceType" :device-list-api="getDeviceList.bind(null, { devicekind: deviceType })" designScope="alarm-history" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <AlarmHistoryTable ref="alarmHistoryTable" v-if="activeKey == '3'" :sysId="systemID" columns-type="alarm" :device-type="deviceType" :device-list-api="getDeviceList.bind(null, { strtype: deviceType, sysId: systemID })" designScope="alarm-history" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         </a-tab-pane> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         <a-tab-pane key="4" tab="操作历史"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           <div class="tab-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <HandlerHistoryTable columns-type="operatorhistory" :device-type="deviceType"  :device-list-api="getDeviceList.bind(null, { devicekind: deviceType })" designScope="operator-history" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <HandlerHistoryTable ref="handlerHistoryTable" v-if="activeKey == '4'" :sysId="systemID" columns-type="operatorhistory" :device-type="deviceType"  :device-list-api="getDeviceList.bind(null, { strtype: deviceType, sysId: systemID  })" designScope="operator-history" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          </div>  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         </a-tab-pane> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       </a-tabs> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    <component :is="currentModal" v-model:visible="modalVisible" :dataSource="dataSource" :activeID="activeID" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    <component v-if="modalVisible" :is="currentModal" v-model:visible="modalVisible" :dataSource="dataSource" :activeID="activeID" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 </template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 <script setup lang="ts"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   import {ref, onMounted, onUnmounted, ComponentOptions, shallowRef } from 'vue' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  import { SendOutlined } from '@ant-design/icons-vue'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   import { list, getDeviceList, getDeviceTypeList } from './device.api' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   import AlarmHistoryTable from '../comment/AlarmHistoryTable.vue'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   import HistoryTable from '../comment/HistoryTable.vue'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   import HandlerHistoryTable from '../comment/HandlerHistoryTable.vue'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   import MonitorTable from '../comment/MonitorTable.vue'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   import GroupMonitorTable from '../comment/GroupMonitorTable.vue'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  import type { TreeProps } from 'ant-design-vue'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  import { TreeProps, message } from 'ant-design-vue'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   import { TableAction } from '/@/components/Table'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   import FiberModal from './modal/fiber.modal.vue'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   import DustModal from './modal/dust.modal.vue' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  import { SvgIcon } from '/@/components/Icon'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  import { getActions } from '/@/qiankun/state'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  import { useRouter } from 'vue-router'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  type DeviceType = { deviceType: string, deviceName: string, datalist: any[] }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const router = useRouter() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const actions = getActions(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  actions.setGlobalState({ pageObj: { pageType: 'home' } }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const monitorTable = ref() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const historyTable = ref() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const alarmHistoryTable = ref() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const handlerHistoryTable = ref() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const routerParam = ref('home') // 默认进来时首页 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // 模态框 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  const currentModal = shallowRef<Nullable<ComponentOptions>>(null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  const modalVisible = ref<Boolean>(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const currentModal = shallowRef<Nullable<ComponentOptions>>(null); //模态框 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const modalVisible = ref<Boolean>(false); // 模态框是否可见 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  const drawerHeight = ref(700)  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  const activeKey = ref('1'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  const dataSource = shallowRef([]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  const activeID = ref('') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  const deviceType = ref('window') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const drawerHeight = ref(240) // 监测框最小高度 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const treeShow = ref(true) //是否显示树形菜单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const treeNodeTitle = ref('') // 选中的树形标题 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const deviceList = ref<DeviceType[]>([]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const deviceActive = ref('') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const activeKey = ref('1'); // tab key 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const dataSource = shallowRef([]) // 实时监测数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const activeID = ref('') // 打开详情modal时监测的设备id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const deviceType = ref('') // 监测设备类型 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const systemType = ref('') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const systemID = ref('') // 系统监测时,系统id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const selectedKeys = ref<string[]>([]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const expandedKeys = ref<string[]>([]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const scroll = ref({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     y: drawerHeight.value - 100 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const treeData = ref<TreeProps['treeData']>([]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  const onSelect: TreeProps['onSelect'] = (selectedKeys) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // console.log('selected', selectedKeys, info); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // info.node.title 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    deviceType.value = selectedKeys[0] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  //树形菜单选择事件 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const onSelect: TreeProps['onSelect'] = async(keys, e) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    deviceType.value = '' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    systemID.value = '' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    deviceList.value = [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if(e.node.parent && (e.node.parent.node.type.toString()).startsWith('sys')){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      systemType.value = e.node.parent.node.type 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      deviceType.value = e.node.parent.node.type 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      systemID.value = e.node.type 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // 传递工作面id信息,用于定位 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      actions.setGlobalState({ locationObj: { pageType: deviceType.value ,deviceid: systemID.value }, pageObj: null }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      systemType.value = e.node.type 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      deviceType.value = e.node.type 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    selectedKeys.values = keys 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    treeNodeTitle.value = e.node.title 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (timer) clearInterval(timer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    await getDataSource() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    getMonitor()  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   function tabChange(activeKeyVal) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     activeKey.value = activeKeyVal; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  function showTree(flag) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    treeShow.value = flag 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   async function getDeviceType () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const result = await getDeviceTypeList({}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (result.length > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       const dataSource = <TreeProps['treeData']>[] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      const getData = (resultList, dataSourceList) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        resultList.forEach((item) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      let key = '0' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const getData = (resultList, dataSourceList, keyVal) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        resultList.forEach((item, index) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           if (item.children && item.children.length > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            const children = getData(item.children, []) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            const children = getData(item.children, [], `${keyVal}-${index}`) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             dataSourceList.push({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               children: children, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               title: item.itemText, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              key: item.itemValue, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              key: `${keyVal}-${index}`, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              type: item.itemValue, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             dataSourceList.push({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              children: [], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               title: item.itemText, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              key: item.itemValue, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              children: [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              key: `${keyVal}-${index}`, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              type: item.itemValue, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return dataSourceList 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      treeData.value = getData(result, dataSource) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      console.log('树形菜单-------------->', treeData.value) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      treeData.value = getData(result, dataSource, key) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+       
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // https获取监测数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   let timer: null | NodeJS.Timeout = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   function getMonitor() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (Object.prototype.toString.call(timer) === '[object Null]') { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      timer = setTimeout(async () => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        const res = await list({ devicetype: deviceType.value, pagetype: 'normal' }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        debugger 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    timer = setInterval(async () => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      await getDataSource() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }, 1000); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  async function getDataSource() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (deviceType.value.startsWith('sys') && systemID.value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const res = await list({ devicetype: 'sys', systemID: systemID.value }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const result = res.msgTxt; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const deviceArr = <DeviceType[]>[] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      result.forEach(item => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const data = item['datalist'].filter((data: any) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          const readData = data.readData; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          return Object.assign(data, readData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (item.type != 'sys') { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          deviceArr.unshift({ deviceType: item.type, deviceName: item['typeName'] ? item['typeName'] : item['datalist'][0]['typeName'], datalist: data }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      console.log('关联设备列表', deviceArr) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      deviceList.value = deviceArr 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      deviceActive.value = deviceArr[1].deviceType 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      monitorChange(1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const res = await list({ devicetype: deviceType.value, pagetype: 'normal' }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (res.msgTxt[0]) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         dataSource.value = res.msgTxt[0].datalist || []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         dataSource.value.filter((data: any) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           const readData = data.readData; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           return Object.assign(data, readData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (timer) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          timer = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        getMonitor(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      }, 1000); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   function setDivHeight(e: MouseEvent) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const divObject = document.getElementById('monitorBox') as HTMLElement 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -160,10 +246,10 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       res.preventDefault() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       const distY = Math.abs(res.clientY - startY) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if(res.clientY > startY){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if(divHeight - distY >= 300){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(divHeight - distY >= 240){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           drawerHeight.value = divHeight - distY 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          drawerHeight.value = 300 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          drawerHeight.value = 240 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if(res.clientY < startY){ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -182,31 +268,126 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  function goLocation() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // 定位 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  function goLocation(record) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    actions.setGlobalState({ locationId: record.deviceID, locationObj: null, pageObj: null }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  function goDetail(record){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if(deviceType.value.startsWith('fiber')){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      activeID.value = record.deviceID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      currentModal.value = FiberModal 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      modalVisible.value = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // 详情 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  function goDetail(record?){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if(record){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (deviceType.value.startsWith('fiber')) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        activeID.value = record.deviceID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        currentModal.value = FiberModal 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        modalVisible.value = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } else if (deviceType.value.startsWith('dusting')) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        activeID.value = record.deviceID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        currentModal.value = DustModal 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        modalVisible.value = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } else if (deviceType.value.indexOf("gate") != -1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const newPage = router.resolve({path: '/monitorChannel/monitor-gate'}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        window.open(newPage.href, '_blank') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } else if (deviceType.value.indexOf("window") != -1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const newPage = router.resolve({ path: '/monitorChannel/monitor-window' }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        window.open(newPage.href, '_blank') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } else if (deviceType.value.indexOf("windrect") != -1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const newPage = router.resolve({ path: '/monitorChannel/monitor-windrect' }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        window.open(newPage.href, '_blank') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } else if (deviceType.value.indexOf("fanmain") != -1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const newPage = router.resolve({ path: '/monitorChannel/monitor-fan-main' }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        window.open(newPage.href, '_blank') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } else if (deviceType.value.indexOf("fanlocal") != -1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const newPage = router.resolve({ path: '/monitorChannel/monitor-fan-local' }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        window.open(newPage.href, '_blank') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        message.info('待开发。。。') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (systemType.value.indexOf("sys_dongshi") != -1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const newPage = router.resolve({ path: '/chamber-home', query: {id: systemID.value }}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        window.open(newPage.href, '_blank') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        message.info('待开发。。。') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (deviceType.value.startsWith('dusting')) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      activeID.value = record.deviceID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      currentModal.value = DustModal 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      modalVisible.value = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  function toHome() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    deviceList.value = [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    actions.setGlobalState({ pageObj: { pageType: 'home'} }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // 遍历树形菜单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  async function findTreeDataValue(data:[], obj) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    const findDeviceType = (data: [], obj) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      let type = '' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (obj.deviceid) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        type = obj.deviceid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        type = obj.deviceType 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      data.find((item: any) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (item.children.length > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          findDeviceType(item.children, obj) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (item.type == type) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          deviceType.value = obj.deviceid ? 'sys' : item.type 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          if (obj.deviceid) systemID.value = obj.deviceid 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          selectedKeys.value = [item.key] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          expandedKeys.value = [item.key] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          treeNodeTitle.value = item.title 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    findDeviceType(data, obj) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (timer) clearInterval(timer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    await getDataSource() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    getMonitor() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  function monitorChange(index) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    dataSource.value = [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    deviceActive.value = deviceType.value = deviceList.value[index].deviceType 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (activeKey.value == '1' && monitorTable.value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      monitorTable.value.setLoading(true) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      dataSource.value = deviceList.value[index].datalist 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if(activeKey.value == '2' && historyTable.value){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      historyTable.value.setLoading(true) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (activeKey.value == '3' && alarmHistoryTable.value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      alarmHistoryTable.value.setLoading(true) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (activeKey.value == '4' && handlerHistoryTable.value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      handlerHistoryTable.value.setLoading(true) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   onMounted(async() => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    actions.onGlobalStateChange(async(newState, prev) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      for (const key in newState) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (key === 'pageObj') { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          const pageObj = newState[key] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          if (pageObj) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            routerParam.value = pageObj.pageType 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (pageObj.deviceid) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              await findTreeDataValue(treeData.value, { deviceid: pageObj.deviceid }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              await findTreeDataValue(treeData.value, { deviceType: pageObj.pageType }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     await getDeviceType() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    getMonitor() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // await getDataSource() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // getMonitor() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   onUnmounted(() => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (timer) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      clearTimeout(timer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      timer = undefined; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      clearInterval(timer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -226,15 +407,81 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     font-weight: 600; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     z-index: -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  .device-select-box{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .select-node{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    position: fixed; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    top: 60px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    left: 10px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    color: #fff; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    display: flex; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    justify-content: center; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    font-size: 24px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    .title{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      margin-left: 10px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .device-select{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     width: 250px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     height: 500px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    background: url('/@/assets/images/vent/home/tree-bg.png') no-repeat; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     position: fixed; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    top: 55px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    left: 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    color: #fff; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    top: 60px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    left: 10px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    background-size: contain; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     pointer-events: auto; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    overflow-y: auto; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    padding: 20px 10px 30px 10px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    .expansion-icon{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      position: absolute; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      left: 190px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      top: 25px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .is-expansion-icon{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    background: url('/@/assets/images/vent/home/tree-icon-bg.png') no-repeat; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    background-size: contain; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    padding: 5px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    pointer-events: auto; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    z-index: 999; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    &:hover{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      background: url('/@/assets/images/vent/home/tree-icon-hover-bg.png') no-repeat; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      background-size: contain; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .put-away-icon{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    display: inline-block; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .device-select-show{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    left: 10px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    animation-name: treeShow; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /* 持续时间 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    animation-duration: 1s; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    transition: all 1s cubic-bezier(0.165, 0.84, 0.44, 1) .5s; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .device-select-hide{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    left: -250px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    animation-name: treeHide; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /* 持续时间 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    animation-duration: 1s; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    transition: all 1s cubic-bezier(0.165, 0.84, 0.44, 1) .5s; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .node-select-show{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    left: 10px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    animation-name: treeShow; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /* 持续时间 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    animation-duration: 1s; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    transition: all 1s cubic-bezier(0.165, 0.84, 0.44, 1) .5s; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .node-select-hide{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    left: -400px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    animation-name: treeHide; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /* 持续时间 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    animation-duration: 1s; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    transition: all 1s cubic-bezier(0.165, 0.84, 0.44, 1) .5s; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .device-select-box{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    width: 208px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    height: 450px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    overflow-y: auto;     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    color: #fff;     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     :deep(.zxm-tree){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       background: transparent !important; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       color: #fff !important; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -245,7 +492,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         background-color: #00b1c8; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       .zxm-tree-node-content-wrapper:hover{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        background-color: #00b1c8; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        background-color: #00b1c855; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       input{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         height: 0px !important; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -255,12 +502,148 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       -webkit-box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       border-radius: 10px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       background: #ededed22; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      height: 100px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     &::-webkit-scrollbar-thumb { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       -webkit-box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       background: #4288A444; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .bottom-tabs-box{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    position: relative; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    .to-small{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      width: 60px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      height: 60px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      background: url('/@/assets/images/vent/home/tosmall.png') no-repeat center; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      background-size: auto; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      position: absolute; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      top: -65px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      right: 30px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      border-radius: 10px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      padding: 8px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      backdrop-filter: blur(10px); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      background-color: rgba(0, 58, 128, 0.418); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      &:hover{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        background-color: rgba(42, 85, 138, 0.418); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    .device-button-group{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      position: absolute; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      top: -30px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      left: 30px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      display: flex; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      width: 100%; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+       
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      .device-button{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        padding: 4px 15px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        position: relative; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        display: flex; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        justify-content: center; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        align-items: center; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        font-size: 14px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        color: #fff; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        cursor: pointer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        margin: 0 3px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        &::before{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          content: ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          position: absolute; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          top: 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          right: 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          bottom: 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          left: 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          border: 1px solid #6176AF; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          transform: skewX(-38deg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          background-color: rgba(0, 77, 103,85%); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          z-index: -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      .device-active{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // color: #0efcff; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        &::before{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          border-color: #0efcff; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          box-shadow: 1px 1px 3px 1px #0efcff inset; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    .enter-detail{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      color: #fff; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      cursor: pointer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      position: absolute; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      right: 150px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      top: -10px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      padding: 5px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // border: 1px transparent solid; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      border-radius: 5px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      margin-left: 8px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      margin-right: 8px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      width: auto; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // height: 40px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // border: 1px solid #65dbea; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      height: 33px !important; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      display: flex; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      align-items: center; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      justify-content: center; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      color: #fff; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      padding: 5px 15px 5px 15px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      cursor: pointer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      &:hover { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        background: linear-gradient(#2cd1ff55, #1eb0ff55); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      &::before { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        width: calc(100% - 6px); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        height: 27px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        content: ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        position: absolute; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        top: 3px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        right: 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        left: 3px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        bottom: 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        z-index: -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        border-radius: inherit; /*important*/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        background: linear-gradient(#1fa6cb, #127cb5); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      &::after { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        width: calc(100% + 32px); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        height: 10px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        content: ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        position: absolute; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        top: 35px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        right: 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        left: -16px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        bottom: 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        z-index: -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        border-radius: inherit; /*important*/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        background: url('/@/assets/images/vent/short-light.png') no-repeat; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        background-position: center; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        background-size: 100%; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        z-index: 999; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  @keyframes treeShow { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    0% { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      left: -400px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      opacity: 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    100% { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      left: 10px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      opacity: 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  @keyframes treeHide { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    0% { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      left: 10px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      opacity: 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    100% { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      left: -400px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      opacity: 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   :deep(.@{ventSpace}-tabs-tabpane-active) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     overflow: auto; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // height: 100%; 
			 |