This commit is contained in:
GGJ
2025-01-09 19:02:44 +08:00
commit 92e7a7a5eb
2943 changed files with 1152283 additions and 0 deletions

View File

@@ -0,0 +1,384 @@
<template>
<div class="pd10" v-loading="loading" element-loading-text="数据加载中">
<div v-show="flg">
<el-form :inline="true" :model="formData">
<el-form-item label="终端等级:">
<el-select v-model="formData.lineGrade" placeholder="终端等级" clearable>
<el-option
v-for="item in terminalClass"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item>
<Timeinterval ref="interval" :interval="3"></Timeinterval>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit" class="ml10" icon="el-icon-search">查询</el-button>
</el-form-item>
</el-form>
<el-row>
<el-col :span="24" :style="'height:' + vh + 'px'">
<div id="Statistics">
<div id="electr6" ref="fg" :style="`width:100%;height:100%;`"></div>
</div>
</el-col>
<el-col :span="24">
<el-table
stripe
header-cell-class-name="table_header"
:data="datamock"
style="width: 100%"
:height="vh + 'px'"
border
:default-sort="{ prop: 'time', order: 'descending' }"
>
<el-table-column prop="time" label="时间" sortable></el-table-column>
<el-table-column prop="deviceAbnormalNum" label="终端异常个数">
<template slot-scope="scope">
{{ scope.row.deviceAbnormalNum == 3.14159 ? '暂无数据' : scope.row.deviceAbnormalNum }}
</template>
</el-table-column>
<el-table-column label="操作" min-width="40">
<template slot-scope="scope">
<el-button size="mini" type="primary" @click="details(scope.row)" icon="el-icon-view">
终端详情
</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
background
align="right"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="formData.pageNum"
:page-sizes="[20, 30, 40, 50, 100]"
:page-size="formData.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
class="mt10"
></el-pagination>
</el-col>
</el-row>
</div>
<TerminalDetails v-if="!flg" @back="onSubmit" :TerminalDetails="tableData" />
</div>
</template>
<script>
import Timeinterval from '@/views/components/TimePicker/index4'
import { dicData } from '@/assets/commjs/dictypeData'
import yan from '@/assets/commjs/color'
import TerminalDetails from './components/AbnormalStatisticsCild/TerminalDetails.vue'
import { getDailyDeviceAbnormalStatistics, getDailyDeviceAbnormal } from '@/api/integraliy/AbnormalStatistics'
import { onLienRate1, onLienRate2, onLienRate3, Integrity1, Integrity2, Integrity3 } from '@/assets/commjs/color'
export default {
name: 'abnormalstatistics',
components: {
Timeinterval,
TerminalDetails
},
props: {},
data() {
return {
loading: false,
flg: true,
zoom: '', //图表焦点校验
vh: undefined,
h: undefined,
formData: {
lineGrade: '', //终端等级
searchBeginTime: '', //开始
searchEndTime: '', //结束
pageNum: 1,
pageSize: 20
},
item: ['', ''],
myChartes: '',
terminalClass: [], //终端等级
datamock: [],
tableData: [],
timeFlag: '',
total: undefined
}
},
created() {
this.getclassificationData()
},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.resizeEchart()
window.addEventListener('resize', () => {
if (this.myChartes !== '') {
this.myChartes.resize()
}
})
this.onSubmit()
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
let heightd = (window.sessionStorage.getItem('appheight') - 95) / 2
this.h = heightd + 'px'
this.vh = (window.sessionStorage.getItem('appheight') - 95) / 2
},
//获取类型
getclassificationData() {
//监测点等级
this.terminalClass = dicData('Dev_Level', [])
this.formData.lineGrade = this.terminalClass[0].id
},
//查询
onSubmit() {
this.loading = true
this.flg = true
this.item = this.$refs.interval.timeValue
this.formData.searchBeginTime = this.item[0]
this.formData.searchEndTime = this.item[1]
getDailyDeviceAbnormalStatistics(this.formData).then(res => {
this.datamock = res.data.records.reverse()
this.total = res.data.total
this.loading = false
this.$nextTick(() => {
this.chart()
})
})
},
//每页条数改变时触发 选择一页显示多少行
handleSizeChange(val) {
this.formData.pageSize = val
this.onSubmit()
},
//当前页改变时触发 跳转其他页
handleCurrentChange(val) {
this.formData.pageNum = val
this.onSubmit()
},
//点击切换
details(e) {
// console.log(e);
this.flg = false
let data = {
lineGrade: this.formData.lineGrade,
searchBeginTime: e.time, //开始
searchEndTime: e.time //结束
}
getDailyDeviceAbnormal(data).then(res => {
this.tableData = res.data
})
},
chart() {
let echarts = require('echarts')
let domID1 = document.getElementById('electr6')
this.myChartes = echarts.init(domID1, null, { renderer: 'svg' })
setTimeout(() => {
domID1.style.width = window.sessionStorage.getItem('Statistics') - 40 + 'px'
domID1.style.height = (window.sessionStorage.getItem('appheight') - 95) / 2 + 'px'
}, 0)
let handle = []
let time = []
let echartsData = JSON.parse(JSON.stringify(this.datamock))
echartsData.forEach(item => {
handle.push(item.deviceAbnormalNum)
time.push(item.time)
})
let echartsColor = JSON.parse(window.localStorage.echartsColor)
this.myChartes.clear()
var option = {
backgroundColor: '#fff', //背景色,
title: {
text: '终端异常个数统计',
left: 'center',
textStyle: {
fontSize: yan.EchartObject.titleNamefontSize1,
color: echartsColor.WordColor
}
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow',
label: {
color: '#fff',
fontSize: 16
}
},
textStyle: {
color: '#fff',
fontStyle: 'normal',
opacity: 0.35,
fontSize: 14
},
backgroundColor: 'rgba(0,0,0,0.35)',
formatter: function (params) {
// console.log(params);
var tips = ''
for (var i = 0; i < params.length; i++) {
if (params[i].value == 3.14159) {
tips += '时间' + ':' + params[i].name + '<br/>'
tips += '终端异常个数' + ':暂无数据<br/>'
} else {
tips += '时间' + ':' + params[i].name + '<br/>'
tips += '终端异常个数' + ':' + params[i].value + '<br/>'
}
}
return tips
}
},
toolbox: {
show: true
},
legend: {
right: 40,
top: 5,
data: ['终端异常个数'],
textStyle: {
color: echartsColor.WordColor,
rich: {
a: {
verticalAlign: 'middle'
}
},
padding: [2, 0, 0, 0] //[上、右、下、左]
}
},
grid: yan.EchartObject.gridk,
dataZoom: yan.EchartObject.dataZoom,
xAxis: [
{
type: 'category',
data: time,
name: '时间',
nameTextStyle: {
color: echartsColor.WordColor
},
splitLine: {
show: false
},
axisLine: {
show: true,
lineStyle: {
color: echartsColor.thread
}
},
axisLabel: {
show: true,
// interval: 0,
textStyle: {
fontFamily: yan.EchartObject.fontFamily,
color: echartsColor.WordColor,
fontSize: yan.EchartObject.xNamefontSize
}
}
}
],
yAxis: [
{
type: 'value',
name: '单位(个)',
nameTextStyle: {
color: echartsColor.WordColor
},
splitLine: {
show: false
},
// axisLabel: {
// formatter: "{value}M",
// },
// axisLine: { show: true },
axisLine: {
show: true,
lineStyle: {
color: echartsColor.thread
}
},
axisLabel: {
color: echartsColor.WordColor,
fontSize: yan.EchartObject.xNamefontSize
}
}
],
series: [
{
name: '终端异常个数',
type: 'bar',
barMaxWidth: yan.EchartObject.barMaxWidth,
itemStyle: {
normal: { show: true, color: echartsColor.FigureColor[0] }
},
label: {
show: true,
position: 'top',
textStyle: {
//数值样式
color: echartsColor.WordColor
},
fontSize: 12
},
data: handle
}
]
}
this.myChartes.setOption(option)
window.echartsArr.push(this.myChartes)
// myChart.resize();
let _this = this
_this.$erd.listenTo(_this.$refs.fg, element => {
_this.$nextTick(() => {
// domID1.style.width = document.getElementById("drag-dept-right").offsetWidth - 30 + "px",
;(domID1.style.width = document.getElementById('Statistics').offsetWidth - 0 + 'px'),
_this.myChartes.resize()
})
})
},
resizeEchart() {
var elementResizeDetectorMaker = require('element-resize-detector')
var erd = elementResizeDetectorMaker()
erd.listenTo(document.getElementById('Statistics'), element => {
let domeId = document.getElementById('Statistics')
let domeId2 = document.getElementById('electr6')
domeId2.style.width = domeId.offsetWidth - 0 + 'px'
// this.$nextTick(() => {
if (this.myChartes !== '') {
this.myChartes.resize()
}
// });
})
}
},
computed: {},
watch: {}
}
</script>
<style lang="less" scoped>
@import url('../../../styles/comStyle.less');
::v-deep .el-form-item--small .el-form-item__content,
.el-form-item--small .el-form-item__label {
height: 32px;
}
.box {
display: flex;
.boxR {
flex: 1;
}
.boxL {
width: 400px;
}
}
::v-deep .el-table .cell {
text-align: center;
}
</style>

View File

@@ -0,0 +1,291 @@
<template>
<div class="pd10">
<div v-show="view">
<div class="box">
<el-upload
class="upload-demo"
ref="upload"
action="#"
:http-request="upload"
:limit="2"
accept=".DAT,.CFG"
:on-exceed="handleExceed"
:before-upload="handleBeforeUpload"
:show-file-list="false"
>
<el-button type="primary" size="small" icon="el-icon-top"
>上传文件</el-button
>
</el-upload>
<el-button
type="primary"
style="margin-left: 10px"
size="small"
icon="el-icon-delete"
@click="
fileList = [];
$refs.upload.clearFiles();
"
>删除文件</el-button
>
<el-button type="primary" size="small" icon="el-icon-view" @click="Look"
>查看波形</el-button
>
</div>
<el-table
stripe
:data="fileList"
highlight-current-row
border
header-cell-class-name="table_header"
style="width: 100%"
class="mt10"
>
<el-table-column prop="name" label="文件名称" align="center">
</el-table-column>
<el-table-column prop="size" label="文件大小" align="center">
<template slot-scope="scope">
<span>
{{
1 * 1024 * 1024 > scope.row.size
? (scope.row.size / 1024).toFixed(2) + "(Kb)"
: (scope.row.size / 1024 / 1024).toFixed(2) + "(Mb)"
}}</span
>
</template>
</el-table-column>
</el-table>
</div>
<el-row>
<el-col :span="12">
<span
v-if="view2"
style="font-size: 14px; font-weight: ; line-height: 30px"
>值类型选择:</span
>
<el-select
v-if="view2"
v-model="value"
@change="changeView"
placeholder="请选择值类型"
>
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-col>
<el-col :span="12">
<el-button
v-if="view2"
@click="backbxlb"
type="primary"
class="el-icon-refresh-right"
style="float: right"
>返回</el-button
>
</el-col>
</el-row>
<el-tabs v-if="view2" v-model="bxactiveName" @tab-click="bxhandleClick">
<el-tab-pane
label="瞬时波形"
name="ssbx"
:style="'height:' + bxecharts + ';overflow-y: scroll;'"
>
<shushiboxi
v-if="bxactiveName == 'ssbx' && showBoxi"
:value="value"
:wp="wp"
></shushiboxi>
</el-tab-pane>
<el-tab-pane
label="RMS波形"
name="rmsbx"
:style="'height:' + bxecharts + ';overflow-y: scroll;'"
>
<rmsboxi
v-if="bxactiveName == 'rmsbx' && showBoxi"
:value="value"
:wp="wp"
></rmsboxi>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import api from "@/api/pollution/pollution";
import rmsboxi from "./components/rmsboxi.vue";
import shushiboxi from "./components/shushiboxi.vue";
export default {
name: "offlinewaveform",
components: { rmsboxi, shushiboxi },
props: {},
data() {
return {
fileList: [],
fileType: ["DAT", "CFG"],
view2: false,
view: true,
bxecharts: null,
wp: {},
//里层默认波形tab标签页
bxactiveName: "ssbx",
value: 1,
showBoxi: true,
options: [
{
value: 1,
label: "一次值",
},
{
value: 2,
label: "二次值",
},
],
};
},
created() {},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.bxecharts = window.sessionStorage.getItem("appheight") - 100 + "px";
},
changeView() {
this.showBoxi = false;
setTimeout(() => {
this.showBoxi = true;
}, 0);
},
//文件上传
upload(params) {
this.fileList.push(params.file);
},
handleExceed(files, fileList) {
this.$message.warning(`只能上传1组波形文件`);
},
// 上传前校检格式和大小
handleBeforeUpload(file) {
// 校检文件类型
if (this.fileType) {
let fileExtension = "";
let fileExtensionL = "";
let fileName = "";
let fileNameL = "";
if (file.name.lastIndexOf(".") > -1) {
fileExtensionL = file.name.substring(0, file.name.lastIndexOf("."));
fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1);
}
const isTypeOk = this.fileType.some((type) => {
if (file.type.indexOf(type) > -1) return true;
return !!(fileExtension && fileExtension.indexOf(type) > -1);
});
if (!isTypeOk) {
this.$message.error(
`文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`
);
return false;
}
if (this.fileList.length > 0) {
fileName = this.fileList[0].name.slice(
this.fileList[0].name.lastIndexOf(".") + 1
);
fileNameL = this.fileList[0].name.substring(
0,
this.fileList[0].name.lastIndexOf(".")
);
if (fileName == fileExtension) {
this.$message.error(
`${this.fileType.join(
" / "
)}是一组波形文件!已有${fileName}文件,请上传${
fileName == "DAT" ? "CFG" : "DAT"
}文件`
);
return false;
}
if (fileNameL != fileExtensionL) {
this.$message.error(
"上传文件的名称必须和已上传的文件名称保持一致!"
);
return false;
}
}
}
this.$message("正在上传文件,请稍候...");
return true;
},
//里层波形tab标签页触发事件
bxhandleClick(tab, event) {
if (tab.name == "ssbx") {
this.bxactiveName = "ssbx";
} else if (tab.name == "rmsbx") {
this.bxactiveName = "rmsbx";
}
},
// 查看
Look() {
if (this.fileList.length != 2) {
this.$message({
message: "请上传1组波形文件!",
type: "warning",
});
return;
}
let form = new FormData();
form.append("file1", this.fileList[0]);
form.append("file2", this.fileList[1]);
api.uploadFileAndViewWave(form).then((res) => {
if (res != undefined) {
this.wp = res.data;
setTimeout(() => {
this.view = false;
this.view2 = true;
}, 0);
}
});
},
//返回触发事件
backbxlb() {
this.view = true;
this.view2 = false;
},
},
computed: {},
watch: {},
};
</script>
<style lang="less" scoped>
@import url("../../../styles/comStyle.less");
.box {
display: flex;
}
.el-icon-refresh-right {
position: absolute;
top: 10px;
right: 10px;
}
</style>

