From d36bac3029c9ff3ea53da4b95618a4b19f855450 Mon Sep 17 00:00:00 2001
From: 罗广辉 <guanghui.luo@foxmail.com>
Date: Tue, 01 Apr 2025 13:09:12 +0800
Subject: [PATCH] feat: 事件概况对接
---
src/views/Home/components/HomeRight/EventOverview.vue | 282 ++++++++++++++++++++++++++++++++------------------------
1 files changed, 162 insertions(+), 120 deletions(-)
diff --git a/src/views/Home/components/HomeRight/EventOverview.vue b/src/views/Home/components/HomeRight/EventOverview.vue
index 426573d..effefdf 100644
--- a/src/views/Home/components/HomeRight/EventOverview.vue
+++ b/src/views/Home/components/HomeRight/EventOverview.vue
@@ -4,21 +4,34 @@
<div class="eventOverview">
<div class="overviewData">
<div class="totalBox">
- <div class="totalNumber">{{ total }}</div>
+ <div class="totalNumber">{{ eventTotal }}</div>
<div class="totalLabel">总事件数</div>
</div>
<div class="contentBox">
- <div class="overviewItem" v-for="item in list" :key="item.name">
+ <div class="overviewItem" v-for="item in eventTypeList" :key="item.name">
<div class="itemName"><img :src="item.img" alt="" />{{ item.name }}</div>
<div class="itemValue" :style="{ color: item.color }">{{ item.value }}</div>
</div>
</div>
</div>
- <CommonDateTime class="dateTime" v-model="newTime" @change="dateChange" />
+ <CommonDateTime class="dateTime" v-model="timeArr" @change="timeChange" />
- <el-select class="homeRightSelect" v-model="value" placeholder="请选择" size="large">
+ <el-select
+ class="homeRightSelect"
+ v-model="params.device_sn"
+ placeholder="请选择"
+ size="large"
+ filterable
+ :remote-method="remoteMethod"
+ remote-show-suffix
+ remote
+ clearable
+ popper-class="uavHomePopper"
+ v-select-load:uavHomePopper="scrollEvent"
+ @change="selectChange"
+ >
<el-option
- v-for="item in options"
+ v-for="item in deviceList"
:key="item.value"
:label="item.label"
:value="item.value"
@@ -46,35 +59,12 @@
import completionLeft from '@/assets/images/home/homeRight/completionLeft.png';
import * as echarts from 'echarts';
import CommonDateTime from '@/components/CommonDateTime.vue';
-import {
- getJobEventBrokerLine,
- getJobEventByStatus,
- getJobEventTotal,
- getJobNumBar,
- getJobStatistics,
-} from '@/api/home';
+import VSelectLoad from '@/directive/selectLoad';
+import { getJobEventBrokerLine, getJobEventByStatus, getJobEventTotal } from '@/api/home';
import dayjs from 'dayjs';
+import { selectDevicePage } from '@/api/home/machineNest';
-const list = ref([
- { name: '待审核', value: 265, img: overviewImg1, color: '#FF8E8E' },
- { name: '待分拨', value: 266, img: overviewImg2, color: '#6FCAFF' },
- { name: '待处理', value: 262, img: overviewImg3, color: '#6FCAFF' },
- { name: '处理中', value: 262, img: overviewImg4, color: '#FFD509' },
- { name: '已完成', value: 246, img: overviewImg5, color: '#FF8E8E' },
- { name: '已完结', value: 262, img: overviewImg6, color: '#8EFFAC' },
-]);
-const value = ref('');
-const echartsRef = ref(null);
-
-const options = [
- {
- value: 'Option1',
- label: 'Option1',
- },
-];
-const currenDate = dayjs().format('YYYY-MM-DD');
-const newTime = ref([currenDate, currenDate]);
-const option = {
+const echartsOption = {
tooltip: {
trigger: 'axis',
axisPointer: {
@@ -88,20 +78,18 @@
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: ['暴露垃圾', '占道', '暴露垃圾', '占道', '暴露垃圾', '占道', '暴露垃圾', '占道'],
+ 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',
@@ -125,103 +113,157 @@
},
},
],
- series: [
- {
- name: '待完成',
- type: 'bar',
- stack: 'Ad',
- emphasis: {
- focus: 'series',
- },
- itemStyle: {
- color: '#FF8E8E', // 设置颜色
- },
- data: [120, 132, 120, 132, 120, 132, 120, 132],
- },
- {
- name: '已完成',
- type: 'bar',
- stack: 'Ad',
- emphasis: {
- focus: 'series',
- },
- data: [120, 132, 120, 132, 120, 132, 120, 132],
- },
- {
- name: '已完成1',
- type: 'bar',
- stack: 'Ad',
- emphasis: {
- focus: 'series',
- },
- data: [120, 132, 120, 132, 120, 132, 120, 132],
- },
- {
- name: '已完成2',
- type: 'bar',
- stack: 'Ad',
- emphasis: {
- focus: 'series',
- },
- data: [120, 132, 120, 132, 120, 132, 120, 132],
- },
- {
- name: '完成率',
- type: 'line',
- itemStyle: {
- color: '#0CEBF7', // 设置颜色
- },
- lineStyle: {
- width: 2, // 线条宽度
- type: 'solid', // 线条类型
- },
- symbol: 'circle', // 数据点符号
- symbolSize: 6, // 数据点符号大小
- emphasis: {
- focus: 'series',
- },
- data: [50, 55, 60, 65, 70, 75, 80, 85], // 示例数据,根据实际完成率计算
- },
- ],
+ series: [],
};
-const total = ref(0);
-const getData = () => {
- const params = {
- date_enum: 'TODAY',
- // start_date: newTime.value[0],
- // end_date: newTime.value[1]
+const eventTypeList = ref([
+ { name: '待审核', value: 0, img: overviewImg1, color: '#FF8E8E', status: '2' },
+ { name: '待分拨', value: 0, img: overviewImg2, color: '#6FCAFF', status: '1' },
+ { name: '待处理', value: 0, img: overviewImg3, color: '#6FCAFF', status: '0' },
+ { name: '处理中', value: 0, img: overviewImg4, color: '#FFD509', status: '3' },
+ { name: '已完成', value: 0, img: overviewImg5, color: '#FF8E8E', status: '4' },
+ { name: '已完结', value: 0, img: overviewImg6, color: '#8EFFAC', status: '5' },
+]);
+const seriesObj = {};
+eventTypeList.value.forEach(item => {
+ seriesObj[item.status] = {
+ type: 'bar',
+ stack: 'Ad',
+ emphasis: {
+ focus: 'series',
+ },
+ name: item.name,
+ itemStyle: { color: item.color },
+ data: [],
};
- getJobEventByStatus(params).then(res => {
+});
+const echartsRef = ref(null);
+let chart = null;
+const deviceList = ref([]);
+const today = dayjs().format('YYYY-MM-DD');
+const timeArr = ref([today, today]);
+const completionRateSeries = {
+ name: '完成率',
+ type: 'line',
+ itemStyle: {
+ color: '#0CEBF7', // 设置颜色
+ },
+ lineStyle: {
+ width: 2, // 线条宽度
+ type: 'solid', // 线条类型
+ },
+ symbol: 'circle', // 数据点符号
+ symbolSize: 6, // 数据点符号大小
+ emphasis: {
+ focus: 'series',
+ },
+ data: [], // 示例数据,根据实际完成率计算
+};
+
+const eventTotal = ref(0);
+let deviceTotal = 0;
+const devicePageParams = ref({
+ current: 1,
+ size: 10,
+ total: 0,
+ nickname: '',
+});
+const params = ref({
+ date_enum: 'TODAY',
+ device_sn: '',
+ end_date: undefined,
+ start_date: undefined,
+});
+
+// 远程查询
+const remoteMethod = nickname => {
+ devicePageParams.value.nickname = nickname;
+ devicePageParams.value.current = 1;
+ devicePageParams.value.size = 10;
+ deviceList.value = [];
+ getTableList();
+};
+// 滚动查询
+const scrollEvent = () => {
+ const { current, size } = devicePageParams.value;
+ if (current * size < deviceTotal) {
+ devicePageParams.value.current = current + 1;
+ getTableList();
+ }
+};
+// 机巢列表数据
+const getTableList = async () => {
+ const res = await selectDevicePage({ ...devicePageParams.value, type: 1 });
+ const arr = res?.data?.data?.records || [];
+ deviceList.value = deviceList.value.concat(
+ arr.map(item => ({
+ value: item.device_sn,
+ label: item.nickname,
+ }))
+ );
+ deviceTotal = res?.data?.data?.total || 0;
+};
+// 下拉变化
+const selectChange = val => {
+ getData();
+};
+
+// 时间变化
+const timeChange = (value, date_enum) => {
+ params.value = {
+ ...params.value,
+ date_enum,
+ };
+ getData();
+};
+
+// 获取柱状图数据
+const getBarChartData = () => {
+ getJobEventBrokerLine(params.value).then(res => {
+ const list = res?.data?.data || [];
+ echartsOption.xAxis.data = list.map(item => item.name);
+ list.forEach(item => {
+ item.data.forEach((item1, index) => {
+ seriesObj[item1.status].data.push(item1.value);
+ });
+ });
+ completionRateSeries.data = list.map(item => item.rate);
+ echartsOption.series = Object.values(seriesObj);
+ echartsOption.series.push(completionRateSeries);
+ chart.setOption(echartsOption);
+ });
+};
+
+// 事件类型数据
+const getTypeData = () => {
+ getJobEventByStatus(params.value).then(res => {
const resList = res?.data?.data || [];
resList.forEach(item => {
- list.value.forEach(item1 => {
+ eventTypeList.value.forEach(item1 => {
if (item1.name === item.name) {
item1.value = item.num;
}
});
});
});
- // todo 未对接
- getJobEventBrokerLine(params).then(res => {});
};
-const dateChange = value => {
- console.log(value);
- newTime.value = value;
- getData();
+// 获取事件概括数据
+const getData = () => {
+ getTypeData();
+ getBarChartData();
};
onMounted(() => {
- const chart = echarts.init(echartsRef.value);
- chart.setOption(option);
+ chart = echarts.init(echartsRef.value);
window.addEventListener('resize', () => {
chart.resize();
});
getJobEventTotal().then(res => {
- total.value = res?.data?.data || 0;
+ eventTotal.value = res?.data?.data || 0;
});
getData();
+ getTableList();
});
</script>
--
Gitblit v1.9.3