<template>
|
<div id="Tab">
|
<PublicDataStandard :dataStandard="dataStandard"></PublicDataStandard>
|
<div class="form-echrts">
|
<div class="from-search">
|
<div class="pickerMon">
|
<div class="pickerData">
|
<span> 开始时间:</span>
|
<span class="pickerTable">
|
<el-date-picker type="datetime" v-model="formInline.timeStart"></el-date-picker>
|
</span>
|
</div>
|
<div class="pickerData">
|
<span>结束时间:</span>
|
<span class="pickerTable">
|
<el-date-picker type="datetime" v-model="formInline.timeEnd"></el-date-picker>
|
</span>
|
</div>
|
</div>
|
<div>
|
<span>采样点数:</span>
|
<el-select v-model="formInline.region" placeholder="50">
|
<el-option label="0" value="0"></el-option>
|
<el-option label="25" value="25"></el-option>
|
<el-option label="50" value="50"></el-option>
|
<el-option label="75" value="75"></el-option>
|
<el-option label="100" value="100"></el-option>
|
</el-select>
|
</div>
|
<div class="detailbtn" @click="querySearch">查询</div>
|
</div>
|
<div style="width:5rem;height:1.5rem;" ref="echarts"></div>
|
</div>
|
</div>
|
</template>
|
|
<script>
|
|
import PublicDataStandard from '@/components/BaseNav/PublicDataStandard'
|
import mapApi from '@/api/mapApi'
|
import 'dayjs/locale/es'
|
import dayjs from 'dayjs'
|
|
export default {
|
name: 'ECharts',
|
components: {
|
PublicDataStandard
|
},
|
data () {
|
return {
|
// tab栏传递接收数据
|
dataStandard: [
|
{
|
current: {
|
name: '氮氧化物',
|
val: 29.93
|
},
|
standard: {
|
name: '标准',
|
val: 100
|
}
|
},
|
{
|
current: {
|
name: '二氧化硫',
|
val: 17.34
|
},
|
standard: {
|
name: '标准',
|
val: 50
|
}
|
},
|
{
|
current: {
|
name: '烟尘',
|
val: 6.93
|
},
|
standard: {
|
name: '标准',
|
val: 30
|
}
|
},
|
{
|
current: {
|
name: '废气流量',
|
val: 120
|
},
|
standard: {
|
name: '',
|
val: null
|
}
|
}],
|
|
// echarts的数据设置
|
myChart: null,
|
|
// 开始 /结束 时间 和采样点值的绑定值数据
|
formInline: {
|
region: '',
|
timeEnd: '',
|
timeStart: ''
|
},
|
|
// 实时数据列表
|
EXHRealTimeDataList: [],
|
bzz: null,
|
exhbzz: [],
|
exhbzzList: []
|
}
|
},
|
mounted () {
|
this.$nextTick(() => {
|
this.initEchartsData()
|
})
|
},
|
methods: {
|
// 点击查询按钮功能
|
querySearch () {
|
// 用于接口数据请求的参数 开始/结束时间 || 可选择查询的开始/结束时间
|
this.formInline.timeEnd = dayjs().format('YYYYMMDD HHmmss')
|
this.formInline.timeStart = dayjs().subtract(3, 'minute').format('YYYYMMDD HHmmss')
|
this.initEchartsData()
|
},
|
// 初始化数据获取echarts的options数据
|
async initEchartsData () {
|
const data = {
|
$tagCodeList: 'TJIP45.y2h508CEMS01NOX,CTJIP45.y2h508CEMS01SO2,CTJIP45.y2h508CEMS01F,CTJIP45.y2h508CEMS01PM',
|
$startTime: this.formInline.timeEnd,
|
$endTime: this.formInline.timeStart,
|
$step: 15
|
}
|
const result = (await mapApi.DataItems(data)).data
|
console.log(result)
|
this.getRtdb15s(result)
|
},
|
// echarts数据处理
|
getRtdb15s (res) {
|
if (res.length > 0) {
|
// 处理数据开始
|
const d = res
|
const nameList = [] // 存放图例
|
|
let data // 数据类型// let data={name:'',value:[now1.getFullYear(), now1.getMonth() + 1, now1.getDate().join('/'),value]}
|
let datalist // 存放data的数组
|
// let bzh = []
|
for (let i = 0; i < d.length; i++) {
|
if (d[i].ErrorMessage != null) {
|
continue
|
}
|
// const name = CFG.DATA_REALTIME_TAGCODETABLE[d[i].UnionTagCode].TagName
|
// 临时name数据
|
const nameListTemp = [
|
{
|
'TJIP45.y2h508CEMS01NOX': '氮氧化物',
|
'TJIP45.y2h508CEMS01SO2': '烟尘',
|
'TJIP45.y2h508CEMS01F': '二氧化磷',
|
'TJIP45.y2h508CEMS01PM': 'ph'
|
// 'TJIP45.lscl2tb552AI10710': '二氧化碳'
|
}
|
]
|
const name = nameListTemp[0][d[i].UnionTagCode]
|
|
if (nameList.length === 0) {
|
nameList.push(name)
|
const newdate = new Date(d[i].ReadTime)
|
data = {
|
name: name,
|
value: [newdate, d[i].TagValue]
|
}
|
datalist = {
|
name: name,
|
data: [data]
|
}
|
this.EXHRealTimeDataList.push(datalist)
|
} else if (nameList.indexOf(name) < 0) {
|
nameList.push(name)
|
const newdate = new Date(d[i].ReadTime)
|
data = {
|
name: name,
|
value: [newdate, d[i].TagValue]
|
}
|
datalist = {
|
name: name,
|
data: [data]
|
}
|
this.EXHRealTimeDataList.push(datalist)
|
} else if (i === d.length - 1) {
|
if (nameList.indexOf(name) < 0) {
|
nameList.push(name)
|
const newdate = new Date(d[i].ReadTime)
|
data = {
|
name: name,
|
value: [newdate, d[i].TagValue]
|
}
|
datalist = {
|
name: name,
|
data: [data]
|
}
|
this.EXHRealTimeDataList.push(datalist)
|
} else {
|
const newdate = new Date(d[i].ReadTime)
|
data = {
|
name: name,
|
value: [newdate, d[i].TagValue]
|
}
|
for (let k = 0; k < this.EXHRealTimeDataList.length; k++) {
|
if (this.EXHRealTimeDataList[k].name === name) {
|
this.EXHRealTimeDataList[k].data.push(data)
|
}
|
}
|
}
|
} else {
|
const newdate = new Date(d[i].ReadTime)
|
data = {
|
name: name,
|
value: [newdate, d[i].TagValue]
|
}
|
for (let k = 0; k < this.EXHRealTimeDataList.length; k++) {
|
if (this.EXHRealTimeDataList[k].name === name) {
|
this.EXHRealTimeDataList[k].data.push(data)
|
}
|
}
|
}
|
}
|
// console.log(this.EXHRealTimeDataList)
|
|
const divid = 'mychart_ss'
|
const title = name
|
const lengList = []
|
let objTemp
|
|
for (let l = 0; l < nameList.length; l++) {
|
let obj
|
let iconurl
|
if (nameList[l] === 'ph') {
|
iconurl = 'image://../assets/imgs/legend/WenDu.png'
|
} else if (nameList[l] === '氮氧化物') {
|
iconurl = 'image://../assets/imgs/legend/NOX.png'
|
} else if (nameList[l] === '烟尘') {
|
iconurl = 'image://../assets/imgs/legend/zongdan.png'
|
} else if (nameList[l] === '二氧化磷') {
|
iconurl = 'image://../assets/imgs/legend/YanChen.png'
|
} else if (nameList[l] === '二氧化碳') {
|
iconurl = 'image://../assets/imgs/legend/VOCs.png'
|
}
|
|
if (nameList[l] === '废气' || nameList[l] === '废气流量') { // 将废气流量排到数组最后
|
objTemp = {
|
name: nameList[l],
|
icon: iconurl,
|
textStyle: {
|
color: '#ccc'
|
},
|
itemWidth: 20,
|
itemHeight: 5
|
}
|
} else {
|
obj = {
|
name: nameList[l],
|
icon: iconurl,
|
textStyle: {
|
color: '#ccc'
|
},
|
itemWidth: 20,
|
itemHeight: 5
|
}
|
lengList.push(obj)
|
}
|
}
|
lengList.push(objTemp)
|
|
const legend = lengList
|
const ydatas = []
|
|
for (let j = 0; j < nameList.length; j++) {
|
let zdcbcolor, zxcolor
|
if (nameList[j] === 'ph') {
|
zdcbcolor = 'red'
|
zxcolor = '#f206ff'
|
} else if (nameList[j] === '烟尘') {
|
zdcbcolor = 'red'
|
zxcolor = '#e0ffff'
|
} else if (nameList[j] === '氮氧化物') {
|
zdcbcolor = 'red'
|
zxcolor = '#00B0F0'
|
} else if (nameList[j] === '二氧化碳') {
|
zdcbcolor = 'red'
|
zxcolor = '#9ACD32'
|
} else if (nameList[j] === '二氧化磷') {
|
zdcbcolor = 'red'
|
zxcolor = '#f48183'
|
}
|
let ydata
|
// 临时数据
|
const BBZMAPPING = [
|
{
|
COD: 35,
|
ph: 9,
|
总氮: 15,
|
总磷: 0.3,
|
氨氮: 3
|
}
|
]
|
for (let m = 0; m < this.EXHRealTimeDataList.length; m++) {
|
let stdValue = null
|
if (this.EXHRealTimeDataList[m].name === nameList[j]) {
|
for (const i in this.BBZMAPPING) {
|
console.log(i)
|
stdValue = BBZMAPPING[this.EXHRealTimeDataList[m].name]
|
}
|
|
ydata = {
|
name: nameList[j],
|
data: this.EXHRealTimeDataList[m].data,
|
zdcbcolor: zdcbcolor,
|
zxcolor: zxcolor,
|
bzz: stdValue
|
}
|
this.exhbzz = {
|
name: nameList[j],
|
bzhui: stdValue
|
}
|
this.exhbzzList.push(this.exhbzz)
|
ydatas.push(ydata)
|
}
|
}
|
}
|
|
const yname = '浓度(mg/m³)'
|
|
this.DrawRealTimeDateChart(divid, title, legend, ydatas, yname)
|
}
|
},
|
// 获取数据用于echarts图表绘制
|
DrawRealTimeDateChart (id, title, legend, ydatas, yname) {
|
// console.log(ydatas)
|
this.myChart = this.$echarts.init(this.$refs.echarts)
|
const serLists = []
|
let dataUnit
|
for (let i = 0; i < ydatas.length; i++) {
|
const zdcbcolor = ydatas[i].zdcbcolor
|
const bz = ydatas[i].bzz
|
let obj
|
if (bz) {
|
obj = {
|
name: ydatas[i].name,
|
// symbol:'circle', // 折点形状
|
// symbolSize: 3, //大小
|
smooth: true, // 直线 ,true 为曲线
|
itemStyle: {
|
normal: {
|
color: function (c) { // 根据value 显示不同的折点颜色
|
let biaozhuiz
|
for (let i = 0; i < this.bzzList.length; i++) {
|
if (this.bzzList[i].name === c.seriesName) {
|
biaozhuiz = this.bzzList[i].bzhui
|
}
|
}
|
if (c.value[1] > biaozhuiz) {
|
return zdcbcolor
|
} else if (c.value[1] > biaozhuiz * 0.9) {
|
return '#FFA500'
|
} else {
|
return '#33c95f'
|
}
|
},
|
lineStyle: { // 折线的颜色
|
color: ydatas[i].zxcolor,
|
width: 2
|
},
|
// borderColor:'black', //折点边框的颜色
|
label: { // 显示值
|
show: false
|
}
|
}
|
|
},
|
type: 'line',
|
data: ydatas[i].data,
|
markLine: { // 平均值 , 和 指标上限
|
symbol: 'none',
|
data: [{
|
label: {
|
normal: {
|
position: 'end',
|
formatter: ''// ydatas[i].name+'标准值' //+'{c}'
|
}
|
},
|
name: '标准值',
|
yAxis: bz,
|
lineStyle: {
|
color: ydatas[i].zxcolor,
|
type: 'dashed',
|
width: 2
|
}
|
}
|
]
|
}
|
}
|
} else {
|
obj = {
|
name: ydatas[i].name,
|
// symbol:'circle', // 折点形状
|
// symbolSize: 3, //大小
|
smooth: true, // 直线 ,true 为曲线
|
yAxisIndex: 1,
|
itemStyle: {
|
normal: {
|
color: function (c) { // 根据value 显示不同的折点颜色
|
return '#33c95f'
|
},
|
lineStyle: { // 折线的颜色
|
color: ydatas[i].zxcolor,
|
width: 2
|
},
|
// borderColor:'black', //折点边框的颜色
|
label: { // 显示值
|
show: false
|
}
|
}
|
|
},
|
type: 'line',
|
data: ydatas[i].data
|
}
|
}
|
|
if (ydatas[i].name === '废气流量' || ydatas[i].name === '废气') {
|
obj.yAxisIndex = 1
|
}
|
// 临时
|
const datatype = 1
|
if (datatype === 1) {
|
dataUnit = '流量(m³/d)'
|
} else {
|
dataUnit = '流量(m³/h)'
|
}
|
serLists.push(obj)
|
}
|
const option = {
|
/* title: {
|
text: title,
|
}, */
|
tooltip: { // 提示框
|
trigger: 'axis',
|
axisPointer: {
|
type: 'cross',
|
label: {
|
color: '#1a4245'
|
}
|
},
|
formatter: function (params) {
|
let s = params[0].name + '<br />'
|
for (let i = 0; i < params.length; i++) {
|
// let name = params[i].name
|
// 图表title名称
|
const seriesName = params[i].seriesName
|
// 值
|
const value = params[i].value[1]
|
|
// let valueFliter = formatter(value)
|
const valueFliter = parseFloat(value).toFixed(2)
|
|
let maker = params[i].marker
|
let colo = ''
|
switch (seriesName) {
|
case 'ph':
|
colo = '#f206ff'
|
break
|
case '氮氧化物':
|
colo = '#00B0F0'
|
break
|
case '烟尘':
|
colo = '#e0ffff'
|
break
|
case '二氧化碳':
|
colo = '#9ACD32'
|
break
|
case '二氧化磷':
|
colo = '#f48183'
|
break
|
default:
|
colo = ''
|
break
|
}
|
maker = '<span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:' + colo + ';"></span>'
|
s += maker + seriesName + ':' + valueFliter + '<br />'
|
}
|
return s
|
}
|
},
|
toolbox: {
|
show: false,
|
feature: {
|
saveAsImage: {}
|
}
|
},
|
grid: {
|
top: '20%',
|
bottom: '15%'
|
},
|
legend: {
|
data: legend
|
},
|
dataZoom: [{
|
type: 'inside',
|
start: 0,
|
end: 100
|
}, {
|
start: 0,
|
end: 100,
|
show: false,
|
handleIcon: 'M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4v1.3h1.3v-1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7V23h6.6V24.4z M13.3,19.6H6.7v-1.4h6.6V19.6z',
|
handleSize: '80%',
|
handleStyle: {
|
color: '#fff',
|
shadowBlur: 3,
|
shadowColor: 'rgba(0, 0, 0, 0.6)',
|
shadowOffsetX: 2,
|
shadowOffsetY: 2
|
}
|
}],
|
xAxis: { // x 轴设置
|
type: 'time',
|
boundaryGap: false,
|
axisLabel: { // x轴全部显示
|
// rotate: 30,
|
margin: 6,
|
interval: 0,
|
textStyle: {
|
color: '#fff'
|
}
|
},
|
splitLine: { // 网格垂直线为 虚线
|
show: true,
|
lineStyle: {
|
type: 'dashed'
|
}
|
},
|
axisTick: { // x 轴刻度显示
|
show: false
|
},
|
axisLine: {
|
lineStyle: {
|
color: '#FFFFFF',
|
width: 1// 这里是为了突出显示加上的
|
}
|
}
|
// data: xdata
|
},
|
yAxis: [{
|
type: 'value',
|
name: yname,
|
max: function (value) {
|
return parseInt(value.max + 30)
|
},
|
axisLabel: {
|
formatter: '{value}',
|
textStyle: {
|
color: '#fff'
|
}
|
},
|
axisPointer: {
|
snap: true
|
},
|
splitLine: {
|
show: false
|
}, // y轴 网格线不显示,
|
axisLine: {
|
lineStyle: {
|
color: '#FFFFFF',
|
width: 1// 这里是为了突出显示加上的
|
}
|
}
|
}, {
|
type: 'value',
|
name: dataUnit,
|
axisLabel: {
|
formatter: '{value}',
|
textStyle: {
|
color: '#fff'
|
}
|
},
|
axisPointer: {
|
snap: true
|
},
|
splitLine: {
|
show: false
|
}, // y轴 网格线不显示,
|
// inverse: true,
|
// nameLocation: 'start',
|
// max:500,
|
axisLine: {
|
lineStyle: {
|
color: '#FFFFFF',
|
width: 1// 这里是为了突出显示加上的
|
}
|
}
|
}],
|
series: serLists
|
}
|
this.myChart.setOption(option)
|
},
|
// 定时器 根据时间间隔请求数据
|
IntervalRealTimeDate (id, unionTagCodeList, BBZMAPPING) {
|
// const interValHander = setInterval(function () {
|
// this.initEchartsData()
|
// console.log('间隔请求数据')
|
// }, 1500)
|
// console.log(interValHander)
|
}
|
}
|
}
|
</script>
|
|
<style scoped lang="less">
|
.grid-content {
|
font-size: 8px;
|
background-color: #2e4967;
|
text-align: center;
|
border-radius: 2px;
|
margin-right: 10px;
|
padding: 0 10px;
|
|
> i {
|
color: #ffffff;
|
}
|
}
|
|
.animation {
|
//width: 600px;
|
//height: 0.06rem;
|
.infomation {
|
padding: 5px 10px;
|
}
|
}
|
|
.form-echrts {
|
width: 100%;
|
border-top: 1px solid #396d83;
|
//margin: 10px 10px 10px 10px;
|
.from-search {
|
display: flex;
|
padding: 5px;
|
|
> div {
|
margin-left: 10px
|
}
|
|
.pickerMon {
|
display: flex;
|
|
> div:first-child {
|
margin-right: 10px;
|
}
|
|
.pickerData {
|
flex: 1;
|
display: flex;
|
|
> span {
|
line-height: 22px
|
}
|
|
.pickerTable {
|
margin-left: 3px;
|
}
|
}
|
}
|
|
/deep/ .el-date-editor--datetime {
|
width: 100%;
|
}
|
|
/deep/ .el-input__inner {
|
position: relative;
|
width: 140px;
|
background-color: #2e4967;
|
color: #fff;
|
font-size: 12px;
|
height: 24px;
|
padding: 0;
|
border-color: #00fff6;
|
text-align: center;
|
z-index: 9999;
|
//padding-left:20px ;
|
//padding: 0!important;
|
}
|
|
/deep/ .el-input__icon {
|
display: block;
|
width: 140px;
|
height: 22px;
|
line-height: 22px;
|
cursor: pointer;
|
font-size: 0;
|
}
|
|
.echatsInput {
|
color: #00ffff;
|
background-color: #2e4967;
|
border: none;
|
border-radius: 6px;
|
width: 80px;
|
height: 22px;
|
}
|
|
input::-webkit-calendar-picker-indicator {
|
opacity: 100;
|
}
|
|
.detailbtn {
|
background-color: #2e4967;
|
text-align: center;
|
padding: 0 7px;
|
line-height: 20px;
|
border-radius: 4px;
|
margin-right: 6px;
|
}
|
|
}
|
|
.el-dialog-div {
|
//height: 50vh!important;
|
overflow: auto;
|
//overflow: hidden;
|
}
|
|
#echarts {
|
margin: 0;
|
padding: 0;
|
//height: 3rem;
|
//border: 1px solid #396d83;
|
//margin: 10px 10px 10px 10px;
|
}
|
}
|
</style>
|