View File

@@ -0,0 +1,420 @@
<template>
<div class="pd10" v-loading="isLoading" element-loading-text="数据加载中">
<!--查询条件-->
<el-form :inline="true" :model="formData">
<el-form-item label="终端等级:">
<el-select v-model="formData.lineGrade" placeholder="终端等级" clearable>
<el-option
v-for="item in terminalClass"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item>
<Timeinterval ref="interval" :interval="3"></Timeinterval>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit" class="ml10" icon="el-icon-search">查询</el-button>
</el-form-item>
</el-form>
<!--内容区-->
<el-row>
<el-col :span="24" :style="'height:' + vh + 'px'">
<div id="ranking">
<div id="tubiao" ref="fg" style="width: 100%"></div>
</div>
</el-col>
<el-col :span="24">
<el-table
stripe
header-cell-class-name="table_header"
:data="tableData"
border
highlight-current-row
default-expand-all
:height="vhh"
>
<el-table-column show-overflow-tooltip label="序号" width="80" align="center">
<template scope="scope">
<span>{{ (formData.pageNum - 1) * formData.pageSize + scope.$index + 1 }}</span>
</template>
</el-table-column>
<el-table-column align="center" prop="name" label="终端名称"></el-table-column>
<el-table-column
align="center"
prop="substation"
label="变电站"
show-overflow-tooltip
></el-table-column>
<el-table-column align="center" prop="runFlag" label="终端状态">
<template slot-scope="scope">
<span type="primary" v-if="scope.row.runFlag === 0">投运</span>
<span type="primary" v-if="scope.row.runFlag === 1">热备用</span>
<span type="primary" v-if="scope.row.runFlag === 2">停运</span>
</template>
</el-table-column>
<el-table-column align="center" prop="comFlag" label="通讯状态">
<template slot-scope="scope">
<el-tag
type="primary"
v-if="scope.row.comFlag === 0"
style="color: #fff; background: #cc0000"
size="small"
>
中断
</el-tag>
<el-tag
type="primary"
v-if="scope.row.comFlag === 1"
style="color: #fff; background: #2e8b57"
size="small"
>
正常
</el-tag>
</template>
</el-table-column>
<el-table-column align="center" prop="updateTime" label="最新数据时间" sortable></el-table-column>
<el-table-column align="center" prop="flowMeal" label="套餐流量(MB)" sortable></el-table-column>
<el-table-column align="center" prop="statisValue" sortable label="已用流量(MB)"></el-table-column>
<el-table-column align="center" prop="flowProportion" sortable label="流量使用占比(%)">
<template slot-scope="scope">
<span>{{ (scope.row.flowProportion * 100).toFixed() }}</span>
</template>
</el-table-column>
</el-table>
<el-pagination
background
align="right"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="formData.pageNum"
:page-sizes="[20, 30, 40, 50, 100]"
:page-size="formData.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
class="mt10"
></el-pagination>
</el-col>
</el-row>
</div>
</template>
<script>
import Timeinterval from '@/views/components/TimePicker/index4'
import { dicData } from '@/assets/commjs/dictypeData'
import yan from '@/assets/commjs/color'
import { getNewDeviceRunStatistics } from '@/api/BusinessAdministrator/OperationStatistics'
export default {
name: 'operatingstatistic',
components: {
Timeinterval
},
data() {
return {
zoom: '', //图表焦点校验
vh: null,
vhh: null,
isLoading: false,
myChartes: '',
formData: {
lineGrade: '', //终端等级
searchBeginTime: '', //开始
searchEndTime: '', //结束
pageNum: 1,
pageSize: 20
},
item: ['', ''],
vh: undefined,
terminalClass: [], //终端等级
teriminal: '',
teriminaloption: [],
tableData: [],
total: undefined // 总条数
}
},
created() {
this.getclassificationData()
},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.resizeEchart()
// this.vh =window.sessionStorage.getItem('appheight') - 125 + "px";
this.onSubmit()
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = (window.sessionStorage.getItem('appheight') - 95) / 2
this.vhh = (window.sessionStorage.getItem('appheight') - 95) / 2
if (this.myChartes !== '') {
this.myChartes.resize()
}
},
//获取类型
getclassificationData() {
//监测点等级
this.terminalClass = dicData('Dev_Level', [])
this.formData.lineGrade = this.terminalClass[0].id
},
//查询
onSubmit() {
if (this.formData.formData !== '') {
this.formData.pageNum = 1
}
this.tableData = []
this.isLoading = true
this.$refs.interval.timeOptions = [
// { label: "年份", value: 1 },
// { label: "季度", value: 2 },
{ label: '月份', value: 3 }
// { label: "周", value: 4 },
// // { label: "自定义", value: 5 },
]
this.item = this.$refs.interval.timeValue
this.formData.searchBeginTime = this.item[0]
this.formData.searchEndTime = this.item[1]
getNewDeviceRunStatistics(this.formData).then(res => {
this.isLoading = false
if (res.code == 'A0000') {
this.tableData = res.data.records
this.total = res.data.total
this.$nextTick(() => {
this.initData()
})
} else {
this.$message({
message: res.message,
type: 'warning'
})
}
})
// this.initData();
},
//分页查询用
onSubmit1() {
this.isLoading = true
this.item = this.$refs.interval.timeValue
this.formData.searchBeginTime = this.item[0]
this.formData.searchEndTime = this.item[1]
getNewDeviceRunStatistics(this.formData).then(res => {
this.isLoading = false
if (res.code == 'A0000') {
this.tableData = res.data.records
this.total = res.data.total
this.$nextTick(() => {
this.initData()
})
} else {
this.$message({
message: res.message,
type: 'warning'
})
}
})
// this.initData();
},
//每页条数改变时触发 选择一页显示多少行
handleSizeChange(val) {
this.formData.pageSize = val
this.onSubmit1()
},
//当前页改变时触发 跳转其他页
handleCurrentChange(val) {
this.formData.pageNum = val
this.onSubmit1()
},
initData() {
const echarts = require('echarts')
let domID1 = document.getElementById('tubiao')
this.myChartes = echarts.init(domID1, null, { renderer: 'svg' })
setTimeout(() => {
domID1.style.width = window.sessionStorage.getItem('ranking') - 40 + 'px'
domID1.style.height = (window.sessionStorage.getItem('appheight') - 95) / 2 + 'px'
}, 0)
let name = []
let flowMeal = []
let statisValue = []
let echartsData = JSON.parse(JSON.stringify(this.tableData))
echartsData.forEach(item => {
name.push(item.name)
flowMeal.push(item.flowMeal)
statisValue.push(item.statisValue)
})
let echartsColor = JSON.parse(window.localStorage.echartsColor)
this.myChartes.clear()
var option = {
xAxis: {
type: 'category',
name: '终端\n名称',
nameTextStyle: {
color: echartsColor.WordColor
},
data: name.slice(0, 20),
axisLine: { show: true },
axisLabel: {
// padding: [0, 10, 0, 10],
// interval: 0,
textStyle: {
fontFamily: yan.EchartObject.fontFamily,
color: echartsColor.WordColor,
fontSize: yan.EchartObject.xNamefontSize
}
}
},
yAxis: {
name: '单位:MB',
nameTextStyle: {
color: echartsColor.WordColor
},
type: 'value',
splitLine: {
show: false
},
axisLine: {
show: true,
lineStyle: {
color: echartsColor.thread
}
},
axisLabel: {
color: echartsColor.WordColor,
fontSize: yan.EchartObject.xNamefontSize
}
},
grid: yan.EchartObject.gridd,
dataZoom: yan.EchartObject.dataZoom,
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow',
label: {
color: '#fff',
fontSize: 16
}
},
textStyle: {
color: '#fff',
fontStyle: 'normal',
opacity: 0.35,
fontSize: 14
},
backgroundColor: 'rgba(0,0,0,0.35)',
formatter: function (params) {
// console.log(params);
var tips = ''
for (var i = 0; i < echartsData.length; i++) {
if (echartsData[i].name == params[0].name) {
tips += echartsData[i].substation + '_' + params[0].name + '</br/>'
break
}
}
for (var i = 0; i < params.length; i++) {
tips += params[i].seriesName + ':' + '&nbsp' + '&nbsp' + '&nbsp' + params[i].value + '<br/>'
}
return tips
}
},
legend: {
right: 40,
top: 5,
data: ['套餐总量', '流量使用量'],
textStyle: {
color: echartsColor.WordColor,
rich: {
a: {
verticalAlign: 'middle'
}
},
padding: [2, 0, 0, 0] //[上、右、下、左]
}
},
title: {
text: '流量使用占比排名',
left: 'center',
textStyle: {
fontSize: yan.EchartObject.titleNamefontSize1,
color: echartsColor.WordColor
}
},
// colors: echartsColor.FigureColor,
series: [
{
name: '套餐总量',
data: flowMeal.slice(0, 20),
type: 'bar',
barMaxWidth: yan.EchartObject.barMaxWidth,
z: '-1',
barGap: '-100%',
label: {
show: true,
position: 'top',
fontSize: 10,
textStyle: {
//数值样式
color: echartsColor.WordColor
}
},
itemStyle: {
normal: { show: true, color: echartsColor.FigureColor[0] }
}
},
{
name: '流量使用量',
data: statisValue.slice(0, 20),
type: 'bar',
barMaxWidth: yan.EchartObject.barMaxWidth,
label: {
show: true,
position: 'inside',
fontSize: 10,
textStyle: {
//数值样式
color: echartsColor.WordColor
}
},
itemStyle: {
normal: { show: true, color: echartsColor.FigureColor[5] }
}
}
]
}
this.myChartes.setOption(option)
window.echartsArr.push(this.myChartes)
// myChart.resize();
let _this = this
_this.$erd.listenTo(_this.$refs.fg, element => {
_this.$nextTick(() => {
// domID1.style.width = document.getElementById("drag-dept-right").offsetWidth - 30 + "px",
;(domID1.style.width = document.getElementById('ranking').offsetWidth - 0 + 'px'),
_this.myChartes.resize()
})
})
},
resizeEchart() {
var elementResizeDetectorMaker = require('element-resize-detector')
var erd = elementResizeDetectorMaker()
erd.listenTo(document.getElementById('ranking'), element => {
let domeId = document.getElementById('ranking')
let domeId2 = document.getElementById('tubiao')
domeId2.style.width = domeId.offsetWidth - 0 + 'px'
// this.$nextTick(() => {
if (this.myChartes !== '') {
this.myChartes.resize()
}
// });
})
}
}
}
</script>
<style lang="less" scoped>
@import url('../../../styles/comStyle.less');
</style>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,71 @@
<template>
<el-container class="pd10">
<el-main class="main">
<el-row :gutter="20">
<el-col :span="24">
<el-tabs type="border-card" v-model="activeName">
<el-tab-pane label="完整性列表" name="tab1" :style="'height:' + vh + ';'">
<dataintegrity v-if="activeName == 'tab1'"></dataintegrity>
</el-tab-pane>
<el-tab-pane label="完整性图表" name="tab2" :style="'height:' + vh + ';'">
<dataintegrityechart v-if="activeName == 'tab2'" />
</el-tab-pane>
</el-tabs>
</el-col>
</el-row>
</el-main>
</el-container>
</template>
<script>
import { dicData } from '../../../assets/commjs/dictypeData'
import api from '@/api/integraliy/integraliy'
import dataintegrity from './components/completeCild/dataintegrity.vue'
import dataintegrityechart from './components/completeCild/dataintegrityechart.vue'
//import dataintegrityechart from '../../components/dataintegrityechart'
export default {
name: 'sjwzx',
components: {
dataintegrity,
dataintegrityechart
// dataintegrityechart
},
watch: {},
computed: {},
data() {
return {
activeName: 'tab1',
vh: undefined
}
},
created() {},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem('appheight') - 83 + 'px'
}
}
}
</script>
<style scoped>
.main {
overflow: hidden;
}
::-webkit-scrollbar {
width: 5px;
height: 0;
}
</style>
<style lang="less" scoped>
@import url('../../../styles/comStyle.less');
::v-deep .el-form-item--small .el-form-item__content,
.el-form-item--small .el-form-item__label {
height: 32px;
}
</style>

View File

