变电近电作业,受限空间

This commit is contained in:
hongchao 2025-01-03 15:02:17 +08:00
parent c5517b019b
commit 1acf302d0b
7 changed files with 460 additions and 651 deletions

View File

@ -166,3 +166,52 @@ export const queryWarnConfigApi = (data) => {
}) })
} }
// 查询有限空间监测设备 - 报警记录
export const queryWarnSpaceListApi = (data) => {
return request.get(`/base/screen/info/queryInfoWarnSpaceList`, {
params: data
})
}
// 查询有限空间当年监测设备 - 报警记录
export const queryWarnSpaceMonthApi = (data) => {
return request.get(`/base/screen/info/queryInfoWarnSpaceMonth`, {
params: data
})
}
// 查询有限空间当年违章类型占比监测设备 - 报警记录
export const queryWarnSpaceTypeApi = (data) => {
return request.get(`/base/screen/info/queryInfoWarnSpaceType`, {
params: data
})
}
// 删除受限空间视频预警
export const delWarnSpace = (data) => {
return request.post('/base/screen/info/delWarnSpace', data)
}
// 查询近电感应设备 - 报警记录
export const queryWarnElectListApi = (data) => {
return request.get(`/base/screen/info/queryInfoWarnElectList`, {
params: data
})
}
// 删除近电感应预警
export const delWarnElect = (data) => {
return request.post('/base/screen/info/delWarnElect', data)
}
// 查询近电感应参数配置数据
export const getWarnElectConfigApi = (data) => {
return request.get(`/base/screen/info/getWarnElectConfig`, {
params: data
})
}
// 修改近电感应参数配置数据
export const editConfig = (data) => {
return request.post('/base/screen/info/editConfig', data)
}

