From b4a603e7e1c123195f5515aa7c3b247e1784fb76 Mon Sep 17 00:00:00 2001 From: haoxuan <haoxuan> Date: 星期三, 24 一月 2024 14:53:00 +0800 Subject: [PATCH] 1 --- src/views/dashboard/components/DashboardTitle.vue | 225 ++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 201 insertions(+), 24 deletions(-) diff --git a/src/views/dashboard/components/DashboardTitle.vue b/src/views/dashboard/components/DashboardTitle.vue index d52b218..aa9cf3d 100644 --- a/src/views/dashboard/components/DashboardTitle.vue +++ b/src/views/dashboard/components/DashboardTitle.vue @@ -1,58 +1,235 @@ <template> <div class="dashboard-title"> - <div class="title-text">鏅鸿兘宸ヤ綔鍙� 鈥� {{ deviceStore?.devices?.currentDeviceID ?? '' }}</div> + <div class="title-text-box"> + <div class="title-text"> + <span> 鏅鸿兘宸ヤ綔鍙� 鈥�</span> + <el-popover placement="bottom" :width="180" trigger="click" :content="currentDeviceName"> + <template #reference> + <el-text truncated class="device-name">{{ currentDeviceName }}</el-text> + </template> + </el-popover> + <el-icon class="text-icon" color="#0db7f5" @click="openDevicesModal"> + <IconSlider></IconSlider> + </el-icon> + </div> + </div> <div class="title-status"> - <div class="connection-info" @click="openSelectDeviceModal"> - <el-icon size="30" color="red"> + <div class="connection-info" @click="openProblemsModal"> + <el-icon class="size_26" :color="problemsIconStatus ? '#00ff00' : '#ff0000'"> <AlertLightIcon></AlertLightIcon> </el-icon> </div> - <div class="connection-status"></div> + <div class="cloud-connection-status"> + <el-icon v-if="cloudConnectionIconStatus" class="size_36" color="#00ff00"> + <IconCloudDone></IconCloudDone> + </el-icon> + + <el-icon v-else class="size_36" color="#ff0000"> + <IconCloudOff></IconCloudOff> + </el-icon> + </div> + + <div class="reporting-record"> + <el-icon + class="size_26" + :color="taskStore.activeTask ? '#0db7f5' : '#c0c0c0'" + :style="{ 'margin-right': '10px', cursor: taskStore.activeTask ? 'pointer' : 'not-allowed' }" + @click="openReportingRecord" + > + <IconRecords></IconRecords> + </el-icon> + </div> + + <div class="params-config" @click="openConfigModal"> + <el-icon class="size_28"><Setting /></el-icon> + </div> </div> </div> - - <TroubleTrackerModal v-model="showModal"></TroubleTrackerModal> + <DeviceCheckList v-model="showDevicesModal" @should-reload="emits('shouldReload')"></DeviceCheckList> + <TroubleTrackerModal v-model="showProblemsModal" :problems="problemList"></TroubleTrackerModal> + <DeliverParamsConfigModal v-model="showConfigModal"></DeliverParamsConfigModal> + <ReportingRecordModal v-model="showReportingRecordModal"></ReportingRecordModal> </template> <script setup lang="ts"> import AlertLightIcon from '@/components/icons/AlertLightIcon.vue' -import { ref } from 'vue' +import IconRecords from '~icons/vaadin/records' +import { computed, onUnmounted, ref } from 'vue' import { useDevicesStore } from '@/stores/devices' import TroubleTrackerModal from '@/views/dashboard/components/TroubleTrackerModal.vue' +import DeviceCheckList from '@/views/dashboard/components/DeviceCheckList.vue' +import IconCloudDone from '~icons/material-symbols-light/cloud-done-outline' +import IconCloudOff from '~icons/material-symbols-light/cloud-off-outline' +import IconSlider from '~icons/bx/slider' +import { useRequest } from 'vue-hooks-plus' +import { apiGetProblemList } from '@/api' +import { PROBLEMS_POLLING_DURATION } from '@/common/constants' +import { Setting } from '@element-plus/icons-vue' +import DeliverParamsConfigModal from '@/views/dashboard/components/DeliverParamsConfigModal.vue' +import ReportingRecordModal from '@/views/dashboard/components/ReportingRecordModal.vue' +import { useTasksStore } from '@/stores/tasks' -export interface DashBoardTitleProps { - // deviceInfo: Devices +const emits = defineEmits<{ + shouldReload: [] +}>() + +// 鏄惁鏄剧ず闂璇婃柇modal +const showProblemsModal = ref(false) +/** + * 鎵撳紑闂璇婃柇modal + */ +function openProblemsModal() { + showProblemsModal.value = true } -const props = defineProps<DashBoardTitleProps>() - -const showModal = ref(false) - -function openSelectDeviceModal() { - showModal.value = true +// 鏄惁鏄剧ず璁惧鍒囨崲modal +const showDevicesModal = ref(false) +/** + * 鎵撳紑璁惧鍒囨崲modal + */ +function openDevicesModal() { + showDevicesModal.value = true } +// 鑾峰彇褰撳墠璁惧鍚� const deviceStore = useDevicesStore() +const currentDeviceName = computed(() => { + return ( + deviceStore?.deviceInfo?.deviceList?.find((ele) => ele?.deviceID === deviceStore?.deviceInfo?.currentDeviceID) + ?.deviceName ?? '' + ) +}) -deviceStore.getDevicesInfo() +// 闂璇婃柇鍒楄〃 +const problemList = computed(() => { + return problemsRes?.value?.data ?? [] +}) +// 闂璇婃柇icon鐘舵��, 闂鍒楄〃涓湁涓�鏉″紓甯稿嵆涓虹孩鐏� 鍚﹀垯鏄豢鐏� true缁跨伅 +const problemsIconStatus = computed(() => { + if (!problemList.value || !problemList.value?.length) { + // 榛樿缁跨伅, 鎷垮埌涓�娆℃暟鎹悗鎵嶄互鎺ュ彛涓哄噯 + return true + } + return !problemList.value.some((ele) => !ele.CheckResult) +}) +// 浜戠杩炴帴icon鐘舵��, 闂鍒楄〃涓湁涓�鏉′唬琛ㄤ簯绔摼鎺ョ殑, 寮傚父鍗充负绾㈣壊浜慽con 鍚﹀垯鏄豢鑹� true缁夸簯 +const cloudConnectionIconStatus = computed(() => { + if (!problemList.value || !problemList.value?.length) { + // 榛樿缁跨伅, 鎷垮埌涓�娆℃暟鎹悗鎵嶄互鎺ュ彛涓哄噯 + return true + } + // 娌℃暟鎹氨褰撴槸閾炬帴姝e父 + const cloudConnection = problemList.value.find((ele) => ele.ItemCode === 'cloud') + return cloudConnection ? cloudConnection?.CheckResult : true +}) + +// 閰嶇疆涓嬪彂鍙傛暟寮圭獥 +const showConfigModal = ref(false) +function openConfigModal() { + showConfigModal.value = true +} +function closeConfigModal() { + showConfigModal.value = false +} +/** + * 杞闂璇婃柇 + */ +const { + data: problemsRes, + run: startProblemsPolling, + cancel: cancelProblemsPolling +} = useRequest(apiGetProblemList, { + manual: true, + pollingInterval: PROBLEMS_POLLING_DURATION, + pollingWhenHidden: false +}) +startProblemsPolling() +onUnmounted(() => { + cancelProblemsPolling() +}) + +const taskStore = useTasksStore() + +// 鏄惁鏄剧ず鎶ュ伐璁板綍 +const showReportingRecordModal = ref(false) +function openReportingRecord() { + if (!taskStore.activeTask) { + ElMessage.error('璇峰厛閫夋嫨浠诲姟') + return + } + showReportingRecordModal.value = true +} </script> <style scoped lang="scss"> .dashboard-title { position: relative; + height: 100%; } -.title-text { - display: flex; - align-items: center; - justify-content: center; - font-size: 40px; - font-weight: 700; +.el-icon.size_28 { + font-size: 28px; } +.size_26 { + font-size: 26px; +} +.size_36 { + font-size: 36px; +} +.title-text-box { + width: calc(100% - 150px); + height: 100%; + + .title-text { + // display: flex; + width: 450px; + height: 100%; + margin: 0 auto; + margin-left: 24%; + align-items: center; + line-height: 68px; + // justify-content: center; + font-size: 34px; + font-weight: 700; + span { + float: left; + } + .text-icon { + font-size: 32px; + margin-left: 4px; + cursor: pointer; + } + } +} + .title-status { + height: 100%; + display: flex; + vertical-align: middle; + align-items: center; position: absolute; - top: 16px; - right: 40px; + top: 0px; + right: 6px; + div { + vertical-align: middle; + display: inline-block; + margin-top: 7px; + } + .cloud-connection-status { + // margin-top: 5px; + } } .connection-info { + margin-right: 10px; + cursor: pointer; +} +.device-name { + max-width: 180px; + font-size: 40px; + color: #fff; +} +.cloud-connection-status { + margin-right: 10px; +} +.params-config { cursor: pointer; } </style> -- Gitblit v1.8.0