@@ -0,0 +1,268 @@
<template>
<div>
<div class="svgIcon">
<el-button size="mini" class="back" type="primary" @click="$emit('back')" icon="el-icon-refresh-left"
>返回</el-button
>
</div>
<el-table
stripe
:data="TerminalDetails"
class="xshou"
style="width: 100%; margin-bottom: 10px"
row-key="id"
id="rebateSetTable"
border
highlight-current-row
:height="vh + 'px'"
header-cell-class-name="table_header"
v-loading="loading"
element-loading-text="数据加载中"
:header-cell-style="{
height: '25px',
padding: '0px',
}"
:row-style="{ height: '28px' }"
:cell-style="{ padding: '2px' }"
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
>
<el-table-column
min-width="150"
prop="deviceName"
label="台账信息"
:show-overflow-tooltip="true"
class="TAB"
width="200"
>
</el-table-column>
<el-table-column
prop="cityName"
align="center"
label="所属地区"
></el-table-column>
<el-table-column
prop="subName"
align="center"
label="变电站"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column
prop="integrityValue"
align="center"
min-width="80"
label="数据完整性(%)"
>
<template slot-scope="scope">
<span>{{
scope.row.integrityValue == null
? "/"
: scope.row.integrityValue.toFixed(2)
}}</span>
</template>
</el-table-column>
<el-table-column
prop="onlineRateValue"
align="center"
min-width="80"
label="在线率(%)"
>
<template slot-scope="scope">
<span>{{
scope.row.onlineRateValue == null
? "/"
: scope.row.onlineRateValue.toFixed(2)
}}</span>
</template>
</el-table-column>
<el-table-column
prop="comOutCount"
align="center"
min-width="100"
label="通讯中断(次)"
>
</el-table-column>
<el-table-column
prop="alarmCount"
align="center"
min-width="100"
label="终端告警(次)"
>
</el-table-column>
<el-table-column
prop="flowValue"
align="center"
min-width="100"
label="终端流量(%)"
>
</el-table-column>
<el-table-column label="操作" align="center" min-width="60">
<template slot-scope="scope">
<el-button size="mini" type="primary" @click="details(scope.row)" icon="el-icon-view"
>详情</el-button
>
</template>
</el-table-column>
</el-table>
<el-dialog
:close-on-click-modal="false"
:title="title"
v-if="dialogVisible"
:visible.sync="dialogVisible"
width="30%"
>
<el-collapse v-model="activeNames">
<el-collapse-item title="终端基础信息" name="1">
<div>
{{ Basicinformation }}
</div>
<div></div>
</el-collapse-item>
<el-collapse-item title="数据完整性" name="2">
<div>
{{ Dataintegrity }}
</div>
</el-collapse-item>
<el-collapse-item title="在线率" name="3">
<div>
{{ onlinerate }}
</div>
</el-collapse-item>
<el-collapse-item title="终端通讯信息" name="4">
<div style="white-space: pre-line">
{{ Communicationinformation }}
</div>
</el-collapse-item>
<el-collapse-item title="终端告警信息" name="5">
<div style="white-space: pre-line">
{{ alarminformation }}
</div>
</el-collapse-item>
<el-collapse-item title="终端流量信息" name="6">
<div>
{{ trafficinformation }}
</div>
</el-collapse-item>
</el-collapse>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="dialogVisible = false"
> </el-button
>
</span>
</el-dialog>
</div>
</template>
<script>
export default {
props: {
TerminalDetails: {
type: Array,
default: undefined,
},
},
components: {},
data() {
return {
activeNames: ["1", "2", "3", "4", "5", "6"],
title: "",
dialogVisible: false,
loading: true,
vh: undefined,
tableData: [],
Basicinformation: "",
Dataintegrity: "",
onlinerate: "",
Communicationinformation: "",
alarminformation: "",
};
},
created() {},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
//this.loading = true
this.tableData = this.TerminalDetails;
if (this.tableData != []) {
this.loading = false;
}
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem("appheight") - 50;
},
details(e) {
this.title = "异常终端详情";
this.dialogVisible = true;
this.Basicinformation =
e.cityName + "_" + e.subName + "," + e.deviceName + ";";
if (e.integrityFlag == "0") {
this.Dataintegrity =
"数据完整性" + ":" + e.integrityValue + "%" + "[不合格]";
} else if (e.integrityFlag == "1") {
this.Dataintegrity =
"数据完整性" + ":" + e.integrityValue + "%" + "[合格]";
}
if (e.onlineRateFlag == "-1") {
this.onlinerate = "在线率" + ":" + e.onlineRateValue + "%" + "[不合格]";
} else if (e.onlineRateFlag == "1") {
this.onlinerate = "在线率" + ":" + e.onlineRateValue + "%" + "[合格]";
}
this.Communicationinformation = e.comOutDesc.replace(/,/g, "\n");
this.alarminformation = e.alarmDesc.replace(/,/g, "\n");
// console.log(this.Communicationinformation);
// this.alarminformation = e.alarmDesc
this.trafficinformation =
e.deviceName + "终端流量已使用" + e.flowValue + "%";
},
},
computed: {},
watch: {},
};
</script>
<style lang="less" scoped>
@import url("../../../../../styles/comStyle.less");
</style>
<style lang="scss" scoped>
.svgIcon {
display: flex;
justify-content: end;
}
.back {
margin-right: 10px;
margin-bottom: 10px;
margin-left: auto;
}
::v-deep .el-collapse-item__header.is-active {
color: rgb(4, 199, 179);
border-bottom-color: transparent;
}
::v-deep .el-collapse-item__header {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
align-items: center;
height: 48px;
font-size: 13px;
font-weight: 500;
line-height: 48px;
color: #e8a806;
cursor: pointer;
background-color: #fff;
border-bottom: 1px solid #ebeef5;
outline: 0;
-webkit-box-align: center;
-webkit-transition: border-bottom-color 0.3s;
transition: border-bottom-color 0.3s;
-ms-flex-align: center;
}
</style>

View File

@@ -0,0 +1,392 @@
<template>
<div>
<el-form :inline="true" :model="formData">
<el-form-item>
<el-switch class="tableScopeSwitch" :active-value="2" :inactive-value="1" active-text="全网" inactive-text="网公司"
inactive-color="#666666" v-model="formData.monitorFlag">
</el-switch></el-form-item>
<el-form-item label="统计类型:">
<el-select v-model="formData.statisticalType" placeholder="请选择统计类型" style="width: 160px">
<el-option v-for="item in classificationData" :key="item.id" :label="item.name" :value="{
label: item.name,
value: item.id,
name: item.name,
id: item.id,
code: item.code,
sort: item.sort,
}">
</el-option> </el-select></el-form-item>
<el-form-item label="终端等级:">
<el-select v-model="formData.algoDescribe" multiple collapse-tags placeholder="终端等级" style="width: 160px">
<el-option v-for="item in terminalClass" :key="item.id" :label="item.label" :value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="电压等级:">
<el-select v-model="formData.scale" multiple collapse-tags placeholder="请选择电压等级" style="width: 160px">
<el-option v-for="item in voltageleveloption" :key="item.id" :label="item.name" :value="{
label: item.name,
value: item.id,
code: item.code,
name: item.name,
id: item.id,
sort: item.sort,
}">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="终端厂家:">
<el-select v-model="formData.manufacturer" multiple collapse-tags placeholder="请选择终端厂家" style="width: 160px">
<el-option v-for="item in terminaloption" :key="item.id" :label="item.name" :value="{
label: item.name,
value: item.id,
code: item.code,
name: item.name,
id: item.id,
sort: item.sort,
}">
</el-option>
</el-select>
</el-form-item>
<!-- <el-form-item label="终端厂家:">
<el-select
v-model="formData.manufacturer"
multiple
collapse-tags
placeholder="请选择终端厂家"
style="width: 160px;"
>
<el-option
v-for="item in terminaloption"
:key="item.id"
:label="item.name"
:value="{
label: item.name,
value: item.id,
code: item.code,
name: item.name,
id: item.id,
sort: item.sort
}"
>
</el-option>
</el-select>
</el-form-item> -->
<el-form-item label="干扰源类型:">
<el-select v-model="formData.loadType" multiple collapse-tags placeholder="请选择干扰源类型" style="width: 180px">
<el-option v-for="item in interfereoption" :key="item.id" :label="item.name" :value="{
label: item.name,
value: item.id,
code: item.code,
name: item.name,
id: item.id,
sort: item.sort,
}">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="合格率:">
<el-select v-model="formData.linePassRate" placeholder="请选择合格率" style="width: 180px">
<el-option label="合格" value="1"> </el-option>
<el-option label="不合格" value="0"> </el-option>
</el-select>
</el-form-item>
<el-form-item>
<Area @click="handleNodeClick"></Area>
</el-form-item>
<el-form-item>
<Timeinterval ref="Timeinterval" :interval="3"></Timeinterval>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit" class="ml10" icon="el-icon-search">查询</el-button>
</el-form-item>
<el-form-item>
<el-button type="primary" class="ml10" icon="el-icon-search" @click="Reset">重置</el-button>
</el-form-item>
</el-form>
<el-select v-show="false" v-model="ExpandedNum" @change="handleExpandNumChange" placeholder="选择展开级别" size="mini"
style="width: 100px; left: 0px">
<el-option label="不展开" :value="0"></el-option>
<el-option label="展开1" :value="1"></el-option>
<el-option label="展开2" :value="2"></el-option>
<el-option label="展开3" :value="3"></el-option>
</el-select>
<el-table stripe :data="tableData" class="xshou" style="width: 100%; margin-bottom: 10px" row-key="id"
id="rebateSetTable" border highlight-current-row :height="vh + 'px'" :expand-row-keys="expandID"
header-cell-class-name="table_header" v-loading="loading" element-loading-text="数据加载中"
:row-style="{ height: '25px' }" :cell-style="{ padding: '0px' }"
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
<el-table-column min-width="150" prop="name" :label="typedata" :show-overflow-tooltip="true" class="TAB"
width="200">
</el-table-column>
<el-table-column min-width="80" align="center" prop="voltageLevel" v-if="dydj" label="电压等级">
<template slot-scope="scope">
<div v-if="scope.row.level == 6">
<span v-if="scope.row.lineScale == null" type="primary" size="small">/</span>
<span v-if="scope.row.lineScale != null" type="primary" size="small">{{ scope.row.lineScale }}</span>
</div>
<div v-else>
<span v-if="scope.row.subScale == null" type="primary" size="small">/</span>
<span v-if="scope.row.subScale != null" type="primary" size="small">{{ scope.row.subScale }}</span>
</div>
</template>
</el-table-column>
<el-table-column min-width="100" align="center" prop="ip" label="网络参数">
<template slot-scope="scope">
<span v-if="scope.row.ip == null" type="primary" size="small">/</span>
<span v-if="scope.row.ip != null" type="primary" size="small">{{
scope.row.ip
}}</span>
</template>
</el-table-column>
<!-- <el-table-column min-width='150' align="center" prop="name" :show-overflow-tooltip='true' label="名称" >
</el-table-column> -->
<el-table-column min-width="100" align="center" prop="manufacturer" label="厂家">
<template slot-scope="scope">
<span v-if="scope.row.manufacturer == null" type="primary" size="small">/</span>
<span v-if="scope.row.manufacturer != null" type="primary" size="small">{{ scope.row.manufacturer }}</span>
</template>
</el-table-column>
<el-table-column min-width="150" align="center" prop="name" label="终端名称">
<template slot-scope="scope">
<span v-if="scope.row.name == null" type="primary" size="small">/</span>
<span v-if="scope.row.name != null" type="primary" size="small">{{
scope.row.name
}}</span>
</template>
</el-table-column>
<el-table-column min-width="80" align="center" prop="comFlag" label="通讯状态">
<template slot-scope="scope">
<span v-if="scope.row.comFlag == null" type="primary" size="small">/</span>
<span v-if="scope.row.comFlag == 0" type="primary" size="small">中断</span>
<span v-if="scope.row.comFlag == 1" type="primary" size="small">正常</span>
</template>
</el-table-column>
<el-table-column min-width="100" align="center" prop="updateTime" label="最新数据时间">
<!-- :show-overflow-tooltip="true" -->
<template slot-scope="scope">
<span v-if="scope.row.updateTime == null" type="primary" size="small">/</span>
<span v-if="scope.row.updateTime != null" type="primary" size="small">{{ scope.row.updateTime }}</span>
</template>
</el-table-column>
<el-table-column min-width="100" align="center" prop="integrityData" label="完整性(%)">
<template slot-scope="scope">
<span v-if="
scope.row.integrityData == null ||
scope.row.integrityData == 3.14159
" type="primary" size="small">暂无数据</span>
<span v-else type="primary" size="small">{{
scope.row.integrityData.toFixed(2)
}}</span>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import { dicData } from "@/assets/commjs/dictypeData";
import Area from "@/views/components/Area/Area.vue";
import Timeinterval from "@/views/components/Timeinterval.vue";
import { getLineIntegrityData } from "@/api/integraliy/integraliy";
export default {
components: {
Area,
Timeinterval,
},
props: {},
data() {
return {
vh: undefined,
formData: {
//后面需要修改
deptIndex: "",
monitorFlag: 2,
powerFlag: 2,
loadType: [],
manufacturer: [],
searchBeginTime: "",
searchEndTime: "",
statisticalType: "",
scale: [],
linePassRate: "",
},
classificationData: [],
dejioption: [],
deji: "",
//电压等级
voltageleveloption: [],
interfereoption: [],
terminaloption: [],
ExpandedNum: 2,
tableData: [],
typedata: "",
dydj: true,
expandID: [],
loading: false,
terminalClass: [
{
id: 0,
value: "0",
label: "极重要",
},
{
id: 1,
value: "1",
label: "重要",
},
{
id: 2,
value: "2",
label: "普通",
},
{
id: 3,
value: "3",
label: "不重要",
},
], //终端等级
};
},
created() {
this.info();
},
mounted() {
this.vh = window.sessionStorage.getItem("appheight") - 170;
this.handleExpandNumChange();
this.formData.deptIndex = JSON.parse(
window.sessionStorage.getItem("Info")
).deptId;
this.onSubmit();
},
methods: {
//字典表
info() {
// 获取统计类型
this.classificationData = dicData("Statistical_Type", ["Report_Type"]);
this.formData.statisticalType = this.classificationData[0];
// 字典获取数据电压等级;
this.voltageleveloption = dicData("Dev_Voltage", []);
this.formData.scale = this.voltageleveloption;
//字典获取数据终端厂家
this.terminaloption = dicData("Dev_Manufacturers", []);
this.formData.manufacturer = this.terminaloption;
//字典获取数据干扰源类型
this.interfereoption = dicData("Interference_Source", []);
this.formData.loadType = this.interfereoption;
},
// 区域
handleNodeClick(data) {
// console.log(data);
this.formData.deptIndex = data.id;
},
// 查询
onSubmit() {
this.loading = true;
// console.log("========", this.formData);
(this.formData.serverName = "harmonic-boot"),
(this.formData.searchBeginTime = this.$refs.Timeinterval.timeValue[0]);
this.formData.searchEndTime = this.$refs.Timeinterval.timeValue[1];
this.typedata = this.formData.statisticalType.label;
getLineIntegrityData(this.formData).then((res) => {
if (res.code == "A0000") {
// console.log(res.data[0].deviceName === null)
if (res.data.length == 0) {
this.tableData = [];
this.loading = false;
} else {
// this.tableData = res.data
res.data.forEach((m) => {
m.id = this.guid();
m.children.forEach((n) => {
n.id = this.guid();
n.children.forEach((d) => {
d.id = this.guid();
d.children.forEach((c) => {
c.id = this.guid();
c.children.forEach((p) => {
p.id = this.guid();
p.children.forEach((a) => {
a.id = this.guid();
a.children.forEach((r) => {
r.id = this.guid();
r.children.forEach((t) => {
t.id = this.guid();
});
});
});
});
});
});
});
});
this.tableData = res.data;
this.handleExpandNumChange();
this.loading = false;
}
}
});
},
// 重置
Reset() {
this.formData = {
//后面需要修改
deptIndex: "",
monitorFlag: 2,
powerFlag: 2,
loadType: [],
manufacturer: [],
searchBeginTime: "",
searchEndTime: "",
statisticalType: "",
scale: [],
linePassRate: "",
};
},
//判断需要展开层级
handleExpandNumChange() {
if (this.ExpandedNum > 0) {
this.setExpandKeys(this.tableData);
}
},
//层级展开递归方法
setExpandKeys(dataList, n) {
if (!n) n = 1;
for (let i = 0; i < dataList.length; i++) {
if (n <= this.ExpandedNum) {
//this.expandID=[]
this.expandID.push(`${dataList[i].id}`);
if (dataList[i].hasOwnProperty("children")) {
const children = dataList[i].children;
this.setExpandKeys(children, n + 1);
}
}
}
},
guid() {
return "xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx".replace(/[xy]/g, function (c) {
let r = (Math.random() * 16) | 0,
v = c === "x" ? r : (r & 0x3) | 0x8;
return v.toString(16);
});
},
},
computed: {},
watch: {},
};
</script>
<style lang="less" scoped>
@import url("../../../../../styles/comStyle.less");
</style>
<style lang="scss" scoped>
::v-deep .el-tooltip {
text-align: left !important;
}
</style>

