| | |
| | | <!-- 自动从接口获取数据 生成仪表盘 --> |
| | | |
| | | <script lang="ts"> |
| | | import axios from 'axios'; |
| | | import * as echarts from 'echarts'; |
| | | |
| | | <script> |
| | | import ExceptionTypeLineChart from '../sfc/ExceptionTypeLineChart.vue'; |
| | | import dayjs from 'dayjs'; |
| | | export default { |
| | | components: { |
| | | ExceptionTypeLineChart |
| | | }, |
| | | data() { |
| | | return { |
| | | loading:false, |
| | | smogData: [ |
| | | // { |
| | | // "time": "2023-06-24 13:23", |
| | | // "value": 0.04, |
| | | // "mnCode": "31011020175002" |
| | | // }, |
| | | // { |
| | | // "time": "2023-06-24 00:42", |
| | | // "value": 0.04, |
| | | // "mnCode": "31011020175004" |
| | | // }, |
| | | // { |
| | | // "time": "2023-05-24 20:39", |
| | | // "value": 0.06, |
| | | // "mnCode": "31011020175008" |
| | | // }, |
| | | // { |
| | | // "time": "2023-06-24 13:38", |
| | | // "value": 0.66, |
| | | // "mnCode": "64480047078091" |
| | | // }, |
| | | // { |
| | | // "time": "2023-05-24 20:39", |
| | | // "value": 0.8, |
| | | // "mnCode": "31011020175006" |
| | | // }, |
| | | // { |
| | | // "time": "2023-06-24 13:38", |
| | | // "value": 0.69, |
| | | // "mnCode": "64480047078099" |
| | | // }, |
| | | // { |
| | | // "time": "2023-05-24 20:39", |
| | | // "value": 0.8, |
| | | // "mnCode": "31011020175026" |
| | | // }, |
| | | |
| | | ],//从后端放回的值 |
| | | chartData: [], //从图像返回的值 |
| | | xAxis: [ |
| | | '2023-07-20 12:00:00', |
| | | '2023-07-20 12:10:00', |
| | | '2023-07-20 12:20:00', |
| | | '2023-07-20 12:30:00', |
| | | '2023-07-20 12:40:00' |
| | | ], |
| | | yAxis: [0.4, 0.9, 0.1, 1.5, 0.3] |
| | | }; |
| | | }, |
| | | mounted() { |
| | | this.loading = true |
| | | //自动获取接口全部数据 |
| | | axios.get('https://fyami.com.cn/device/min/value/real_time', { params: { "page": 1, "per_page": 20 } }).then((result) => { |
| | | this.smogData = result.data.data |
| | | console.log(this.smogData); |
| | | this.loading = false |
| | | }); |
| | | |
| | | |
| | | this.descTenTime() |
| | | }, |
| | | |
| | | methods: { |
| | | showMore(){ |
| | | this.smogData.forEach((device) => { |
| | | const chartDom = document.querySelector(`#chart-${device.mnCode}`) //根据选择器获取元素,并且只返回元素中的第一个 |
| | | const chart = echarts.init(chartDom) |
| | | |
| | | this.chartData = { |
| | | value: device.value, |
| | | axisLabel: { |
| | | show: true, |
| | | textStyle: { |
| | | color: '#666' |
| | | }, |
| | | formatter: function (value) { |
| | | return value; |
| | | } |
| | | }, |
| | | detail: { |
| | | formatter: function (value) { |
| | | return value + 'mg/m³'; |
| | | }, |
| | | textStyle: { |
| | | fontSize: 10, |
| | | fontWeight: 'bold' |
| | | }, |
| | | offsetCenter: [0, '30%'] |
| | | }, |
| | | title: { |
| | | show: true, |
| | | text: '设备油烟浓度', |
| | | textStyle: { |
| | | color: '#999', |
| | | fontSize: 14 |
| | | }, |
| | | offsetCenter: [0, '-30%'] |
| | | }, |
| | | axisLine: { |
| | | lineStyle: { |
| | | width: 10, |
| | | color: [ |
| | | [0.2, '#67e0e3'], |
| | | [0.8, '#37a2da'], |
| | | [1, '#fd666d'] |
| | | ] |
| | | } |
| | | }, |
| | | splitLine: { |
| | | show: true, |
| | | length: 10, |
| | | lineStyle: { |
| | | color: 'auto', |
| | | } |
| | | }, |
| | | axisTick: { |
| | | show: true, |
| | | length: 15, |
| | | lineStyle: { |
| | | color: 'auto', |
| | | } |
| | | findTimeInExceptionData(data,time){ |
| | | for(let i=0;i<data.length;i++){ |
| | | if(data[i]['mvDataTime'] == time) { |
| | | return data[i]['mvFumeConcentration2'] |
| | | } |
| | | }; |
| | | |
| | | chart.setOption({ |
| | | tooltip: { |
| | | formatter: '{a}: <br/> {c}mg/m³' |
| | | }, |
| | | series: [ |
| | | { |
| | | name: '油烟浓度', |
| | | type: 'gauge', |
| | | min: 0, |
| | | max: 2, |
| | | splitNumber: 10, |
| | | axisLabel: this.chartData.axisLabel, |
| | | detail: this.chartData.detail, |
| | | data: [{ value: this.chartData.value, name: '' }], |
| | | title: this.chartData.title, |
| | | axisLine: this.chartData.axisLine, |
| | | splitLine: this.chartData.splitLine, |
| | | axisTick: this.chartData.axisTick |
| | | } |
| | | ] |
| | | }); |
| | | }) |
| | | } |
| | | } |
| | | return -1 |
| | | }, |
| | | // 参数:加上前后区间的异常数据,时间字符串 |
| | | // 功能:判断data中是否有该日期时间,存在返回该时间对应的浓度值,否则返回-1 |
| | | |
| | | // 参数:前区间的开始时间, 后区间的结束时间, 加上前后区间的总时间段的异常数据的对象数组 |
| | | // 功能:根据开始和结束时间,返回以10分钟为间隔的时间和对应的值 |
| | | keepContinuousByEachTenMinutes(intervalStarTime,intervalEndTime,headAndTailExceptionData){ |
| | | let xAxis = [] |
| | | let yAxis = [] |
| | | let obj = {} |
| | | let current = intervalStarTime |
| | | let tail = dayjs(intervalEndTime).add(10,'minute').format('YYYY-MM-DD HH:mm:ss') |
| | | while(current != tail){ |
| | | let value = this.findTimeInExceptionData(headAndTailExceptionData,current) |
| | | if(value!= -1){ |
| | | xAxis.push(current) |
| | | yAxis.push(value) |
| | | }else { |
| | | xAxis.push(current) |
| | | yAxis.push(null) |
| | | } |
| | | current = dayjs(current).add(10,'minute').format('YYYY-MM-DD HH:mm:ss') |
| | | } |
| | | obj['xAxis'] = xAxis |
| | | obj['yAxis'] = yAxis |
| | | return obj |
| | | }, |
| | | test(){ |
| | | let data = [ |
| | | { mvDataTime: '2023-07-20 12:30:00', mvFumeConcentration2: '0.2' }, |
| | | { mvDataTime: '2023-07-20 12:40:00', mvFumeConcentration2: '0.3' }, |
| | | { mvDataTime: '2023-07-20 12:50:00', mvFumeConcentration2: '0.2' }, |
| | | { mvDataTime: '2023-07-20 13:10:00', mvFumeConcentration2: '0.9' }, |
| | | ]; |
| | | let obj = this.keepContinuousByEachTenMinutes('2023-07-20 12:00:00','2023-07-20 13:50:00',data) |
| | | console.log(obj) |
| | | }, |
| | | descTenTime(begin, end) { |
| | | let time = []; |
| | | if(begin == end){ |
| | | time.push(begin) |
| | | return time |
| | | } |
| | | // 保留结果 00 10 20 30 |
| | | let temp = dayjs(begin).add(10, 'minute').format('YYYY-MM-DD HH:mm:ss'); |
| | | while (temp != end) { |
| | | time.push(temp); |
| | | temp = dayjs(temp).add(10, 'minute').format('YYYY-MM-DD HH:mm:ss'); |
| | | } |
| | | // 加上异常的结束时间 |
| | | time.push(temp); |
| | | return time; |
| | | }, |
| | | } |
| | | }; |
| | | </script> |
| | | |
| | | <template> |
| | | <div style="margin: 5px;"> |
| | | <span style="color: #b1b3b8;" >实时数据</span> |
| | | </div> |
| | | |
| | | <hr style="margin-top: 10px;"/> |
| | | |
| | | <div > |
| | | <el-button @click="showMore" style="margin-top: 20px;margin-left: 20px">展示</el-button> |
| | | |
| | | </div> |
| | | <div v-loading="loading" > |
| | | <!-- 根据设备编号个数动态生成仪表盘 --> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12" v-for="device in smogData" :key="device.mnCode"> |
| | | <div class="chart-container"> |
| | | <div class="chart-title">设备{{ device.mnCode }}</div> |
| | | <div class="chart-content"> |
| | | <div :id="'chart-' + device.mnCode" class="chartClass"></div> |
| | | </div> |
| | | <div> |
| | | <span>浓度值为:{{ device.value }}</span> |
| | | <br/> |
| | | 产生时间:{{ device.time}} |
| | | </div> |
| | | </div> |
| | | <!-- <br v-if="index % 4 == 0"/> --> |
| | | </el-col> |
| | | </el-row> |
| | | <div> |
| | | <ExceptionTypeLineChart |
| | | :xData="xAxis" |
| | | :yData="yAxis" |
| | | ></ExceptionTypeLineChart> |
| | | </div> |
| | | </template> |
| | | |
| | | <style lang="scss" scoped></style> |
| | | |
| | | |
| | | |
| | | <style lang="scss" scoped> |
| | | .chart-container { |
| | | background-color: #f9f9f9; |
| | | padding: 20px; |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | .chart-title { |
| | | font-size: 16px; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | .chart-content { |
| | | margin-top: 10px; |
| | | } |
| | | |
| | | .chartClass { |
| | | height: 300px; |
| | | } |
| | | </style> |