|  | @@ -0,0 +1,1109 @@
 | 
	
		
			
				|  |  | +<template>
 | 
	
		
			
				|  |  | +  <div class="scene-box">
 | 
	
		
			
				|  |  | +    <div class="select-node" :class="{ 'node-select-show': !treeShow, 'node-select-hide': treeShow, }"
 | 
	
		
			
				|  |  | +      @click="showTree('treeShow', true)">
 | 
	
		
			
				|  |  | +      <SvgIcon class="is-expansion-icon put-away-icon" size="38" name="expansion" />
 | 
	
		
			
				|  |  | +      <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('treeShow', false)" />
 | 
	
		
			
				|  |  | +      <div class="device-select-box">
 | 
	
		
			
				|  |  | +        <a-tree :show-line="true" :tree-data="treeData" v-model:selectedKeys="selectedKeys"
 | 
	
		
			
				|  |  | +          :autoExpandParent ="true"
 | 
	
		
			
				|  |  | +          v-model:expandedKeys = "expandedKeys" @select="onSelect">
 | 
	
		
			
				|  |  | +        </a-tree>
 | 
	
		
			
				|  |  | +      </div>
 | 
	
		
			
				|  |  | +    </div>
 | 
	
		
			
				|  |  | +    <div class="location-icon"
 | 
	
		
			
				|  |  | +      :class="{ 'location-btn-show': !locationSettingShow, 'location-btn-hide': locationSettingShow, }"
 | 
	
		
			
				|  |  | +      @click="showTree('location', true)">
 | 
	
		
			
				|  |  | +      <SvgIcon size="18" name="put-away" />
 | 
	
		
			
				|  |  | +      <span class="location-text">定位图标显示</span>
 | 
	
		
			
				|  |  | +    </div>
 | 
	
		
			
				|  |  | +    <div class="location-select"
 | 
	
		
			
				|  |  | +      :class="{ 'location-select-show': locationSettingShow, 'location-select-hide': !locationSettingShow, }">
 | 
	
		
			
				|  |  | +      <div class="location-select-box">
 | 
	
		
			
				|  |  | +        <div class="location-top-title" @click="showTree('location', false)">
 | 
	
		
			
				|  |  | +          <SvgIcon class="is-expansion-icon location-expansion-icon" size="28" name="expansion" />
 | 
	
		
			
				|  |  | +          <div class="title">定位图标显示</div>
 | 
	
		
			
				|  |  | +        </div>
 | 
	
		
			
				|  |  | +        <div class="location-container">
 | 
	
		
			
				|  |  | +          <template v-for="location in locationList" :key="location.deviceType">
 | 
	
		
			
				|  |  | +            <div class="location-item">
 | 
	
		
			
				|  |  | +              <div class="item-title">{{ location.title }} :</div>
 | 
	
		
			
				|  |  | +              <div>
 | 
	
		
			
				|  |  | +                <a-radio-group v-model:value="location.Visible" :name="location.deviceType">
 | 
	
		
			
				|  |  | +                  <a-radio :value="1">是</a-radio>
 | 
	
		
			
				|  |  | +                  <a-radio :value="0">否</a-radio>
 | 
	
		
			
				|  |  | +                </a-radio-group>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            </div>
 | 
	
		
			
				|  |  | +          </template>
 | 
	
		
			
				|  |  | +          <div class="location-bottom-btn">
 | 
	
		
			
				|  |  | +            <span @click="setLocation">提交</span>
 | 
	
		
			
				|  |  | +          </div>
 | 
	
		
			
				|  |  | +        </div>
 | 
	
		
			
				|  |  | +      </div>
 | 
	
		
			
				|  |  | +    </div>
 | 
	
		
			
				|  |  | +    <div>
 | 
	
		
			
				|  |  | +      <div class="bottom-tabs-box" @mousedown="setDivHeight($event, 250, scroll)" 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' && activeKey == '1' && isRefresh">
 | 
	
		
			
				|  |  | +              <GroupMonitorTable :dataSource="dataSource" :columnsType="`${deviceType}_monitor`" />
 | 
	
		
			
				|  |  | +            </template>
 | 
	
		
			
				|  |  | +            <template v-else-if="activeKey == '1' && isRefresh">
 | 
	
		
			
				|  |  | +              <MonitorTable ref="monitorTable" :columnsType="`${deviceType}_monitor`" :dataSource="dataSource"
 | 
	
		
			
				|  |  | +                design-scope="device_monitor" :isShowPagination="false" :isShowActionColumn="true" title="设备监测"
 | 
	
		
			
				|  |  | +                :scroll="scroll">
 | 
	
		
			
				|  |  | +                <template #action="{ record }">
 | 
	
		
			
				|  |  | +                  <TableAction :actions="[
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                      label: '详情',
 | 
	
		
			
				|  |  | +                      onClick: goDetail.bind(null, record),
 | 
	
		
			
				|  |  | +                    },
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                      label: '定位',
 | 
	
		
			
				|  |  | +                      onClick: goLocation.bind(null, record),
 | 
	
		
			
				|  |  | +                    },
 | 
	
		
			
				|  |  | +                  ]" />
 | 
	
		
			
				|  |  | +                </template>
 | 
	
		
			
				|  |  | +                <template #filterCell="{ column, record }">
 | 
	
		
			
				|  |  | +                  <template v-if="deviceType.startsWith('gate')">
 | 
	
		
			
				|  |  | +                    <template v-if="record.frontGateOpenCtrl">
 | 
	
		
			
				|  |  | +                      <a-tag
 | 
	
		
			
				|  |  | +                        v-if="column.dataIndex === 'frontGateOpen' && record.frontGateOpen == 0 && record.frontGateClose == 0"
 | 
	
		
			
				|  |  | +                        color="red">正在打开</a-tag>
 | 
	
		
			
				|  |  | +                      <a-tag v-else-if="column.dataIndex === 'frontGateOpen'" color="processing">打开</a-tag>
 | 
	
		
			
				|  |  | +                    </template>
 | 
	
		
			
				|  |  | +                    <template v-else>
 | 
	
		
			
				|  |  | +                      <a-tag
 | 
	
		
			
				|  |  | +                        v-if="column.dataIndex === 'frontGateOpen' && record.frontGateOpen == 0 && record.frontGateClose == 0"
 | 
	
		
			
				|  |  | +                        color="red">正在关闭</a-tag>
 | 
	
		
			
				|  |  | +                      <a-tag
 | 
	
		
			
				|  |  | +                        v-else-if="column.dataIndex === 'frontGateOpen' && record.frontGateOpen == 0 && record.frontGateClose == 1"
 | 
	
		
			
				|  |  | +                        color="default">关闭</a-tag>
 | 
	
		
			
				|  |  | +                      <a-tag
 | 
	
		
			
				|  |  | +                        v-else-if="column.dataIndex === 'frontGateOpen' && record.frontGateOpen == 1 && record.frontGateClose == 0"
 | 
	
		
			
				|  |  | +                        color="default">打开</a-tag>
 | 
	
		
			
				|  |  | +                    </template>
 | 
	
		
			
				|  |  | +                    <template v-if="record.rearGateOpenCtrl">
 | 
	
		
			
				|  |  | +                      <a-tag
 | 
	
		
			
				|  |  | +                        v-if="column.dataIndex === 'rearGateOpen' && record.rearGateOpen == 0 && record.rearGateClose == 0"
 | 
	
		
			
				|  |  | +                        color="red">正在打开</a-tag>
 | 
	
		
			
				|  |  | +                      <a-tag v-else-if="column.dataIndex === 'rearGateOpen'" color="processing">打开</a-tag>
 | 
	
		
			
				|  |  | +                    </template>
 | 
	
		
			
				|  |  | +                    <template v-else>
 | 
	
		
			
				|  |  | +                      <a-tag
 | 
	
		
			
				|  |  | +                        v-if="column.dataIndex === 'rearGateOpen' && record.rearGateOpen == 0 && record.rearGateClose == 0"
 | 
	
		
			
				|  |  | +                        color="red">正在关闭</a-tag>
 | 
	
		
			
				|  |  | +                      <a-tag
 | 
	
		
			
				|  |  | +                        v-else-if="column.dataIndex === 'rearGateOpen' && record.rearGateOpen == 0 && record.rearGateClose == 1"
 | 
	
		
			
				|  |  | +                        color="default">关闭</a-tag>
 | 
	
		
			
				|  |  | +                      <a-tag
 | 
	
		
			
				|  |  | +                        v-else-if="column.dataIndex === 'rearGateOpen' && record.rearGateOpen == 1 && record.rearGateClose == 0"
 | 
	
		
			
				|  |  | +                        color="default">打开</a-tag>
 | 
	
		
			
				|  |  | +                    </template>
 | 
	
		
			
				|  |  | +                  </template>
 | 
	
		
			
				|  |  | +                  <template v-if="deviceType.startsWith('windrect')">
 | 
	
		
			
				|  |  | +                    <a-tag v-if="column.dataIndex === 'sign'"
 | 
	
		
			
				|  |  | +                      :color="record.sign == 0 ? '#95CF65' : record.sign == 1 ? '#4590EA' : '#9876AA'"> {{
 | 
	
		
			
				|  |  | +                        record.sign == 0 ? '高位' : record.sign == 1 ? '中位' : '低位'
 | 
	
		
			
				|  |  | +                      }}</a-tag>
 | 
	
		
			
				|  |  | +                    <template v-if="record && column && column.dataIndex === 'isRun' && record.isRun">
 | 
	
		
			
				|  |  | +                      <a-tag v-if="record.isRun == -2 || record.isRun == -1"
 | 
	
		
			
				|  |  | +                        :color="record.isRun == -2 ? '#95CF65' : '#ED5700'">{{
 | 
	
		
			
				|  |  | +                          record.isRun == -2 ? '空闲' : '等待'
 | 
	
		
			
				|  |  | +                        }}</a-tag>
 | 
	
		
			
				|  |  | +                      <a-tag v-else-if="record.isRun == 100" color="#4693FF">完成</a-tag>
 | 
	
		
			
				|  |  | +                      <Progress v-else :percent="Number(record.isRun)" size="small" status="active" />
 | 
	
		
			
				|  |  | +                    </template>
 | 
	
		
			
				|  |  | +                  </template>
 | 
	
		
			
				|  |  | +                  <a-tag v-if="column.dataIndex === 'warnFlag'"
 | 
	
		
			
				|  |  | +                    :color="record.warnFlag == 0 ? 'green' : record.warnFlag == 1 ? '#FF5812' : 'gray'"> {{
 | 
	
		
			
				|  |  | +                      record.warnFlag == 0 ? '正常' : record.warnFlag == 1 ? '报警' : record.warnFlag == 2 ? '断开' : '未监测'
 | 
	
		
			
				|  |  | +                    }}</a-tag>
 | 
	
		
			
				|  |  | +                  <a-tag v-if="column.dataIndex === 'netStatus'" :color="record.netStatus == 0 ? 'default' : 'green'">{{
 | 
	
		
			
				|  |  | +                    record.netStatus == 0 ? '断开' : '连接'
 | 
	
		
			
				|  |  | +                  }}</a-tag>
 | 
	
		
			
				|  |  | +                </template>
 | 
	
		
			
				|  |  | +              </MonitorTable>
 | 
	
		
			
				|  |  | +            </template>
 | 
	
		
			
				|  |  | +          </a-tab-pane>
 | 
	
		
			
				|  |  | +          <a-tab-pane key="2" tab="历史数据">
 | 
	
		
			
				|  |  | +            <div class="tab-item">
 | 
	
		
			
				|  |  | +              <HistoryTable ref="historyTable" v-if="activeKey == '2' && isRefresh" :sysId="systemID"
 | 
	
		
			
				|  |  | +                :columns-type="`${deviceType}`" :device-type="deviceType"
 | 
	
		
			
				|  |  | +                :device-list-api="getDeviceList.bind(null, { strtype: deviceType, sysId: systemID })"
 | 
	
		
			
				|  |  | +                designScope="device-history" :scroll="scroll" />
 | 
	
		
			
				|  |  | +            </div>
 | 
	
		
			
				|  |  | +          </a-tab-pane>
 | 
	
		
			
				|  |  | +          <a-tab-pane key="3" tab="报警历史">
 | 
	
		
			
				|  |  | +            <div class="tab-item">
 | 
	
		
			
				|  |  | +              <AlarmHistoryTable ref="alarmHistoryTable" v-if="activeKey == '3' && isRefresh" :sysId="systemID"
 | 
	
		
			
				|  |  | +                columns-type="alarm" :device-type="deviceType"
 | 
	
		
			
				|  |  | +                :device-list-api="getDeviceList.bind(null, { strtype: deviceType, sysId: systemID })" :scroll="scroll"
 | 
	
		
			
				|  |  | +                designScope="alarm-history" />
 | 
	
		
			
				|  |  | +            </div>
 | 
	
		
			
				|  |  | +          </a-tab-pane>
 | 
	
		
			
				|  |  | +          <a-tab-pane key="4" tab="操作历史">
 | 
	
		
			
				|  |  | +            <div class="tab-item">
 | 
	
		
			
				|  |  | +              <HandlerHistoryTable ref="handlerHistoryTable" v-if="activeKey == '4' && isRefresh" :sysId="systemID"
 | 
	
		
			
				|  |  | +                columns-type="operatorhistory" :device-type="deviceType"
 | 
	
		
			
				|  |  | +                :device-list-api="getDeviceList.bind(null, { strtype: deviceType, sysId: systemID })" :scroll="scroll"
 | 
	
		
			
				|  |  | +                designScope="operator-history" />
 | 
	
		
			
				|  |  | +            </div>
 | 
	
		
			
				|  |  | +          </a-tab-pane>
 | 
	
		
			
				|  |  | +        </a-tabs>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      </div>
 | 
	
		
			
				|  |  | +    </div>
 | 
	
		
			
				|  |  | +    <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, nextTick, watch, reactive, defineProps } 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 { TreeProps, message, Progress } from 'ant-design-vue';
 | 
	
		
			
				|  |  | +import { TableAction } from '/@/components/Table';
 | 
	
		
			
				|  |  | +import FiberModal from './modal/fiber.modal.vue';
 | 
	
		
			
				|  |  | +import BundleModal from './modal/bundle.modal.vue'
 | 
	
		
			
				|  |  | +import DustModal from './modal/dust.modal.vue'
 | 
	
		
			
				|  |  | +import { SvgIcon } from '/@/components/Icon';
 | 
	
		
			
				|  |  | +import { getActions } from '/@/qiankun/state';
 | 
	
		
			
				|  |  | +import { useRouter } from 'vue-router';
 | 
	
		
			
				|  |  | +import { setDivHeight } from '/@/utils/event';
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +type DeviceType = { deviceType: string, deviceName: string, datalist: any[] };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const props = defineProps({
 | 
	
		
			
				|  |  | +  pageData: {
 | 
	
		
			
				|  |  | +    type: Object,
 | 
	
		
			
				|  |  | +    default: () => {}
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +})
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +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 drawerHeight = ref(240) // 监测框最小高度
 | 
	
		
			
				|  |  | +const treeShow = ref(true) //是否显示树形菜单
 | 
	
		
			
				|  |  | +const locationSettingShow = ref(false) //是否显示树形菜单
 | 
	
		
			
				|  |  | +const treeNodeTitle = ref('') // 选中的树形标题
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const locationList = 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[]>(['0-0-0-1']);
 | 
	
		
			
				|  |  | +const isRefresh = ref(true)
 | 
	
		
			
				|  |  | +const scroll = reactive({
 | 
	
		
			
				|  |  | +  y: 240
 | 
	
		
			
				|  |  | +})
 | 
	
		
			
				|  |  | +const treeData = ref<TreeProps['treeData']>([]);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +//树形菜单选择事件
 | 
	
		
			
				|  |  | +const onSelect: TreeProps['onSelect'] = (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) clearTimeout(timer)
 | 
	
		
			
				|  |  | +  timer = undefined
 | 
	
		
			
				|  |  | +  if (monitorTable.value) monitorTable.value.setLoading(true)
 | 
	
		
			
				|  |  | +  nextTick(() => {
 | 
	
		
			
				|  |  | +    setTimeout(() => {
 | 
	
		
			
				|  |  | +      timer = null
 | 
	
		
			
				|  |  | +      getMonitor()
 | 
	
		
			
				|  |  | +    }, 0)
 | 
	
		
			
				|  |  | +  })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +function tabChange(activeKeyVal) {
 | 
	
		
			
				|  |  | +  activeKey.value = activeKeyVal;
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +function showTree(flag, value) {
 | 
	
		
			
				|  |  | +  if (flag == 'treeShow') treeShow.value = value
 | 
	
		
			
				|  |  | +  if (flag == 'location') locationSettingShow.value = value
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async function getDeviceType() {
 | 
	
		
			
				|  |  | +  if(treeData.value?.length > 0) return
 | 
	
		
			
				|  |  | +  const result = await getDeviceTypeList({})
 | 
	
		
			
				|  |  | +  if (result.length > 0) {
 | 
	
		
			
				|  |  | +    const dataSource = <TreeProps['treeData']>[]
 | 
	
		
			
				|  |  | +    let key = '0'
 | 
	
		
			
				|  |  | +    const getData = (resultList, dataSourceList, keyVal) => {
 | 
	
		
			
				|  |  | +      resultList.forEach((item, index) => {
 | 
	
		
			
				|  |  | +        if (item.children && item.children.length > 0) {
 | 
	
		
			
				|  |  | +          const children = getData(item.children, [], `${keyVal}-${index}`)
 | 
	
		
			
				|  |  | +          dataSourceList.push({
 | 
	
		
			
				|  |  | +            children: children,
 | 
	
		
			
				|  |  | +            title: item.itemText,
 | 
	
		
			
				|  |  | +            key: `${keyVal}-${index}`,
 | 
	
		
			
				|  |  | +            type: item.itemValue,
 | 
	
		
			
				|  |  | +            parentKey: `${keyVal}`
 | 
	
		
			
				|  |  | +          });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +          dataSourceList.push({
 | 
	
		
			
				|  |  | +            children: [],
 | 
	
		
			
				|  |  | +            title: item.itemText,
 | 
	
		
			
				|  |  | +            key: `${keyVal}-${index}`,
 | 
	
		
			
				|  |  | +            type: item.itemValue,
 | 
	
		
			
				|  |  | +            parentKey: `${keyVal}`
 | 
	
		
			
				|  |  | +          });
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +      return dataSourceList
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    treeData.value = getData(result, dataSource, key)
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// https获取监测数据
 | 
	
		
			
				|  |  | +let timer: null | NodeJS.Timeout = undefined;
 | 
	
		
			
				|  |  | +function getMonitor() {
 | 
	
		
			
				|  |  | +  if (deviceType.value) {
 | 
	
		
			
				|  |  | +    if (timer) timer = null
 | 
	
		
			
				|  |  | +    if (Object.prototype.toString.call(timer) === '[object Null]') {
 | 
	
		
			
				|  |  | +      timer = setTimeout(async () => {
 | 
	
		
			
				|  |  | +        await getDataSource()
 | 
	
		
			
				|  |  | +        if (timer) {
 | 
	
		
			
				|  |  | +          getMonitor();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }, 1000);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async function getDataSource() {
 | 
	
		
			
				|  |  | +  if (deviceType.value && 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 })
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    deviceList.value = deviceArr
 | 
	
		
			
				|  |  | +    if (deviceArr.length > 0) {
 | 
	
		
			
				|  |  | +      if (deviceArr[1]) {
 | 
	
		
			
				|  |  | +        deviceActive.value = deviceArr[1].deviceType
 | 
	
		
			
				|  |  | +        monitorChange(1)
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +        deviceActive.value = deviceArr[0].deviceType
 | 
	
		
			
				|  |  | +        monitorChange(0)
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  } 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);
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +function goLocation(record) {
 | 
	
		
			
				|  |  | +  actions.setGlobalState({ locationId: record.deviceID, locationObj: null, pageObj: null });
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +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')) { //bundletube
 | 
	
		
			
				|  |  | +      activeID.value = record.deviceID
 | 
	
		
			
				|  |  | +      currentModal.value = DustModal
 | 
	
		
			
				|  |  | +      modalVisible.value = true;
 | 
	
		
			
				|  |  | +    } else if (deviceType.value.startsWith('bundletube')) {
 | 
	
		
			
				|  |  | +      activeID.value = record.deviceID
 | 
	
		
			
				|  |  | +      currentModal.value = BundleModal
 | 
	
		
			
				|  |  | +      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 if (deviceType.value.indexOf("nitrogen") != -1) {
 | 
	
		
			
				|  |  | +      const newPage = router.resolve({ path: '/compressor-home' })
 | 
	
		
			
				|  |  | +      window.open(newPage.href, '_blank')
 | 
	
		
			
				|  |  | +    } else if (deviceType.value.indexOf("pulping") != -1) {
 | 
	
		
			
				|  |  | +      const newPage = router.resolve({ path: '/grout-home' })
 | 
	
		
			
				|  |  | +      window.open(newPage.href, '_blank')
 | 
	
		
			
				|  |  | +    } else if (deviceType.value.indexOf("pressurefan") != -1) {
 | 
	
		
			
				|  |  | +      const newPage = router.resolve({ path: '/nitrogen/home' })
 | 
	
		
			
				|  |  | +      window.open(newPage.href, '_blank')
 | 
	
		
			
				|  |  | +    } else if (deviceType.value.indexOf("chamber") != -1) {
 | 
	
		
			
				|  |  | +      const newPage = router.resolve({ path: '/chamber-home' })
 | 
	
		
			
				|  |  | +      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('待开发。。。')
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +function toHome() {
 | 
	
		
			
				|  |  | +  deviceList.value = []
 | 
	
		
			
				|  |  | +  if (timer) clearTimeout(timer)
 | 
	
		
			
				|  |  | +  timer = undefined
 | 
	
		
			
				|  |  | +  deviceType.value = ''
 | 
	
		
			
				|  |  | +  actions.setGlobalState({ pageObj: { pageType: 'home' } });
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +async function findTreeDataValue(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
 | 
	
		
			
				|  |  | +        return true
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      return false
 | 
	
		
			
				|  |  | +    })
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  findDeviceType(treeData.value, obj)
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  if (timer === undefined) {
 | 
	
		
			
				|  |  | +    timer = null
 | 
	
		
			
				|  |  | +    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)
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * 设置巷道设备定位图标的显示与隐藏
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +function setLocation() {
 | 
	
		
			
				|  |  | +  let locationStr = ''
 | 
	
		
			
				|  |  | +  locationList.value.forEach((item: any) => {
 | 
	
		
			
				|  |  | +    if (item.Visible) {
 | 
	
		
			
				|  |  | +      locationStr = locationStr ? locationStr + ',' + item.value : item.value
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  })
 | 
	
		
			
				|  |  | +  actions.setGlobalState({ locationId: null, locationObj: null, pageObj: null, locationPlane: locationStr });
 | 
	
		
			
				|  |  | +  setTimeout(() => {
 | 
	
		
			
				|  |  | +    message.success('设置成功')
 | 
	
		
			
				|  |  | +  }, 600)
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +watch(() => scroll.y, () => {
 | 
	
		
			
				|  |  | +  isRefresh.value = false
 | 
	
		
			
				|  |  | +  nextTick(() => {
 | 
	
		
			
				|  |  | +    isRefresh.value = true
 | 
	
		
			
				|  |  | +  })
 | 
	
		
			
				|  |  | +})
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +onMounted(async () => {
 | 
	
		
			
				|  |  | +  await getDeviceType()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  const pageObj = props.pageData
 | 
	
		
			
				|  |  | +  if (pageObj.deviceid) {
 | 
	
		
			
				|  |  | +    findTreeDataValue({ deviceid: pageObj.deviceid })
 | 
	
		
			
				|  |  | +  } else {
 | 
	
		
			
				|  |  | +    findTreeDataValue({ deviceType: pageObj.pageType })
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  // 定位
 | 
	
		
			
				|  |  | +  const posShowData = pageObj.locationPlane
 | 
	
		
			
				|  |  | +  if (posShowData) {
 | 
	
		
			
				|  |  | +    locationList.value = posShowData
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +})
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +onUnmounted(() => {
 | 
	
		
			
				|  |  | +  if (timer) {
 | 
	
		
			
				|  |  | +    clearTimeout(timer);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  timer = undefined;
 | 
	
		
			
				|  |  | +})
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +</script>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +<style lang="less" scoped >
 | 
	
		
			
				|  |  | +@import '/@/design/vent/modal.less';
 | 
	
		
			
				|  |  | +@ventSpace: zxm;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.device-header {
 | 
	
		
			
				|  |  | +  position: fixed;
 | 
	
		
			
				|  |  | +  width: 100%;
 | 
	
		
			
				|  |  | +  height: 56px;
 | 
	
		
			
				|  |  | +  background: url('/@/assets/images/vent/home/modal-top.png');
 | 
	
		
			
				|  |  | +  text-align: center;
 | 
	
		
			
				|  |  | +  line-height: 56px;
 | 
	
		
			
				|  |  | +  font-size: 28px;
 | 
	
		
			
				|  |  | +  color: #ffffffdd;
 | 
	
		
			
				|  |  | +  font-weight: 600;
 | 
	
		
			
				|  |  | +  z-index: -1;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.select-node {
 | 
	
		
			
				|  |  | +  position: fixed;
 | 
	
		
			
				|  |  | +  top: 60px;
 | 
	
		
			
				|  |  | +  left: 10px;
 | 
	
		
			
				|  |  | +  color: #fff;
 | 
	
		
			
				|  |  | +  display: flex;
 | 
	
		
			
				|  |  | +  justify-content: center;
 | 
	
		
			
				|  |  | +  font-size: 22px;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  .title {
 | 
	
		
			
				|  |  | +    margin-left: 10px;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.expansion-icon {
 | 
	
		
			
				|  |  | +  background: url('/@/assets/images/vent/home/tree-icon-bg.png') no-repeat;
 | 
	
		
			
				|  |  | +  background-size: contain;
 | 
	
		
			
				|  |  | +  position: absolute;
 | 
	
		
			
				|  |  | +  left: 190px;
 | 
	
		
			
				|  |  | +  top: 25px;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  &:hover {
 | 
	
		
			
				|  |  | +    background: url('/@/assets/images/vent/home/tree-icon-hover-bg.png') no-repeat;
 | 
	
		
			
				|  |  | +    background-size: contain;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.device-select {
 | 
	
		
			
				|  |  | +  width: 250px;
 | 
	
		
			
				|  |  | +  height: 500px;
 | 
	
		
			
				|  |  | +  background: url('/@/assets/images/vent/home/tree-bg.png') no-repeat;
 | 
	
		
			
				|  |  | +  position: fixed;
 | 
	
		
			
				|  |  | +  top: 60px;
 | 
	
		
			
				|  |  | +  left: 10px;
 | 
	
		
			
				|  |  | +  background-size: contain;
 | 
	
		
			
				|  |  | +  pointer-events: auto;
 | 
	
		
			
				|  |  | +  padding: 20px 10px 30px 10px;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.is-expansion-icon {
 | 
	
		
			
				|  |  | +  padding: 5px;
 | 
	
		
			
				|  |  | +  pointer-events: auto;
 | 
	
		
			
				|  |  | +  z-index: 999;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.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 {
 | 
	
		
			
				|  |  | +  width: 276px;
 | 
	
		
			
				|  |  | +  height: 44px;
 | 
	
		
			
				|  |  | +  background: url('/@/assets/images/vent/home/tree-expansion-bg.png') no-repeat;
 | 
	
		
			
				|  |  | +  left: 10px;
 | 
	
		
			
				|  |  | +  animation-name: treeShow;
 | 
	
		
			
				|  |  | +  /* 持续时间 */
 | 
	
		
			
				|  |  | +  animation-duration: 1s;
 | 
	
		
			
				|  |  | +  transition: all 1s cubic-bezier(0.165, 0.84, 0.44, 1) .5s;
 | 
	
		
			
				|  |  | +  display: flex;
 | 
	
		
			
				|  |  | +  align-items: center;
 | 
	
		
			
				|  |  | +  margin-left: 0;
 | 
	
		
			
				|  |  | +  justify-content: flex-start;
 | 
	
		
			
				|  |  | +  pointer-events: auto;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  &:hover {
 | 
	
		
			
				|  |  | +    background: url('/@/assets/images/vent/home/tree-expansion-hover-bg.png') no-repeat;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  .put-away-icon {
 | 
	
		
			
				|  |  | +    position: relative;
 | 
	
		
			
				|  |  | +    display: inline-block;
 | 
	
		
			
				|  |  | +    left: 4px;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.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;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    .zxm-tree-switcher {
 | 
	
		
			
				|  |  | +      background: transparent !important;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    .zxm-tree-node-content-wrapper.zxm-tree-node-selected {
 | 
	
		
			
				|  |  | +      background-color: #00b1c8;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    .zxm-tree-node-content-wrapper:hover {
 | 
	
		
			
				|  |  | +      background-color: #00b1c855;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    input {
 | 
	
		
			
				|  |  | +      height: 0px !important;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  &::-webkit-scrollbar-track {
 | 
	
		
			
				|  |  | +    -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;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.location-icon {
 | 
	
		
			
				|  |  | +  width: 46px;
 | 
	
		
			
				|  |  | +  height: 178px;
 | 
	
		
			
				|  |  | +  position: absolute;
 | 
	
		
			
				|  |  | +  top: 60px;
 | 
	
		
			
				|  |  | +  // right: 0;
 | 
	
		
			
				|  |  | +  background: url('/@/assets/images/vent/home/location-bg.png') no-repeat;
 | 
	
		
			
				|  |  | +  background-size: contain;
 | 
	
		
			
				|  |  | +  writing-mode: vertical-lr;
 | 
	
		
			
				|  |  | +  line-height: 46px;
 | 
	
		
			
				|  |  | +  color: #fff;
 | 
	
		
			
				|  |  | +  padding-top: 10px;
 | 
	
		
			
				|  |  | +  pointer-events: auto;
 | 
	
		
			
				|  |  | +  cursor: pointer;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  &:hover {
 | 
	
		
			
				|  |  | +    background: url('/@/assets/images/vent/home/location-hover-bg.png') no-repeat;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  .location-text {
 | 
	
		
			
				|  |  | +    padding-top: 20px;
 | 
	
		
			
				|  |  | +    letter-spacing: 3px;
 | 
	
		
			
				|  |  | +    font-size: 16px;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.location-select {
 | 
	
		
			
				|  |  | +  position: fixed;
 | 
	
		
			
				|  |  | +  top: 60px;
 | 
	
		
			
				|  |  | +  // right: 240px;
 | 
	
		
			
				|  |  | +  pointer-events: auto;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  .location-select-box {
 | 
	
		
			
				|  |  | +    width: 100%;
 | 
	
		
			
				|  |  | +    height: 100%;
 | 
	
		
			
				|  |  | +    position: relative;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    &::before {
 | 
	
		
			
				|  |  | +      content: "";
 | 
	
		
			
				|  |  | +      position: absolute;
 | 
	
		
			
				|  |  | +      width: 230px;
 | 
	
		
			
				|  |  | +      height: 500px;
 | 
	
		
			
				|  |  | +      top: 0;
 | 
	
		
			
				|  |  | +      left: 0;
 | 
	
		
			
				|  |  | +      background: url('/@/assets/images/vent/home/tree-bg.png') no-repeat;
 | 
	
		
			
				|  |  | +      background-size: contain;
 | 
	
		
			
				|  |  | +      transform: rotateY(180deg);
 | 
	
		
			
				|  |  | +      z-index: -1;
 | 
	
		
			
				|  |  | +      // &:hover {
 | 
	
		
			
				|  |  | +      //   background: url('/@/assets/images/vent/home/tree-icon-hover-bg.png') no-repeat;
 | 
	
		
			
				|  |  | +      //   background-size: contain;
 | 
	
		
			
				|  |  | +      // }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    .location-top-title {
 | 
	
		
			
				|  |  | +      color: #fff;
 | 
	
		
			
				|  |  | +      position: absolute;
 | 
	
		
			
				|  |  | +      width: 225px;
 | 
	
		
			
				|  |  | +      height: 68px;
 | 
	
		
			
				|  |  | +      background: url('/@/assets/images/vent/home/turn-location-top-bg.png') no-repeat;
 | 
	
		
			
				|  |  | +      background-size: contain;
 | 
	
		
			
				|  |  | +      top: 5px;
 | 
	
		
			
				|  |  | +      left: 5px;
 | 
	
		
			
				|  |  | +      display: flex;
 | 
	
		
			
				|  |  | +      flex-direction: row;
 | 
	
		
			
				|  |  | +      justify-content: space-between;
 | 
	
		
			
				|  |  | +      align-items: flex-end;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      .title {
 | 
	
		
			
				|  |  | +        font-size: 18px;
 | 
	
		
			
				|  |  | +        position: relative;
 | 
	
		
			
				|  |  | +        top: -14px;
 | 
	
		
			
				|  |  | +        right: 15px;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    .location-expansion-icon {
 | 
	
		
			
				|  |  | +      background: url('/@/assets/images/vent/home/tree-icon-cover-bg.png') no-repeat;
 | 
	
		
			
				|  |  | +      background-size: contain;
 | 
	
		
			
				|  |  | +      position: relative;
 | 
	
		
			
				|  |  | +      left: 10px;
 | 
	
		
			
				|  |  | +      top: -15px;
 | 
	
		
			
				|  |  | +      padding: 5px;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      &:hover {
 | 
	
		
			
				|  |  | +        background: url('/@/assets/images/vent/home/tree-icon-cover-hover-bg.png') no-repeat;
 | 
	
		
			
				|  |  | +        background-size: contain;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  .location-container {
 | 
	
		
			
				|  |  | +    width: 200px;
 | 
	
		
			
				|  |  | +    height: 390px;
 | 
	
		
			
				|  |  | +    position: absolute;
 | 
	
		
			
				|  |  | +    display: flex;
 | 
	
		
			
				|  |  | +    flex-direction: column;
 | 
	
		
			
				|  |  | +    top: 80px;
 | 
	
		
			
				|  |  | +    left: 18px;
 | 
	
		
			
				|  |  | +    overflow-y: auto;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    .location-item {
 | 
	
		
			
				|  |  | +      color: #fff;
 | 
	
		
			
				|  |  | +      line-height: 30px;
 | 
	
		
			
				|  |  | +      display: flex;
 | 
	
		
			
				|  |  | +      justify-content: space-between;
 | 
	
		
			
				|  |  | +      background-image: linear-gradient(to left, #39f5ff05, #39f5ff10);
 | 
	
		
			
				|  |  | +      margin: 3px 0;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      .item-title {
 | 
	
		
			
				|  |  | +        width: 80px;
 | 
	
		
			
				|  |  | +        text-align: right;
 | 
	
		
			
				|  |  | +        color: #87f1ff;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    .location-bottom-btn {
 | 
	
		
			
				|  |  | +      width: 100%;
 | 
	
		
			
				|  |  | +      color: #fff;
 | 
	
		
			
				|  |  | +      display: flex;
 | 
	
		
			
				|  |  | +      justify-content: flex-end;
 | 
	
		
			
				|  |  | +      margin-top: 20px;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      span {
 | 
	
		
			
				|  |  | +        display: inline-block;
 | 
	
		
			
				|  |  | +        width: 100%;
 | 
	
		
			
				|  |  | +        background: #00709955;
 | 
	
		
			
				|  |  | +        border-radius: 3px;
 | 
	
		
			
				|  |  | +        border: 1px solid rgba(174, 243, 255, 0.3);
 | 
	
		
			
				|  |  | +        text-align: center;
 | 
	
		
			
				|  |  | +        padding: 2px 0;
 | 
	
		
			
				|  |  | +        cursor: pointer;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        &:hover {
 | 
	
		
			
				|  |  | +          background: #00557422;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.location-select-show {
 | 
	
		
			
				|  |  | +  right: 240px;
 | 
	
		
			
				|  |  | +  animation-name: locationShow;
 | 
	
		
			
				|  |  | +  /* 持续时间 */
 | 
	
		
			
				|  |  | +  animation-duration: 1s;
 | 
	
		
			
				|  |  | +  transition: all 1s cubic-bezier(0.165, 0.84, 0.44, 1) .5s;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.location-select-hide {
 | 
	
		
			
				|  |  | +  right: -2px;
 | 
	
		
			
				|  |  | +  animation-name: locationHide;
 | 
	
		
			
				|  |  | +  /* 持续时间 */
 | 
	
		
			
				|  |  | +  animation-duration: 1s;
 | 
	
		
			
				|  |  | +  transition: all 1s cubic-bezier(0.165, 0.84, 0.44, 1) .5s;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.location-btn-show {
 | 
	
		
			
				|  |  | +  right: -0px;
 | 
	
		
			
				|  |  | +  animation-name: locationBtnShow;
 | 
	
		
			
				|  |  | +  /* 持续时间 */
 | 
	
		
			
				|  |  | +  animation-duration: 1s;
 | 
	
		
			
				|  |  | +  transition: all 1s cubic-bezier(0.165, 0.84, 0.44, 1) .5s;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.location-btn-hide {
 | 
	
		
			
				|  |  | +  right: -240px;
 | 
	
		
			
				|  |  | +  animation-name: locationBtnHide;
 | 
	
		
			
				|  |  | +  /* 持续时间 */
 | 
	
		
			
				|  |  | +  animation-duration: 1s;
 | 
	
		
			
				|  |  | +  transition: all 1s cubic-bezier(0.165, 0.84, 0.44, 1) .5s;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.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: -62px;
 | 
	
		
			
				|  |  | +    right: 36px;
 | 
	
		
			
				|  |  | +    border-radius: 10px;
 | 
	
		
			
				|  |  | +    padding: 8px;
 | 
	
		
			
				|  |  | +    backdrop-filter: blur(10px);
 | 
	
		
			
				|  |  | +    background-color: rgba(45, 86, 137, 0.418);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    &:hover {
 | 
	
		
			
				|  |  | +      background-color: rgba(79, 104, 134, 0.418);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  .device-button-group {
 | 
	
		
			
				|  |  | +    position: absolute;
 | 
	
		
			
				|  |  | +    top: -27px;
 | 
	
		
			
				|  |  | +    left: 30px;
 | 
	
		
			
				|  |  | +    display: flex;
 | 
	
		
			
				|  |  | +    width: 100%;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    .device-button {
 | 
	
		
			
				|  |  | +      height: 26px;
 | 
	
		
			
				|  |  | +      padding: 0 20px;
 | 
	
		
			
				|  |  | +      background: linear-gradient(45deg, #04e6fb55, #0c5cab55);
 | 
	
		
			
				|  |  | +      clip-path: polygon(10px 0,
 | 
	
		
			
				|  |  | +          0 50%,
 | 
	
		
			
				|  |  | +          10px 100%,
 | 
	
		
			
				|  |  | +          100% 100%,
 | 
	
		
			
				|  |  | +          calc(100% - 10px) 50%,
 | 
	
		
			
				|  |  | +          100% 0);
 | 
	
		
			
				|  |  | +      display: flex;
 | 
	
		
			
				|  |  | +      justify-content: center;
 | 
	
		
			
				|  |  | +      align-items: center;
 | 
	
		
			
				|  |  | +      color: #FFF;
 | 
	
		
			
				|  |  | +      position: relative;
 | 
	
		
			
				|  |  | +      cursor: pointer;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      &:nth-child(1) {
 | 
	
		
			
				|  |  | +        left: calc(-6px * 1);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      &:nth-child(2) {
 | 
	
		
			
				|  |  | +        left: calc(-6px * 2);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      &:nth-child(3) {
 | 
	
		
			
				|  |  | +        left: calc(-6px * 3);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      &:nth-child(4) {
 | 
	
		
			
				|  |  | +        left: calc(-6px * 4);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      &:nth-child(5) {
 | 
	
		
			
				|  |  | +        left: calc(-6px * 5);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      &:nth-child(6) {
 | 
	
		
			
				|  |  | +        left: calc(-6px * 6);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      &:nth-child(7) {
 | 
	
		
			
				|  |  | +        left: calc(-6px * 7);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      &:nth-child(8) {
 | 
	
		
			
				|  |  | +        left: calc(-6px * 8);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      &:nth-child(9) {
 | 
	
		
			
				|  |  | +        left: calc(-6px * 9);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      &:nth-child(10) {
 | 
	
		
			
				|  |  | +        left: calc(-6px * 10);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      &:nth-child(11) {
 | 
	
		
			
				|  |  | +        left: calc(-6px * 11);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      &:nth-child(12) {
 | 
	
		
			
				|  |  | +        left: calc(-6px * 12);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      &:nth-child(13) {
 | 
	
		
			
				|  |  | +        left: calc(-6px * 13);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      &:nth-child(14) {
 | 
	
		
			
				|  |  | +        left: calc(-6px * 14);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      &:nth-child(15) {
 | 
	
		
			
				|  |  | +        left: calc(-6px * 15);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      &:first-child {
 | 
	
		
			
				|  |  | +        clip-path: polygon(0 0,
 | 
	
		
			
				|  |  | +            10px 50%,
 | 
	
		
			
				|  |  | +            0 100%,
 | 
	
		
			
				|  |  | +            100% 100%,
 | 
	
		
			
				|  |  | +            calc(100% - 10px) 50%,
 | 
	
		
			
				|  |  | +            100% 0);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    .device-active {
 | 
	
		
			
				|  |  | +      background: linear-gradient(45deg, #04e6fb, #0c5cab);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      &::before {
 | 
	
		
			
				|  |  | +        border-color: #0efcff;
 | 
	
		
			
				|  |  | +        box-shadow: 1px 1px 3px 1px #0efcff inset;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  .enter-detail {
 | 
	
		
			
				|  |  | +    color: #fff;
 | 
	
		
			
				|  |  | +    cursor: pointer;
 | 
	
		
			
				|  |  | +    position: absolute;
 | 
	
		
			
				|  |  | +    right: 120px;
 | 
	
		
			
				|  |  | +    top: -6px;
 | 
	
		
			
				|  |  | +    padding: 5px;
 | 
	
		
			
				|  |  | +    border-radius: 5px;
 | 
	
		
			
				|  |  | +    margin-left: 8px;
 | 
	
		
			
				|  |  | +    margin-right: 8px;
 | 
	
		
			
				|  |  | +    width: auto;
 | 
	
		
			
				|  |  | +    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);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +@keyframes treeShow {
 | 
	
		
			
				|  |  | +  0% {
 | 
	
		
			
				|  |  | +    left: -400px;
 | 
	
		
			
				|  |  | +    opacity: 0;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  100% {
 | 
	
		
			
				|  |  | +    left: 10px;
 | 
	
		
			
				|  |  | +    opacity: 1;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +@keyframes treeHide {
 | 
	
		
			
				|  |  | +  0% {
 | 
	
		
			
				|  |  | +    left: 10px;
 | 
	
		
			
				|  |  | +    opacity: 1;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  100% {
 | 
	
		
			
				|  |  | +    left: -400px;
 | 
	
		
			
				|  |  | +    opacity: 0;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +@keyframes locationShow {
 | 
	
		
			
				|  |  | +  0% {
 | 
	
		
			
				|  |  | +    right: 0px;
 | 
	
		
			
				|  |  | +    opacity: 0;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  100% {
 | 
	
		
			
				|  |  | +    right: 240px;
 | 
	
		
			
				|  |  | +    opacity: 1;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +@keyframes locationHide {
 | 
	
		
			
				|  |  | +  0% {
 | 
	
		
			
				|  |  | +    right: 240px;
 | 
	
		
			
				|  |  | +    opacity: 1;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  100% {
 | 
	
		
			
				|  |  | +    right: 0;
 | 
	
		
			
				|  |  | +    opacity: 0;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +@keyframes locationBtnShow {
 | 
	
		
			
				|  |  | +  0% {
 | 
	
		
			
				|  |  | +    right: -240px;
 | 
	
		
			
				|  |  | +    opacity: 0;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  100% {
 | 
	
		
			
				|  |  | +    right: -2px;
 | 
	
		
			
				|  |  | +    opacity: 1;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +@keyframes locationBtnHide {
 | 
	
		
			
				|  |  | +  0% {
 | 
	
		
			
				|  |  | +    right: -2px;
 | 
	
		
			
				|  |  | +    opacity: 1;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  100% {
 | 
	
		
			
				|  |  | +    right: -240px;
 | 
	
		
			
				|  |  | +    opacity: 0;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +:deep(.@{ventSpace}-tabs-tabpane-active) {
 | 
	
		
			
				|  |  | +  // overflow: auto;
 | 
	
		
			
				|  |  | +  height: 100%;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +:deep(.zxm-select-dropdown) {
 | 
	
		
			
				|  |  | +  left: 0 !important;
 | 
	
		
			
				|  |  | +}</style>
 |