View File

@@ -0,0 +1,541 @@
<template>
<div>
<el-form :inline="true" :model="formData">
<el-form-item>
<el-switch class="tableScopeSwitch" :active-value="2" :inactive-value="1" active-text="全网"
inactive-text="网公司" inactive-color="#666666" v-model="formData.monitorFlag"></el-switch>
</el-form-item>
<el-form-item label="统计类型:">
<el-select v-model="formData.statisticalType" placeholder="请选择统计类型" style="width: 160px">
<el-option v-for="item in classificationData" :key="item.id" :label="item.name" :value="{
label: item.name,
value: item.id,
name: item.name,
id: item.id,
code: item.code,
sort: item.sort
}"></el-option>
</el-select>
</el-form-item>
<el-form-item label="终端等级:">
<el-select v-model="formData.algoDescribe" multiple collapse-tags placeholder="终端等级"
style="width: 160px">
<el-option v-for="item in terminalClass" :key="item.id" :label="item.label"
:value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="电压等级:">
<el-select v-model="formData.scale" multiple collapse-tags placeholder="请选择电压等级" style="width: 160px">
<el-option v-for="item in voltageleveloption" :key="item.id" :label="item.name" :value="{
label: item.name,
value: item.id,
code: item.code,
name: item.name,
id: item.id,
sort: item.sort
}"></el-option>
</el-select>
</el-form-item>
<!-- <el-form-item label="终端厂家:">
<el-select
v-model="formData.manufacturer"
multiple
collapse-tags
placeholder="请选择终端厂家"
style="width: 160px;"
>
<el-option
v-for="item in terminaloption"
:key="item.id"
:label="item.name"
:value="{
label: item.name,
value: item.id,
code: item.code,
name: item.name,
id: item.id,
sort: item.sort
}"
>
</el-option>
</el-select>
</el-form-item> -->
<el-form-item label="终端厂家:">
<el-select v-model="formData.manufacturer" multiple collapse-tags placeholder="请选择终端厂家"
style="width: 160px">
<el-option v-for="item in terminaloption" :key="item.id" :label="item.name" :value="{
label: item.name,
value: item.id,
code: item.code,
name: item.name,
id: item.id,
sort: item.sort
}"></el-option>
</el-select>
</el-form-item>
<el-form-item label="干扰源类型:">
<el-select v-model="formData.loadType" multiple collapse-tags placeholder="请选择干扰源类型"
style="width: 180px">
<el-option v-for="item in interfereoption" :key="item.id" :label="item.name" :value="{
label: item.name,
value: item.id,
code: item.code,
name: item.name,
id: item.id,
sort: item.sort
}"></el-option>
</el-select>
</el-form-item>
<el-form-item label="合格率:">
<el-select v-model="formData.linePassRate" placeholder="请选择合格率" style="width: 180px">
<el-option label="合格" value="1"></el-option>
<el-option label="不合格" value="0"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<Area @click="handleNodeClick"></Area>
</el-form-item>
<el-form-item>
<Timeinterval ref="Timeinterval" :interval="3"></Timeinterval>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit" class="ml10" icon="el-icon-search">查询</el-button>
</el-form-item>
<el-form-item>
<el-button type="primary" class="ml10" icon="el-icon-search" @click="Reset">重置</el-button>
</el-form-item>
</el-form>
<el-row>
<el-col :span="24" style="height: 100px">
<div ref="fg" v-loading="loading" id="dataintegrity" :style="'zoom:' + device"></div>
<!-- -->
</el-col>
</el-row>
</div>
</template>
<script>
import { dicData } from '@/assets/commjs/dictypeData'
import Area from '@/views/components/Area/Area.vue'
import Timeinterval from '@/views/components/Timeinterval.vue'
import { getLineIntegrityData } from '@/api/integraliy/integraliy'
import { onLienRate1, onLienRate2, onLienRate3, Integrity1, Integrity2, Integrity3 } from '@/assets/commjs/color'
export default {
components: {
Area,
Timeinterval
},
props: {},
data() {
return {
zoom: '',
vh: undefined,
formData: {
//后面需要修改
deptIndex: '',
monitorFlag: 2,
powerFlag: 2,
loadType: [],
manufacturer: [],
searchBeginTime: '',
searchEndTime: '',
statisticalType: '',
scale: [],
linePassRate: ''
},
classificationData: [],
dejioption: [],
deji: '',
//电压等级
voltageleveloption: [],
interfereoption: [],
terminaloption: [],
tableData: [],
title: '',
dydj: true,
expandID: [],
loading: false,
title: '',
device: 1,
terminalClass: [
{
id: 0,
value: '0',
label: '极重要'
},
{
id: 1,
value: '1',
label: '重要'
},
{
id: 2,
value: '2',
label: '普通'
},
{
id: 3,
value: '3',
label: '不重要'
}
] //终端等级
}
},
created() {
this.info()
},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.zoom = 1 / document.body.style.zoom
window.addEventListener('resize', () => {
this.zoom = 1 / document.body.style.zoom
// this.myChartes.resize();
})
this.formData.deptIndex = JSON.parse(window.sessionStorage.getItem('Info')).deptId
this.onSubmit()
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
setTimeout(() => {
; (document.getElementById('dataintegrity').style.width = `100%`),
// document.getElementById("app-main-in").offsetWidth - 100 + "px"
(document.getElementById('dataintegrity').style.height =
window.sessionStorage.getItem('appheight') - 240 + 'px')
this.device = window.devicePixelRatio
if (this.device == 1) {
this.tableheight = this.tableheight * 2
}
if (this.device == 1.25) {
this.tableheight = this.tableheight * 1.6
}
if (this.device == 1.5) {
this.tableheight = this.tableheight * 1.93
}
}, 0)
this.vh = window.sessionStorage.getItem('appheight') - 170
},
//字典表
info() {
// 获取统计类型
this.classificationData = dicData('Statistical_Type', ['Report_Type'])
this.formData.statisticalType = this.classificationData[0]
// 字典获取数据电压等级;
this.voltageleveloption = dicData('Dev_Voltage', [])
this.formData.scale = this.voltageleveloption
//字典获取数据终端厂家
this.terminaloption = dicData('Dev_Manufacturers', [])
this.formData.manufacturer = this.terminaloption
//字典获取数据干扰源类型
this.interfereoption = dicData('Interference_Source', [])
this.formData.loadType = this.interfereoption
},
// 区域
handleNodeClick(data) {
// console.log(data);
this.formData.deptIndex = data.id
},
// 查询
onSubmit() {
this.loading = true
; (this.formData.serverName = 'harmonic-boot'),
(this.formData.searchBeginTime = this.$refs.Timeinterval.timeValue[0])
this.formData.searchEndTime = this.$refs.Timeinterval.timeValue[1]
this.title = this.formData.statisticalType.label
getLineIntegrityData(this.formData).then(res => {
if (res.code == 'A0000') {
let title = []
let integrityData = []
res.data.forEach(item => {
title.push(item.name)
integrityData.push(item.integrityData)
})
this.dataintegritys(title, integrityData)
}
})
},
// 重置
Reset() {
this.formData = {
//后面需要修改
deptIndex: '',
monitorFlag: 2,
powerFlag: 2,
loadType: [],
manufacturer: [],
searchBeginTime: '',
searchEndTime: '',
statisticalType: '',
scale: [],
linePassRate: ''
}
},
dataintegritys(title, integrityData) {
// console.log("===", title, integrityData);
this.loading = true
const echarts = require('echarts')
let runstatus = document.getElementById('dataintegrity')
var myChartes = echarts.init(runstatus)
myChartes.clear()
var option = {
title: {
text: this.title,
left: 'center'
//subtext: '单位(%)'
},
tooltip: {
trigger: 'axis',
axisPointer: {
// 坐标轴指示器,坐标轴触发有效
type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
},
formatter: function (params) {
var tips = ''
tips += params[0].name + '</br/>'
for (var i = 0; i < params.length; i++) {
if (params[i].value == 3.14159) {
tips += params[i].seriesName + ':暂无数据<br/>'
} else {
tips += params[i].seriesName + ':' + params[i].value + '%<br/>'
}
}
return tips
}
},
grid: {
left: '2%',
right: '2%',
bottom: '10px',
containLabel: true
},
xAxis: [
{
type: 'category',
// data: this.xdata,
data: title,
splitLine: {
show: false
},
axisTick: {
alignWithLabel: true
},
axisLabel: {
textStyle: {
fontFamily: 'dinproRegular',
color: '#000'
},
rotate: 39
},
axisLine: {
show: true,
symbol: ['none', 'arrow']
}
}
],
toolbox: {
show: true,
feature: {
saveAsImage: { show: true }
// dataZoom: {
// yAxisIndex: 'none'
// },
// //restore: {},
// mark : {show: true},
//magicType : {show: true, type: ['line', 'bar']}
}
},
yAxis: [
{
name: '单位(%)',
type: 'value',
min: 0,
max: 100,
splitLine: {
show: false
},
axisLine: {
show: true,
symbol: ['none', 'arrow']
},
splitArea: {
show: true
}
}
],
series: [
{
name: '',
// name: this.timeValue,
barMaxWidth: 45,
type: 'bar',
label: {
normal: {
show: false,
position: 'top'
}
},
itemStyle: {
normal: {
// 随机显示
//color:function(d){return "#"+Math.floor(Math.random()*(256*256*256-1)).toString(16);}
// 定制显示(按顺序)
color: function (params) {
if (params.value == 3.14159) {
return new echarts.graphic.LinearGradient(
0,
1,
0,
0,
[
{
offset: 1,
color: '#ccc'
}
],
false
)
} else if (params.value >= 90) {
return new echarts.graphic.LinearGradient(
0,
1,
0,
0,
[
{
offset: 1,
color: Integrity1
}
],
false
)
} else if (params.value >= 60 && params.value <= 90) {
return new echarts.graphic.LinearGradient(
0,
1,
0,
0,
[
{
offset: 1,
color: Integrity2
}
],
false
)
// && params.value > 5
} else if (params.value <= 60) {
return new echarts.graphic.LinearGradient(
0,
1,
0,
0,
[
{
offset: 1,
color: Integrity3
}
],
false
)
}
}
}
},
markLine: {
silent: false,
symbol: 'circle',
data: [
{
name: '完整性≥90%',
yAxis: 100,
lineStyle: {
color: Integrity1
},
label: {
position: 'middle',
formatter: '{b}',
textStyle: {
color: Integrity1
}
}
},
{
name: '60%≤完整性<90%',
yAxis: 90,
lineStyle: {
color: Integrity2
},
label: {
position: 'middle',
formatter: '{b}',
textStyle: {
color: Integrity2
}
}
},
{
name: '完整性<60%',
yAxis: 60,
lineStyle: {
color: Integrity3
},
label: {
position: 'middle',
formatter: '{b}',
textStyle: {
color: Integrity3
}
}
}
]
},
// data: this.ydata
data: integrityData
}
]
}
let _this = this
myChartes.setOption(option)
window.echartsArr.push(myChartes)
setTimeout(() => {
myChartes.resize()
_this.loading = false
}, 100)
_this.$erd.listenTo(_this.$refs.fg, element => {
_this.$nextTick(() => {
myChartes.resize()
})
})
window.onresize = function () {
myChartes.resize()
}
}
},
computed: {},
watch: {}
}
</script>
<style lang="less" scoped>
@import url('../../../../../styles/comStyle.less');
</style>
<style lang="scss" scoped>
::v-deep .el-table_1_column_1 {
.el-tooltip {
text-align: left;
}
}
</style>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,362 @@
<template>
<div class="pd10">
<div v-show="flg" v-loading="isLoading" element-loading-text="数据加载中">
<el-form :inline="true" :model="formData">
<el-form-item label="监测点等级:">
<el-select v-model="formData.lineGrade" placeholder="监测点等级" style="width: 160px">
<el-option
v-for="item in terminalClass"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<!-- <el-form-item>
<Timeinterval ref="Timeinterval" :interval="2"></Timeinterval>
</el-form-item> -->
<el-form-item>
<el-button type="primary" @click="onSubmit" class="ml10" icon="el-icon-search">查询</el-button>
</el-form-item>
<!-- <el-form-item>
<el-button type="primary" class="ml10" icon="el-icon-upload2"
>导出</el-button
></el-form-item
> -->
</el-form>
<div class="box">
<div class="boxR" style="overflow: hidden" z>
<div style="width: 100%; height: 100%" id="electr4"></div>
</div>
<div class="boxL">
<el-table
stripe
header-cell-class-name="table_header"
:data="tableData"
style="width: 100%"
:height="vh + 'px'"
highlight-current-row
border
>
<el-table-column :resizable="false" prop="name" label="区域"></el-table-column>
<el-table-column :resizable="false" prop="value" label="监测点个数"></el-table-column>
</el-table>
</div>
</div>
</div>
</div>
</template>
<script>
import Timeinterval from '@/views/components/Timeinterval.vue'
import { dicData } from '@/assets/commjs/dictypeData'
import { getLineDistribution } from '@/api/BusinessAdministrator/distribution'
export default {
name: 'monitoringdistribution',
components: {
Timeinterval
},
props: {},
data() {
return {
flg: true,
isLoading: true,
zoom: '', //图表焦点校验
vh: undefined,
formData: {
lineGrade: '' //终端等级
// searchBeginTime: "", //开始
// searchEndTime: "", //结束
// timeFlag: "", //区分时间
},
terminalClass: [], //终端等级
tableData: []
}
},
created() {
this.getclassificationData()
},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.onSubmit()
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem('appheight') - 55
},
//获取类型
getclassificationData() {
//监测点等级
this.terminalClass = dicData('Dev_Level', [])
this.formData.lineGrade = this.terminalClass[0].id
},
onSubmit() {
this.flg = true
this.isLoading = true
getLineDistribution(this.formData).then(res => {
this.tableData = res.data
this.chart()
this.isLoading = false
})
},
//点击切换
details(e) {
this.flg = false
},
chart() {
let _this = this
let echarts = require('echarts')
let domID2 = document.getElementById('electr4')
setTimeout(() => {
;(domID2.style.width = document.getElementById('app-main-in').offsetWidth - 430 + 'px'),
(domID2.style.height = window.sessionStorage.getItem('appheight') - 55 + 'px')
}, 0)
let myChart2 = echarts.init(domID2)
let echartsData = []
this.tableData.forEach(item => {
echartsData.push(item)
})
// let maps=await map()
let echartsColor = JSON.parse(window.localStorage.echartsColor)
// let colors = ["#0ec7aa", "#33CCFF", "#FFCC00", "#FF6600", "#FF3300"];
// let title = ["无污染", "轻微污染", "轻度污染", "中度污染", "重度污染"];
// jquery.getJSON("/api1/system-boot/map", null, function(data) {
_this.$axios.get('./static/mapjson/全国.json').then(data => {
echarts.registerMap('china', data.data)
let option = {
// backgroundColor: '#060303', //地图背景色深蓝
tooltip: {
trigger: 'item',
showDelay: 0,
hideDelay: 0,
enterable: true,
transitionDuration: 0,
//提示框组件
axisPointer: {
type: 'shadow',
label: {
color: '#fff',
fontSize: 16
}
},
textStyle: {
color: '#fff',
fontStyle: 'normal',
opacity: 0.35,
fontSize: 14
},
backgroundColor: 'rgba(0,0,0,0.35)',
borderWidth: 0,
extraCssText: 'z-index:100',
formatter: function (params) {
var tips = ''
if (params.data == undefined) {
;(tips += '区域:' + params.name + '<br/>'), (tips += '监测点个数:' + '暂无数据')
} else {
;(tips += '区域:' + params.name + '<br/>'),
(tips += '监测点个数:' + params.value + '个')
}
return tips
}
},
geo: {
show: true,
map: 'china',
roam: true,
top: 220,
left: 300,
zoom: 1.5,
label: {
normal: {
show: true,
textStyle: {
color: echartsColor.WordColor,
fontSize: 12,
fontFamily: 'Arial'
}
}
},
select: {
// 地图选中区域样式
label: {
// 选中区域的label(文字)样式
color: '#fff'
},
itemStyle: {
// 选中区域的默认样式
areaColor: '#0075FF'
}
},
// label: {
// emphasis: {
// show: false
// }
// },
itemStyle: {
normal: {
borderColor: 'rgba(147, 235, 248, 1)',
borderWidth: 1,
areaColor: {
type: 'radial',
x: 0.5,
y: 0.5,
r: 0.8,
colorStops: [
{
offset: 0,
color: 'rgba(147, 235, 248, 0)' // 0% 处的颜色
},
{
offset: 1,
color: 'rgba(147, 235, 248, .2)' // 100% 处的颜色
}
],
globalCoord: false // 缺省为 false
},
shadowColor: 'rgba(128, 217, 248, 1)',
// shadowColor: 'rgba(255, 255, 255, 1)',
shadowOffsetX: -2,
shadowOffsetY: 2,
shadowBlur: 10
},
emphasis: {
areaColor: '#389BB7',
borderWidth: 0
}
}
},
toolbox: {
show: true,
top: '25',
// iconStyle: {
// borderColor: "crimson",
// },
feature: {
saveAsImage: {}
}
},
legend: {
//各标记图例
orient: 'vertical',
// id: 1,
top: '40px',
right: '40px',
itemWidth: 16,
itemHeight: 16,
itemGap: 28,
textStyle: {
color: echartsColor.WordColor,
rich: {
a: {
verticalAlign: 'middle'
}
},
padding: [2, 0, 0, 0] //[上、右、下、左]
}
},
title: {
text: '',
left: 'left',
top: '60',
textStyle: {
color: '#C09611',
size: 20
}
},
visualMap: {
show: true,
left: '3%',
top: '6%',
itemHeight: 15,
itemWidth: 15,
pieces: [
{
gte: 0,
lt: 30,
label: '0-30(个)',
color: '#0ec7aa'
},
{
gte: 30,
lt: 60,
label: '30-60(个)',
color: '#33CCFF'
},
{
gte: 60,
lt: 80,
label: '60-80(个)',
color: '#FFCC00'
},
{
gte: 80,
lt: 100,
label: '80-100(个)',
color: '#FF6600'
},
{
gte: 100,
label: '>100(个)',
color: '#FF3300'
}
],
textStyle: {
color: echartsColor.WordColor
}
},
series: [
{
type: 'map', //图表类型
geoIndex: 0,
data: echartsData //图表的数据
}
]
}
myChart2.clear(option)
option && myChart2.setOption(option)
window.echartsArr.push(myChart2)
setTimeout(function () {
myChart2.resize()
}, 0)
})
}
},
computed: {},
watch: {}
}
</script>
<style lang="less" scoped>
@import url('../../../styles/comStyle.less');
::v-deep .el-form-item--small .el-form-item__content,
.el-form-item--small .el-form-item__label {
height: 32px;
}
.box {
display: flex;
.boxR {
flex: 1;
}
.boxL {
width: 400px;
}
}
::v-deep .el-table .cell {
text-align: center;
}
// ::v-deep .has-gutter{
// height: 35px !important;
// }
</style>

