From 4a4c65d0d2e7b5db4c4ea6ba7af0e800f83a890a Mon Sep 17 00:00:00 2001
From: 罗广辉 <guanghui.luo@foxmail.com>
Date: Tue, 08 Apr 2025 11:50:20 +0800
Subject: [PATCH] feat: 事件概况left对接完成
---
src/views/Home/HomeRight/EventOverview.vue | 14 +
src/views/Home/EventOverviewDetail/EventOverviewDetailLeft/EventTrendAnalysis.vue | 106 +++++++++++++
src/views/Home/EventOverviewDetail/EventOverviewDetail.vue | 7
src/store/modules/home.js | 4
src/views/Home/EventOverviewDetail/EventOverviewDetailLeft/EventTop5.vue | 98 ++++++++++++
src/components/CommonTitle.vue | 2
src/views/Home/EventOverviewDetail/EventOverviewDetailLeft/EventOverviewDetailLeft.vue | 70 ++++++++
src/views/Home/EventOverviewDetail/EventOverviewDetailLeft/EventDataAnalysis.vue | 115 ++++++++++++++
src/views/Home/Home.vue | 61 ++++---
9 files changed, 444 insertions(+), 33 deletions(-)
diff --git a/src/components/CommonTitle.vue b/src/components/CommonTitle.vue
index eef6d28..efe77c2 100644
--- a/src/components/CommonTitle.vue
+++ b/src/components/CommonTitle.vue
@@ -10,7 +10,7 @@
const props = defineProps({
title: {
type: String,
- default: '机巢概况',
+ default: '标题',
},
text: {
type: String,
diff --git a/src/store/modules/home.js b/src/store/modules/home.js
index dede0d9..74a7360 100644
--- a/src/store/modules/home.js
+++ b/src/store/modules/home.js
@@ -5,6 +5,7 @@
state: {
machineNestDetail: false, // 机巢详情
singleUavHome: {},
+ isEventOverviewDetail: false,//是事件概述详细信息
singleTotal: {}, // 统计单个机巢数据
// 项目id
selectedWorkSpaceId: window.localStorage.getItem('bs_workspace_id'),
@@ -36,6 +37,9 @@
},
actions: {},
mutations: {
+ setIsEventOverviewDetail: (state, data) => {
+ state.isEventOverviewDetail = data;
+ },
setMachineNestDetail: (state, data) => {
state.machineNestDetail = data;
},
diff --git a/src/views/Home/EventOverviewDetail/EventOverviewDetail.vue b/src/views/Home/EventOverviewDetail/EventOverviewDetail.vue
new file mode 100644
index 0000000..c53b87c
--- /dev/null
+++ b/src/views/Home/EventOverviewDetail/EventOverviewDetail.vue
@@ -0,0 +1,7 @@
+<template>
+ <EventOverviewDetailLeft />
+</template>
+<script setup>
+import EventOverviewDetailLeft from './EventOverviewDetailLeft/EventOverviewDetailLeft.vue'
+</script>
+<style scoped lang="scss"></style>
diff --git a/src/views/Home/EventOverviewDetail/EventOverviewDetailLeft/EventDataAnalysis.vue b/src/views/Home/EventOverviewDetail/EventOverviewDetailLeft/EventDataAnalysis.vue
new file mode 100644
index 0000000..59aae22
--- /dev/null
+++ b/src/views/Home/EventOverviewDetail/EventOverviewDetailLeft/EventDataAnalysis.vue
@@ -0,0 +1,115 @@
+<template>
+ <common-title title="行业数据分析" />
+ <div class="chart" ref="echartsRef"></div>
+</template>
+<script setup>
+import CommonTitle from '@/components/CommonTitle.vue'
+import { getEventIndustryData } from '@/api/home/event'
+import * as echarts from 'echarts'
+
+const echartsRef = ref(null)
+let chart = null
+
+const echartsOption = {
+ tooltip: {
+ trigger: 'axis',
+ axisPointer: {
+ type: 'shadow',
+ },
+ },
+ grid: {
+ top: '5%',
+ left: 0,
+ right: 0,
+ bottom: 0,
+ containLabel: true,
+ },
+ xAxis: {
+ type: 'category',
+ axisLabel: {
+ rotate: -45, // 旋转角度
+ interval: 0, // 显示所有标签
+ color: '#FFFFFF',
+ fontFamily: 'Source Han Sans CN, Source Han Sans CN',
+ fontWeight: 400,
+ fontSize: 10,
+ },
+ data: [],
+ },
+ yAxis: [
+ {
+ type: 'value',
+ axisLabel: {
+ interval: 0, // 显示所有标签
+ color: '#FFFFFF',
+ fontFamily: 'Source Han Sans CN, Source Han Sans CN',
+ fontWeight: 400,
+ fontSize: 10,
+ },
+ axisLine: {
+ lineStyle: {
+ color: '#ffffff',
+ },
+ },
+ splitLine: {
+ lineStyle: {
+ color: 'rgba(255, 255, 255, 0.1)',
+ type: 'dashed', // 设置为虚线
+ },
+ },
+ },
+ ],
+ series: [],
+}
+
+const testObj = color => ({
+ type: 'bar',
+ emphasis: {
+ focus: 'series',
+ },
+ itemStyle: { color },
+ data: [],
+})
+
+const eventType = [
+ { name: '事件', ...testObj('#6FCAFF') },
+ { name: '任务', ...testObj('#8EFFAC') },
+]
+const params = inject('eventOverviewParams')
+
+watch(params, () => {
+ getData()
+})
+
+// 获取数据
+const getData = async () => {
+ const res = await getEventIndustryData(params.value)
+ const list = res?.data?.data || []
+ echartsOption.xAxis.data = list.map(item => item.name)
+ //
+ eventType.forEach(item => {
+ item.data = []
+ })
+ list.forEach(item => {
+ item.data.forEach(item1 => {
+ eventType.forEach(item2 => {
+ item2.name === item1.name && item2.data.push(item1.value)
+ })
+ })
+ })
+ echartsOption.series = eventType
+ chart.setOption(echartsOption)
+}
+
+onMounted(() => {
+ chart = echarts.init(echartsRef.value)
+ window.addEventListener('resize', chart.resize)
+ getData()
+})
+</script>
+<style scoped lang="scss">
+.chart {
+ width: 356px;
+ height: 190px;
+}
+</style>
diff --git a/src/views/Home/EventOverviewDetail/EventOverviewDetailLeft/EventOverviewDetailLeft.vue b/src/views/Home/EventOverviewDetail/EventOverviewDetailLeft/EventOverviewDetailLeft.vue
new file mode 100644
index 0000000..821a67e
--- /dev/null
+++ b/src/views/Home/EventOverviewDetail/EventOverviewDetailLeft/EventOverviewDetailLeft.vue
@@ -0,0 +1,70 @@
+<template>
+ <div class="left">
+ <div class="do-return" @click="goBack">
+ <img src="@/assets/images/signMachineNest/return.png" alt="" />
+ </div>
+ <common-title title="事件数据分析" />
+ <CommonDateTime class="dateTime" v-model="timeArr" @change="timeChange" />
+ <EventDataAnalysis />
+ <EventTrendAnalysis />
+ <EventTop5 />
+ </div>
+</template>
+<script setup>
+import EventDataAnalysis from './EventDataAnalysis.vue'
+import CommonTitle from '@/components/CommonTitle.vue'
+import CommonDateTime from '@/components/CommonDateTime.vue'
+import dayjs from 'dayjs'
+import { useStore } from 'vuex'
+import EventTrendAnalysis from '@/views/Home/EventOverviewDetail/EventOverviewDetailLeft/EventTrendAnalysis.vue'
+import EventTop5 from '@/views/Home/EventOverviewDetail/EventOverviewDetailLeft/EventTop5.vue'
+
+const today = dayjs().format('YYYY-MM-DD')
+const timeArr = ref([today, today])
+const store = useStore()
+
+const params = ref({
+ date_enum: 'TODAY',
+ end_date: undefined,
+ start_date: undefined,
+})
+provide('eventOverviewParams', params)
+
+// 时间变化
+const timeChange = (value, date_enum) => {
+ params.value = {
+ ...params.value,
+ date_enum,
+ }
+}
+const goBack = () => {
+ store.commit('setIsEventOverviewDetail', false)
+}
+</script>
+<style scoped lang="scss">
+.left {
+ position: absolute;
+ top: 88px;
+ color: #e7f5ff;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+
+ .dateTime {
+ width: 356px;
+ margin: 0 0 8px 0;
+ }
+
+ .do-return {
+ position: absolute;
+ top: 50px;
+ right: -50px;
+ cursor: pointer;
+
+ img {
+ width: 40px;
+ height: 40px;
+ }
+ }
+}
+</style>
diff --git a/src/views/Home/EventOverviewDetail/EventOverviewDetailLeft/EventTop5.vue b/src/views/Home/EventOverviewDetail/EventOverviewDetailLeft/EventTop5.vue
new file mode 100644
index 0000000..692cb5d
--- /dev/null
+++ b/src/views/Home/EventOverviewDetail/EventOverviewDetailLeft/EventTop5.vue
@@ -0,0 +1,98 @@
+<template>
+ <common-title title="同类事件TOP5统计" />
+ <div class="chart" ref="echartsRef"></div>
+</template>
+<script setup>
+import CommonTitle from '@/components/CommonTitle.vue'
+import { getEventTopFive, getEventTrend } from '@/api/home/event'
+import * as echarts from 'echarts'
+
+const echartsRef = ref(null)
+let chart = null
+
+const echartsOption = {
+ tooltip: {
+ trigger: 'axis',
+ axisPointer: {
+ type: 'shadow',
+ },
+ },
+ grid: {
+ top: '5%',
+ left: 0,
+ right: 0,
+ bottom: 0,
+ containLabel: true,
+ },
+ xAxis: {
+ type: 'category',
+ axisLabel: {
+ rotate: -45, // 旋转角度
+ interval: 0, // 显示所有标签
+ color: '#FFFFFF',
+ fontFamily: 'Source Han Sans CN, Source Han Sans CN',
+ fontWeight: 400,
+ fontSize: 10,
+ },
+ data: [],
+ },
+ yAxis: [
+ {
+ type: 'value',
+ axisLabel: {
+ interval: 0, // 显示所有标签
+ color: '#FFFFFF',
+ fontFamily: 'Source Han Sans CN, Source Han Sans CN',
+ fontWeight: 400,
+ fontSize: 10,
+ },
+ axisLine: {
+ lineStyle: {
+ color: '#ffffff',
+ },
+ },
+ splitLine: {
+ lineStyle: {
+ color: 'rgba(255, 255, 255, 0.1)',
+ type: 'dashed', // 设置为虚线
+ },
+ },
+ },
+ ],
+ series: {
+ type: 'bar',
+ emphasis: {
+ focus: 'series',
+ },
+ itemStyle: { color:'#6FCAFF' },
+ data: [],
+ },
+}
+
+const params = inject('eventOverviewParams')
+
+watch(params, () => {
+ getData()
+})
+
+// 获取数据
+const getData = async () => {
+ const res = await getEventTopFive(params.value)
+ const list = res?.data?.data || []
+ echartsOption.xAxis.data = list.map(item => item.name)
+ echartsOption.series.data = list.map(item => item.value)
+ chart.setOption(echartsOption)
+}
+
+onMounted(() => {
+ chart = echarts.init(echartsRef.value)
+ window.addEventListener('resize', chart.resize)
+ getData()
+})
+</script>
+<style scoped lang="scss">
+.chart {
+ width: 356px;
+ height: 190px;
+}
+</style>
diff --git a/src/views/Home/EventOverviewDetail/EventOverviewDetailLeft/EventTrendAnalysis.vue b/src/views/Home/EventOverviewDetail/EventOverviewDetailLeft/EventTrendAnalysis.vue
new file mode 100644
index 0000000..8faa9e5
--- /dev/null
+++ b/src/views/Home/EventOverviewDetail/EventOverviewDetailLeft/EventTrendAnalysis.vue
@@ -0,0 +1,106 @@
+<template>
+ <common-title title="事件趋势分析" />
+ <div class="chart" ref="echartsRef"></div>
+</template>
+<script setup>
+import CommonTitle from '@/components/CommonTitle.vue'
+import { getEventTrend } from '@/api/home/event'
+import * as echarts from 'echarts'
+
+const echartsRef = ref(null)
+let chart = null
+
+const echartsOption = {
+ tooltip: {
+ trigger: 'axis',
+ axisPointer: {
+ type: 'shadow',
+ },
+ },
+ grid: {
+ top: '5%',
+ left: 0,
+ right: 0,
+ bottom: 0,
+ containLabel: true,
+ },
+ xAxis: {
+ type: 'category',
+ axisLabel: {
+ rotate: -45, // 旋转角度
+ interval: 0, // 显示所有标签
+ color: '#FFFFFF',
+ fontFamily: 'Source Han Sans CN, Source Han Sans CN',
+ fontWeight: 400,
+ fontSize: 10,
+ },
+ data: [],
+ },
+ yAxis: [
+ {
+ type: 'value',
+ axisLabel: {
+ interval: 0, // 显示所有标签
+ color: '#FFFFFF',
+ fontFamily: 'Source Han Sans CN, Source Han Sans CN',
+ fontWeight: 400,
+ fontSize: 10,
+ },
+ axisLine: {
+ lineStyle: {
+ color: '#ffffff',
+ },
+ },
+ splitLine: {
+ lineStyle: {
+ color: 'rgba(255, 255, 255, 0.1)',
+ type: 'dashed', // 设置为虚线
+ },
+ },
+ },
+ ],
+ series: {
+ type: 'line',
+ itemStyle: {
+ color: '#0CEBF7', // 设置颜色
+ },
+ lineStyle: {
+ width: 2, // 线条宽度
+ type: 'solid', // 线条类型
+ },
+ symbol: 'circle', // 数据点符号
+ symbolSize: 6, // 数据点符号大小
+ emphasis: {
+ focus: 'series',
+ },
+ data: [], // 示例数据,根据实际完成率计算
+ },
+}
+
+const params = inject('eventOverviewParams')
+
+watch(params, () => {
+ getData()
+})
+
+// 获取数据
+const getData = async () => {
+ const res = await getEventTrend(params.value)
+ const list = res?.data?.data || []
+ echartsOption.xAxis.data = list.map(item => item.name)
+ echartsOption.series.data = list.map(item => item.value)
+ chart.setOption(echartsOption)
+}
+
+onMounted(() => {
+ chart = echarts.init(echartsRef.value)
+ window.addEventListener('resize', chart.resize)
+ getData()
+})
+</script>
+<style scoped lang="scss">
+.chart {
+ width: 356px;
+ height: 190px;
+}
+</style>
diff --git a/src/views/Home/Home.vue b/src/views/Home/Home.vue
index 90ae6c3..cb9d703 100644
--- a/src/views/Home/Home.vue
+++ b/src/views/Home/Home.vue
@@ -1,39 +1,44 @@
<template>
- <template v-if="!singleUavHome?.device_sn">
- <SearchBox />
- <HomeLeft />
- <HomeRight />
- </template>
- <template v-else>
- <SignMachineNest />
- </template>
- <RSide />
- <Footer />
+ <template v-if="singleUavHome?.device_sn">
+ <SignMachineNest />
+ </template>
+ <template v-else>
+ <EventOverviewDetail v-if="isEventOverviewDetail" />
+ <template v-else>
+ <SearchBox />
+ <HomeLeft />
+ <HomeRight />
+ </template>
+ </template>
+ <RSide />
+ <Footer />
</template>
<script setup>
-import HomeRight from '@/views/Home/HomeRight/HomeRight.vue';
-import HomeLeft from '@/views/Home/HomeLeft/HomeLeft.vue';
-import SearchBox from '@/views/Home/SearchBox.vue';
-import SignMachineNest from '@/views/SignMachineNest/SignMachineNest.vue';
-import { useStore } from 'vuex';
-import Footer from '@/views/Home/Footer.vue';
-import RSide from '@/views/Home/RSide.vue';
-import { onMounted } from 'vue';
-import cesiumOperation from '@/utils/cesium-tsa';
-import MeasuringDistance from '@/components/MeasuringDistance.vue';
-const store = useStore();
-const { _init,viewerDestory } = cesiumOperation();
+import HomeRight from '@/views/Home/HomeRight/HomeRight.vue'
+import HomeLeft from '@/views/Home/HomeLeft/HomeLeft.vue'
+import SearchBox from '@/views/Home/SearchBox.vue'
+import SignMachineNest from '@/views/SignMachineNest/SignMachineNest.vue'
+import { useStore } from 'vuex'
+import Footer from '@/views/Home/Footer.vue'
+import RSide from '@/views/Home/RSide.vue'
+import { onMounted } from 'vue'
+import cesiumOperation from '@/utils/cesium-tsa'
+import EventOverviewDetail from '@/views/Home/EventOverviewDetail/EventOverviewDetail.vue'
-const singleUavHome = computed(() => store.state.home.singleUavHome);
+const store = useStore()
+const { _init, viewerDestory } = cesiumOperation()
-onUnmounted(()=>{
- store.commit('setSingleUavHome',null);
+const singleUavHome = computed(() => store.state.home.singleUavHome)
+const isEventOverviewDetail = computed(() => store.state.home.isEventOverviewDetail)
+
+onUnmounted(() => {
+ store.commit('setSingleUavHome', null)
console.log('home销毁')
- viewerDestory()
+ viewerDestory()
})
onMounted(() => {
- _init('cesium');
-});
+ _init('cesium')
+})
</script>
diff --git a/src/views/Home/HomeRight/EventOverview.vue b/src/views/Home/HomeRight/EventOverview.vue
index effefdf..d36ef27 100644
--- a/src/views/Home/HomeRight/EventOverview.vue
+++ b/src/views/Home/HomeRight/EventOverview.vue
@@ -1,5 +1,5 @@
<template>
- <CommonTitle title="事件概况" />
+ <CommonTitle title="事件概况" @Details="details"/>
<div :style="{ marginLeft: pxToRem(14) }">
<div class="eventOverview">
<div class="overviewData">
@@ -63,6 +63,7 @@
import { getJobEventBrokerLine, getJobEventByStatus, getJobEventTotal } from '@/api/home';
import dayjs from 'dayjs';
import { selectDevicePage } from '@/api/home/machineNest';
+import { useStore } from 'vuex'
const echartsOption = {
tooltip: {
@@ -175,6 +176,11 @@
start_date: undefined,
});
+const store = useStore()
+const details = () =>{
+ store.commit('setIsEventOverviewDetail',true)
+}
+
// 远程查询
const remoteMethod = nickname => {
devicePageParams.value.nickname = nickname;
@@ -222,6 +228,8 @@
getJobEventBrokerLine(params.value).then(res => {
const list = res?.data?.data || [];
echartsOption.xAxis.data = list.map(item => item.name);
+ // 赋值前清空数据
+ Object.keys(seriesObj).forEach(key => {seriesObj[key].data = []})
list.forEach(item => {
item.data.forEach((item1, index) => {
seriesObj[item1.status].data.push(item1.value);
@@ -256,9 +264,7 @@
onMounted(() => {
chart = echarts.init(echartsRef.value);
- window.addEventListener('resize', () => {
- chart.resize();
- });
+ window.addEventListener('resize', chart.resize);
getJobEventTotal().then(res => {
eventTotal.value = res?.data?.data || 0;
});
--
Gitblit v1.9.3