123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721 |
- <template>
-
- <div class="scada-monitor" style="padding: 0">
- <tf-legend class="legend_dept" label="条件搜索" isopen="true" title="描述站位。">
- <el-row>
- <div class="innerType">
- <el-select
- v-model="type"
- size="small"
- clearable
- placeholder="请选择设备类型"
- style="float: left; width: 46%; margin-right: 4%;"
- >
- <el-option key="1" label="水厂" value="1" />
- <el-option key="2" label="管网" value="2" />
-
- </el-select>
- <el-select
- v-model="deviceType"
- size="small"
- clearable
- multiple
- collapse-tags
- placeholder="请选择设备类型"
- style="float: left;margin-right: 4%; width: 50%;"
- >
- <el-option v-for="item in deviceTypes" :key="item.ccode" :label="item.cname" :value="item.ccode" />
- </el-select>
- </div>
- <el-input
- v-model="querySiteName"
- class="helpInput"
- style="float: left; width: calc(100% - 46px); margin: 6px 0"
- clearable
- size="small"
- placeholder="请输入设备名称"
- >
- <template slot-scope="{ item }">
- <i class="el-icon-location" />
- <span class="name">{{ item.value }}</span>
- </template>
- </el-input>
- <el-button
- style="
- float: left;
- height: 32px;
- margin-top: 6px;
- border-radius: 0px 4px 4px 0px;
- "
- type="primary"
- icon="el-icon-search"
- size="small"
- plain
- @click="querySite"
- />
- </el-row>
- </tf-legend>
- <tf-legend
- class="legend_dept"
- label="监测列表"
- isopen="true"
- title="描述站位。"
- style="height: calc(100% - 124px); padding: 0"
- :can-change="false"
- >
- <div style="position: absolute;top: -28px;right: 20px;" class='warning'>
- <el-switch v-model="warning" active-text="关闭报警" inactive-text="开启报警"></el-switch>
- <video autoplay='autoplay' loop='loop' v-if='existWarnig&&warning' ref="videoMsg" :src="mp3" style="display: none" />
- </div>
- <el-table v-loading="tableLoading" height="calc(100% - 26px)" :data="siteDataTable" stripe style="width: 100%">
- <el-table-column prop="site" label="设备名称" align="center" show-overflow-tooltip />
- <el-table-column fixed="right" label="操作" width="120" align="center">
- <template slot-scope="scope">
- <el-button type="text" size="small" @click="goto(scope.row)">查看</el-button>
- <el-button type="text" size="small" @click="getSiteHistroty(scope.row)">趋势图</el-button>
- <el-button v-if="scope.row.isCraft" type="text" size="small" @click="watchCraft(scope.row)">工艺图</el-button>
- </template>
- </el-table-column>
- </el-table>
- <div style="margin-top: 8px">
- <div style="float: left; width: 80%">
- <el-pagination
- ref="pagination"
- background
- layout="total, sizes, prev, next"
- :total="total"
- :page-sizes="[20, 30, 50, 80, 160]"
- @current-change="listRefersh(resData)"
- @size-change="listRefersh(resData)"
- />
- </div>
- <div style="float: left; width: 20%" class="el-pagination is-background">
- <span ref="pageLength" style="font-size: 13px" class="el-pagination__total">1/1 页</span>
- </div>
- <div style="clear: both" />
- </div>
- </tf-legend>
- <el-dialog title="工艺图" :visible.sync="craftVisible" top="50px" @close="craftClose">
- <div ref="craft" />
- </el-dialog>
- <ScadaMapCom
- ref="scadaMapComAll"
- :map-view="mapView"
- :site-data="siteData"
- :isscadashow="true"
- :ismapok="false"
- maplayer-name="scadaAll"
- />
- </div>
- </template>
- <script>
- import tfLegend from '@/views/zhpt/common/Legend'
- import TableItem from '@/components/Table'
- import request from '@/utils/request'
- import mp3 from '@/assets/images/home/msg.mp3';
- import { getScadaMonitor, getScadaListAll, queryMonitorHistory } from '@/api/SCADAInfoApi'
- import Echarts from 'echarts'
- import { TF_craft } from './createSiteCraft'
- import { craftConfig, deviceConfig, deviceStateConfig } from './craftConfig'
- import { getSysCommonCode } from '@/api/dataCenter'
- import ScadaMapCom from '@/views/zhpt/scada/scadaMonitorAll/components/scadaMapCom'
- import MonitorCurve from './components/monitorcurve'
- export default {
- name: 'ScadaMonitor',
- components: { TableItem, tfLegend, Echarts, MonitorCurve, ScadaMapCom },
- props: { data: Object },
- data() {
- return {
-
- querySiteName: '',
- tableLoading: false,
-
- siteDataTable: [],
- total: 0,
- warning:true,
- mp3:mp3,
- existWarnig:false,
-
- craftVisible: false,
-
- historyLoading: false,
- siteVisible: false,
- siteTitle: '',
- siteType: '',
- sites: [],
- timss: [],
- siteHistoryDataTable: [],
- total2: 0,
- dontShow: true,
- resData: [],
- deviceTypes: [],
- type: '',
-
- deviceType: [],
- mapView: {},
- siteData: [],
- queryTimeOut:null,
-
- layer: undefined,
- hitlayer: undefined,
- divs: [],
- mapClick: undefined
- }
- },
- computed: {
- sidePanelOn() {
- return this.$store.state.map.P_editableTabsValue
- }
- },
- watch: {
- sidePanelOn(newTab, oldTab) {
- if (newTab == oldTab) return
- if (newTab == 'scadaMonitorAll') {
- this.$nextTick(() => {
-
-
-
-
- const scadalayer = this.data.mapView.map.findLayerById('scadaAll')
- const scadahitlayer = this.data.mapView.map.findLayerById('scadaAllhit')
- if (scadalayer !== null && scadalayer !== undefined) {
- scadalayer.visible = true
- }
- if (scadahitlayer !== null && scadahitlayer !== undefined) {
- scadahitlayer.visible = true
- }
- if(this.$refs.scadaMapComAll&&this.$refs.scadaMapComAll.divs){
- for (var i = 0, il =this.$refs.scadaMapComAll.divs, ii = il.length; i < ii; i++) {
- il[i].div.style.display = ''
- }
- }
- this.addWatch&&this.addWatch()
- if (this.ids&&this.ids.length > 0) this.loadRealTimeSiteValue()
- })
- }
- if (oldTab == 'scadaMonitorAll') {
- const scadalayer = this.data.mapView.map.findLayerById('scadaAll')
- const scadahitlayer = this.data.mapView.map.findLayerById('scadaAllhit')
- if (scadalayer !== null && scadalayer !== undefined) {
- scadalayer.visible = false
- }
- if (scadahitlayer !== null && scadahitlayer !== undefined) {
- scadahitlayer.visible = false
- }
- if(this.$refs.scadaMapComAll&&this.$refs.scadaMapComAll.divs){
- for (var i = 0, il = this.$refs.scadaMapComAll.divs, ii = il.length; i < ii; i++) {
- il[i].div.style.display = 'none'
- }
- }
- if (this.watch) {
- this.watch.remove()
- this.watch = undefined
- }
- if (this.timeOut) window.clearTimeout(this.timeOut)
- }
- }
- },
- created() {
- getSysCommonCode({ pCid: '53400' }).then((res) => {
- this.deviceTypes = res.result[0].codeList
-
- this.deviceTypes.splice(this.deviceTypes.findIndex(item => item.ccode === '4'), 1)
- })
- },
- mounted() {
- var view = (this.mapView = this.data.mapView)
- this.floatDiv = view.TF_floatPanel
- const scadalayer = view.map.findLayerById('scadaAll')
- const scadahitlayer = view.map.findLayerById('scadaAllhit')
- if (scadalayer !== null && scadalayer !== undefined) {
- scadalayer.visible = false
- }
- if (scadahitlayer !== null && scadahitlayer !== undefined) {
- scadahitlayer.visible = false
- }
- this.querySite()
- },
- destroyed() {
- this.siteData = []
- if (this.queryTimeOut) window.clearTimeout(this.queryTimeOut)
-
- var view = this.mapView
- const scadalayer = view.map.findLayerById('scadaAll')
- const scadahitlayer = view.map.findLayerById('scadaAllhit')
- if (scadalayer !== null && scadalayer !== undefined) {
- scadalayer.visible = true
- }
- if (scadahitlayer !== null && scadahitlayer !== undefined) {
- scadahitlayer.visible = true
- }
-
-
- },
- methods: {
- querySite() {
- const that = this
- var pages = that.$refs.pagination
- const data = { name: that.querySiteName }
- that.tableLoading = true
- if (that.type != '') { Object.assign(data, { type: that.type }) }
- if (that.deviceType != '') {
-
- Object.assign(data, { deviceTypeIds: that.deviceType.join(',') })
- }
- var modulesFiles = require.context('./images', true, /\.png$/)
- getScadaMonitor(data).then((res) => {
- that.siteData = []
- pages.internalCurrentPage = 1
- if (res.code == 1) {
-
-
-
- var result = res.result
- if (result) {
- this.existWarnig=false;
- this.resData = result
- this.total = result.length
- for (var i = 0, ii = result.length; i < ii; i++) {
- var site = result[i]
-
- let isError = false
- let monitorModel = {}
- if (site.allocations) {
- const allocationsAry = site.allocations.sort(compare('sortNumber'))
- if (allocationsAry.length > 0) {
- monitorModel = allocationsAry[0]
- }
- const allocationsFilter = site.allocations.filter(item => {
- return item.isAlarm == '1'
- })
- if (allocationsFilter.length > 0) {
- isError = true;
- this.existWarnig=true;
- }
- }
-
-
- const deviceTypeImg = modulesFiles('./' + (isError ? deviceConfig[site.deviceType].image_red : deviceConfig[site.deviceType].image))
-
- that.siteData.push({
- id: site.id,
- site: site.name,
- x: site.longitude,
- y: site.latitude,
- isCraft: false,
- icon: deviceTypeImg,
- monitorModel: monitorModel,
- deviceType:site.deviceType,
- scadaEntity: site
- })
- }
- this.listRefersh(result)
- } else {
- that.siteDataTable = []
- this.$refs.pageLength.innerHTML = '0/0 页'
- }
- }
- this.tableLoading = false
- })
- function compare(key) {
- return function(value1, value2) {
- var val1 = value1[key]
- var val2 = value2[key]
- return val1 - val2
- }
- }
-
- if(!this.queryTimeOut){
- this.queryTimeOut = window.setTimeout(() => {
- window.clearTimeout(this.queryTimeOut);
- this.queryTimeOut=null;
- this.querySite()
- }, 1000 * 60 * 1)
- }
- },
- listRefersh(res) {
- console.log('前端分页')
-
- var pages = this.$refs.pagination
- var current = pages.internalCurrentPage
- var size = pages.internalPageSize
- var sites = this.siteData
- var firstIndex = (current - 1) * size
- var showSites = (this.siteDataTable = sites.slice(
- firstIndex,
- firstIndex + size
- ))
- this.$refs.pageLength.innerHTML =
- current + '/' + Math.ceil(sites.length / size) + ' 页'
- },
- loadRealTimeSiteValue() {
- const data = { name: this.querySiteName }
- if (this.deviceType != '') { Object.assign(data, { deviceType: this.deviceType }) }
- getScadaMonitor(data).then((res) => {
- if (res.code == 1) {
- res = res.result.filter((item) => {
- return item.allocations
- })
- setValue(res)
- } else {
- this.$message.error('获取测站指标失败!' + res.message)
- console.log(res)
- }
- })
- var setValue = (res) => {
- var index = this.siteIndex
- for (var item in res) {
- if (!index.hasOwnProperty(res[item].id)) continue
- var di = index[res[item].id].children
- var dr = res[item].allocations
- for (const item2 in dr) {
- for (var i = 0, ii = di.length; i < ii; i++) {
- var ddi = di[i]
- var id = ddi.getAttribute('data')
- if (dr[item2].variableCode != id) continue
- var ddr = dr[item2].scada
- if (!ddr) continue
- var value = ddr.value
- ddi.children[1].innerHTML = value == 'null' ? '-' : value
- ddi.children[3].classList.value =
- 'scadaLayer-float-arrow' + (ddr.mark || 1)
- }
- }
- }
- this.timeOut = window.setTimeout(
- (_) => this.loadRealTimeSiteValue(),
- 1000 * 60 * 1
- )
- }
- },
- goto(row) {
- if (row.x) {
- var mapView = this.mapView
- mapView.center = {
- x: row.x,
- y: row.y,
- spatialReference: mapView.spatialReference
- }
- mapView.zoom = 6
- } else {
- this.$message('此测站无坐标信息')
- }
- },
- getSiteHistroty(e) {
- this.$refs.scadaMapComAll.getSiteHistroty(e)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- },
-
- showScadaHistory(e) {
- this.siteVisible = true
- this.getSiteHistroty(e)
- },
-
- showResult() {
- if (!this.timss) return this.$message.error('请选择时间范围')
- this.historyLoading = true
- this.$refs.pagination2.internalCurrentPage = 1
- this.getAllData()
- this.siteHistiryQuery = [
- this.selectZBXIndex[this.siteType][0],
- this.timss
- ]
- this.pagRefersh()
- },
- getAllData() {
- var datt = this.selectZBXIndex[this.siteType]
- var times = this.timss
- var parm = this.siteType.replace(/\#/g, '%23')
- const params = {
- code: parm,
- start: times[0],
- end: times[1],
- isPage: false
- }
- getScadaListAll(params).then((res) => {
- var chart = this.chart
- chart.clear()
- if (res.code == 1) {
- res = res.result.records
- this.total2 = res.length
- var dontShow = this.dontShow
- var dataX = []
- var dataY = []
- var max = -Infinity
- var min = Infinity
- var Xmax = -Infinity
- var Xmin = Infinity
- var d
- var symbol = 'none'
- for (var i = 0, ii = res.length; i < ii; i++) {
- var v = parseFloat(res[i].value)
- if (dontShow && v == -9999) continue
-
- const x = res[i].scadaTime.substring(5)
- dataX.push(x)
- dataY.push(v)
-
-
-
-
- }
-
-
- var [type, unit] = datt
- chart.setOption({
- title: {
- text: type,
- left: 'center',
- subtext: times[0] + '至' + times[1]
- },
- color: 'rgb(45, 116, 231)',
- grid: { left: '50px', right: '50px', bottom: '80px' },
-
-
-
-
-
-
-
- toolbox: { feature: { saveAsImage: {}}},
- tooltip: {
- trigger: 'axis',
- formatter(a) {
- return (
- '记录时间:' +
- a[0].axisValue +
- '<br>' +
- type +
- ' ' +
- a[0].data +
- ' ' +
- unit
- )
- }
- },
- xAxis: [
- {
- name: '日期',
- type: 'category',
- data: dataX,
- axisTick: {
- show: false
- },
- axisLine: {
- show: false
- }
- }
- ],
- yAxis: [{ name: unit, type: 'value' }],
- dataZoom: [
- { type: 'inside', start: 0, end: 100 },
- { start: 0, end: 100 }
- ],
- series: [
- {
- type: 'line',
- symbol,
- smooth: true,
- data: dataY,
- markPoint: {
- data: [
- { type: 'max', name: 'Max' },
- { type: 'min', name: 'Min' }
- ]
- },
- markLine: {
- data: [
- {
- type: 'average',
- name: 'Avg',
- label: {
- show: true,
- formatter: '平均值:\n {c}'
- }
- }
- ]
- }
- }
- ]
- })
- } else {
- this.$message.error('获取指标历史失败!' + res.message)
- console.error(res)
- }
- this.historyLoading = false
- })
- },
- pagRefersh() {
- this.tableLoading = true
- var pages = this.$refs.pagination2
- var parm = this.siteType.replace(/\#/g, '%23')
- var [zbx, times] = this.siteHistiryQuery
- const params = {
- code: parm,
- start: times[0],
- end: times[1],
- current: pages.internalCurrentPage,
- size: pages.internalPageSize
- }
- queryMonitorHistory(params).then((res) => {
- if (res.code == 1) {
- res = res.result
- this.siteHistoryDataTable = res.records
- this.$refs.pageLength2.innerHTML =
- (pages.internalCurrentPage || 1) +
- '/' +
- Math.ceil(parseInt(res.total) / pages.internalPageSize) +
- ' 页'
- } else {
- this.$message.error(res.message)
- this.siteHistoryDataTable = []
- this.$refs.pageLength2.innerHTML = '1/1 页'
- }
- this.tableLoading = false
- })
- },
- watchCraft(row) {
- var config = craftConfig[row.id]
- if (config) {
- this.craftVisible = true
- var image = new Image()
- var modulesFiles = require.context('./images', true, /\.png$/)
- image.src = modulesFiles('./' + config.craftImage)
- image.onload = () => {
- var craft = TF_craft({
- div: this.$refs.craft,
- image: image,
- config: config.config,
- id: row.id
- })
- this.craftRealTime(row.id, craft.index)
- craft.divs.map((e) => (e.onclick = this.getSiteHistroty))
- }
- } else this.$message.error('工艺图未配置')
- },
- craftRealTime(id, index) {
- request({
- url: '/gis/customDisplay/getSiteInfos?stids=' + id,
- method: 'post'
- }).then((res) => {
- if (res.code == 1 && (res = res.result[id])) {
- for (var item in res) {
- if (!index.hasOwnProperty(item)) continue
- index[item].innerHTML = res[item].realVal
- }
- this.craftTimeOut = window.setTimeout(() => {
- this.craftRealTime(id, index)
- }, 1000 * 60 * 1)
- } else {
- this.$message.error('获取测站指标失败!' + res.message)
- console.log(res)
- }
- })
- },
- craftClose() {
- if (this.craftTimeOut) window.clearTimeout(this.craftTimeOut)
- },
-
- arrayIsNull(aryList) {
- return (typeof (aryList) === 'undefined' || aryList == null || aryList.length == 0)
- },
-
- strIsNull(strVal) {
- strVal = strVal || ''
- return (typeof (strVal) === 'undefined' || strVal == null || strVal == '')
- }
- }
- }
- </script>
- <style lang='scss' scoped>
- .innerType {
- display: flex;
- width: 100%;
- // border: 1px red solid;
- }
- .legend_dept{
- /deep/ .el-table tr {
- background-color: #FFFFFF;
- height: auto;
- }
- }
- </style>
|