View File

@@ -0,0 +1,613 @@
<template>
<div class="pd10" v-loading="loading" element-loading-text="数据加载中">
<el-form :inline="true" class="demo-form-inline">
<el-form-item>
<Timeinterval :interval="3" ref="interval"></Timeinterval>
</el-form-item>
<el-form-item style="margin-bottom: 10px">
<el-button type="primary" icon="el-icon-search" @click="onSubmit">查询</el-button>
<el-button type="primary" icon="el-icon-download" @click="exportEvent">导出</el-button>
</el-form-item>
<el-form-item>
<el-button type="text" @click="closeHandle"
>条件筛选<i
:class="!view ? 'el-icon-arrow-down' : 'el-icon-arrow-right'"
></i
></el-button>
</el-form-item>
</el-form>
<div class="container" id="container">
<i @click="closeHandle" class="el-icon-circle-close coles"></i>
<el-form :inline="true" label-width="110px">
<el-form-item label="监测点等级:">
<el-select
v-model="formData.lineGrade"
clearable
placeholder="请选择监测点等级"
>
<el-option
v-for="item in devLevel"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="通讯状态:">
<el-select v-model="formData.comFlag" clearable placeholder="请选择通讯状态">
<el-option
v-for="item in options1"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="运行状态:">
<el-select v-model="formData.runFlag" clearable placeholder="请选择运行状态">
<el-option
v-for="item in options"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="筛选数据:" style="margin-bottom: 10px">
<el-input
v-model.trim="formData.searchValue"
clearable
placeholder="请输入筛选数据"
></el-input>
</el-form-item>
</el-form>
</div>
<vxe-table class="xiaoshou"
stripe
header-cell-class-name="table_header"
:data="tableData"
border
ref="monthreport"
:row-config="{ isCurrent: true, isHover: true }"
highlight-current-row
default-expand-all
:height="vh"
>
<vxe-table-column title="序号" min-width="70" type="seq" align="center">
<template v-slot="row">
<span>{{
(formData.pageNum - 1) * formData.pageSize + row.seq
}}</span>
</template>
</vxe-table-column>
<vxe-table-column
align="center"
min-width="120px"
show-overflow
field="areaName"
title="省公司"
></vxe-table-column>
<vxe-table-column
align="center"
min-width="120px"
field="gdName"
title="供电公司"
show-overflow
>
<template slot-scope="scope">
{{ scope.row.gdName == null ? '/' : scope.row.gdName }}
</template>
</vxe-table-column>
<vxe-table-column
align="center"
min-width="120px"
show-overflow
field="subName"
title="所属变电站"
>
</vxe-table-column>
<vxe-table-column
align="center"
min-width="120px"
show-overflow
field="lineName"
title="监测点名称"
>
</vxe-table-column>
<vxe-table-column
align="center"
min-width="120px"
show-overflow
field="lineGrade"
:formatter="formFilter"
title="重要等级"
></vxe-table-column>
<vxe-table-column
align="center"
min-width="120px"
show-overflow
field="businessType"
:formatter="formFilter1"
title="行业类型"
></vxe-table-column>
<vxe-table-column
align="center"
min-width="120px"
show-overflow
field="runFlag"
title="运行状态"
>
<template slot-scope="scope">
<span type="primary" v-if="scope.row.runFlag === '0'">投运</span>
<span type="primary" v-if="scope.row.runFlag === '1'">热备用</span>
<span type="primary" v-if="scope.row.runFlag === '2'">停运</span>
</template>
</vxe-table-column>
<vxe-table-column
align="center"
min-width="160"
show-overflow
field="comFlag"
title="监测点通讯状态"
>
<template slot-scope="scope">
<el-tag
type="primary"
v-if="scope.row.comFlag === '0'"
style="color: #fff; background: #cc0000"
size="small"
>中断</el-tag
>
<el-tag
type="primary"
v-if="scope.row.comFlag === '1'"
style="color: #fff; background: #2e8b57"
size="small"
>正常</el-tag
>
</template>
</vxe-table-column>
<vxe-table-column
align="center"
min-width="120px"
show-overflow
field="loginTime"
title="投运时间"
>
</vxe-table-column>
<vxe-table-column
align="center"
min-width="140"
show-overflow
field="updateTime"
title="数据更新时间"
>
</vxe-table-column>
<vxe-table-column
align="center"
min-width="120px"
show-overflow
field="onlineRate"
title="在线率(%)"
>
</vxe-table-column>
<vxe-table-column
align="center"
min-width="120px"
show-overflow
field="integrityData"
title="完整性(%)"
>
</vxe-table-column>
<vxe-table-column
align="center"
min-width="120px"
show-overflow
field="devName"
title="装置名称"
>
</vxe-table-column>
<vxe-table-column
align="center"
min-width="120px"
show-overflow
field="devSeries"
:formatter="formFilter2"
title="装置系列"
>
</vxe-table-column>
<vxe-table-column
align="center"
min-width="160"
show-overflow
field="ip"
title="MAC地址"
>
</vxe-table-column>
<vxe-table-column
align="center"
min-width="120px"
show-overflow
field="flowMeal"
title="总流量(M)"
>
</vxe-table-column>
<vxe-table-column
align="center"
min-width="140"
show-overflow
field="statisValue"
title="使用流量(M)"
>
</vxe-table-column>
<vxe-table-column
align="center"
min-width="140"
field="residualFlow"
title="剩余流量(M)"
>
<template slot-scope="scope">
{{ (scope.row.flowMeal) - (scope.row.statisValue) }}
</template>
</vxe-table-column>
<vxe-table-column
align="center"
min-width="120px"
field="usageRate"
title="使用率(%)"
>
<template slot-scope="scope">
{{ (((scope.row.statisValue) / (scope.row.flowMeal)) * 100).toFixed(2) }}
</template>
</vxe-table-column>
<vxe-table-column
align="center"
min-width="120px"
show-overflow
field="sim"
title="ICICD"
>
<template slot-scope="scope">
{{ scope.row.sim == null ? '/' : scope.row.sim }}
</template>
</vxe-table-column>
<vxe-table-column
align="center"
min-width="120px"
show-overflow
field="remark"
title="备注"
>
<template slot-scope="scope">
{{ scope.row.remark == null ? '/' : scope.row.remark }}
</template>
</vxe-table-column>
</vxe-table>
<el-pagination
background
align="right"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="formData.pageNum"
:page-sizes="[20, 30, 40, 50, 100]"
:page-size="formData.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
class="mt10"
>
</el-pagination>
</div>
</template>
<script>
import Timeinterval from "@/views/components/Timeinterval.vue";
import api from "@/api/BusinessAdministrator/monthreport/monthreport.js";
import { dicData } from "@/assets/commjs/dictypeData";
export default {
components: { Timeinterval },
props: {},
data() {
return {
view: false,
loading: false,
form: {},
options: [
{
id: 0,
name: "投运",
},
{
id: 2,
name: "停运",
},
{
id: 1,
name: "热备用",
},
],
options1: [
{
id: 0,
name: "中断",
},
{
id: 1,
name: "正常",
},
],
value: "",
formData: {
lineGrade: "", //终端等级
runFlag: "",
comFlag: "",
searchValue: "",
searchBeginTime: "", //开始
searchEndTime: "", //结束
pageNum: 1,
pageSize: 20,
},
tableData: [],
devLevel: [],
BusinessType: [],
DevSeries: [],
total: 0,
vh: null,
};
},
created() {
this.getclassificationData();
},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.onSubmit();
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem("appheight") - 95;
},
//获取类型
getclassificationData() {
//监测点等级
this.devLevel = dicData("Dev_Level", []);
//行业类型
this.BusinessType = dicData("Business_Type", []);
//装置系列
this.DevSeries = dicData("Dev_Series", []);
},
//查询
onSubmit() {
this.loading = true;
this.formData.pageNum = 1;
this.$refs.interval.timeOptions = [
// { label: "年份", value: 1 },
// { label: "季度", value: 2 },
{ label: "月份", value: 3 },
// { label: "周", value: 4 },
// // { label: "自定义", value: 5 },
]
this.formData.searchBeginTime = this.$refs.interval.timeValue[0];
this.formData.searchEndTime = this.$refs.interval.timeValue[1];
api.getHalfReport(this.formData).then((res) => {
this.tableData = res.data.records;
this.total = res.data.total;
this.loading = false;
});
},
onSubmit1() {
this.loading = true;
this.$refs.interval.timeOptions = [
// { label: "年份", value: 1 },
// { label: "季度", value: 2 },
{ label: "月份", value: 3 },
// { label: "周", value: 4 },
// // { label: "自定义", value: 5 },
]
this.formData.searchBeginTime = this.$refs.interval.timeValue[0];
this.formData.searchEndTime = this.$refs.interval.timeValue[1];
api.getHalfReport(this.formData).then((res) => {
this.tableData = res.data.records;
this.total = res.data.total;
this.loading = false;
});
},
// 数据过滤
formFilter(row, column) {
if (row.column.property == "lineGrade") {
let title = "";
this.devLevel.forEach((item) => {
if (item.id == row.row.lineGrade) {
title = item.name;
}else if(row.row.lineGrade == null || row.row.lineGrade == ''){
title = '/';
}
});
return title;
} else {
return row.row[row.column.property];
}
},
// 数据过滤
formFilter1(row, column) {
if (row.column.property == "businessType") {
let title = "";
this.BusinessType.forEach((item) => {
if (item.id == row.row.businessType) {
title = item.name;
}else if(row.row.businessType == null || row.row.businessType == ''){
title = '/';
}
});
return title;
} else {
return row.row[row.column.property];
}
},
// 数据过滤
formFilter2(row, column) {
if (row.column.property == "devSeries") {
let title = "";
this.DevSeries.forEach((item) => {
if (item.id == row.row.devSeries) {
title = item.name;
}else if(row.row.devSeries == null || row.row.devSeries == ''){
title = '/';
}
});
return title;
} else {
return row.row[row.column.property];
}
},
//每页条数改变时触发 选择一页显示多少行
handleSizeChange(val) {
this.formData.pageSize = val;
this.onSubmit1();
},
//当前页改变时触发 跳转其他页
handleCurrentChange(val) {
this.formData.pageNum = val;
this.onSubmit1();
},
//导出
exportEvent() {
api
.getHalfReport({
lineGrade: this.formData.lineGrade,
comFlag: this.formData.comFlag,
runFlag: this.formData.runFlag,
searchBeginTime: this.formData.searchBeginTime,
searchEndTime: this.formData.searchEndTime,
searchValue: this.formData.searchValue,
pageNum: 1,
pageSize: this.total,
})
.then((res) => {
res.data.records.forEach(item=>{
if(item.gdName == null){
item.gdName = '/'
}
if(item.sim == null){
item.sim = '/'
}
if(item.remark == null){
item.remark = '/'
}
if(item.runFlag == '0'){
item.runFlag = '投运'
}else if(item.runFlag == '1'){
item.runFlag = '热备用'
}else if(item.runFlag == '2'){
item.runFlag = '停运'
}
if(item.comFlag == '0'){
item.comFlag = '中断'
}else if(item.comFlag == '1'){
item.comFlag = '正常'
}
item.residualFlow = (item.flowMeal) - (item.statisValue)
item.usageRate = (((item.statisValue) / (item.flowMeal)) * 100).toFixed(2)
})
this.$refs.monthreport.exportData({
filename: "export", // 文件名字
sheetName: "Sheet1",
type: "xlsx", //导出文件类型 xlsx 和 csv
useStyle: true,
data: res.data.records, // 数据源 // 过滤那个字段导出
columnFilterMethod: function (column, $columnIndex) {
return !(column.$columnIndex === 0);
},
});
});
},
closeHandle() {
if (this.view) {
this.view = false;
} else {
this.view = true;
}
//console.log('关闭和展开');
const dom = document.getElementById("container");
const closeDom = document.getElementsByClassName("close")[0];
if (!dom.className.match(/(?:^|\s)expend(?!\S)/)) {
dom.className = "container expend";
} else {
dom.className = "container close-container";
}
},
},
computed: {},
watch: {},
};
</script>
<style lang="less" scoped>
@import url("../../../styles/comStyle.less");
.container {
/* margin: auto; */
top: 0px;
right: 0;
width: 40%;
height: 0px;
z-index: 2000;
position: absolute;
background-color: #e4e7ebb9;
overflow: auto;
scroll-behavior: smooth;
-radius: 20px;
}
/* 隐藏滚动条 */
::-webkit-scrollbar {
display: block;
}
.expend {
animation: expend ease 5s forwards;
}
.close-container {
animation: no-expend ease 1s forwards;
}
@keyframes expend {
from {
top: 0px;
height: auto;
}
to {
height: auto;
top: 0px;
}
}
@keyframes no-expend {
from {
height: 20%;
top: 0px;
}
to {
top: 0px;
height: 0px;
}
}
.coles {
position: absolute;
right: 0;
font-size: 20px;
cursor: pointer;
}
.xiaoshou{
cursor: pointer;
}
</style>