BIN
src/assets/img/pm1.0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -344,8 +344,8 @@
</el-dialog> </el-dialog>
<!-- 查看位移历史记录弹窗 --> <!-- 查看位移历史记录弹窗 -->
<el-dialog :title="title" :visible.sync="showShift" width="1000px" height="800px" append-to-body @close="closeShift"> <el-dialog :title="title" :visible.sync="showShift" width="1000px" height="800px" append-to-body @close="closeShift">
<el-form :model="queryShift" ref="queryFormShift" size="small" :inline="true" v-show="showSearch" label-width="68px"> <el-form :model="queryShift" ref="queryFormShift" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="设备名称" prop="deviceName"> <el-form-item label="设备名称" prop="deviceName">
<el-input <el-input
v-model="queryShift.deviceName" v-model="queryShift.deviceName"
@ -479,6 +479,7 @@ export default {
showSearch: true, showSearch: true,
settleLoad: false, settleLoad: false,
shiftLoad: false, shiftLoad: false,
tableShiftList: [],
} }
}, },
created() { created() {
@ -549,31 +550,7 @@ export default {
}) })
this.detectShiftList = res.data.data this.detectShiftList = res.data.data
}, },
// async getTowerTodayData(proId) {
// let res = await queryTowerTodayApi({
// proId
// })
// res.data.forEach(item => {
// if(item.devType === '117') {
// item.angle = item.jcValue + '°'
// } else if(item.dev === '118') {
// item.pull = item.jcValue + 'N'
// }
// })
// this.detectList = res.data
// },
// async getEnvironmentData(devId, type) {
// let res = await queryEnvironmentInfoByIdApi({
// devId
// })
// if(type === '117') {
// this.angleFirst = res.data.data[0].jcValue
// this.angleList = res.data.data.filter(item => item.jcUnit === '°')
// } else if(type === '118') {
// this.pullFirst = res.data.data[0].jcValue
// this.pullList = res.data.data.filter(item => item.jcUnit === 'N')
// }
// },
selTowerAngle(val) { selTowerAngle(val) {
console.log(val) console.log(val)
this.currentAngleTower = val.devId this.currentAngleTower = val.devId

View File

@ -6,6 +6,22 @@
<img src="../../assets/img/lef-badge.png" alt="" /> <img src="../../assets/img/lef-badge.png" alt="" />
GLL通管监测 GLL通管监测
</div> </div>
<div style="display: flex; justify-content: right">
<el-select
v-model="deviceVal"
clearable
filterable
placeholder="请选择"
@change="deviceChange"
>
<el-option
v-for="item in deviceRange"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
</div> </div>
<div class="work-icons"> <div class="work-icons">
<!-- <div <!-- <div
@ -19,7 +35,7 @@
</div>--> </div>-->
<div class="single-icon"> <div class="single-icon">
<span style="color: #42c8e3" <span style="color: #42c8e3"
>{{environmentInfoList ? environmentInfoList[8].jcValue : '0'}}°C</span> >{{environmentInfoList ? environmentInfoList[0].jcValue : '0'}}°C</span>
<span>温度</span> <span>温度</span>
<img src="../../assets/img/temp.png" alt="" /> <img src="../../assets/img/temp.png" alt="" />
</div> </div>
@ -38,7 +54,7 @@
<span style="color: #87d674" <span style="color: #87d674"
>{{ >{{
environmentInfoList environmentInfoList
? environmentInfoList[9].jcValue ? environmentInfoList[1].jcValue
: '0' : '0'
}}%rh</span }}%rh</span
> >
@ -46,26 +62,15 @@
<img src="../../assets/img/wet.png" alt="" /> <img src="../../assets/img/wet.png" alt="" />
</div> </div>
<div class="single-icon"> <div class="single-icon">
<span style="color: #f2ad49" <span style="color:cornflowerblue"
>{{ >{{
environmentInfoList environmentInfoList
? environmentInfoList[5].jcValue ? environmentInfoList[2].jcValue
: '0'
}}db</span
>
<span>噪声</span>
<img src="../../assets/img/loud.png" alt="" />
</div>
<div class="single-icon">
<span style="color:blue"
>{{
environmentInfoList
? environmentInfoList[3].jcValue
: '0' : '0'
}}/ugm3</span }}/ugm3</span
> >
<span>PM1.0</span> <span>PM1.0</span>
<img src="../../assets/img/pm2.5.png" alt="" /> <img src="../../assets/img/pm1.0.png" alt="" />
</div> </div>
<div class="single-icon"> <div class="single-icon">
<span style="color: #9634cc" <span style="color: #9634cc"
@ -238,7 +243,7 @@ export default {
let res = await queryDeviceByProApi({ let res = await queryDeviceByProApi({
powerId: this.sendMsg.gtId, powerId: this.sendMsg.gtId,
proId, proId,
devType: 116, devType: 137,
}) })
if (res.data.data.length !== 0) { if (res.data.data.length !== 0) {
this.deviceVal = res.data.data[0].devId this.deviceVal = res.data.data[0].devId
@ -257,7 +262,7 @@ export default {
async getDevTypeCodeDetails(proId) { async getDevTypeCodeDetails(proId) {
let param = { let param = {
proId: proId, proId: proId,
devTypeCode: 116, devTypeCode: 137,
} }
let res = await getDevTypeCodeDetails(param) let res = await getDevTypeCodeDetails(param)
this.tableList = res.data this.tableList = res.data
@ -284,12 +289,12 @@ export default {
console.log(res) console.log(res)
this.deviceConfig = res.data this.deviceConfig = res.data
}, },
// deviceChange(e) { deviceChange(e) {
// console.log(e) console.log(e)
// this.getEnvironmentData(e) this.getEnvironmentData(e)
// this.getChartsData(e) this.getChartsData(e)
// this.getWarnConfig(e) this.getWarnConfig(e)
// }, },
generateCharts(list) { generateCharts(list) {
console.log(list) console.log(list)
@ -307,10 +312,10 @@ export default {
return item.xtime return item.xtime
}) })
let loudArr = list['噪声'].map((item) => { let pm1Arr = list['pm1.0'].map((item) => {
return Number(item.jcValue) return Number(item.jcValue)
}) })
let loudXList = list['噪声'].map((item) => { let pm21XList = list['pm1.0'].map((item) => {
return item.xtime return item.xtime
}) })
@ -324,9 +329,6 @@ export default {
let pm10Arr = list['pm10'].map((item) => { let pm10Arr = list['pm10'].map((item) => {
return Number(item.jcValue) return Number(item.jcValue)
}) })
let windSpeedList = list['风速'].map((item) => {
return Number(item.jcValue)
})
// //
let tempOption = { let tempOption = {
grid: { grid: {
@ -493,114 +495,6 @@ export default {
let sdChart = echarts.init(document.querySelector('#sd-chart')) let sdChart = echarts.init(document.querySelector('#sd-chart'))
sdChart.setOption(sdOption) sdChart.setOption(sdOption)
// //
// let wetOption = {
// grid: {
// width: '80%',
// height: '60%',
// },
// tooltip: {
// trigger: 'axis',
// axisPointer: {
// type: 'shadow',
// },
// valueFormatter: (value) => {
// return value + 'm/s'
// },
// },
// xAxis: {
// type: 'category',
// data: wetXList,
// },
// yAxis: {
// type: 'value',
// name: 'm/s',
// },
// series: [
// {
// name: '',
// data: windSpeedList,
// type: 'line',
// smooth: true,
// lineStyle: {
// color: '#FE8511',
// },
// itemStyle: {
// normal: {
// color: '#FE8511',
// },
// },
// areaStyle: {
// color: {
// x: 0,
// y: 0,
// x2: 0,
// y2: 1,
// type: 'linear',
// colorStops: [
// { offset: 0, color: '#F5CC91' },
// { offset: 1, color: '#F8F6F6' },
// ],
// },
// },
// },
// ],
// }
// let wetChart = echarts.init(document.querySelector('#wet-chart'))
// wetChart.setOption(wetOption)
// //
// let loudOption = {
// grid: {
// width: '80%',
// height: '60%',
// },
// tooltip: {
// trigger: 'axis',
// axisPointer: {
// type: 'shadow',
// },
// valueFormatter: (value) => {
// return value + ''
// },
// },
// xAxis: {
// type: 'category',
// data: loudXList,
// },
// yAxis: {
// type: 'value',
// name: 'db',
// },
// series: [
// {
// name: '',
// data: loudArr,
// type: 'line',
// smooth: true,
// symbol: 'none',
// lineStyle: {
// color: '#4781FC',
// },
// areaStyle: {
// color: {
// x: 0,
// y: 0,
// x2: 0,
// y2: 1,
// type: 'linear',
// colorStops: [
// { offset: 0, color: '#CCDBFF' },
// { offset: 1, color: '#ECF2FF' },
// ],
// },
// },
// },
// ],
// }
// let loudChart = echarts.init(document.querySelector('#loud-chart'))
// loudChart.setOption(loudOption)
// //
let airOption = { let airOption = {
grid: { grid: {
@ -625,16 +519,31 @@ export default {
name: 'ugm3', name: 'ugm3',
}, },
series: [ series: [
{
name: 'PM1.0',
data: pm1Arr,
type: 'line',
lineStyle: {
color: 'cornflowerblue',
},
itemStyle: {
normal: {
color: 'cornflowerblue',
},
},
symbol: 'none',
smooth: true,
},
{ {
name: 'PM2.5', name: 'PM2.5',
data: pm25Arr, data: pm25Arr,
type: 'line', type: 'line',
lineStyle: { lineStyle: {
color: '#FC8B2D', color: '#9484FC',
}, },
itemStyle: { itemStyle: {
normal: { normal: {
color: '#FC8B2D', color: '#9484FC',
}, },
}, },
symbol: 'none', symbol: 'none',
@ -645,11 +554,11 @@ export default {
data: pm10Arr, data: pm10Arr,
type: 'line', type: 'line',
lineStyle: { lineStyle: {
color: '#4B84FC', color: '#1db1c0',
}, },
itemStyle: { itemStyle: {
normal: { normal: {
color: '#4B84FC', color: '#1db1c0',
}, },
}, },
symbol: 'none', symbol: 'none',
@ -825,7 +734,6 @@ export default {
box-sizing: border-box; box-sizing: border-box;
padding: 10px 20px; padding: 10px 20px;
background-color: #eff4fe; background-color: #eff4fe;
display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
color: #000; color: #000;

View File

@ -1,111 +1,113 @@
<template> <template>
<div class="hole-page"> <div class="hole-page">
<div class="tower-detect"> <div class="tower-detect">
<div class="inner-tit"> <div class="inner-tit" style="display: flex; justify-content: space-between; align-items: center;">
<div> <div>
<img src="../../assets/img/lef-badge.png" alt=""> <img src="../../assets/img/lef-badge.png" alt="">
近电感应设备 近电感应预警
</div> </div>
<el-button type="text" style="font-size: 18px;" @click="handleSignUp">参数配置</el-button>
</div> </div>
<div class="tower-info"> <el-form
<div class="tower-lef"> style="width: 100%;"
<div class="lef-spin"> :model="queryParams"
<div> ref="queryFormRef"
<h4 style="background-color: #D8D8D8"></h4> size="small"
离线 :inline="true"
</div> label-width="80px"
<div> >
<h4 style="background-color: #F31111"></h4> <el-form-item
报警 label="设备名称"
</div> prop="devName"
<div> >
<h4 style="background-color: #39CE10"></h4> <el-input
在线 v-model="queryParams.devName"
</div> placeholder="请输入设备名称"
</div> clearable maxlength="20"
<div class="lef-tower-pic" > style="width: 200px;"
<div
:class="['single-tower', getBorderColorClass(item)]"
v-for="item in deviceList"
:key="item.devId"
:style="{ border: '2px solid', padding: '1px' }"
>
<img
v-if="item.devStatus === 0 && item.devWarn === 0"
src="../../assets/img/deForm1.png"
alt=""
/> />
<img </el-form-item>
v-if="item.devWarn === 1" <el-form-item
src="../../assets/img/deForm3.png" label="预警时间"
prop="warnTime"
alt="" >
<el-date-picker
v-model="dateRange"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
style="background-color: #ECF3FE;">
</el-date-picker>
</el-form-item>
<el-button
style="margin-top: 3px"
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>搜索</el-button>
</el-form>
<el-table
:data="tableList"
stripe
style="width: 100%"
:row-style="rowStyle"
>
<el-table-column
label="序号"
align="center"
width="80"
type="index"
>
<template slot-scope="scope">
<span>{{ (queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1 }}</span>
</template>
</el-table-column>
<el-table-column
prop="devName"
label="设备名称"
align="center"
>
</el-table-column>
<el-table-column
prop="warnTime"
label="预警时间"
align="center"
>
</el-table-column>
<el-table-column
prop="warnContent"
label="预警内容"
align="center"
>
</el-table-column>
<el-table-column
label="操作"
align="center"
>
<template slot-scope="scope">
<el-button type="danger" size="mini" @click="handleWarn(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getTableList"
style="background-color: #f3f7ff;"
/> />
<img
v-if="item.devStatus === 1 && item.devWarn === 0"
src="../../assets/img/deForm2.png"
alt=""
/>
<div :class="['dev-name']" >{{ item.devName }}</div>
</div>
</div>
</div>
</div>
</div>
<div class="map">
<div id="map-container"></div>
</div>
<div class="key-standby">
<div class="inner-tit">
<div>
<img src="../../assets/img/lef-badge.png" alt="">
近电感应预警
</div>
<span @click="handleSignUp">参数配置</span>
</div>
<el-table
:data="keyPersonTable"
stripe
style="width: 100%"
:row-style="rowStyle"
>
<el-table-column
prop="postName"
label="设备名称"
align="center"
>
</el-table-column>
<el-table-column
prop="relName"
label="预警时间"
align="center"
width="80"
>
</el-table-column>
<el-table-column
prop="relPhone"
label="预警内容"
align="center"
>
</el-table-column>
</el-table>
</div> </div>
<!-- 查看参数配置弹窗 --> <!-- 查看参数配置弹窗 -->
<el-dialog :title="title" :visible.sync="showConfig" width="800px" height="800px" append-to-body @close="closeConfig"> <el-dialog :title="title" :visible.sync="showConfig" width="800px" height="800px" append-to-body @close="closeConfig">
<el-form :model="queryConfig" ref="queryFormConfig" size="small" :inline="true" v-show="showSearch" label-width="120px"> <el-form :model="queryConfig" ref="queryFormConfig" size="small" :inline="true" v-show="showSearch" label-width="120px">
<div
v-for="(item, index) in configItems"
:key="index"
class="dynamic-item"
>
<el-row :gutter="24"> <el-row :gutter="24">
<el-col :span="20"> <el-col :span="20">
<el-form-item label="线路属性:" prop="attribute"> <el-form-item label="线路属性:" prop="attribute">
<el-radio-group v-model="item.attribute"> <el-radio-group v-model="queryConfig.attribute">
<el-radio <el-radio
v-for="(radioItem, radioIndex) in radioList" v-for="(radioItem, radioIndex) in radioList"
:key="radioIndex" :key="radioIndex"
@ -119,7 +121,7 @@
<el-col :span="20"> <el-col :span="20">
<el-form-item label="电压等级:" label-width="195px" prop="elecLevel" style="display: flex;margin-bottom: 30px;" > <el-form-item label="电压等级:" label-width="195px" prop="elecLevel" style="display: flex;margin-bottom: 30px;" >
<el-radio-group v-model="item.elecLevel" style="display: flex; flex-wrap: wrap; gap: 10px;margin-top: 0px;align-items: center;"> <el-radio-group v-model="queryConfig.elecLevel" style="display: flex; flex-wrap: wrap; gap: 10px;margin-top: 0px;align-items: center;">
<el-radio <el-radio
v-for="(radioItem, radioIndex) in radioLevelList" v-for="(radioItem, radioIndex) in radioLevelList"
:key="radioIndex" :key="radioIndex"
@ -131,28 +133,6 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="24">
<el-col :span="17">
<el-form-item
label="报警距离:"
prop="distinct"
>
<div style="display: flex; align-items: center;">
<el-input
v-model="item.distinct"
placeholder="请输入"
style="width: 100%"
/>
<span style="margin-left: 10px;font-size: 16px;"></span>
</div>
</el-form-item>
</el-col>
<el-col :span="5" style="display: flex;justify-content: left;align-items: center;">
<el-button size="mini" type="success" @click="addConfigItem" >添加配置</el-button>
<el-button size="mini" type="danger" @click="removeConfigItem(index)" v-show="index!=0">删除配置</el-button>
</el-col>
</el-row>
</div>
</el-form> </el-form>
<div <div
style=" style="
@ -180,9 +160,10 @@ import { dialogConfig } from './config-sign'
import { commonMixin } from '@/views/mixins/common' import { commonMixin } from '@/views/mixins/common'
import TableSign from './subComp/table-sign.vue' import TableSign from './subComp/table-sign.vue'
import { import {
queryKeyArriveApi, queryWarnElectListApi,
queryCrewInfoApi, delWarnElect,
queryCrewCoordinateApi getWarnElectConfigApi,
editConfig,
} from '@/api/substation/substation' } from '@/api/substation/substation'
export default { export default {
components: { components: {
@ -200,35 +181,10 @@ export default {
return { return {
showSearch: true, showSearch: true,
showConfig: false, showConfig: false,
crewIpt: undefined,
crewList: [
/* {
id: 1,
crew: '第一班组',
children: [
{ name: '张三', phone: 13811111111, lon: 117.13805, lat: 31.8734 },
{ name: '李四', phone: 13811111111, lon: 117.13505, lat: 31.8434 },
{ name: '王五', phone: 13811111111, lon: 117.13205, lat: 31.8134 },
]
},
{
id: 2,
crew: '第二班组',
children: [
{ name: '胡汉三', phone: 13811111111 },
{ name: '尉迟恭', phone: 13811111111 },
{ name: '刘寄奴', phone: 13811111111 },
]
} */
],
coordList: [],
activeCrew: [],
crewName: undefined,
keyPersonTable: [],
sendId: undefined, sendId: undefined,
configItems: [{ attribute: "", elecLevel: "", distinct: "" }],
queryConfig: { queryConfig: {
isCharge: '', attribute: "",
elecLevel: "",
}, },
title: '参数配置', title: '参数配置',
radioList: [ radioList: [
@ -247,68 +203,97 @@ export default {
{ value: 8, label: '1000KV' }, { value: 8, label: '1000KV' },
// //
], ],
deviceList: [ queryParams: {
{ devName: '',
devId: 1, pageNum: 1,
devName: '1号塔', pageSize: 10,
devStatus: 1, startTime: '',
devWarn: 0 endTime: '',
}, },
{ dateRange: [],
devId: 2, tableList: [],
devName: '2号塔', total: 0,
devStatus: 0,
devWarn: 1
},
{
devId: 3,
devName: '3号塔',
devStatus: 0,
devWarn: 0
},
],
}
},
computed: {
searchCrew() {
if(!this.crewIpt) {
return this.crewList
} else {
return this.crewList.map(item => ({
teamId: item.teamId,
teamName: item.teamName,
peopleList: item.peopleList.filter(child => child.peopleName.includes(this.crewIpt))
}))
}
} }
}, },
computed: {},
created() { created() {
}, },
mounted() { mounted() {
this.sendId = this.sendMsg.projectId this.sendId = this.sendMsg.projectId
// this.createMap() this.getWarnElectList(this.sendMsg.projectId)
}, },
methods: { methods: {
getBorderColorClass(item) { //
if (item.devStatus === 0 && item.devWarn === 0) { async getWarnElectList(proId) {
return 'gray-border'; let res = await queryWarnElectListApi({
} else if (item.devWarn === 1) { proId,
return 'red-border'; })
} else if (item.devStatus === 1 && item.devWarn === 0) { this.tableList = res.rows
return 'green-border'; this.total = res.total
}
return 'default-border';
}, },
async getCrewData() {
let res = await queryCrewInfoApi({ async getTableList() {
this.queryParams.proId = this.sendMsg.projectId
if (this.dateRange!=null&&this.dateRange.length>0) {
const dateStart = new Date(this.dateRange[0])
const dateEnd = new Date(this.dateRange[1])
this.queryParams.startTime = dateStart.toLocaleDateString('en-CA')
this.queryParams.endTime = dateEnd.toLocaleDateString('en-CA')
} else {
this.queryParams.startTime = null
this.queryParams.endTime = null
}
let res = await queryWarnElectListApi(this.queryParams)
this.tableList = res.rows
this.total = res.total
},
//
handleQuery() {
this.getTableList()
},
/** 删除按钮操作 */
handleWarn(row) {
const id = row.id
this.$modal.confirm('是否确认删除该条数据').then(function() {
return delWarnElect({'id':id});
}).then(() => {
this.getTableList()
this.$modal.msgSuccess("删除成功");
}).catch(() => {})
},
//
async handleSignUp() {
const res = await getWarnElectConfigApi({
proId: this.sendMsg.projectId proId: this.sendMsg.projectId
}) })
this.crewList = res.data console.log('2222222', res)
/* this.crewList.forEach((item, index) => { this.queryConfig.attribute = res.data.configElectValue
this.activeCrew.push(index + 1) this.queryConfig.elecLevel = res.data.configLevelValue
}) */ this.showConfig = true
}, },
closeConfig() {
this.showConfig = false
},
saveConfig() {
let config = {
configElectName: '线路属性',
configLevelName: '电压等级',
configElectValue: this.queryConfig.attribute,
configLevelValue: this.queryConfig.elecLevel,
}
editConfig(config).then(response => {
this.$modal.msgSuccess("修改成功");
this.showConfig = false;
});
},
closeClick() {
this.showConfig = false
},
rowStyle(scope) { rowStyle(scope) {
if(scope.rowIndex % 2 === 0) { if(scope.rowIndex % 2 === 0) {
return { return {
@ -320,30 +305,6 @@ export default {
} }
} }
}, },
handleSignUp() {
this.showConfig = true
},
addConfigItem() {
this.configItems.push({ attribute: "", elecLevel: "", distinct: ""});
},
removeConfigItem(index) {
if (this.configItems.length > 1) {
this.configItems.splice(index, 1);
}
},
closeConfig() {
this.configItems=[{ attribute: "", elecLevel: "", distinct: "" }],
this.showConfig = false
},
saveConfig() {
},
closeClick() {
this.configItems=[{ attribute: "", elecLevel: "", distinct: "" }],
this.showConfig = false
},
} }
} }
</script> </script>
@ -375,130 +336,19 @@ export default {
src: url("../../assets/iconfont/YouSheBiaoTiHei.ttf"); src: url("../../assets/iconfont/YouSheBiaoTiHei.ttf");
} }
.el-input__inner {
background-color: #FFFF;
}
.hole-page{ .hole-page{
width: 100%; width: 100%;
height: 100%; height: 100%;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
.crew{
width: 23%;
height: 100%;
background-color: #F3F7FF;
box-sizing: border-box;
padding: 20px;
border-radius: 5px;
border: 1px solid #EFF2FC;
box-shadow: 2px 2px 2px #D9E0F3;
display: flex;
flex-direction: column;
.crew-sel{
flex: 1;
border: 1px solid #C6DAF8;
background: linear-gradient(180deg, #E8F2FC, #D6E6F7);
border-radius: 5px;
.sel-top{
width: 100%;
box-sizing: border-box;
padding: 20px 35px;
background-color: #D3E4FA;
font-size: 18px;
font-weight: bold;
color: #000;
}
.single-crew{
box-sizing: border-box;
padding: 15px 30px;
border-top: 1px dashed #CFD8E5;
background-color: transparent;
cursor: pointer;
}
.crewActive{
background-color: #D3E4FA;
}
}
}
.map{
width: 40%;
height: 100%;
#map-container{
width: 100%;
height: 100%;
}
}
.key-standby{
width: 28%;
height: 100%;
background-color: #F3F7FF;
box-sizing: border-box;
padding: 20px;
border-radius: 5px;
border: 1px solid #EFF2FC;
box-shadow: 2px 2px 2px #D9E0F3;
display: flex;
flex-direction: column;
.inner-tit{
width: 100%;
box-sizing: border-box;
padding: 10px 20px;
background-color: #EFF4FE;
display: flex;
align-items: center;
justify-content: space-between;
color: #000;
font-size: 20px;
font-family: 'YouShe', sans-serif;
box-shadow: -3px -3px 2px #CBDCF6,
2px 2px 2px #F8F9FE,
-2px -2px 2px #CBDCF6,
2px 2px 2px #F8F9FE;
margin-bottom: 15px;
span{
color: #fff;
box-sizing: border-box;
padding: 5px 15px;
background-color: #0297FC;
border-radius: 5px;
cursor: pointer;
}
}
}
.radioLevelType{
flex-basis: 25%;
}
.tower-detect{ .tower-detect{
width: 28%; width: 100%;
height: 100%; height: 100%;
background-color: #F3F7FF; background-color: #F3F7FF;
box-sizing: border-box; box-sizing: border-box;
@ -635,21 +485,6 @@ export default {
} }
} }
.gray-border {
border-color: gray !important;
}
.red-border {
border-color: red !important;
}
.green-border {
border-color: green !important;
}
.default-border {
border-color: gray !important;
}
} }
</style> </style>

View File

@ -10,7 +10,9 @@
<el-date-picker <el-date-picker
v-model="yearValue" v-model="yearValue"
type="year" type="year"
placeholder="选择年"> placeholder="选择年"
@change="yearChange"
>
</el-date-picker> </el-date-picker>
</div> </div>
</div> </div>
@ -21,7 +23,7 @@
<span>告警统计</span> <span>告警统计</span>
<span v-if="deviceConfig&&deviceConfig.tempThreshold" style="font-size: 14px;font-weight: 400;color: gray;">温度阈值{{deviceConfig.tempThreshold}}温度阈值{{deviceConfig.tempThreshold}}</span> <span v-if="deviceConfig&&deviceConfig.tempThreshold" style="font-size: 14px;font-weight: 400;color: gray;">温度阈值{{deviceConfig.tempThreshold}}温度阈值{{deviceConfig.tempThreshold}}</span>
</div> </div>
<div id="temp-chart"></div> <div id="warn-chart"></div>
</div> </div>
<div class="single-chart" style="margin-left: 40px;"> <div class="single-chart" style="margin-left: 40px;">
<div class="inner-titWarn"> <div class="inner-titWarn">
@ -45,23 +47,12 @@
:inline="true" :inline="true"
label-width="80px" label-width="80px"
> >
<el-form-item
label="工程名称"
prop="proName"
>
<el-input
v-model="queryParams.proName"
placeholder="请输入工程名称"
clearable maxlength="20"
style="width: 200px;"
/>
</el-form-item>
<el-form-item <el-form-item
label="设备名称" label="设备名称"
prop="deviceName" prop="devName"
> >
<el-input <el-input
v-model="queryParams.deviceName" v-model="queryParams.devName"
placeholder="请输入设备名称" placeholder="请输入设备名称"
clearable maxlength="20" clearable maxlength="20"
style="width: 200px;" style="width: 200px;"
@ -72,7 +63,7 @@
prop="warnTime" prop="warnTime"
> >
<el-date-picker <el-date-picker
v-model="queryParams.warnTime" v-model="dateRange"
type="daterange" type="daterange"
range-separator="至" range-separator="至"
start-placeholder="开始日期" start-placeholder="开始日期"
@ -106,7 +97,7 @@
> >
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="deviceName" prop="devName"
label="预警设备名称" label="预警设备名称"
align="center" align="center"
> >
@ -127,13 +118,16 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="warnTime" prop="warnUrl"
label="违章照片" label="违章照片"
align="center" align="center"
> >
<template slot-scope="scope">
<span v-if="scope.row.warnUrl != null && scope.row.warnUrl !=''" style="color: blue;" @click="showPicture(scope.row)">查看</span>
<span v-else></span>
</template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="warnType"
label="操作" label="操作"
align="center" align="center"
> >
@ -152,17 +146,27 @@
/> />
</div> </div>
</div> </div>
<!-- 图片查看弹窗 -->
<el-dialog title="查看" :visible.sync="pictureVisible" width="600px" append-to-body>
<img width="100%" height="500px" :src="pictureUrl" alt />
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="saveImg">保存图片</el-button>
<el-button type="danger" @click="cancel"> </el-button>
</div>
</el-dialog>
</div> </div>
</template> </template>
<script> <script>
import * as echarts from 'echarts' import * as echarts from 'echarts'
import { import {
queryWarnSpaceListApi,
queryWarnSpaceMonthApi,
queryWarnSpaceTypeApi,
delWarnSpace,
queryDeviceByProApi, queryDeviceByProApi,
queryEnvironmentInfoByIdApi,
queryChartsInfoByIdApi, queryChartsInfoByIdApi,
queryWarnInfoByIdApi,
getDevTypeCodeDetails,
queryWarnConfigApi queryWarnConfigApi
} from '@/api/substation/substation' } from '@/api/substation/substation'
export default { export default {
@ -177,59 +181,137 @@ export default {
data() { data() {
return { return {
environmentInfoList: undefined, environmentInfoList: undefined,
yearValue: undefined, yearValue: '', // ,
deviceRange: [], deviceRange: [],
deviceConfig:{}, deviceConfig:{},
tableList: [
{
date: 'xxx工程',
name: '2024.1.1 12:23',
address: '明天有大风',
},
{
date: 'xxx工程',
name: '2024.1.1 12:23',
address: '明天有大风',
},
{
date: 'xxx工程',
name: '2024.1.1 12:23',
address: '明天有大风',
},
{
date: 'xxx工程',
name: '2024.1.1 12:23',
address: '明天有大风',
},
{
date: 'xxx工程',
name: '2024.1.1 12:23',
address: '明天有大风',
},
{
date: 'xxx工程',
name: '2024.1.1 12:23',
address: '明天有大风',
},
],
queryParams: { queryParams: {
proName: '', devName: '',
deviceName: '', proId: '',
warnTime: [],
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
startTime: '',
endTime: '',
}, },
dateRange: [],
loading: false, loading: false,
tableListWarn: [], tableListDown: [],
total: 0,
//
pictureVisible: false,
pictureUrl: '',
monthData: [],
TypeList: [],
} }
}, },
created() {}, created() {
this.yearValue = (new Date().getFullYear()).toString()
},
mounted() { mounted() {
console.log(this.sendMsg) console.log(this.sendMsg)
this.getWarnSpaceMonth(this.sendMsg.projectId, this.yearValue)
this.getWarnSpaceType(this.sendMsg.projectId, this.yearValue)
this.getDeviceData(this.sendMsg.projectId) this.getDeviceData(this.sendMsg.projectId)
this.getDevTypeCodeDetails(this.sendMsg.projectId) this.getWarnSpaceList(this.sendMsg.projectId)
}, },
methods: { methods: {
async yearChange(e) {
this.yearValue = (e.getFullYear()).toString()
await this.getWarnSpaceMonth(this.sendMsg.projectId, this.yearValue)
await this.getWarnSpaceType(this.sendMsg.projectId, this.yearValue)
await this.getChartsData(this.deviceVal)
},
async getWarnSpaceMonth(proId, year) {
queryWarnSpaceMonthApi({
proId,
year,
}).then((res) => {
this.monthData=Object.values(res.data)
})
},
async getWarnSpaceType(proId, year) {
this.TypeList = []
let res = await queryWarnSpaceTypeApi({
proId,
year,
})
if (res.data) {
res.data.forEach(item => {
this.TypeList.push({
value: item.count,
name: item.warnType,
})
});
}
},
//
async getWarnSpaceList(proId) {
let res = await queryWarnSpaceListApi({
proId,
})
this.tableListDown = res.rows
this.total = res.total
},
async getTableList() {
this.queryParams.proId = this.sendMsg.projectId
if (this.dateRange!=null&&this.dateRange.length>0) {
const dateStart = new Date(this.dateRange[0])
const dateEnd = new Date(this.dateRange[1])
this.queryParams.startTime = dateStart.toLocaleDateString('en-CA')
this.queryParams.endTime = dateEnd.toLocaleDateString('en-CA')
} else {
this.queryParams.startTime = null
this.queryParams.endTime = null
}
let res = await queryWarnSpaceListApi(this.queryParams)
this.tableListDown = res.rows
this.total = res.total
},
//
handleQuery() {
this.getTableList()
},
//
showPicture(row) {
this.pictureUrl = row.warnUrl
this.pictureVisible = true
},
//
async saveImg() {
try {
const response = await fetch(this.pictureUrl);
const blob = await response.blob();
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = '违章图片.jpg'; //
link.click();
URL.revokeObjectURL(link.href); // URL
} catch (error) {
console.error('下载图片失败', error);
}
},
//
cancel() {
this.pictureVisible = false
},
/** 删除按钮操作 */
handleWarn(row) {
const id = row.id
this.$modal.confirm('是否确认删除该条数据').then(function() {
return delWarnSpace({'id':id});
}).then(() => {
this.getTableList()
this.$modal.msgSuccess("删除成功");
}).catch(() => {})
},
async getDeviceData(proId) { async getDeviceData(proId) {
let res = await queryDeviceByProApi({ let res = await queryDeviceByProApi({
powerId: this.sendMsg.gtId, powerId: this.sendMsg.gtId,
@ -244,26 +326,9 @@ export default {
value: item.devId, value: item.devId,
} }
}) })
await this.getEnvironmentData(this.deviceVal)
await this.getChartsData(this.deviceVal) await this.getChartsData(this.deviceVal)
await this.getWarnConfig(this.deviceVal)
} }
}, },
//
async getDevTypeCodeDetails(proId) {
let param = {
proId: proId,
devTypeCode: 116,
}
let res = await getDevTypeCodeDetails(param)
this.tableList = res.data
},
async getEnvironmentData(devId) {
let res = await queryEnvironmentInfoByIdApi({
devId,
})
this.environmentInfoList = res.data.data
},
async getChartsData(devId) { async getChartsData(devId) {
let res = await queryChartsInfoByIdApi({ let res = await queryChartsInfoByIdApi({
devId, devId,
@ -288,42 +353,24 @@ export default {
// }, // },
generateCharts(list) { generateCharts(list) {
console.log(list) console.log(list)
let tempArr = this.monthData
let tempXList = [
'1月',
'2月',
'3月',
'4月',
'5月',
'6月',
'7月',
'8月',
'9月',
'10月',
'11月',
'12月',
]
let tempArr = list['温度'].map((item) => {
return Number(item.jcValue)
})
let tempXList = list['温度'].map((item) => {
return item.xtime
})
let wetArr = list['湿度'].map((item) => { //
return Number(item.jcValue)
})
let wetXList = list['湿度'].map((item) => {
return item.xtime
})
let loudArr = list['噪声'].map((item) => {
return Number(item.jcValue)
})
let loudXList = list['噪声'].map((item) => {
return item.xtime
})
let pm25Arr = list['pm25'].map((item) => {
return Number(item.jcValue)
})
let pm25XList = list['pm25'].map((item) => {
return item.xtime
})
let pm10Arr = list['pm10'].map((item) => {
return Number(item.jcValue)
})
let windSpeedList = list['风速'].map((item) => {
return Number(item.jcValue)
})
//
let tempOption = { let tempOption = {
grid: { grid: {
left: '3%', left: '3%',
@ -349,16 +396,17 @@ export default {
yAxis: [ yAxis: [
{ {
type: 'value', type: 'value',
name: '°C', name: '次',
}, minInterval:1,
{
type: 'value',
name: '%rh',
}, },
// {
// type: 'value',
// name: '%rh',
// },
], ],
series: [ series: [
{ {
name: '温度', name: '告警次数',
type: 'bar', type: 'bar',
barWidth: '40%', barWidth: '40%',
data: tempArr, data: tempArr,
@ -388,16 +436,17 @@ export default {
type: 'shadow', type: 'shadow',
}, },
valueFormatter: (value) => { valueFormatter: (value) => {
return value + '°C' return value + ''
}, },
}, },
}, },
], ],
} }
let tempChart = echarts.init(document.querySelector('#temp-chart')) let tempChart = echarts.init(document.querySelector('#warn-chart'))
tempChart.setOption(tempOption) tempChart.setOption(tempOption)
// //
let gatheringSourceOption = { let gatheringSourceOption = {
tooltip: { tooltip: {
@ -425,7 +474,7 @@ export default {
}, },
series: [ series: [
{ {
name: '违章类型', name: '',
type: 'pie', type: 'pie',
radius: '70%', radius: '70%',
center: ['45%', '40%'], // center: ['45%', '40%'], //
@ -458,13 +507,7 @@ export default {
], ],
} }
gatheringSourceOption.series[0].data = [ gatheringSourceOption.series[0].data = this.TypeList
{ value: 1048, name: '违章类型1' },
{ value: 735, name: '违章类型2' },
{ value: 580, name: '违章类型3' },
{ value: 484, name: '违章类型4' },
{ value: 300, name: '违章类型5' },
]
let gatheringSourceChart = echarts.init(document.querySelector('#violation-chart')) let gatheringSourceChart = echarts.init(document.querySelector('#violation-chart'))
gatheringSourceChart.setOption(gatheringSourceOption); gatheringSourceChart.setOption(gatheringSourceOption);
@ -490,9 +533,6 @@ export default {
font-family: 'YouShe'; font-family: 'YouShe';
src: url('../../assets/iconfont/YouSheBiaoTiHei.ttf'); src: url('../../assets/iconfont/YouSheBiaoTiHei.ttf');
} }
.el-input__inner {
background-color: #FFFF;
}
.hole-page { .hole-page {
width: 100%; width: 100%;
height: 100%; height: 100%;
@ -565,7 +605,7 @@ export default {
} }
#temp-chart, #warn-chart,
#violation-chart, #violation-chart,
#loud-chart { #loud-chart {
flex: 1; flex: 1;

View File

@ -172,8 +172,8 @@ export default {
{ title: '基坑检测类', id: 4 }, { title: '基坑检测类', id: 4 },
{ title: '形变监测类', id: 5 }, { title: '形变监测类', id: 5 },
{ title: 'GLL通管监测类', id: 6 }, { title: 'GLL通管监测类', id: 6 },
{ title: '受限空间视频', id: 7 }, { title: '受限空间视频预警', id: 7 },
{ title: '近电作业监控', id: 8 }, { title: '近电作业检测', id: 8 },
], ],
sendMsg: undefined, sendMsg: undefined,
sendGeo: undefined sendGeo: undefined