View File

@@ -0,0 +1,102 @@
l
<template>
<div class="pd10">
<el-row>
<el-col> </el-col>
<el-col>
<el-tabs
v-model.trim="activeName"
@tab-click="handleClick"
type="border-card"
>
<el-tab-pane
label="在线率列表"
name="first"
:style="'height:' + vh + ';'"
>
<List></List>
</el-tab-pane>
<el-tab-pane
label="在线率图表"
name="second"
:style="'height:' + vh + ';'"
>
<chart></chart>
</el-tab-pane>
</el-tabs>
</el-col>
</el-row>
</div>
</template>
<script>
import List from "./list/list.vue";
import chart from "./chart/chart.vue";
export default {
name:'onlineratestatistics',
components: { List, chart },
data() {
return {
vh: "",
activeName: "first",
type: "暂态总体概况",
device: "",
};
},
created() {},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem('appheight') - 80 + "px";
},
handleClick(tab, event) {
// console.log(tab, event);
},
// researchFn() {
// this.item = this.$refs.interval.timeValue;
// setTimeout(() => {
// if(this.type=='暂态总体概况'){
// if(this.$refs.child.table==true){
// this.$refs.child.region();
// this.$refs.child.voltageLevel();
// }else if(this.$refs.child.chart==true){
// this.$refs.child.$refs.child.getechart1()
// this.$refs.child.$refs.child1.getechart2()
// this.$refs.child.$refs.child2.getechart3()
// this.$refs.child.$refs.child3.getechart4()
// }
// }else if(this.type=='暂态严重度统计'){
// this.$refs.child1.severity();
// }else if(this.type=='暂态原因统计'){
// this.$refs.child2.isLoading=true
// this.$refs.child2.$refs.child.getechart()
// }else if(this.type=='详细事件列表'){
// this.$refs.child3.eventlist();
// }else if(this.type=='暂降次数统计'){
// this.$refs.child4.numberOfDips();
// }else if(this.type=='暂升次数统计'){
// this.$refs.child5.temporaryrise();
// }else if(this.type=='短时中断次数统计')
// this.$refs.child6.shortinterruption();
// }, 100);
// },
},
};
</script>
<style lang="less" scoped>
@import url("../../../../styles/comStyle.less");
::v-deep .el-table .cell {
text-align: center;
}
::v-deep .el-tabs--border-card > .el-tabs__content {
padding: 10px;
}
</style>

View File

@@ -0,0 +1,549 @@
<template>
<div>
<el-form :inline="true" class="demo-form-inline">
<el-form-item>
<el-switch class="tableScopeSwitch" :active-value="2" :inactive-value="1" @change="handleStatusChange"
active-text="全网" inactive-text="网公司" inactive-color="#666666" v-model="formData.monitorFlag">
</el-switch>
</el-form-item>
<el-form-item label="统计类型:" class="box">
<el-select v-model="formData.statisticalType" clearable placeholder="请选择">
<el-option v-for="item in statisticalType" :key="item.id" :label="item.name" :value="{
label: item.name,
value: item.id,
code: item.code,
name: item.name,
id: item.id,
sort: item.sort,
}">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="终端等级:" class="box">
<el-select v-model="formData.algoDescribe" clearable placeholder="请选择">
<el-option v-for="item in terminalClass" :key="item.id" :label="item.label" :value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<Area @click="handleNodeClick" ref="area" class="box"></Area>
</el-form-item>
<el-form-item label="电压等级:" class="box">
<el-select v-model="formData.scale" clearable multiple collapse-tags placeholder="请选择">
<el-option v-for="item in voltageLevel" :key="item.id" :label="item.name" :value="{
label: item.name,
value: item.id,
code: item.code,
name: item.name,
id: item.id,
sort: item.sort,
}">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="终端厂家:" class="box">
<el-select v-model="formData.manufacturer" clearable multiple collapse-tags placeholder="请选择">
<el-option v-for="item in terminalManufacturer" :key="item.id" :label="item.name" :value="{
label: item.name,
value: item.id,
code: item.code,
name: item.name,
id: item.id,
sort: item.sort,
}">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="干扰源类型:" class="box1">
<el-select v-model="formData.loadType" clearable multiple collapse-tags placeholder="请选择">
<el-option v-for="item in interferenceType" :key="item.id" :label="item.name" :value="{
label: item.name,
value: item.id,
code: item.code,
name: item.name,
id: item.id,
sort: item.sort,
}">
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<Timeinterval :interval="3" ref="interval"></Timeinterval>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="onSubmit">查询</el-button>
<el-button type="primary" icon="el-icon-refresh" @click="resetFn">重置</el-button>
</el-form-item>
</el-form>
<el-row>
<el-col :span="24" style="height: 100px">
<div ref="fg" v-loading="loadingd" id="dataintegrity" :style="'zoom:' + device"></div>
<!-- :style="
``
" -->
</el-col>
</el-row>
</div>
</template>
<script>
import { dicData } from "@/assets/commjs/dictypeData";
import Area from "@/views/components/Area/Area.vue";
import Timeinterval from "@/views/components/Timeinterval.vue";
import api from "@/api/integraliy/integraliy";
import {
onLienRate1,
onLienRate2,
onLienRate3,
Integrity1,
Integrity2,
Integrity3,
} from "@/assets/commjs/color";
export default {
components: {
Area,
Timeinterval,
},
props: {},
data() {
return {
zoom: "",
vh: undefined,
statisticalType: [], //统计类型
voltageLevel: [], //电压等级
terminalManufacturer: [], //终端厂家
interferenceType: [], //干扰源类型
terminalClass: [
{
id: 0,
value: "选项1",
label: "极重要",
},
{
id: 1,
value: "选项1",
label: "重要",
},
{
id: 2,
value: "选项1",
label: "普通",
},
{
id: 3,
value: "选项1",
label: "不重要",
},
], //终端等级
formData: {
deptIndex: "",
monitorFlag: 2,
powerFlag: 2,
searchBeginTime: "",
searchEndTime: "",
statisticalType: "",
algoDescribe: null,
scale: [],
manufacturer: [],
loadType: [],
serverName: "harmonic-boot",
},
tableData: [],
title: "",
dydj: true,
expandID: [],
loadingd: false,
title: "",
device: 1,
};
},
created() {
this.info();
},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.device = window.devicePixelRatio;
if (this.device == 1) {
this.tableheight = this.tableheight * 2;
}
if (this.device == 1.25) {
this.tableheight = this.tableheight * 1.6;
}
if (this.device == 1.5) {
this.tableheight = this.tableheight * 1.93;
}
this.zoom = 1 / document.body.style.zoom;
window.addEventListener("resize", () => {
this.zoom = 1 / document.body.style.zoom;
// this.myChartes.resize();
});
this.formData.deptIndex = JSON.parse(
window.sessionStorage.getItem("Info")
).deptId;
this.onSubmit();
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem("appheight") - 170;
},
//字典表
info() {
var code1 = "Statistical_Type";
this.statisticalType = dicData(code1, ["Report_Type"]);
this.formData.statisticalType = this.statisticalType[0];
//电压等级
var code3 = "Dev_Voltage";
this.voltageLevel = dicData(code3, []);
this.formData.scale = this.voltageLevel;
//终端厂家
var code4 = "Dev_Manufacturers";
this.terminalManufacturer = dicData(code4, []);
this.formData.manufacturer = this.terminalManufacturer;
//干扰源类型
var code5 = "Interference_Source";
this.interferenceType = dicData(code5, []);
this.formData.loadType = this.interferenceType;
},
// 区域
handleNodeClick(data) {
// console.log(data);
this.formData.deptIndex = data.id;
},
//开关触发
handleStatusChange(val) {
this.formData.monitorFlag = val;
//this.fiveTreeData()
},
// 查询
onSubmit() {
this.loading = true;
// console.log("========", this.formData);
this.formData.searchBeginTime = this.$refs.interval.timeValue[0];
this.formData.searchEndTime = this.$refs.interval.timeValue[1];
this.title = this.formData.statisticalType.label;
this.dataintegritys();
},
// 重置
resetFn() {
this.formData = {
deptIndex: "",
monitorFlag: 2,
powerFlag: 2,
searchBeginTime: "",
searchEndTime: "",
statisticalType: "",
algoDescribe: null,
scale: [],
manufacturer: [],
loadType: [],
serverName: "harmonic-boot",
};
},
async dataintegritys() {
this.loadingd = true;
let xData = [];
let yData = [];
const data = await api.getOnlineRateData(this.formData);
data.data.forEach((item) => {
// console.log(item);
xData.push(item.name);
yData.push(item.onlineRate);
});
// console.log(xData,yData);
// console.log(data);
const echarts = require("echarts");
let runstatus = document.getElementById("dataintegrity");
var myChartes = echarts.init(runstatus);
setTimeout(() => {
(runstatus.style.width = `100%`),
// document.getElementById("app-main-in").offsetWidth - 100 + "px"
(runstatus.style.height =
window.sessionStorage.getItem("appheight") - 240 + "px");
}, 0);
myChartes.clear();
var option = {
title: {
text: this.title,
left: "center",
//subtext: '单位(%)'
},
tooltip: {
trigger: "axis",
axisPointer: {
// 坐标轴指示器,坐标轴触发有效
type: "shadow", // 默认为直线,可选为:'line' | 'shadow'
},
formatter: function (params) {
var tips = "";
tips += params[0].name;
for (var i = 0; i < params.length; i++) {
if (params[i].value == 3.14159) {
tips += params[i].seriesName + ":暂无数据<br/>";
} else {
tips += params[i].seriesName + ":" + params[i].value + "%<br/>";
}
}
return tips;
},
},
grid: {
left: "2%",
right: "2%",
bottom: "2%",
containLabel: true,
},
xAxis: [
{
type: "category",
// data: this.xdata,
data: xData,
splitLine: {
show: false,
},
axisTick: {
alignWithLabel: true,
},
axisLabel: {
textStyle: {
fontFamily: "dinproRegular",
color: "#000",
},
rotate: 39,
},
axisLine: {
show: true,
symbol: ["none", "arrow"],
},
},
],
toolbox: {
show: true,
feature: {
saveAsImage: { show: true },
// dataZoom: {
// yAxisIndex: 'none'
// },
// //restore: {},
// mark : {show: true},
//magicType : {show: true, type: ['line', 'bar']}
},
},
yAxis: [
{
name: "单位(%)",
type: "value",
min: 0,
max: 100,
splitLine: {
show: false,
},
axisLine: {
show: true,
symbol: ["none", "arrow"],
},
splitArea: {
show: true,
},
},
],
series: [
{
name: "",
// name: this.timeValue,
barMaxWidth: 45,
type: "bar",
label: {
normal: {
show: false,
position: "top",
},
},
itemStyle: {
normal: {
// 随机显示
//color:function(d){return "#"+Math.floor(Math.random()*(256*256*256-1)).toString(16);}
// 定制显示(按顺序)
color: function (params) {
if (params.value >= 90) {
return new echarts.graphic.LinearGradient(
0,
1,
0,
0,
[
{
offset: 1,
color: Integrity1,
},
],
false
);
} else if (params.value >= 60 && params.value <= 90) {
return new echarts.graphic.LinearGradient(
0,
1,
0,
0,
[
{
offset: 1,
color: Integrity2,
},
],
false
);
} else if (params.value <= 60 && params.value > 5) {
return new echarts.graphic.LinearGradient(
0,
1,
0,
0,
[
{
offset: 1,
color: Integrity3,
},
],
false
);
} else if (params.value > 0 && params.value <= 5) {
return new echarts.graphic.LinearGradient(
0,
1,
0,
0,
[
{
offset: 1,
color: "#ccc",
},
],
false
);
}
},
},
},
markLine: {
silent: false,
symbol: "circle",
data: [
{
name: "完整性≥90%",
yAxis: 100,
lineStyle: {
color: Integrity1,
},
label: {
position: "middle",
formatter: "{b}",
textStyle: {
color: Integrity1,
},
},
},
{
name: "60%≤完整性<90%",
yAxis: 90,
lineStyle: {
color: Integrity2,
},
label: {
position: "middle",
formatter: "{b}",
textStyle: {
color: Integrity2,
},
},
},
{
name: "完整性<60%",
yAxis: 60,
lineStyle: {
color: Integrity3,
},
label: {
position: "middle",
formatter: "{b}",
textStyle: {
color: Integrity3,
},
},
},
],
},
// data: this.ydata
data: yData,
},
],
};
myChartes.setOption(option)
window.echartsArr.push(myChartes);
setTimeout(() => {
myChartes.resize();
}, 100);
this.loadingd = false;
let _this = this;
_this.$erd.listenTo(_this.$refs.fg, (element) => {
_this.$nextTick(() => {
myChartes.resize();
});
});
window.onresize = function () {
myChartes.resize();
};
},
},
computed: {},
watch: {},
};
</script>
<style lang="less" scoped>
@import url("../../../../../styles/comStyle.less");
</style>
<style lang="scss" scoped>
::v-deep .el-table_1_column_1 {
.el-tooltip {
text-align: left;
}
}
::v-deep .el-tabs--border-card>.el-tabs__content {
padding: 10px;
}
::v-deep .box {
.el-input {
width: 160px;
}
}
::v-deep .box1 {
.el-input {
width: 180px;
}
}
::v-deep .el-form-item {
margin-bottom: 5px;
}
</style>

View File

@@ -0,0 +1,433 @@
<template>
<div>
<el-form :inline="true" class="demo-form-inline">
<el-form-item>
<el-switch class="tableScopeSwitch" :active-value="2" :inactive-value="1" @change="handleStatusChange"
active-text="全网" inactive-text="网公司" inactive-color="#666666" v-model="formData.monitorFlag">
</el-switch>
</el-form-item>
<el-form-item label="统计类型:" class="box">
<el-select v-model="formData.statisticalType" clearable placeholder="请选择">
<el-option v-for="item in statisticalType" :key="item.id" :label="item.name" :value="{
label: item.name,
value: item.id,
code: item.code,
name: item.name,
id: item.id,
sort: item.sort,
}">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="终端等级:" class="box">
<el-select v-model="formData.algoDescribe" clearable placeholder="请选择">
<el-option v-for="item in terminalClass" :key="item.id" :label="item.label" :value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<Area @click="handleNodeClick" ref="area" class="box"></Area>
</el-form-item>
<el-form-item label="电压等级:" class="box">
<el-select v-model="formData.scale" clearable multiple collapse-tags placeholder="请选择">
<el-option v-for="item in voltageLevel" :key="item.id" :label="item.name" :value="{
label: item.name,
value: item.id,
code: item.code,
name: item.name,
id: item.id,
sort: item.sort,
}">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="终端厂家:" class="box">
<el-select v-model="formData.manufacturer" clearable multiple collapse-tags placeholder="请选择">
<el-option v-for="item in terminalManufacturer" :key="item.id" :label="item.name" :value="{
label: item.name,
value: item.id,
code: item.code,
name: item.name,
id: item.id,
sort: item.sort,
}">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="干扰源类型:" class="box1">
<el-select v-model="formData.loadType" clearable multiple collapse-tags placeholder="请选择">
<el-option v-for="item in interferenceType" :key="item.id" :label="item.name" :value="{
label: item.name,
value: item.id,
code: item.code,
name: item.name,
id: item.id,
sort: item.sort,
}">
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<Timeinterval :interval="3" ref="interval"></Timeinterval>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="onSubmit">查询</el-button>
<el-button type="primary" icon="el-icon-refresh" @click="resetFn">重置</el-button>
</el-form-item>
</el-form>
<el-row>
<el-col :span="24">
<el-select v-show="false" v-model="ExpandedNum" @change="handleExpandNumChange" placeholder="选择展开级别" size="mini"
style="left: 0; width: 100px">
<el-option label="不展开" :value="0"></el-option>
<el-option label="展开1" :value="1"></el-option>
<el-option label="展开2" :value="2"></el-option>
<el-option label="展开3" :value="3"></el-option>
</el-select>
<el-table stripe :data="tableData" class="xshou" style="width: 100%; margin-bottom: 0" row-key="id"
id="rebateSetTable" border :height="height + 'px'" :expand-row-keys="expandID" highlight-current-row
:header-cell-style="{
//background:'#5E95E8',
//color:'#FFFFFF',
height: '25px',
top: '0px',
padding: '0px',
}" v-loading="loading" element-loading-text="数据加载中" header-cell-class-name="table_header"
:row-style="{ height: '25px' }" :cell-style="{ padding: '0px' }"
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
<el-table-column min-width="150" prop="name" :label="typedata" sortable :show-overflow-tooltip="true"
width="200"></el-table-column>
<el-table-column min-width="150" align="center" prop="voltageLevel" v-if="dydj" label="电压等级" sortable>
<template slot-scope="scope">
<span v-if="scope.row.voltageLevel == null" type="primary" size="small">/</span>
<span v-if="scope.row.voltageLevel != null" type="primary" size="small">{{ scope.row.voltageLevel
}}</span>
</template>
</el-table-column>
<el-table-column min-width="150" align="center" prop="networkParam" label="网络参数" sortable>
<template slot-scope="scope">
<span v-if="scope.row.networkParam == null" type="primary" size="small">/</span>
<span v-if="scope.row.networkParam != null" type="primary" size="small">{{ scope.row.networkParam
}}</span>
</template>
</el-table-column>
<el-table-column min-width="150" align="center" prop="name" :show-overflow-tooltip="true" label="名称" sortable>
</el-table-column>
<el-table-column min-width="150" align="center" prop="factoryName" label="厂家" sortable>
<template slot-scope="scope">
<span v-if="scope.row.factoryName == null" type="primary" size="small">/</span>
<span v-if="scope.row.factoryName != null" type="primary" size="small">{{ scope.row.factoryName }}</span>
</template>
</el-table-column>
<el-table-column min-width="150" align="center" prop="deviceName" label="终端名称" sortable>
<template slot-scope="scope">
<span v-if="scope.row.deviceName == null" type="primary" size="small">/</span>
<span v-if="scope.row.deviceName != null" type="primary" size="small">{{ scope.row.deviceName }}</span>
</template>
</el-table-column>
<el-table-column min-width="150" align="center" prop="state" label="通讯状态" sortable>
<template slot-scope="scope">
<span v-if="scope.row.state == null" type="primary" size="small">/</span>
<span v-if="scope.row.state == 0" type="primary" size="small">中断</span>
<span v-if="scope.row.state == 1" type="primary" size="small">正常</span>
</template>
</el-table-column>
<el-table-column min-width="150" align="center" prop="time" label="最新数据时间" :show-overflow-tooltip="true"
sortable>
<template slot-scope="scope">
<span v-if="scope.row.time == null" type="primary" size="small">/</span>
<span v-if="scope.row.time != null" type="primary" size="small">{{
scope.row.time
}}</span>
</template>
</el-table-column>
<el-table-column min-width="150" align="center" prop="onlineRateData" label="在线率(%)">
<template slot-scope="scope">
<span v-if="scope.row.onlineRateData == null" type="primary" size="small">暂无数据</span>
<span v-else type="primary" size="small">{{
scope.row.onlineRateData.toFixed(2)
}}</span>
<!-- <span type="primary" size="small" @click="clickFn" style="color:blue;text-decoration:underline">查看</span> -->
</template>
</el-table-column>
</el-table>
</el-col>
</el-row>
</div>
</template>
<script>
import Area from "@/views/components/Area/Area.vue";
import Timeinterval from "../../../../components/Timeinterval.vue";
import api from "@/api/integraliy/integraliy";
import { dicData } from "@/assets/commjs/dictypeData";
export default {
components: { Area, Timeinterval },
data() {
return {
vh: "",
height: null,
loading: false,
statisticalType: [], //统计类型
voltageLevel: [], //电压等级
terminalManufacturer: [], //终端厂家
interferenceType: [], //干扰源类型
terminalClass: [
{
id: 0,
value: "选项1",
label: "极重要",
},
{
id: 1,
value: "选项1",
label: "重要",
},
{
id: 2,
value: "选项1",
label: "普通",
},
{
id: 3,
value: "选项1",
label: "不重要",
},
], //终端等级
formData: {
deptIndex: "",
monitorFlag: 2,
powerFlag: 2,
searchBeginTime: "",
searchEndTime: "",
statisticalType: "",
algoDescribe: null,
scale: [],
manufacturer: [],
loadType: [],
serverName: "harmonic-boot",
},
ExpandedNum: 2,
expandID: [],
tableData: [],
typedata: "",
dydj: false,
device: "",
};
},
created() {
this.getclassificationData();
},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.handleExpandNumChange();
this.formData.deptIndex = JSON.parse(
window.sessionStorage.getItem("Info")
).deptId;
this.onSubmit();
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.device = window.devicePixelRatio;
this.height = window.sessionStorage.getItem("appheight") - 195;
},
clickFn() {
alert("111");
},
//判断需要展开层级
handleExpandNumChange() {
if (this.ExpandedNum > 0) {
this.setExpandKeys(this.tableData);
}
},
//层级展开递归方法
setExpandKeys(dataList, n) {
if (!n) n = 1;
for (let i = 0; i < dataList.length; i++) {
if (n <= this.ExpandedNum) {
//this.expandID=[]
this.expandID.push(`${dataList[i].id}`);
if (dataList[i].hasOwnProperty("children")) {
const children = dataList[i].children;
this.setExpandKeys(children, n + 1);
}
}
}
},
guid() {
return "xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx".replace(/[xy]/g, function (c) {
let r = (Math.random() * 16) | 0,
v = c === "x" ? r : (r & 0x3) | 0x8;
return v.toString(16);
});
},
//获取类型
getclassificationData() {
//统计类型
var code1 = "Statistical_Type";
this.statisticalType = dicData(code1, ["Report_Type"]);
this.formData.statisticalType = this.statisticalType[0];
//电压等级
var code3 = "Dev_Voltage";
this.voltageLevel = dicData(code3, []);
this.formData.scale = this.voltageLevel;
//终端厂家
var code4 = "Dev_Manufacturers";
this.terminalManufacturer = dicData(code4, []);
this.formData.manufacturer = this.terminalManufacturer;
//干扰源类型
var code5 = "Interference_Source";
this.interferenceType = dicData(code5, []);
this.formData.loadType = this.interferenceType;
},
//查询
onSubmit() {
this.loading = true;
// console.log("========", this.formData);
this.formData.searchBeginTime = this.$refs.interval.timeValue[0];
this.formData.searchEndTime = this.$refs.interval.timeValue[1];
this.typedata = this.formData.statisticalType.label;
api.getOnlineRateData(this.formData).then((res) => {
if (res.code == "A0000") {
// console.log(res.data[0].deviceName === null)
if (res.data.length == 0) {
this.tableData = [];
} else {
// this.tableData = res.data
res.data.forEach((m) => {
m.id = this.guid();
m.children.forEach((n) => {
n.id = this.guid();
n.children.forEach((d) => {
d.id = this.guid();
d.children.forEach((c) => {
c.id = this.guid();
c.children.forEach((p) => {
p.id = this.guid();
p.children.forEach((a) => {
a.id = this.guid();
a.children.forEach((r) => {
r.id = this.guid();
r.children.forEach((t) => {
t.id = this.guid();
});
});
});
});
});
});
});
});
this.tableData = res.data;
this.handleExpandNumChange();
this.loading = false;
}
}
});
},
// 切换选项
handleNodeClick(data) {
// console.log(data);
this.formData.deptIndex = data.id;
},
//开关触发
handleStatusChange(val) {
this.formData.monitorFlag = val;
//this.fiveTreeData()
},
//重置
resetFn() {
(this.formData = {
deptIndex: "",
monitorFlag: 2,
powerFlag: 2,
searchBeginTime: "",
searchEndTime: "",
statisticalType: "",
algoDescribe: null,
scale: [],
manufacturer: [],
loadType: [],
serverName: "harmonic-boot",
}),
(this.$refs.area.form.valueTitle = "全国");
this.$refs.interval.intervald = 1;
},
},
};
</script>
<style lang="less" scoped>
@import url("../../../../../styles/comStyle.less");
::v-deep .el-table .cell {
text-align: center;
}
::v-deep .el-tabs--border-card>.el-tabs__content {
padding: 10px;
}
::v-deep .box {
.el-input {
width: 160px;
}
}
::v-deep .box1 {
.el-input {
width: 180px;
}
}
::v-deep .el-form-item {
margin-bottom: 5px;
}
.tableScopeSwitch .el-switch__label {
position: absolute;
display: none;
color: #fff !important;
}
/* 打开时文字位置设置 */
.tableScopeSwitch .el-switch__label--right {
z-index: 1;
/* 不同场景下可能不同,自行调整 */
}
/* 关闭时文字位置设置 */
.tableScopeSwitch .el-switch__label--left {
left: 80px;
/* 不同场景下可能不同,自行调整 */
z-index: 1;
}
/* 显示文字 */
.tableScopeSwitch .el-switch__label.is-active {
display: block;
}
.tableScopeSwitch.el-switch .el-switch__core,
.el-switch .el-switch__label {
width: 200px !important;
/* 开关按钮的宽度大小 */
}
</style>

View File

@@ -0,0 +1,615 @@
<template>
<div class="pd10" v-loading="loading" element-loading-text="数据加载中">
<el-form :inline="true" :model="formData" class="demo-form-inline">
<el-form-item label="监测点等级:">
<el-select
v-model="formData.lineGrade"
placeholder="请选择监测点等级"
clearable
>
<el-option
v-for="item in devLevel"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="装置运行状态:">
<el-select
v-model="formData.runFlag"
placeholder="请选择装置运行状态"
clearable
>
<el-option
v-for="item in options"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="筛选数据:" style="margin-bottom: 10px">
<el-input
style="width: 204px"
v-model.trim="formData.searchValue"
clearable
placeholder="请输入筛选数据"
></el-input>
</el-form-item>
<el-form-item style="margin-bottom: 10px">
<el-button type="primary" icon="el-icon-search" @click="onSubmit"
>查询</el-button
>
<el-button type="primary" icon="el-icon-download" @click="exportEvent"
>导出</el-button
>
<el-button
type="primary"
icon="el-icon-download"
@click="TemplateExport"
>模版导出</el-button
>
<el-button type="primary" icon="el-icon-download" @click="batchImport"
>批量导出监测点评分权重</el-button
>
</el-form-item>
</el-form>
<vxe-table class="xiaoshou"
size="mini"
ref="powerweight"
:row-config="{ isCurrent: true, isHover: true }"
header-cell-class-name="table_header"
:data="tableData"
border
highlight-current-row
default-expand-all
:height="vh"
stripe
>
<vxe-table-column title="序号" min-width="70" type="seq" align="center">
<template v-slot="row">
<span>{{
(formData.pageNum - 1) * formData.pageSize + row.seq
}}</span>
</template>
</vxe-table-column>
<vxe-table-column
align="center"
min-width="80px"
field="areaName"
title="省份"
></vxe-table-column>
<vxe-table-column
align="center"
min-width="100px"
field="gbName"
title="供电公司"
></vxe-table-column>
<vxe-table-column
align="center"
min-width="120px"
field="subName"
show-overflow
title="所属变电站"
></vxe-table-column>
<vxe-table-column
align="center"
min-width="120px"
field="devName"
title="装置名称"
>
</vxe-table-column>
<vxe-table-column
align="center"
min-width="120px"
show-overflow
field="lineName"
title="监测点名称"
>
</vxe-table-column>
<vxe-table-column
align="center"
min-width="100px"
field="runFlag"
title="装置状态"
>
<template slot-scope="scope">
<span v-if="scope.row.runFlag == 0" style="color: green">投运</span>
<span v-if="scope.row.runFlag == 2" style="color: red">停运</span>
<span v-if="scope.row.runFlag == 1" style="color: orange"
>热备用</span
>
<span v-if="scope.row.runFlag == null">/</span>
</template>
</vxe-table-column>
<vxe-table-column
align="center"
min-width="120"
field="lineGrade"
:formatter="formFilter"
title="监测点评级"
></vxe-table-column>
<vxe-table-column
align="center"
min-width="140"
field="communFeeMark"
title="通讯费用评分"
></vxe-table-column>
<vxe-table-column
align="center"
min-width="140"
field="assetBelong"
title="资产归属评分"
></vxe-table-column>
<vxe-table-column
align="center"
min-width="140"
field="serviceMark"
title="服务条款评分"
></vxe-table-column>
<vxe-table-column
align="center"
min-width="160"
field="agentMark"
title="中间户数据需求"
>
</vxe-table-column>
<vxe-table-column
align="center"
min-width="140"
field="companyMark"
title="公司数据需求"
>
</vxe-table-column>
<vxe-table-column
align="center"
min-width="100px"
field="userMark"
title="用户需求"
>
</vxe-table-column>
<vxe-table-column
align="center"
min-width="120"
field="lineTypeMark"
title="坚测点类型"
>
</vxe-table-column>
<vxe-table-column
align="center"
min-width="120"
field="businessMark"
title="行业重要度"
>
</vxe-table-column>
<vxe-table-column
align="center"
min-width="120px"
field="flowProportion"
title="操作"
>
<template slot-scope="scope">
<el-button
type="primary"
size="mini"
icon="el-icon-circle-check"
@click="score(scope.row)"
>评分</el-button
>
</template>
</vxe-table-column>
</vxe-table>
<el-pagination
background
align="right"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="formData.pageNum"
:page-sizes="[20, 30, 40, 50, 100]"
:page-size="formData.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
class="mt10"
>
</el-pagination>
<el-dialog title="权重评分" :visible.sync="dialogVisible" width="30%">
<el-form ref="form" :model="scoreForm" label-width="120px">
<el-form-item label="通讯费用评分:">
<el-input
v-model.number="scoreForm.communFeeMark"
placeholder="0 100"
oninput="if(value > 100) value = 100; if(value < 0 || value == '' || value == null) value = 0;"
:maxlength="3"
:minlength="1"
></el-input>
</el-form-item>
<el-form-item label="资产归属评分:" class="top">
<el-input
v-model.number="scoreForm.assetBelong"
placeholder="0 100"
oninput="if(value > 100) value = 100; if(value < 0 || value == '' || value == null) value = 0;"
:maxlength="3"
:minlength="1"
></el-input>
</el-form-item>
<el-form-item label="服务条款评分:" class="top">
<el-input
v-model.number="scoreForm.serviceMark"
placeholder="0 100"
oninput="if(value > 100) value = 100; if(value < 0 || value == '' || value == null) value = 0;"
:maxlength="3"
:minlength="1"
></el-input>
</el-form-item>
<el-form-item label="中间户数据需求:" class="top">
<el-input
v-model.number="scoreForm.agentMark"
placeholder="0 100"
oninput="if(value > 100) value = 100; if(value < 0 || value == '' || value == null) value = 0;"
:maxlength="3"
:minlength="1"
></el-input>
</el-form-item>
<el-form-item label="公司数据需求:" class="top">
<el-input
v-model.number="scoreForm.companyMark"
placeholder="0 100"
oninput="if(value > 100) value = 100; if(value < 0 || value == '' || value == null) value = 0;"
:maxlength="3"
:minlength="1"
></el-input>
</el-form-item>
<el-form-item label="用户需求:" class="top">
<el-input
v-model.number="scoreForm.userMark"
placeholder="0 100"
oninput="if(value > 100) value = 100; if(value < 0 || value == '' || value == null) value = 0;"
:maxlength="3"
:minlength="1"
></el-input>
</el-form-item>
<el-form-item label="坚测点类型:" class="top">
<el-input
v-model.number="scoreForm.lineTypeMark"
placeholder="0 100"
oninput="if(value > 100) value = 100; if(value < 0 || value == '' || value == null) value = 0;"
:maxlength="3"
:minlength="1"
></el-input>
</el-form-item>
<el-form-item label="行业重要度:" class="top">
<el-input
v-model.number="scoreForm.businessMark"
placeholder="0 100"
oninput="if(value > 100) value = 100; if(value < 0 || value == '' || value == null) value = 0;"
:maxlength="3"
:minlength="1"
></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="queryFn"> </el-button>
</span>
</el-dialog>
<!-- 上传文件 -->
<el-dialog
:close-on-click-modal="false"
title="批量导入监测点评分权重"
:visible.sync="uploadInformation"
width="25%"
class="dialog"
height="210px"
>
<el-form ref="form" :model="scoreForm" label-width="120px">
<el-form-item label="文件上传:">
<el-upload
ref="upload"
class="upload-files"
action=""
:headers="headers"
name="file"
multiple
:auto-upload="false"
:file-list="fileList"
:on-change="handleChange"
:limit="1"
accept=".doc,.docx,.xls,.xlsx,.pdf,.txt"
:on-exceed="handleExceed"
>
<el-button slot="trigger" size="mini" type="primary"
>选取文件</el-button
>
</el-upload>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="uploadInformation = fasle"
> </el-button
>
<el-button type="primary" @click="uploadFn"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import Timeinterval from "@/views/components/Timeinterval.vue";
import api from "@/api/BusinessAdministrator/powerweight/powerweight.js";
import { dicData } from "@/assets/commjs/dictypeData";
export default {
components: { Timeinterval },
props: {},
data() {
return {
loading: false,
view: false,
form: {},
jcname: "",
options: [
{
id: 0,
name: "投运",
},
{
id: 2,
name: "停运",
},
{
id: 1,
name: "热备用",
},
],
uploadInformation: false,
dialogVisible: false,
headers: {
Authorization: window.sessionStorage.getItem("cntoken"),
},
fileList: [],
value: "",
formData: {
lineGrade: "", //终端等级
comFlag: "",
searchValue: "",
pageNum: 1,
pageSize: 20,
},
scoreForm: {
communFeeMark: "",
serviceMark: "",
agentMark: "",
companyMark: "",
userMark: "",
lineTypeMark: "",
businessMark: "",
assetBelong: "",
},
tableData: [{}],
devLevel: [],
total: undefined,
vh: null,
};
},
created() {
this.getclassificationData();
},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.onSubmit();
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem("appheight") - 95;
},
//获取类型
getclassificationData() {
//监测点等级
this.devLevel = dicData("Dev_Level", []);
},
//查询
onSubmit() {
this.loading = true;
this.formData.pageNum = 1;
api.LineWeightList(this.formData).then((res) => {
this.tableData = res.data.records;
this.total = res.data.total;
this.loading = false;
});
},
onSubmit1() {
this.loading = true;
api.LineWeightList(this.formData).then((res) => {
this.tableData = res.data.records;
this.total = res.data.total;
this.loading = false;
});
},
// 数据过滤
formFilter(row, column) {
if (row.column.property == "lineGrade") {
let title = "";
this.devLevel.forEach((item) => {
if (item.id == row.row.lineGrade) {
title = item.name;
}
});
return title;
} else {
return row.row[row.column.property];
}
},
// 评分
score(val) {
this.dialogVisible = true;
this.scoreForm = val;
this.scoreForm.lineIndex = val.lineIndex;
},
//评分确定
queryFn() {
this.$confirm("是否确认修改?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
api.addLineWeight(this.scoreForm).then((res) => {
if (res.code == "A0000") {
this.$message({
message: res.message,
type: "success",
});
}
this.dialogVisible = false;
this.onSubmit();
});
})
.catch(() => {
this.$message({
type: "info",
message: "已取消修改",
});
});
},
//批量导出监测点评分权重
batchImport() {
this.uploadInformation = true;
},
//导入确定
uploadFn() {
let fileName = this.fileList[0].name
let pos = fileName.lastIndexOf('.')
let includes = fileName.substring(pos, fileName.length)
console.log(includes)
let fileLastArr = [".doc",".docx",".xls",".xlsx",".pdf",".txt"]
if (!fileLastArr.includes(includes)) {
this.$message.error('当前不支持该格式文件')
return false;
}
this.$confirm("是否确认导入?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
const formData = new FormData();
this.fileList.forEach((item) => {
// console.log(item);
if (item.raw == "") {
} else {
formData.append("file", item.raw);
}
});
api.batchWeight(formData).then((res) => {
if (res.code == "A0000") {
this.$message({
message: res.message,
type: "success",
});
this.uploadInformation = false;
this.$refs.upload.clearFiles();
this.onSubmit();
}
});
})
.catch(() => {
this.$message({
type: "info",
message: "已取消导入",
});
});
},
handleChange(file, fileList) {
// console.log(file, fileList);
this.fileList = fileList;
},
handleExceed(files, fileList) {
this.$message.warning(
`当前限制选择 1个文件,本次选择了 ${files.length} 个文件,共选择了 ${
files.length + fileList.length
} 个文件`
);
},
//每页条数改变时触发 选择一页显示多少行
handleSizeChange(val) {
this.formData.pageSize = val;
this.onSubmit1();
},
//当前页改变时触发 跳转其他页
handleCurrentChange(val) {
this.formData.pageNum = val;
this.onSubmit1();
},
//模板导出
TemplateExport() {
api.export().then((res) => {
let blob = new Blob([res], {
type: "application/vnd.ms-excel",
});
const url = window.URL.createObjectURL(blob);
const link = document.createElement("a"); // 创建a标签
link.href = url; // link.download = "电压暂降事件分析报告"; // 设置下载的文件名
link.download = "监测点评分权重模板.csv"; // 设置下载的文件名
document.body.appendChild(link);
link.click(); //执行下载
document.body.removeChild(link);
});
},
//导出
exportEvent() {
api
.LineWeightList({
lineGrade: this.formData.lineGrade,
comFlag: this.formData.comFlag,
searchValue: this.formData.searchValue,
pageNum: 1,
pageSize: this.total,
})
.then((res) => {
res.data.records.forEach(item=>{
if(item.runFlag == '0'){
item.runFlag = '投运'
}else if(item.runFlag == '1'){
item.runFlag = '热备用'
}else if(item.runFlag == '2'){
item.runFlag = '停运'
}
})
this.$refs.powerweight.exportData({
filename: "监测点权重信息", // 文件名字
sheetName: "Sheet1",
type: "xlsx", //导出文件类型 xlsx 和 csv
useStyle: true,
data: res.data.records, // 数据源 // 过滤那个字段导出
columnFilterMethod: function (column, $columnIndex) {
return !(column.$columnIndex === 0 || column.$columnIndex === 16 );
},
});
});
},
},
computed: {},
watch: {},
};
</script>
<style lang="less" scoped>
@import url("../../../styles/comStyle.less");
.xiaoshou {
cursor: pointer;
}
</style>

File diff suppressed because it is too large Load Diff