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,255 @@
<template>
<div class="pd10" v-loading="loading" element-loading-text="数据加载中">
<el-form :inline="true" :model="formInline" class="demo-form-inline">
<el-form-item label="推送状态:">
<el-select v-model="formInline.result" placeholder="请选择推送状态">
<el-option
v-for="item in teriminaloption"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="筛选数据:">
<el-input
v-model="formInline.searchValue"
placeholder="请输入要筛选的字段"
></el-input>
</el-form-item>
<el-form-item>
<Timeinterval ref="Timeinterval" :interval="2"></Timeinterval
></el-form-item>
<el-form-item>
<el-button type="primary" @click="queryData" icon="el-icon-search"
>查询</el-button
>
</el-form-item>
</el-form>
<el-row>
<el-table
stripe
header-cell-class-name="table_header"
:data="tableData"
border
style="width: 100%"
highlight-current-row
:height="vh + 'px'"
>
<!-- <el-table-column
align="center"
prop="xh"
label="序号"
width="80"
></el-table-column> -->
<el-table-column
align="center"
prop="time"
label="暂降时间"
width="220"
></el-table-column>
<el-table-column
align="center"
prop="powerCompany"
label="供电公司"
width="220"
></el-table-column>
<el-table-column
align="center"
prop="substation"
label="变电站名称"
width="220"
></el-table-column>
<el-table-column
align="center"
prop="line"
label="监测点名称"
width="220"
></el-table-column>
<el-table-column
align="center"
prop="eventValue"
label="特征幅值(%)"
width="220"
></el-table-column>
<el-table-column
align="center"
prop="persistTime"
label="持续时间(s)"
width="220"
></el-table-column>
<el-table-column
align="center"
prop="creatTime"
label="首次推送时间"
width="220"
></el-table-column>
<el-table-column
align="center"
prop="creatTimed"
label="推送成功时间"
width="220"
></el-table-column>
<el-table-column
align="center"
prop="pushFailed"
label="推送失败次数"
width="220"
></el-table-column>
<el-table-column
align="center"
prop="result"
label="推送结果"
width="220"
></el-table-column>
<el-table-column
align="center"
prop="updateTime"
label="人工推送时间"
width="220"
></el-table-column>
<el-table-column align="center" fixed="right" label="操作" width="150">
<template slot-scope="scope">
<el-button
v-if="scope.row.state !== '成功'"
type="primary"
size="mini"
>推送</el-button
>
<el-button
v-if="scope.row.state == '成功'"
type="primary"
disabled
size="mini"
>已推送</el-button
>
</template>
</el-table-column>
</el-table>
<el-pagination
background
class="mt10"
align="right"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="formInline.pageNum"
:page-sizes="[20, 30, 40, 50, 100]"
:page-size="formInline.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
>
</el-pagination>
</el-row>
</div>
</template>
<script>
import Timeinterval from "@/views/components/TimePicker/index4";
import api from "@/api/device/log";
export default {
name: "suspensionlog",
components: {
Timeinterval,
},
data() {
return {
loading: true,
teriminaloption: [
{
name: "全部",
id: null,
},
{
name: "成功",
id: 1,
},
{
name: "失败",
id: 0,
},
],
vh: undefined,
formInline: {
searchValue: "",
result: '',
pageNum: 1,
pageSize: 20,
},
total: null,
height: "",
tableData: [],
};
},
created() {},
mounted() {
this.queryData();
this.setHeight()
window.addEventListener('resize', this.setHeight)
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem("appheight") - 96;
},
//查询列表
queryData() {
if(this.formInline.result !== '' || this.formInline.searchValue !== ''){
this.formInline.pageNum = 1
}
this.loading = true;
this.formInline.searchBeginTime = this.$refs.Timeinterval.timeValue[0];
this.formInline.searchEndTime = this.$refs.Timeinterval.timeValue[1];
api.getEventList(this.formInline).then((res) => {
if (res.code == "A0000") {
this.total = res.data.total;
this.tableData = res.data.records;
this.loading = false;
} else if ((res.data = null)) {
this.loading = false;
}
});
},
//分页查询用
queryData1() {
this.loading = true;
this.formInline.searchBeginTime = this.$refs.Timeinterval.timeValue[0];
this.formInline.searchEndTime = this.$refs.Timeinterval.timeValue[1];
api.getEventList(this.formInline).then((res) => {
if (res.code == "A0000") {
this.total = res.data.total;
this.tableData = res.data.records;
this.loading = false;
} else if ((res.data = null)) {
this.loading = false;
}
});
},
//每页条数改变时触发 选择一页显示多少行
handleSizeChange(val) {
this.formInline.pageSize = val;
this.queryData1();
},
//当前页改变时触发 跳转其他页
handleCurrentChange(val) {
this.formInline.pageNum = val;
this.queryData1();
},
},
};
</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;
}
// ::v-deep .table_header {
// height: 35px !important;
// }
</style>

View File

@@ -0,0 +1,206 @@
<template>
<div class="pd10" v-loading="loading" element-loading-text="数据加载中">
<el-form :inline="true" :model="formInline" class="demo-form-inline">
<el-form-item label="日志类型:">
<el-select
v-model="formInline.type"
placeholder="请选择日志类型"
clearable
>
<el-option
v-for="item in teriminaloption"
:key="item.code"
:label="item.name"
:value="item.code"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="筛选数据:">
<el-input
v-model="formInline.searchValue"
placeholder="请输入筛选描述的字段"
clearable
></el-input>
</el-form-item>
<el-form-item>
<Timeinterval ref="Timeinterval" :interval="3"></Timeinterval
></el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="queryData"
>查询</el-button
>
</el-form-item>
</el-form>
<el-row>
<el-table
stripe
header-cell-class-name="table_header"
:data="tableData"
border
style="width: 100%"
highlight-current-row
:height="vh + 'px'"
:row-class-name="rowClassName"
>
<el-table-column align="center" prop="number" label="序号" width="80">
<template scope="scope">
<span>{{
(formInline.pageNum - 1) * formInline.pageSize + scope.$index + 1
}}</span>
</template></el-table-column
>
<el-table-column
align="center"
prop="type"
label="日志类型"
width="180"
></el-table-column>
<!-- <el-table-column
align="center"
prop="updateBy"
label="更新用户"
width="200"
></el-table-column> -->
<el-table-column
align="center"
prop="updateTime"
label="更新时间"
width="180"
>
<template slot-scope="scope">
<span> {{ scope.row.updateTime.replace("T", " ") }}</span>
</template>
</el-table-column>
<el-table-column
align="center"
prop="remark"
label="描述"
:show-overflow-tooltip="true"
></el-table-column>
</el-table>
<el-pagination
background
class="mt10"
align="right"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="formInline.pageNum"
:page-sizes="[20, 30, 40, 50, 100]"
:page-size="formInline.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
>
</el-pagination>
</el-row>
</div>
</template>
<script>
import Timeinterval from "@/views/components/TimePicker/index4";
import { dicData } from "@/assets/commjs/dictypeData";
import api from "@/api/device/log";
export default {
name: "operationlogs",
components: {
Timeinterval,
},
data() {
return {
loading: true,
teriminaloption: [],
vh: undefined,
height: "",
formInline: {
type: "",
searchValue: "",
searchBeginTime: "",
searchEndTime: "",
pageNum: 1,
pageSize: 20,
},
total: null,
tableData: [],
};
},
created() {},
mounted() {
this.getDevLog();
this.queryData();
this.setHeight()
window.addEventListener('resize', this.setHeight)
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem("appheight") - 96;
},
//获取所有日志类型
getDevLog() {
let code = "Dev_Ops";
this.teriminaloption = dicData(code, []);
},
//序号
rowClassName({ row, rowIndex }) {
row.number = rowIndex + 1;
},
//查询列表
queryData() {
if(this.formInline.type !== '' || this.formInline.searchValue !== ''){
this.formInline.pageNum = 1
}
this.loading = true;
this.formInline.searchBeginTime = this.$refs.Timeinterval.timeValue[0];
this.formInline.searchEndTime = this.$refs.Timeinterval.timeValue[1];
api.getListData(this.formInline).then((res) => {
if (res.code === "A0000") {
this.tableData = res.data;
this.total = this.tableData.length;
this.loading = false;
} else if (res.data == null) {
this.loading = false;
}
});
},
//分页查询用
queryData1() {
this.loading = true;
this.formInline.searchBeginTime = this.$refs.Timeinterval.timeValue[0];
this.formInline.searchEndTime = this.$refs.Timeinterval.timeValue[1];
api.getListData(this.formInline).then((res) => {
if (res.code === "A0000") {
this.tableData = res.data;
this.total = this.tableData.length;
this.loading = false;
} else if (res.data == null) {
this.loading = false;
}
});
},
//每页条数改变时触发 选择一页显示多少行
handleSizeChange(val) {
this.formInline.pageSize = val;
this.queryData1();
},
//当前页改变时触发 跳转其他页
handleCurrentChange(val) {
this.formInline.pageNum = val;
this.queryData1();
},
},
};
</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;
}
// ::v-deep .table_header {
// height: 35px !important;
// }
</style>

View File

@@ -0,0 +1,76 @@
l
<template>
<div class="pd10">
<el-tabs v-if="flag" v-model.trim="activeName" @tab-click="handleClick" type="border-card">
<el-tab-pane label="报告模板配置" name="first" :style="'height:' + vh + ';'">
<MonitoringPoint @send="takeOver" @flag="flag = false" v-if="activeName == 'first'" />
</el-tab-pane>
<!-- <el-tab-pane
label="区域报告"
name="second"
:style="'height:' + vh + ';'"
>
<Region @flag="flag=false" v-if="activeName=='second'"/>
</el-tab-pane> -->
</el-tabs>
<Administration v-else @flag="flag = true" :type="type"></Administration>
</div>
</template>
<script>
import MonitoringPoint from '../components/ReportTemplateCild/MonitoringPoint.vue'
import Region from '../components/ReportTemplateCild/region.vue'
import Administration from '../components/ReportTemplateCild/Administration.vue'
export default {
name: 'reportingmanager',
components: { MonitoringPoint, Region, Administration },
data() {
return {
flag: true,
vh: undefined,
activeName: 'first',
device: '',
type: ''
}
},
created() {},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.device = window.devicePixelRatio
this.vh = window.sessionStorage.getItem('appheight') - 70 + 'px'
},
handleClick(tab, event) {
// console.log(tab, event);
},
takeOver(data) {
// console.log(data);
this.type = data
}
}
}
</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;
}
.block {
position: absolute;
right: 10px;
bottom: 10px;
}
::v-deep ::-webkit-scrollbar {
width: 8px !important;
height: 14px;
}
</style>

View File

@@ -0,0 +1,400 @@
<template>
<div class="pd10">
<!-- 前置 -->
<el-row>
<el-col :span="12">
<el-form :inline="true" :model="formInline" class="demo-form-inline">
<el-form-item label="前置等级:">
<el-select
v-model="formInline.nodeGrade"
placeholder="请选择终端型号"
>
<el-option
v-for="item in fontdveoption"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="状态:">
<el-select
v-model="formInline.searchState"
placeholder="请选择终端状态"
>
<el-option
v-for="item in statusoption"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="query"
>查询</el-button
>
</el-form-item>
</el-form></el-col
>
<el-col :span="12">
<!-- <el-button
style="float: right; margin-right: 20px;"
type="primary"
icon="el-icon-check"
>导出</el-button
> -->
<el-button
style="float: right; margin-right: 20px"
type="primary"
size="small"
icon="el-icon-plus"
@click="add"
>新增
</el-button>
</el-col>
</el-row>
<el-table
stripe
:data="tableData"
border
:row-config="{ isCurrent: true, isHover: true }"
highlight-current-row
:height="vh + 'px'"
style="width: 100%"
v-loading="loading"
header-cell-class-name="table_header"
>
<el-table-column
align="center"
prop="name"
label="名称"
></el-table-column>
<el-table-column align="center" prop="ip" label="IP"></el-table-column>
<el-table-column align="center" prop="nodeGrade" label="等级">
<template slot-scope="scope">
<el-tag type="primary" v-if="scope.row.nodeGrade === 1">普通</el-tag>
<el-tag type="primary" v-if="scope.row.nodeGrade === 0"
>极重要</el-tag
>
<el-tag type="primary" v-if="scope.row.nodeGrade === 2">备用</el-tag>
</template>
</el-table-column>
<el-table-column
align="center"
prop="nodeDevNum"
label="最大监测点数量"
></el-table-column>
<el-table-column
align="center"
prop="sort"
label="排序"
></el-table-column>
<el-table-column align="center" prop="state" label="状态">
<template slot-scope="scope">
<el-tag type="primary" v-if="scope.row.state === 1">启用</el-tag>
<el-tag type="primary" v-if="scope.row.state === 0">未启用</el-tag>
</template>
</el-table-column>
<el-table-column
align="center"
prop="remark"
label="描述"
></el-table-column>
<el-table-column align="center" label="操作" width="200">
<template slot-scope="scope">
<el-button type="primary" size="mini" @click="edit(scope.row)" icon="el-icon-edit"
>修改</el-button
>
<el-button type="danger" size="mini" @click="Delete(scope.row)" icon="el-icon-delete"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<el-pagination
background
class="mt10"
align="right"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="formInline.pageNum"
:page-sizes="[20, 30, 40, 50, 100]"
:page-size="formInline.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
>
</el-pagination>
<!--新增-->
<el-dialog :close-on-click-modal="false"
:title="title"
:visible.sync="dialogVisible"
width="30%"
:before-close="handleClose"
>
<el-form ref="form" :model="formData" :rules="rules" label-width="110px">
<el-form-item label="名称:" prop="name">
<el-input
v-model="formData.name"
placeholder="请输入名称"
></el-input>
</el-form-item>
<el-form-item label="IP:" prop="ip" class="top">
<el-input
v-model="formData.ip"
placeholder="请输入Ip"
></el-input>
</el-form-item>
<el-form-item label="等级:" prop="nodeGrade" class="top">
<el-select
v-model="formData.nodeGrade"
placeholder="请选择等级"
style="width: 100%;"
>
<el-option
v-for="item in fontdveoptionForm"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="最大装置数:" prop="nodeDevNum" class="top">
<el-input
v-model="formData.nodeDevNum"
onkeyup="value = value.replace(/[^0-9]/g,'')"
maxlength="5"
placeholder="请输入最大装置数"
></el-input>
</el-form-item>
<el-form-item label="排序:" prop="sort" class="top">
<el-input
v-model="formData.sort"
placeholder="请输入排序"
></el-input>
</el-form-item>
<el-form-item label="描述:" prop="remark" class="top">
<el-input
v-model="formData.remark"
placeholder="请输入描述"
></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="handleClose"> </el-button>
<el-button type="primary" @click="submit"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import node from "@/api/device/node";
export default {
name: "premage",
data() {
return {
dialogVisible: false,
loading: true,
vh: undefined,
formInline: {
nodeGrade: "",
searchState: "",
pageNum: 1,
pageSize: 20,
},
title: "",
total: 2,
fontdve: "",
fontdveoption: [
{ id: "", name: "全部" },
{ id: 0, name: "极重要" },
{ id: 1, name: "普通" },
{ id: 2, name: "备用" },
],
fontdveoptionForm: [
{ id: 0, name: "极重要" },
{ id: 1, name: "普通" },
{ id: 2, name: "备用" },
],
status: "",
statusoption: [
{ id: "", name: "全部" },
{ id: 0, name: "未启用" },
{ id: 1, name: "启用" },
],
// //分页
// pageData: {
// currentPage: 1,
// pagesize: 20,
// total: 0,
// },
operaType: 0, //0新增 1 修改 2 查看
formData: {},
//列表
tableData: [],
rules:{
name:[{ required: true, message: "名称不可为空", trigger: "blur" }],
ip:[{ required: true, message: "ip不可为空", trigger: "blur" }],
nodeGrade:[{ required: true, message: "等级不可为空", trigger: "blur" }],
nodeDevNum:[{ required: true, message: "最大装置数不可为空", trigger: "blur" }],
sort:[{ required: true, message: "排序不可为空", trigger: "blur" }],
remark:[{ required: true, message: "描述不可为空", trigger: "blur" }],
}
};
},
created() {},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.query();
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem("appheight") - 96;
},
// 表单重置
resetForm() {
if (this.$refs["form"]) {
this.$refs["form"].resetFields();
}
},
//每页条数改变时触发 选择一页显示多少行
handleSizeChange(val) {
this.formInline.pageSize = val;
this.query();
},
//当前页改变时触发 跳转其他页
handleCurrentChange(val) {
this.formInline.pageNum = val;
this.query();
},
//新增
add() {
this.formData = {};
this.dialogVisible = true;
this.operaType = 0;
this.title = "新增前置机";
},
//关闭
handleClose() {
this.dialogVisible = false;
this.resetForm()
},
//修改
edit(row) {
this.dialogVisible = true;
this.operaType = 1;
this.title = row.name + "修改";
this.getOne(row.id);
},
//删除
Delete(row) {
this.$confirm("是否确认删除?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
node.delete(row.id).then((response) => {
if (response.code === "A0000") {
this.$message({
type: "success",
message: "删除成功!",
});
this.query();
}
});
})
.catch(() => {
this.$message({
type: "info",
message: "已取消删除",
});
});
},
//获取主界面列表
query() {
this.loading = true;
node.getList(this.formInline).then((response) => {
if (response.code === "A0000") {
let res = response.data;
this.formInline.currentPage = res.current;
this.formInline.pagesize = res.size;
this.total = res.total;
this.tableData = res.records;
}
});
this.loading = false;
},
//获取单个前置机详情
getOne(id) {
node.getOne(id).then((response) => {
if (response.code === "A0000") {
this.formData = response.data;
}
});
},
//提交
submit() {
this.$confirm("是否确认操作?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
if (this.operaType === 0) {
node.add(this.formData).then((response) => {
if (response.code === "A0000") {
this.$message({
type: "success",
message: "新增成功!",
});
this.dialogVisible = false;
this.query();
}
});
} else {
//修改
node.update(this.formData).then((response) => {
if (response.code === "A0000") {
this.$message({
type: "success",
message: "修改成功!",
});
this.dialogVisible = false;
this.query();
}
});
}
});
},
},
};
</script>
<style lang="less" scoped>
@import url("../../../styles/comStyle.less");
// /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,673 @@
<template>
<div>
<el-container id="dept" v-show="view1">
<el-aside v-show="view" width="300px" id="drag-dept-left">
<muentree
@eleMenuData="getTreeText"
@chushiData="chushiData"
:number="number"
:tablename="tablename"
ref="commonTree"
></muentree>
</el-aside>
<div id="drag-dept">
<el-tooltip
class="item"
effect="dark"
:content="view ? '收缩' : '展开'"
placement="top-start"
>
<i
:class="view ? 'el-icon-caret-left' : 'el-icon-caret-right'"
style="
font-size: 18px;
z-index: 2000;
cursor: pointer;
margin-right: 0px;
width: 30px;
height: 30px;
background: rgba(6, 70, 122, 0);
"
@click="changeview"
></i>
</el-tooltip>
</div>
<el-main
id="drag-dept-right"
class="pd10"
v-loading="loading"
style="padding-left: 5px"
element-loading-text="数据加载中"
>
<div class="wzhixx" v-show="falg">
<div>
<div style="float: left; margin-top: -2px">
<i
style="color: #339966; font-size: 20px"
class="el-icon-location-information"
></i>
<span style="color: #000">当前位置:</span>
</div>
<div style="height: auto; overflow: hidden">
<p class="zt animate h3">
<!-- {{ treenode!=undefined?treenode.parent.parent.parent.parent.data.name +`>` +treenode.parent.parent.parent.data.name +`>` +treenode.parent.parent.data.name +`>` +treenode.parent.data.name+`>` +treenode.data.name:wezhiname}} -->
{{
treenode != undefined
? treenode.parent.parent.parent.data.name +
`>` +
treenode.parent.parent.data.name +
`>` +
treenode.parent.data.name +
`>` +
treenode.data.name
: wezhiname
}}
</p>
</div>
</div>
</div>
<el-tabs
v-model="activeName"
type="border-card"
@tab-click="handleClick"
:style="'width: 100%; transform: translateX(0px);height:' + vh"
>
<el-tab-pane
v-for="(item, index) in tabsData"
:label="item.label"
:key="item.id"
:name="item.id"
:index="index"
:lazy="true"
>
<el-row v-if="item.id === 'dzgl'">
<el-col>
<div style="float: right">
<el-button type="primary" class="el-icon-edit"
>修改定值</el-button
>
<el-button type="primary" class="el-icon-edit"
>下发定值</el-button
>
<el-button type="primary">获取外部定值描述</el-button>
<el-button type="primary">校验外部定值</el-button>
<el-button type="primary">获取内部定值描述</el-button>
<el-button type="primary">校验内部定值</el-button>
</div>
<div style="clear: both"></div>
<div class="mt10">
<el-radio-group v-model="radio1">
<el-radio-button label="1">基本定值</el-radio-button>
<el-radio-button label="2">谐波电流</el-radio-button>
<el-radio-button label="3">谐波电压</el-radio-button>
<el-radio-button label="4">间歇波定值</el-radio-button>
</el-radio-group>
</div>
<el-table
stripe
:data="constantValueData"
:height="vh1"
border
class="mt10 table"
style="width: 100%"
header-cell-class-name="table_header"
:header-cell-style="{
height: '25px',
padding: '0px',
}"
:row-style="{ height: '35px' }"
:cell-style="{ padding: '0px' }"
:row-class-name="rowClassName"
>
<el-table-column
prop="number"
align="center"
label="序号"
min-width="50"
></el-table-column>
<el-table-column
align="center"
prop="name"
label="定值名称"
></el-table-column>
<el-table-column
align="center"
prop="current"
label="当前定值"
display="none"
>
<template slot-scope="scope">
<el-input
min="0"
size="mini"
v-model="scope.row.modify"
></el-input>
</template>
</el-table-column>
<el-table-column
align="center"
prop="modify"
label="修改定值"
display="none"
>
<template slot-scope="scope">
<el-input
min="0"
size="mini"
v-model="scope.row.modify"
></el-input>
</template>
</el-table-column>
<el-table-column
align="center"
prop="upDataTime"
label="定值范围"
></el-table-column>
</el-table>
</el-col>
</el-row>
<el-row v-if="item.id === 'wjgl'">
<el-col>
<div class="BOX">
<span style="display: inline-block; width: 300px"
>前置IP:</span
>
<span>终端路径:</span>
</div>
<el-row :gutter="20" class="mt10">
<el-col :span="12">
<span class="BOX1">服务器目录</span>
<el-form ref="form" inline style="float: right">
<el-form-item>
<el-button
size="small"
type="primary"
icon="el-icon-download"
>本地上传</el-button
>
<el-button
size="small"
type="primary"
icon="el-icon-download"
>批量上传终端</el-button
>
</el-form-item>
</el-form>
<el-table
stripe
:data="managementData"
:height="vh2"
border
style="width: 100%"
header-cell-class-name="table_header"
:header-cell-style="{
height: '25px',
padding: '0px',
}"
:row-style="{ height: '28px' }"
:cell-style="{ padding: '0px' }"
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
align="center"
min-width="50"
></el-table-column>
<el-table-column
align="center"
prop="userName"
label="名称"
></el-table-column>
<el-table-column
align="center"
prop="endTime"
label="类型"
></el-table-column>
<el-table-column
align="center"
prop="upDataTime"
label="大小"
></el-table-column>
<el-table-column
align="center"
prop="upDataTime"
label="操作"
></el-table-column>
</el-table>
</el-col>
<el-col :span="12">
<span class="BOX1">终端目录</span>
<el-form ref="form" inline style="float: right">
<el-form-item>
<el-button
size="small"
type="primary"
icon="el-icon-s-home"
>返回根路径</el-button
>
<el-button
size="small"
type="primary"
icon="el-icon-top"
>返回上级</el-button
>
<el-button
size="small"
type="primary"
icon="el-icon-refresh"
>刷新</el-button
>
<el-button
size="small"
type="primary"
icon="el-icon-download"
>批量下载</el-button
>
</el-form-item>
</el-form>
</el-col>
</el-row>
</el-col>
</el-row>
</el-tab-pane>
</el-tabs>
</el-main>
</el-container>
<el-dialog
:close-on-click-modal="false"
title="装置型号选择"
:visible.sync="Devicemodel"
width="20%"
>
<el-table
stripe
:data="DevicemodelData"
:height="vh3"
border
style="width: 100%"
header-cell-class-name="table_header"
:header-cell-style="{
height: '25px',
padding: '0px',
}"
:row-style="{ height: '28px' }"
:cell-style="{ padding: '0px' }"
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
align="center"
min-width="50"
></el-table-column>
<el-table-column
align="center"
prop="desc"
label="控制字描述"
></el-table-column>
</el-table>
<span slot="footer" class="dialog-footer">
<el-button type="primary">确定</el-button>
<el-button type="primary" @click="Devicemodel = false"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import Muentree from "@/views/components/menuTree/el-tree";
// import api from "@/api/harmonic/onlineData";
export default {
name: "nowmonitoring",
components: {
Muentree,
},
watch: {
treenode(a, b) {
if (a) {
this.falg = true;
this.falg1 = false;
}
},
},
data() {
return {
boxoList: {},
wp: {},
Devicemodel: true,
view1: true,
view2: false,
value: 1,
loading: false,
treenode: undefined,
tablename: 1,
vh: null,
vh1: null,
vh2: null,
vh3: null,
number: undefined,
modifyData: "",
id: "",
radio1: "1",
asideheight: undefined,
timeValue: undefined,
screenWidth: undefined,
screenHeight: undefined,
activeName: "dzgl",
//title:'',
falg: true,
falg1: true,
view: true,
dataTree: [],
tabsData: [
{
label: "定值管理",
id: "dzgl",
},
{
label: "文件管理",
id: "wjgl",
},
],
treenode: undefined,
linelist: [],
treedata: [],
constantValueData: [{ name: "123", modify: "123" }],
DevicemodelData: [{ desc: "电压偏差越限功能退出", }],
managementData: [],
deptIndex: "",
wezhiname: null,
ptType: 0,
};
},
created() {},
mounted() {
var info = window.sessionStorage.getItem("Info");
info = eval("(" + info + ")");
this.deptIndex = info.deptId;
this.bindResize();
this.setHeight()
window.addEventListener('resize', this.setHeight)
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem("appheight") - 10 + "px";
this.vh1 = window.sessionStorage.getItem("appheight") - 156 + "px";
this.vh2 = window.sessionStorage.getItem("appheight") - 150 + "px";
this.vh3 = window.sessionStorage.getItem("appheight") - 250 + "px";
},
changeview() {
if (this.view) {
this.view = false;
} else {
this.view = true;
}
},
handleClick(tab, event) {
this.checkbox = false;
//this.falg = false;
},
//序号
rowClassName({ row, rowIndex }) {
row.number = rowIndex + 1;
},
//复选框
handleSelectionChange(val) {
//console.log(val);
this.multipleSelection = val;
},
/**
* 缩放条拖动进而改变左侧div宽度方法
*/
bindResize() {
/**开始坐标 */
let startX;
/**开始宽度 */
let startWidth = getScalableDivWidth();
document
.querySelector("#drag-dept")
.addEventListener("mousedown", startDrag);
function startDrag(e) {
startX = e.clientX;
startWidth = getScalableDivWidth();
document.documentElement.addEventListener("mousemove", onDrag);
document.documentElement.addEventListener("mouseup", stopDrag);
}
function onDrag(e) {
let newWidth = startWidth + e.clientX - startX;
document.querySelector("#drag-dept-left").style.width = newWidth + "px";
}
function stopDrag() {
document.documentElement.removeEventListener("mousemove", onDrag);
document.documentElement.removeEventListener("mouseup", stopDrag);
}
/**获取宽度 */
function getScalableDivWidth() {
return parseInt(
window.getComputedStyle(document.querySelector("#drag-dept-left"))
.width,
10
);
}
},
//初始化树节点默认点击
chushiData(id, data) {
this.id = id;
window.sessionStorage.setItem("nodeid", id);
this.linelist.push(id);
this.treedata = data;
this.wezhiname =
data[0].children[0].name +
">" +
data[0].children[0].children[0].name +
">" +
data[0].children[0].children[0].children[0].name +
">" +
data[0].children[0].children[0].children[0].children[0].name;
},
//二次点击触发点击事件
getTreeText(menudata, treenode, nodeCom, id) {
// console.log(menudata, treenode, nodeCom, id);
if (treenode.data.level == 6) {
// console.log('点击',treenode,nodeCom,menudata)
// console.log('数据',menudata.ptType)
// this.ptType = menudata.ptType;
// this.menudata = menudata;
this.treenode = treenode;
this.id = id;
this.linelist = [];
this.linelist.push(id);
} else {
return;
}
},
//获取5层树
fiveTreeData() {
var data = {
deptIndex: this.deptIndex,
monitorFlag: 2,
powerFlag: 2,
loadType: null,
manufacturer: null,
serverName: "harmonic-boot",
statisticalType: "",
scale: null,
};
api.getTerminalTreeForFive(data).then((res) => {
if (res.code === "A0000") {
res.data.forEach((m) => {
m.icon = "el-icon-s-data";
m.children.forEach((n) => {
n.icon = "el-icon-delete";
n.children.forEach((d) => {
d.icon = "el-icon-user";
d.children.forEach((f) => {
f.icon = "el-icon-warning";
f.children.forEach((e) => {
e.icon = "el-icon-phone-outline";
});
});
});
});
});
this.treedata = res.data;
}
});
},
},
};
</script>
<style lang="scss" scoped>
::v-deep .el-dialog .el-dialog__body {
max-height: 100vh;
min-height: 150px;
padding: 10px;
overflow-y: auto;
}
::v-deep .el-table__header-wrapper .el-checkbox {
// display: none;//设置不成功,页面卡顿
visibility: hidden;
}
.BOX {
height: 24px;
// padding: 0 40px 0 20px;
overflow: hidden;
font-size: 18px;
font-weight: 700;
line-height: 24px;
color: #003078;
}
.BOX1 {
height: 24px;
// padding: 0 40px 0 20px;
overflow: hidden;
font-size: 18px;
font-weight: 700;
line-height: 42px;
color: #003078;
}
::v-deep.wzhixx {
position: fixed;
width: 400px;
z-index: 1;
font-size: 14px;
font-weight: 550;
margin-top: 10px;
right: 15px;
}
// ::v-deep.boxd {
// height: auto;
// overflow: hidden;
// } //自适应高度
::v-deep .table {
.el-input {
width: 150px;
}
}
::v-deep.animate {
padding-left: 20px;
font-size: 12px;
color: #000;
display: inline-block;
white-space: nowrap;
animation: 10s wordsLoop linear infinite normal;
}
::v-deep .el-radio-button--small .el-radio-button__inner {
width: 342px;
}
@keyframes wordsLoop {
0% {
transform: translateX(100%);
-webkit-transform: translateX(100%);
}
100% {
transform: translateX(-100%);
-webkit-transform: translateX(-100%);
}
}
@-webkit-keyframes wordsLoop {
0% {
transform: translateX(100%);
-webkit-transform: translateX(100%);
}
100% {
transform: translateX(-100%);
-webkit-transform: translateX(-100%);
}
}
::v-deep.zt {
color: $themeColor;
}
</style>
<style lang="less" scoped>
@import url("../../../styles/comStyle.less");
::v-deep .el-tabs--border-card > .el-tabs__content {
padding: 10px;
}
#drag-dept-left {
min-width: 220px;
max-width: 35%;
}
::v-deep .el-aside {
overflow: hidden !important;
-webkit-box-sizing: border-box;
box-sizing: border-box;
-ms-flex-negative: 0;
flex-shrink: 0;
}
/**拖拽条样式 */
#drag-dept {
display: flex;
justify-content: center;
align-items: center;
position: relative;
top: 10;
right: 0;
width: 5px;
background: #868788;
background-color: #04607c2a;
box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.35);
cursor: col-resize;
}
#drag-dept i {
display: inline-block;
height: 14px;
width: 5px;
background-color: #e9e9e9;
margin: 0 1px;
}
::v-deep .el-table--scrollable-x .el-table__body-wrapper {
overflow-x: auto;
cursor: pointer;
}
::v-deep .el-tabs__nav {
white-space: nowrap;
width: 100%;
position: relative;
-webkit-transition: -webkit-transform 0.3s;
transition: -webkit-transform 0.3s;
transition: transform 0.3s;
transition: transform 0.3s, -webkit-transform 0.3s;
transition: transform 0.3s, -webkit-transform 0.3s;
float: left;
z-index: 2;
}
</style>

View File

@@ -0,0 +1,844 @@
<template>
<!-- 使用 useVirtual 属性开启虚拟滚动 使用虚拟滚动时必须要固定表格高度和行高 -->
<div class="pd10">
<!-- 程序升级管理 -->
<el-form :inline="true" :model="formInline" class="demo-form-inline">
<el-form-item label="终端型号:">
<el-select v-model="formInline.teriminal" placeholder="请选择终端型号">
<el-option
v-for="item in teriminaloption"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="终端状态:">
<el-select
v-model="formInline.teriminalstatus"
placeholder="请选择终端状态"
>
<el-option
v-for="item in teriminalstatusoption"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="通讯状态:">
<el-select v-model="formInline.state" placeholder="请选择通讯状态">
<el-option
v-for="item in stateoption"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="程序版本:">
<el-select v-model="formInline.program" placeholder="请选择程序版本">
<el-option
v-for="item in programoption"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="getList"
>查询</el-button
>
<el-button type="primary" icon="el-icon-download">导出</el-button>
<el-button type="primary" icon="el-icon-check">批量升级</el-button>
<!-- <el-button @click="$refs.plTreeTable.setAllTreeExpansion()"
>展开全部</el-button
> -->
<!-- <el-button @click="$refs.plTreeTable.clearTreeExpand()"
>关闭所有</el-button
> -->
</el-form-item>
<el-form-item label="筛选:">
<el-input v-model="formInline.search" placeholder="输入关键字筛选" />
</el-form-item>
</el-form>
<!--我是pl-table大数据树形表格 必须指定 row-key 必须开启use-virtual-->
<!-- <div :style="`height:${vh}px; overflow: hidden;`"> -->
<!-- <el-input v-model="ssbsearch" @input="filert" clearable @clear="clear" size="" placeholder="根据省级,市区,变电站进线筛选" style="width:30%;margin-left:20px"></el-input> -->
<u-table
stripe
ref="plTreeTable"
header-cell-class-name="table_header"
highlight-current-row
element-loading-text="数据加载中"
fixed-columns-roll
:data="treeTable"
:row-height="rowHeight"
:height="vh"
:treeConfig="{
children: 'children',
iconClose: 'el-icon-arrow-right',
iconOpen: 'el-icon-arrow-down',
expandAll: true,
}"
v-loading="loading"
@toggle-trand="toggleTreeExpand"
use-virtual
row-id="id"
:row-config="{ isCurrent: true, isHover: true }"
border
>
<!-- beautify-table
header-drag-style -->
<!--u-table大数据表格 你需要在列上指定某个列显示展开收起 treeNode属性-->
<u-table-column
prop="name"
label="电网拓扑"
:treeNode="true"
min-width="150"
:showOverflowTooltip="true"
:show-overflow-tooltip="true"
></u-table-column>
<u-table-column
prop="devType"
label="终端型号"
align="center"
:formatter="formFilter"
:showOverflowTooltip="true"
:show-overflow-tooltip="true"
></u-table-column>
<u-table-column
prop="versionName"
label="版本号"
align="center"
></u-table-column>
<u-table-column
prop="protocol"
label="协议版本"
align="center"
></u-table-column>
<u-table-column
prop="versionDate"
label="版本日期"
align="center"
></u-table-column>
<u-table-column prop="runFlag" label="终端状态" align="center">
<template slot-scope="scope">
<el-tag
type="primary"
v-if="scope.row.runFlag === 0"
style="color: #fff; background: #0099cc"
size="small"
>投运</el-tag
>
<el-tag
type="primary"
v-if="scope.row.runFlag === 1"
style="color: #fff; background: #996600"
size="small"
>热备用</el-tag
>
<el-tag
type="primary"
v-if="scope.row.runFlag === 2"
style="color: #fff; background: #cc0000"
size="small"
>停运</el-tag
>
</template>
</u-table-column>
<u-table-column prop="comFlag" label="通讯状态" align="center">
<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>
</u-table-column>
<u-table-column
prop="updateUser"
label="升级人员"
align="center"
>
<template slot-scope="scope">
<!-- <span>{{ scope.row.updateBy!==null? scope.row.updateBy:'--'}}</span> -->
<span v-if="scope.row.updateBy==null">--</span>
<span v-if="scope.row.updateBy='/'">--</span>
<!-- <span v-if="scope.row.updateBy !==null">{{ scope.row.updateBy }}</span> -->
</template>
</u-table-column>
<u-table-column
prop="updateTime"
label="最新升级时间"
align="center"
></u-table-column>
<u-table-column align="center" width="220" label="操作">
<template slot-scope="scope">
<el-button
v-if="scope.row.level == 4"
type="primary"
size="mini" icon="el-icon-finished"
@click="updateprogram(scope.row)"
>升级</el-button
>
<el-button
v-if="scope.row.level == 4"
:disabled="scope.row.state == 1 ? true : false"
type="primary"
size="mini" icon="el-icon-view"
@click="queryview(scope.row)"
>日志查看</el-button
>
</template>
</u-table-column>
<!-- <u-table-column align="center"
v-for="item in columns"
:key="item.id"
:prop="item.prop"
:label="item.label"
:min-width="item.width"/>-->
</u-table>
<!--升级日志查看-->
<el-dialog
:close-on-click-modal="false"
:title="title + '#终端升级日志查看'"
:visible.sync="dialogVisible"
width="70%"
class="eldialot"
:before-close="handleClose"
>
<el-table
stripe
:data="logtableData"
header-cell-class-name="table_header"
border
:height="height"
style="width: 100%"
highlight-current-row
>
<el-table-column
prop="devTypeName"
align="center"
label="装置序号"
></el-table-column>
<el-table-column
prop="versionId"
align="center"
label="版本序号"
></el-table-column>
<el-table-column
prop="flag"
align="center"
label="版本状态"
width="100"
>
<template slot-scope="scope">
<el-tag
type="primary"
v-if="scope.row.flag == true"
style="color: #fff; background: #fc0"
>前期版本</el-tag
>
<el-tag
type="primary"
v-if="scope.row.flag == false"
style="color: #fff; background: #0c0"
>当前版本</el-tag
>
</template>
</el-table-column>
<el-table-column
prop="result"
align="center"
label="升级结果"
width="100"
>
<template slot-scope="scope">
<el-tag
type="primary"
v-if="scope.row.result == false"
style="color: #fff; background: #f30"
>升级失败</el-tag
>
<el-tag
type="primary"
v-if="scope.row.result == true"
style="color: #fff; background: #093"
>升级成功</el-tag
>
</template>
</el-table-column>
<el-table-column prop="state" align="center" label="状态" width="100">
<template slot-scope="scope">
<el-tag
type="primary"
v-if="scope.row.state == false"
style="color: #fff; background: #f30"
>删除</el-tag
>
<el-tag
type="primary"
v-if="scope.row.state == true"
style="color: #fff; background: #093"
>正常</el-tag
>
</template>
</el-table-column>
<el-table-column
prop="createBy"
align="center"
label="创建用户"
></el-table-column>
<el-table-column
prop="createTime"
align="center"
label="创建时间"
></el-table-column>
<el-table-column
prop="updateTime"
align="center"
label="升级时间"
></el-table-column>
<el-table-column
prop="updateBy"
align="center"
label="升级人员"
>
</el-table-column>
</el-table>
</el-dialog>
<!--升级弹窗-->
<el-dialog
:close-on-click-modal="false"
:title="protitle + '#终端程序升级'"
:visible.sync="prodialogVisible"
width="40%"
:before-close="handleClose"
>
<el-col v-for="(item, index) in percentageoption" :key="index">
<span style="font-size: 14px; font-weight: bold">{{ item.name }}</span
>:
<el-progress
:text-inside="true"
:stroke-width="24"
:percentage="item.percentage"
:status="item.status"
:format="format"
></el-progress>
</el-col>
</el-dialog>
</div>
<!-- </div> -->
</template>
<script>
import version from "@/api/device/version.js";
import { dicData } from "@/assets/commjs/dictypeData";
// 下面是关于pl-table的树形数据的介绍希望读完下面的文字
// 最大数量500当然你可以更多那么只会导致你遍历时间多页面等待时间长并非渲染节点时间长
// 另外 就以下的这个层级,总数据量展开后,就是 500 + 500 x 3 + 3 x 1 = 2003 的总数据量
// 如果你 第一级是500 第二级也是500 第三级是10。 那么你的数据量就是 500 + 500 x 500 + 500 x 10 的总数据量,这是非常吓人的
// 所以结合自己情况去给树数据,不要瞎乱给下面的数据,树节点避免不鸟去递归,如果你的数据量很大很大,那么你会死在遍历上。
// 注意,注意注意并非第一级不能超过500是想告诉你们嵌套里面子节点层级数据量不要太大。比如你可这样的 第一级为1000 第二级为2-5的数据量
// 第三级为2-5的数据量.... 那么这样算下来,就是 1000 + 1000 x 5 + 5 x 5 = 6025的数据量应该是可以的但是记住要是太大的嵌套数据。那只会导致
// 程序卡在遍历数据上,因为程序需要慢慢去递归遍历。这是没有办法的。
// 但是传统el-table 或者el-tree他们数据量超过200 就会卡。 所以我们已经很好的优化了这一点。不过看来对于树形数据的要求,应该数据量不会太大。
// 你可以在pl-table的基础上去改改样式就可以变相的去实现el-tree的组件了哦你隐藏下头部把行的高度给小一点。然后隐形边框线。是不是就是el-tree了呢
var shuju = [];
export default {
name: "home",
data() {
return {
formInline: {},
title: "",
protitle: "",
ssbsearch: "",
rowHeight: 20,
search: "",
expandRow: [],
columns: [
// {
// id:'0',
// prop: "name",
// label: "电网拓扑",
// width: 120,
// treeNode: true,
// showOverflowTooltip: true,
// },
{
id: "1",
prop: "devType",
label: "终端型号",
width: 100,
showOverflowTooltip: true,
},
{
id: "2",
prop: "versionName",
label: "版本号",
width: 230,
showOverflowTooltip: true,
},
{
id: "3",
prop: "protocol",
label: "协议版本",
width: 100,
showOverflowTooltip: true,
},
{
id: "4",
prop: "versionDate",
label: "版本日期",
width: 100,
showOverflowTooltip: true,
},
{
id: "5",
prop: "runFlag",
label: "终端状态",
width: 100,
showOverflowTooltip: true,
},
{
id: "6",
prop: "comFlag",
label: "通讯状态",
width: 100,
showOverflowTooltip: true,
},
{
id: "7",
prop: "updateUser",
label: "升级人员",
width: 100,
showOverflowTooltip: true,
},
{
id: "8",
prop: "updateTime",
label: "最新升级时间",
width: 100,
showOverflowTooltip: true,
},
],
top: 0,
height: "",
vh: undefined,
pageForm: {
total: 1000,
pageSize: 10,
currentPage: 1,
},
tableData: shuju,
//终端型号
teriminal: "",
teriminaloption: [],
//终端状态
teriminalstatus: "",
teriminalstatusoption: [
{ name: "全部", id: "" },
{ name: "投运", id: 0 },
{ name: "热备用", id: 1 },
{ name: "停运", id: 2 },
],
//通讯状态
state: "",
stateoption: [
{ name: "全部", id: "" },
{ name: "正常", id: 1 },
{ name: "中断", id: 0 },
],
//程序版本
program: "",
programoption: [],
//弹窗列表
logtableData: [],
status: "",
//进度条对象
percentageoption: [
{
name: "1号测试终端",
status: "exception",
percentage: 20,
},
{
name: "2号测试终端",
status: "warning",
percentage: 50,
},
{
name: "3号测试终端",
status: "success",
percentage: 90,
},
],
loading: false,
dialogVisible: false,
prodialogVisible: false,
};
},
computed: {
treeTable: function () {
var searchValue = this.formInline.search;
if (searchValue) {
// 一般表格的查询
// return this.tableData.filter(function(dataNews){
// return Object.keys(dataNews).some(function(key){
// return String(dataNews[key]).toLowerCase().indexOf(search) > -1
// })
// }
let treeData = this.tableData;
let handleTreeData = this.handleTreeData(treeData, searchValue);
this.setExpandRow(handleTreeData);
this.expandRow = this.expandRow.join(",").split(",");
return handleTreeData;
}
return this.tableData;
},
},
created() {
this.getDevType();
this.getList();
},
mounted() {
// 设置表格数据
// this.$nextTick(() => {
this.setHeight()
window.addEventListener('resize', this.setHeight)
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem("appheight") - 55;
this.height = window.sessionStorage.getItem("appheight") - 230;
},
formFilter(row, column) {
///console.log("++++++++++++++++++++++++=",row)
let title = ''
dicData("Dev_Type", []).forEach((item) => {
if(row.devType != null ){
if (item.id == row.devType) {
title = item.name;
}
}else{
title = '/';
}
});
return title;
},
filterNode(value, data, node) {
if (!value) {
return true;
}
let _array = []; //这里使用数组存储 只是为了存储值。
this.getReturnNode(node, _array, value);
let result = false;
_array.forEach((item) => {
result = result || item;
});
return result;
},
getReturnNode(node, _array, value) {
let isPass =
node.data && node.data.name && node.data.name.indexOf(value) !== -1;
isPass ? _array.push(isPass) : "";
this.index++;
if (!isPass && node.name != 1 && node.parent) {
this.getReturnNode(node.parent, _array, value);
}
},
//获取所有终端型号
getDevType() {
var code = "Dev_Type";
this.teriminaloption = dicData(code, [], 1);
},
selectAll(val) {
// <!-- console.log(val); -->
},
selectable(row, index) {
if (index === 1) {
return false;
} else {
// console.log(row, index);
return true;
}
},
// 合计
summaryMethod({ columns, data }) {
// 平均值算法(不需要自己去掉)
function cacl(arr, callback) {
let ret;
for (let i = 0; i < arr.length; i++) {
ret = callback(arr[i], ret);
}
return ret;
}
// 平均值算法(不需要自己去掉)
Array.prototype.sum = function () {
return cacl(this, function (item, sum) {
if (typeof sum == "undefined") {
return item;
} else {
return (sum += item);
}
});
};
// 平均值算法(不需要自己去掉)
Array.prototype.avg = function () {
if (this.length == 0) {
return 0;
}
return this.sum(this) / this.length;
};
const means = []; // 合计
const fenceSums = []; // 平均值
columns.forEach((column, columnIndex) => {
if (columnIndex === 0) {
means.push("合计");
fenceSums.push("平均值");
} else {
const values = data.map((item) => Number(item[column.property]));
// 合计
if (!values.every((value) => isNaN(value))) {
means[columnIndex] = values.reduce((prev, curr) => {
const value = Number(curr);
if (!isNaN(value)) {
return prev + curr;
} else {
return prev;
}
}, 0);
// means[columnIndex] += ' 元'
// 改变了ele的合计方式扩展了合计场景
// 你以为就只有上面这样玩吗?错啦,你还可以自定义样式哦
// means[columnIndex] = '<span style="color: red">' + means[columnIndex] + '元</span>'
means[columnIndex] =
'<span style="color: red">' +
means[columnIndex] +
"元</span><br/><span>123</span>";
} else {
means[columnIndex] = "";
}
// 平均值
const precisions = [];
let notNumber = true;
values.forEach((value) => {
if (!isNaN(value)) {
notNumber = false;
let decimal = ("" + value).split(".")[1];
precisions.push(decimal ? decimal.length : 0);
}
});
if (!notNumber) {
fenceSums[columnIndex] = values.avg();
} else {
fenceSums[columnIndex] = "";
}
}
});
// 返回一个二维数组的表尾合计
return [means, fenceSums];
},
setHei(val) {
this.height = val;
},
tableBodyScroll({ scrollTop }) {
this.top = scrollTop;
},
allSelection() {
this.$refs.plTable.toggleAllSelection();
},
clearSelection() {
this.$refs.plTable.clearSelection();
this.$refs.plTable2.clearSelection();
},
setData(num) {
this.data.tableData = Array.from({ length: num }, (_, idx) => ({
id: idx + 1,
date: "2016-05-03",
name: 1,
ab: "欢迎使用pl-table",
address: 1 + idx,
}));
},
scrollBottom() {
this.$refs.plTable.scrollBottom();
},
pagingScrollTopLeft(val) {
this.$refs.plTable.pagingScrollTopLeft(val, 0);
},
// 分页事件
handlePageSize({ page, size }) {
// console.log(page, size);
},
// 获取已经展开的节点
getTreeExpansionEvent() {
// console.log(this.$refs.plTreeTable.getTreeExpandRecords());
},
// 树形表格过滤
handleTreeData(treeData, searchValue) {
// debugger
if (!treeData || treeData.length === 0) {
return [];
}
const array = [];
for (let i = 0; i < treeData.length; i += 1) {
let match = false;
for (let pro in treeData[i]) {
if (typeof treeData[i][pro] == "string") {
match = treeData[i][pro].includes(searchValue);
if (match) break;
}
}
if (
this.handleTreeData(treeData[i].children, searchValue).length > 0 ||
match
) {
array.push({
...treeData[i],
children: this.handleTreeData(treeData[i].children, searchValue),
});
}
}
return array;
},
toggleTreeExpand() {},
// 将过滤好的树形数据展开
setExpandRow(handleTreeData) {
if (handleTreeData.length) {
for (let i of handleTreeData) {
this.expandRow.push(i.id);
if (i.children.length) {
this.setExpandRow(i.children);
}
}
}
},
selected(row, index) {
if (row.level !== 4) {
return false; //不可勾选
} else {
return true; //可勾选
}
},
//日志查看
queryview(row) {
this.title = row.name;
this.dialogVisible = true;
let data = {
id: row.id,
};
version.getTerminalUpLog(data).then((res) => {
this.logtableData = res.data;
});
},
//关闭弹窗
handleClose() {
this.dialogVisible = false;
this.prodialogVisible = false;
},
//升级操作
updateprogram(row) {
this.protitle = row.name;
this.prodialogVisible = true;
},
format(percentage) {
if (percentage <= 100 && percentage >= 90) {
this.status = "success";
return percentage === 100 ? "升级成功" : `${percentage}%`;
} else if (percentage > 0 && percentage < 50) {
this.status = "exception";
return percentage <= 20
? "升级失败" + percentage + "%"
: `${percentage}%`;
} else if (percentage > 0 && percentage <= 50) {
this.status = "warning";
return percentage <= 50 ? "升级中断" : `${percentage}%`;
}
},
//批量操作
handleSelectionChange(val) {
// console.log(val);
},
//查看主列表
getList() {
let a = new Date().getTime();
let data = {
comFlag: this.formInline.state,
runFlag: this.formInline.teriminalstatus,
devType: this.formInline.teriminal,
version: this.formInline.program,
};
this.loading = true;
version.getList(data).then((response) => {
if (response.code === "A0000") {
this.filertData = JSON.parse(JSON.stringify(response.data));
this.treeData = JSON.parse(JSON.stringify(response.data));
this.treeData2 = JSON.parse(JSON.stringify(this.treeData));
this.treeData3 = JSON.parse(JSON.stringify(this.treeData));
this.treeData4 = JSON.parse(JSON.stringify(this.treeData));
var data = response.data;
this.tableData = data;
this.loading = false;
// this.$refs.plTreeTable.reloadData(data)
}
});
// this.tableData = response.data
},
},
};
</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;
}
::v-deep .el-select {
width: 150px;
}
// ::v-deep .plTableBox .el-table td,
// .plTableBox .el-table th.is-leaf {
// border: 1px solid #ece9e9;
// border-bottom: 1px solid #023630;
// }
// ::v-deep .plTableBox .el-table--small th {
// padding: 8px 0;
// border: 1px solid #012920;
// }
</style>
<style lang="scss" scoped>
</style>

View File

@@ -0,0 +1,547 @@
<template>
<div class="pd10">
<!-- 评分管理 -->
<el-form :inline="true" :model="formInline" class="demo-form-inline">
<el-form-item label="监测点:">
<el-select
v-model="formInline.lineGrade"
placeholder="请选择监测点等级"
>
<el-option
v-for="item in lineGradeList"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="通讯状态:">
<el-select v-model="formInline.comFlag" placeholder="请选择通讯状态">
<el-option
v-for="item in statusList"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="数据筛选:">
<el-input
v-model="formInline.searchValue"
placeholder="请选择筛选数据"
:clearable="true"
></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="query" icon="el-icon-search"
>查询</el-button
>
<el-button type="primary" @click="exportCsv" icon="el-icon-download"
>导出模板</el-button
>
<el-button type="primary" @click="exportData" icon="el-icon-download"
>导出</el-button
>
<!-- <el-button type="primary" @click="importData"
icon="el-icon-top" >批量导入监测点评级</el-button
> -->
</el-form-item>
<el-form-item>
<el-upload
class="upload-demo"
ref="upload"
action="#"
:http-request="upload"
:on-preview="handlePreview"
:on-remove="handleRemove"
:before-remove="beforeRemove"
:limit="1"
accept=".xlsx,.xls"
:on-exceed="handleExceed"
>
<el-button size="small" icon="el-icon-top" type="primary"
>批量导入监测点评级</el-button
>
</el-upload>
</el-form-item>
</el-form>
<el-row>
<el-table
stripe
v-loading="loading"
:data="tableData"
border
:height="vh"
style="width: 100%"
header-cell-class-name="table_header"
highlight-current-row
>
<el-table-column
align="center"
prop="index"
type="index"
label="序号"
width="70"
>
<template scope="scope">
<span>{{
(formInline.pageNum - 1) * formInline.pageSize + scope.$index + 1
}}</span>
</template>
</el-table-column>
<el-table-column
align="center"
prop="province"
label="省份"
></el-table-column>
<el-table-column
align="center"
prop="gdName"
label="供电公司"
></el-table-column>
<el-table-column
align="center"
prop="subName"
label="所属变电站"
:show-overflow-tooltip="true"
width="350"
></el-table-column>
<el-table-column
align="center"
prop="devName"
label="装置名称"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column
align="center"
:show-overflow-tooltip="true"
prop="lineName"
label="监测点名称"
></el-table-column>
<el-table-column
align="center"
prop="comFlag"
label="通讯状态"
width="100"
>
<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="runFlag"
label="运行状态"
width="100"
>
<template slot-scope="scope">
<el-tag
type="primary"
v-if="scope.row.runFlag === 0"
style="color: #fff; background: #0099cc"
size="small"
>投运</el-tag
>
<el-tag
type="primary"
v-if="scope.row.runFlag === 1"
style="color: #fff; background: #996600"
size="small"
>热备用</el-tag
>
<el-tag
type="primary"
v-if="scope.row.runFlag === 2"
style="color: #fff; background: #cc0000"
size="small"
>停运</el-tag
>
</template>
</el-table-column>
<el-table-column
align="center"
prop="updateTime"
label="数据更新时间"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column
align="center"
prop="lineGrade"
label="监测点评级"
width="120"
>
</el-table-column>
<el-table-column align="center" label="操作" width="180">
<template slot-scope="scope">
<el-button
type="primary"
@click="deilallData(scope.row)"
size="mini"
class="el-icon-edit"
>修改评级</el-button
>
</template>
</el-table-column>
</el-table>
<el-pagination
background
class="mt10"
align="right"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="formInline.pageNum"
:page-sizes="[20, 30, 40, 50, 100]"
:page-size="formInline.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
>
</el-pagination>
<el-dialog
:close-on-click-modal="false"
title="修改评级"
:visible.sync="dialogVisible"
width="30%"
:before-close="handleClose"
>
<el-form label-width="110px">
<el-form-item label="监测点评级:">
<el-select
v-model="lineGradeChoose"
style="width: 100%"
placeholder="请选择监测点评级"
>
<el-option
v-for="item in lineGradeListNoOne"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="submit()"> </el-button>
</span>
</el-dialog>
<el-dialog
:close-on-click-modal="false"
title="导入文件"
:visible.sync="dialogVisibleUpload"
width="30%"
:before-close="handleClose"
>
<el-upload
class="upload-demo"
ref="upload"
action="#"
:http-request="upload"
:on-preview="handlePreview"
:on-remove="handleRemove"
:before-remove="beforeRemove"
:limit="1"
accept=".xlsx,.xls"
:on-exceed="handleExceed"
:file-list="fileList"
>
<el-button size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">
只能上传csv文件且不超过500kb
</div>
</el-upload>
</el-dialog>
</el-row>
</div>
</template>
<script>
import lineMark from "@/api/device/lineMark.js";
import { dicData } from "@/assets/commjs/dictypeData";
export default {
name: "scoringmage",
components: {
// timepicker
},
data() {
return {
formInline: {
lineGrade: "",
comFlag: "",
searchValue: "",
pageNum: 1,
pageSize: 20,
},
total: 0,
loading: false,
searchValue: "", //模糊检索
height: "",
fileList: [],
dialogVisible: false,
dialogVisibleUpload: false,
lineGradeList: [],
lineGradeListNoOne: [],
statusList: [
{ id: "", name: "全部" },
{ id: 1, name: "正常" },
{ id: 0, name: "中断" },
],
tableData: [],
lineGrade: "",
comFlag: "",
lineGradeChoose: "",
lineId: "",
vh: undefined,
};
},
created() {
this.getLineGradeList();
this.getList();
},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem("appheight") - 95;
},
handleSizeChange(val) {
this.formInline.pageSize = val;
this.getList1();
},
handleCurrentChange(val) {
this.formInline.pageNum = val;
this.getList1();
},
//修改监测点评级
deilallData(row) {
this.dialogVisible = true;
this.lineId = row.lineIndex;
this.lineGradeChoose = row.lineGradeId;
},
//关闭
handleClose() {
this.dialogVisible = false;
this.dialogVisibleUpload = false;
},
//导入
importData() {
this.dialogVisibleUpload = true;
},
//导出监测点台账
exportData() {
// npm;
lineMark
.exportLineMark({})
.then(function (response) {
const blob = new Blob([response]);
const fileName = "监测点评分台账.xls";
const linkNode = document.createElement("a");
linkNode.download = fileName; //a标签的download属性规定下载文件的名称
linkNode.style.display = "none";
linkNode.href = URL.createObjectURL(blob); //生成一个Blob URL
document.body.appendChild(linkNode);
linkNode.click(); //模拟在按钮上的一次鼠标单击
URL.revokeObjectURL(linkNode.href); // 释放URL 对象
document.body.removeChild(linkNode);
})
.catch(function (error) {
// console.log(error);
});
},
handleRemove(file, fileList) {
// console.log(file, fileList);
},
handlePreview(file) {
// console.log(file);
},
handleExceed(files, fileList) {
this.$message.warning(
`当前限制选择 1 个文件,本次选择了 ${files.length} 个文件,共选择了 ${
files.length + fileList.length
} 个文件`
);
},
beforeRemove(file, fileList) {
return this.$confirm(`确定移除 ${file.name}`);
},
//主列表
getList() {
if (
this.formInline.lineGrade !== "" ||
this.formInline.searchValue !== "" ||
this.formInline.comFlag !== ""
) {
this.formInline.pageNum = 1;
}
this.loading = true;
lineMark.getList(this.formInline).then((response) => {
if (response.code === "A0000") {
var data = response.data;
this.tableData = data.records;
this.loading = false;
// this.formInline.pageNum = data.current;
// this.formInline.pageSize = data.size;
this.total = data.total;
}
});
this.loading = false;
},
//分页查询用
getList1() {
this.loading = true;
lineMark.getList(this.formInline).then((response) => {
if (response.code === "A0000") {
var data = response.data;
this.tableData = data.records;
this.loading = false;
// this.formInline.pageNum = data.current;
// this.formInline.pageSize = data.size;
this.fortotal = data.total;
}
});
this.loading = false;
},
/**
* 获取终端等级
*/
getLineGradeList() {
var code = "Dev_Level";
this.lineGradeList = dicData(code, [], 1);
this.lineGradeListNoOne = dicData(code, []);
},
query() {
this.getList();
},
//单个修改监测点评分
singleOperate(id, lineGrade) {
let data = {
id: id,
lineGrade: lineGrade,
};
lineMark.singleOperate(data).then((response) => {
if (response.code === "A0000") {
this.$message.success("监测点等级成功");
this.dialogVisible = false;
this.getList();
}
});
},
//提交按钮
submit() {
this.$confirm("是否确认操作?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
this.singleOperate(this.lineId, this.lineGradeChoose);
});
},
//导出模板
exportCsv() {
lineMark
.heardExport()
.then(function (response) {
const blob = new Blob([response]);
const fileName = "监测点评分模板.xls";
const linkNode = document.createElement("a");
linkNode.download = fileName; //a标签的download属性规定下载文件的名称
linkNode.style.display = "none";
linkNode.href = URL.createObjectURL(blob); //生成一个Blob URL
document.body.appendChild(linkNode);
linkNode.click(); //模拟在按钮上的一次鼠标单击
URL.revokeObjectURL(linkNode.href); // 释放URL 对象
document.body.removeChild(linkNode);
})
.catch(function (error) {
// console.log(error);
});
},
//文件上传
upload(option) {
let formData = new FormData();
formData.set("file", option.file);
lineMark.upload(formData).then((response) => {
// console.log(response);
if (response.type === "application/json") {
const fileReader = new FileReader();
fileReader.onloadend = () => {
try {
const jsonData = JSON.parse(fileReader.result);
if (jsonData.code === "A0000") {
this.$message.success("批量修改监测点评分成功");
this.dialogVisibleUpload = false;
this.getList();
} else {
this.$message.error(jsonData.data);
}
} catch (err) {
// console.log(err);
}
};
fileReader.readAsText(response);
} else {
const link = document.createElement("a"); // 创建a标签
let blob = new Blob([response], {
type: "application/vnd.ms-excel;charset=UTF-8",
}); // 设置文件类型
link.style.display = "none";
link.href = URL.createObjectURL(blob); // 创建URL
link.setAttribute("download", "监测点评分错误信息.xls");
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
this.$refs.upload.clearFiles();
});
},
},
};
</script>
<style lang="less" scoped>
@import url("../../../styles/comStyle.less");
// ::v-deep .table_header {
// height: 35px !important;
// }
</style>

View File

@@ -0,0 +1,593 @@
<template>
<div class="pd10">
<!--查询条件 版本维护-->
<el-form :inline="true" :model="formInline" class="demo-form-inline">
<el-form-item label="装置系列:">
<el-select
v-model="formInline.devType"
placeholder="请选择终端类型"
clearable
>
<el-option
v-for="item in teriminaloption"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="筛选数据:">
<el-input
style=" width: 250px;"
v-model="formInline.searchValue"
placeholder="请输入版本号,版本协议或描述筛选"
clearable
></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" class="el-icon-plus" @click="add"
> </el-button
>
<el-button type="primary" class="el-icon-search" @click="queryData"
> </el-button
>
</el-form-item>
</el-form>
<!--列表-->
<el-row>
<el-col :span="24">
<el-table
:data="tableData"
header-cell-class-name="table_header"
highlight-current-row
border
stripe
:row-config="{ isCurrent: true, isHover: true }"
:row-class-name="rowClassName"
:height="vh + 'px'"
style="width: 100%"
>
<el-table-column
show-overflow-tooltip
align="center"
prop="number"
label="序号"
width="70"
></el-table-column>
<el-table-column
show-overflow-tooltip
align="center"
prop="devType"
label="装置系列"
>
</el-table-column>
<el-table-column
show-overflow-tooltip
align="center"
prop="name"
label="版本号"
></el-table-column>
<el-table-column
show-overflow-tooltip
align="center"
prop="protocol"
label="版本协议"
></el-table-column>
<el-table-column
show-overflow-tooltip
align="center"
prop="date"
label="版本日期"
min-width="100"
></el-table-column>
<el-table-column
show-overflow-tooltip
align="center"
prop="updateBy"
label="修改人员"
></el-table-column>
<el-table-column
show-overflow-tooltip
align="center"
min-width="100"
prop="updateTime"
label="修改时间"
>
<template slot-scope="scope">
<span>{{ scope.row.updateTime.replace("T", " ") }}</span>
</template>
</el-table-column>
<el-table-column
show-overflow-tooltip
align="center"
prop="remark"
label="描述"
></el-table-column>
<el-table-column
show-overflow-tooltip
align="center"
prop="versionType"
label="版本类型"
width="100"
></el-table-column>
<el-table-column
show-overflow-tooltip
align="center"
prop="fileName"
label="文件名称"
width="100"
></el-table-column>
<el-table-column
align="center"
prop="versionFlag"
label="状态"
width="180"
>
<template slot-scope="scope">
<el-radio-group
v-model="scope.row.versionFlag"
size="mini"
@change="checkbox(scope.row)"
>
<el-radio-button label="1">启用</el-radio-button>
<el-radio-button label="0">未启用</el-radio-button>
</el-radio-group>
</template>
</el-table-column>
<el-table-column
show-overflow-tooltip
align="center"
label="操作"
width="200"
>
<template slot-scope="scope">
<el-button
type="primary"
size="mini" icon="el-icon-edit"
@click="editData(scope.row)"
>修改</el-button
>
<el-button
type="danger"
size="mini" icon="el-icon-delete"
@click="DeleteData(scope.row)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<el-pagination
background
class="mt10"
align="right"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="formInline.pageNum"
:page-sizes="[20, 30, 40, 50, 100]"
:page-size="formInline.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
>
</el-pagination>
</el-col>
</el-row>
<!--弹窗框-->
<el-dialog :close-on-click-modal="false"
:title="title"
:visible.sync="dialogVisible"
width="30%"
:before-close="handleClose"
>
<el-form ref="form" :rules="rules" :model="formData" label-width="100px" >
<el-form-item label="版本号:" prop="name">
<el-input
v-model="formData.name"
placeholder="请输入版本号"
></el-input>
</el-form-item>
<el-form-item label="协议版本:" class="top" prop="protocol">
<el-input
v-model="formData.protocol"
placeholder="请输入协议版本"
></el-input>
</el-form-item>
<el-form-item label="版本日期:" class="top" prop="date">
<el-date-picker
type="date"
placeholder="选择日期"
v-model="formData.date"
value-format="yyyy-MM-dd"
style="width: 100%"
></el-date-picker>
</el-form-item>
<el-form-item label="装置系列:" class="top" prop="devType">
<el-select
v-model="formData.devType"
placeholder="请选择装置系列"
style="width: 100%"
clearable
>
<el-option
v-for="item in teriminaloption"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="版本类型:" class="top" prop="versionType">
<el-input
v-model="formData.versionType"
placeholder="请输入版本类型"
></el-input>
</el-form-item>
<el-form-item label="描述:" class="top" prop="remark">
<el-input
type="textarea"
v-model="formData.remark"
placeholder="请输入描述"
></el-input>
</el-form-item>
<el-form-item label="升级文件:" class="top">
<el-upload
ref="upload"
class="upload-demo"
action=""
:headers="headers"
name="file"
multiple
:limit="1"
accept=".doc,.docx,.xls,.xlsx,.pdf,.txt"
:auto-upload="false"
:file-list="fileList"
:on-change="handleChange"
>
<div style="display: flex">
<el-input style="width:100%"
v-model="formData.filename"
placeholder="请上传文件"
></el-input>
<el-button
size="small"
type="primary"
icon="el-icon-upload2"
class="ml20"
style="display: inline; float: right"
>点击上传</el-button
>
</div>
</el-upload>
</el-form-item>
<el-form-item label="CRC校验:" class="top" prop="crc">
<el-input
v-model="formData.crc"
placeholder="请输入CRC校验"
></el-input>
</el-form-item>
<!-- <el-form-item>
<el-button type="primary" >保存</el-button>
<el-button>取消</el-button>
</el-form-item> -->
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="handleClose"> </el-button>
<el-button
type="primary"
v-if="this.title == '新增装置'"
@click="addData"
> </el-button
>
<el-button type="primary" v-else @click="upData"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import {
getProgramVersion,
addProgramVersion,
updateProgramVersion,
delProgramVersion,
updateVersionFlag,
} from "@/api/BusinessAdministrator/TerminalMaintenance";
import { dicData } from "@/assets/commjs/dictypeData";
export default {
name: "versioningmage",
data() {
return {
vh: undefined,
formInline: {
devType: "",
searchValue: "",
pageNum: 1,
pageSize: 20,
},
total: 2,
teriminaloption: "",
height: "",
dialogVisible: false,
tableData: [],
//表单
formData: {
id: "",
name: "",
protocol: "",
date: "",
devType: "",
versionType: "",
remark: "",
crc: "",
file: "",
filename: "",
},
fileList: [
// {
// name: "food.jpeg",
// url: "https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100",
// },
// {
// name: "food2.jpeg",
// url: "https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100",
// },
],
title: "",
headers: {
Authorization: window.sessionStorage.getItem("cntoken"),
},
rules: {
name: [{ required: true, message: "请输入版本号", trigger: "blur" }],
protocol: [{ required: true, message: "请输入协议版本", trigger: "blur" }],
devType: [
{ required: true, message: "请选择装置系列", trigger: "change" },
],
date: [{ required: true, message: "请选择日期", trigger: "change" }],
crc: [{ required: true, message: "请输入CRC校验", trigger: "blur" }],
remark: [{ required: true, message: "请输入描述", trigger: "blur" }],
versionType: [
{ required: true, message: "请输入版本类型", trigger: "blur" },
],
},
};
},
created() {
this.getclassificationData();
},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.queryData();
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem("appheight") - 96;
},
//获取类型
getclassificationData() {
//监测点等级
this.teriminaloption = dicData("Dev_Series", []);
},
//序号
rowClassName({ row, rowIndex }) {
row.number = rowIndex + 1;
},
//查询
queryData() {
getProgramVersion(this.formInline).then((res) => {
this.tableData = res.data.records;
this.total = res.data.total;
});
},
handleChange(file, fileList) {
// console.log(file, fileList);
this.fileList = fileList;
this.formData.filename = file.name;
//获取上传文件大小
let imgSize = Number(file.size / 1024 / 1024);
if (imgSize > 8) {
this.$msgbox({
title: "",
message: "文件大小不能超过8MB,请重新上传。",
type: "warning",
});
return;
}
},
//每页条数改变时触发 选择一页显示多少行
handleSizeChange(val) {
this.formInline.pageSize = val;
this.queryData();
},
//当前页改变时触发 跳转其他页
handleCurrentChange(val) {
this.formInline.pageNum = val;
this.queryData();
},
//切换
checkbox(row) {
// console.log(row);
let data = {
id: row.id,
versionFlag: row.versionFlag,
};
updateVersionFlag(data)
.then((res) => {
if ((res.code == "A0000")) {
this.$message({
type: "success",
message: res.message,
});
}
this.queryData();
})
.catch(() => {
this.$message({
type: "error",
message: res.message,
});
});
},
//删除
DeleteData(row) {
this.$confirm("是否确认删除?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
let data = {
id: row.id,
};
delProgramVersion(data).then((res) => {
if ((res.code == "A0000")) {
this.$message({
type: "success",
message: res.message,
});
}
this.queryData();
});
})
.catch(() => {
this.$message({
type: "info",
message: "已取消删除",
});
});
},
// 表单重置
resetForm() {
if (this.$refs["form"]) {
this.$refs["form"].resetFields();
}
},
//关闭弹窗
handleClose() {
this.dialogVisible = false;
this.resetForm();
// console.log(this.tableData);
this.teriminaloption.forEach((item) => {
this.tableData.forEach((data) => {
if (data.devType == item.id) {
data.devType = item.name;
}
});
});
},
//修改
editData(row) {
// console.log(row);
this.title = row.devType + "装置修改";
this.formData = row;
this.formData.filename = row.fileName;
this.dialogVisible = true;
this.teriminaloption.forEach((item) => {
if (item.name == row.devType) {
this.formData.devType = item.id;
}
});
},
//保存提交
upData() {
this.$refs["form"].validate((valid) => {
if (valid) {
const form = new FormData();
form.append("id", this.formData.id);
form.append("name", this.formData.name);
form.append("protocol", this.formData.protocol);
form.append("date", this.formData.date);
form.append("devType", this.formData.devType);
form.append("versionType", this.formData.versionType);
form.append("remark", this.formData.remark);
form.append("crc", this.formData.crc);
form.append(
"filename",
this.formData.filename == undefined ? "/" : this.formData.filename
);
this.fileList.forEach((item) => {
form.append("file", item.raw);
});
// console.log(form);
updateProgramVersion(form)
.then((res) => {
if ((res.code == "A0000")) {
this.$message({
type: "success",
message: res.message,
});
}
this.dialogVisible = false;
this.queryData();
})
.catch((err) => {
//console.log(err);
});
}
});
},
//新增
add() {
this.title = "新增装置";
this.formData = {};
this.fileList = [];
this.dialogVisible = true;
},
//保存提交
addData() {
this.$refs["form"].validate((valid) => {
if (valid) {
const form = new FormData();
form.append("name", this.formData.name);
form.append("protocol", this.formData.protocol);
form.append("date", this.formData.date);
form.append("devType", this.formData.devType);
form.append("versionType", this.formData.versionType);
form.append("remark", this.formData.remark);
form.append("crc", this.formData.crc);
form.append(
"filename",
this.formData.filename == undefined ? "/" : this.formData.filename
);
this.fileList.forEach((item) => {
form.append("file", item.raw);
});
addProgramVersion(form)
.then((res) => {
if ((res.code == "A0000")) {
this.$message({
type: "success",
message: res.message,
});
}
this.dialogVisible = false;
this.queryData();
})
.catch((err) => {
console.log(err);
});
}
});
},
},
};
</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;
// }
</style>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,395 @@
<template>
<!-- 使用 useVirtual 属性开启虚拟滚动 使用虚拟滚动时必须要固定表格高度和行高 -->
<div style="height: 100%;width: 100%;padding: 0 30px">
<div style="color:red;">pl-table在线预览更多玩法请看文档哦欢迎Star</div>
<el-button @click="$router.push({ path: '/text' })">去子页面(为了测试缓存组件)</el-button>
<div>
<el-button @click="allSelection">全选</el-button>
<el-button @click="clearSelection">清除选中</el-button>
<el-button @click="setData(3)">变化数据为3条</el-button>
<el-button @click="setData(200)">变化数据为200条</el-button>
<el-button @click="setData(1000)">变化数据为1000条</el-button>
<el-button @click="pagingScrollTopLeft(1000)">滚动到1千位置</el-button>
<el-button @click="pagingScrollTopLeft(2000)">滚动到2千位置</el-button>
<el-button @click="pagingScrollTopLeft(0)">滚动到顶部</el-button>
<el-button @click="scrollBottom">滚动到底部位置</el-button>
<el-button @click="setHei(400)">设置高度为400</el-button>
<el-button @click="setHei(300)">设置高度为300</el-button>
</div>
<!--我是Y轴虚拟-->
<div v-if="true">
<p style="color: red">我是Y轴虚拟</p>
<pl-table ref="plTable"
:height="height"
:data="data.tableData"
selectTrClass="selectTr"
header-drag-style
:dataChangesScrollTop="false"
:summary-method="summaryMethod"
@table-body-scroll="tableBodyScroll"
fixedColumnsRoll
inverse-current-row
bigDataCheckbox
@select-all="selectAll"
show-summary
use-virtual
:row-height="rowHeight">
<template slot="empty">
没有查询到符合条件的记录
</template>
<pl-table-column type="selection" width="55" :selectable="selectable"/>
<pl-table-column type="index" width="100" fixed/>
<!--show-overflow-tooltip属性代表超出则内容部分给出提示框-->
<pl-table-column
v-for="item in columns"
:key="item.id"
:resizable="item.resizable"
:show-overflow-tooltip="item.showOverflowTooltip"
:prop="item.prop"
:label="item.label"
:fixed="item.fixed"
:width="item.width"/>
</pl-table>
</div>
<!--我是X + Y轴同时虚拟-->
<div v-if="false">
<p style="color: red">我是X + Y轴同时虚拟</p>
<plx-table-grid :data="data.tableData"
height="300"
:show-summary="true"
:summary-method="summaryMethod"
ref="plTable2">
<plx-table-column type="selection" width="55" fixed="left"/>
<plx-table-column type="index" width="100" fixed="left"/>
<plx-table-column
v-for="item in columns2"
:key="item.id"
:resizable="item.resizable"
:prop="item.prop"
:label="item.label"
:fixed="item.fixed"/>
</plx-table-grid>
</div>
<!--我是加入分页的表格-->
<div v-if="false">
<p style="color: red">我是加入分页的表格</p>
<pl-table :data="data.tableData"
big-data-checkbox
:max-height="height"
header-drag-style
fixedColumnsRoll
use-virtual
:row-height="rowHeight"
:pagination-show="true"
:total="pageForm.total"
:page-size="pageForm.pageSize"
:current-page="pageForm.currentPage"
@handlePageSize="handlePageSize"
>
<template slot="empty">
没有查询到符合条件的记录
</template>
<pl-table-column type="selection" width="55"/>
<pl-table-column type="index" width="100" fixed/>
<!--show-overflow-tooltip属性代表超出则内容部分给出提示框-->
<pl-table-column
v-for="item in columns"
:key="item.id"
:resizable="item.resizable"
:show-overflow-tooltip="item.showOverflowTooltip"
:prop="item.prop"
:label="item.label"
:fixed="item.fixed"
:width="item.width"/>
</pl-table>
</div>
<!--我是普通的el-table树形表格这个数据多了就卡这就是原本的el-table树表格必须指定 row-key-->
<div v-if="false">
<p style="color: red;">我是普通的el-table树形表格这个数据多了就卡这就是原本的el-table树表格必须指定 row-key</p>
<pl-table ref="plTable"
:height="height"
:data="treeData"
selectTrClass="selectTr"
row-key="id"
header-drag-style
@table-body-scroll="tableBodyScroll"
fixedColumnsRoll
inverse-current-row
@select-all="selectAll">
<template slot="empty">
没有查询到符合条件的记录
</template>
<!--show-overflow-tooltip属性代表超出则内容部分给出提示框-->
<pl-table-column
v-for="item in columns"
:key="item.id"
:resizable="item.resizable"
:show-overflow-tooltip="item.showOverflowTooltip"
:prop="item.prop"
:label="item.label"
:fixed="item.fixed"
:width="item.width"/>
</pl-table>
</div>
<!--我是pl-table大数据树形表格 必须指定 row-key 必须开启use-virtual-->
<div v-if="true">
<p style="color: red;">我是pl-table大数据树形表格 必须指定 row-key 必须开启use-virtual</p>
<el-button @click="$refs.plTreeTable.toggleTreeExpansion(treeData[0])">切换第一个</el-button>
<el-button @click="$refs.plTreeTable.setTreeExpansion(treeData[2], true)">展开第三个</el-button>
<el-button @click="$refs.plTreeTable.setAllTreeExpansion()">展开全部</el-button>
<el-button @click="$refs.plTreeTable.clearTreeExpand()">关闭所有</el-button>
<el-button @click="getTreeExpansionEvent">获取已展开</el-button>
<pl-table ref="plTreeTable"
:max-height="height"
:data="treeData"
selectTrClass="selectTr"
row-key="id"
bigDataCheckbox
:treeConfig="{children: 'children', expandAll: false}"
:use-virtual="true"
header-drag-style
@table-body-scroll="tableBodyScroll"
fixedColumnsRoll
inverse-current-row
@select-all="selectAll">
<template slot="empty">
没有查询到符合条件的记录
</template>
<!--pl-table大数据表格 你需要在列上指定某个列显示展开收起 treeNode属性-->
<pl-table-column
:treeNode="item.treeNode"
v-for="item in columns"
:key="item.id"
:resizable="item.resizable"
:show-overflow-tooltip="item.showOverflowTooltip"
:prop="item.prop"
:label="item.label"
:fixed="item.fixed"
:width="item.width"/>
</pl-table>
</div>
</div>
</template>
<script>
// 下面是关于pl-table的树形数据的介绍希望读完下面的文字
// 最大数量500当然你可以更多那么只会导致你遍历时间多页面等待时间长并非渲染节点时间长
// 另外 就以下的这个层级,总数据量展开后,就是 500 + 500 x 3 + 3 x 1 = 2003 的总数据量
// 如果你 第一级是500 第二级也是500 第三级是10。 那么你的数据量就是 500 + 500 x 500 + 500 x 10 的总数据量,这是非常吓人的
// 所以结合自己情况去给树数据,不要瞎乱给下面的数据,树节点避免不鸟去递归,如果你的数据量很大很大,那么你会死在遍历上。
// 注意,注意注意并非第一级不能超过500是想告诉你们嵌套里面子节点层级数据量不要太大。比如你可这样的 第一级为1000 第二级为2-5的数据量
// 第三级为2-5的数据量.... 那么这样算下来,就是 1000 + 1000 x 5 + 5 x 5 = 6025的数据量应该是可以的但是记住要是太大的嵌套数据。那只会导致
// 程序卡在遍历数据上,因为程序需要慢慢去递归遍历。这是没有办法的。
// 但是传统el-table 或者el-tree他们数据量超过200 就会卡。 所以我们已经很好的优化了这一点。不过看来对于树形数据的要求,应该数据量不会太大。
// 你可以在pl-table的基础上去改改样式就可以变相的去实现el-tree的组件了哦你隐藏下头部把行的高度给小一点。然后隐形边框线。是不是就是el-tree了呢
var dataList = Array.from({ length: 500 }, (_, idx) => ({
id: idx + '_' + 1,
date: '2016-05-03',
name: 1,
ab: '欢迎使用pl-table',
address: idx,
children: Array.from({ length: 3 }, (_, idx2) => ({
id: idx + '_' + idx2 + '_' + 1,
date: '2016-05-03',
name: 1,
ab: '欢迎使用pl-table',
address: idx + '_' + idx2,
children: Array.from({ length: 1 }, (_, idx3) => ({
id: idx + '_' + idx2 + '_' + idx3 + '_' + 1,
date: '2016-05-03',
name: 1,
ab: '欢迎使用pl-table',
address: idx + '_' + idx2 + '_' + idx3
}))
}))
}));
export default {
name: 'programmanage',
data() {
return {
rowHeight: 50,
columns: [
{prop: 'address', label: '日期', width: 120, treeNode: true, showOverflowTooltip: true},
{prop: 'address', label: '地址', width: 100, showOverflowTooltip: true},
{prop: 'address', label: '噜噜噜', width: 230, showOverflowTooltip: true},
{prop: 'address', label: '娃哈哈', width: 100, showOverflowTooltip: true},
{prop: 'address', label: '地址', width: 100, showOverflowTooltip: true},
{prop: 'address', label: '娃哈哈', width: 100, showOverflowTooltip: true},
{prop: 'address', label: '娃哈哈', width: 100, showOverflowTooltip: true},
{prop: 'address', label: '地址', width: 100, showOverflowTooltip: true},
{prop: 'address', label: '娃哈哈', width: 100, showOverflowTooltip: true},
{prop: 'address', label: '娃哈哈', width: 100, showOverflowTooltip: true},
{prop: 'address', label: '噜噜噜', showOverflowTooltip: true},
{prop: 'address', label: '娃哈哈', width: 100, showOverflowTooltip: true, fixed: 'right'}
],
columns2: Array.from({ length: 20 }, (_, idx) => ({
prop: 'address', label: '地址' + idx, width: 200, showOverflow: true, sortable: true, fixed: ''
})),
data: {
tableData:Array.from({ length: 20 }, (_, idx) => ({
id: idx + 1,
date: '2016-05-03',
name: 1,
ab: '欢迎使用pl-table',
address: 1 + idx
}))
},
top: 0,
height: 500,
pageForm: {
total: 1000,
pageSize: 10,
currentPage: 1
},
treeData: dataList
}
},
methods: {
selectAll (val) {
// console.log(val)
},
selectable (row, index) {
if (index === 1) {
return false
} else {
return true
}
},
// 合计
summaryMethod ({ columns, data }) {
// 平均值算法(不需要自己去掉)
function cacl(arr, callback) {
let ret;
for (let i=0; i<arr.length;i++) {
ret = callback(arr[i], ret);
}
return ret;
}
// 平均值算法不需要自己去掉
Array.prototype.sum = function () {
return cacl(this, function (item, sum) {
if (typeof (sum) == 'undefined') {
return item;
}
else {
return sum += item;
}
});
};
// 平均值算法不需要自己去掉
Array.prototype.avg = function () {
if (this.length == 0) {
return 0;
}
return this.sum(this) / this.length;
};
const means = [] // 合计
const fenceSums = [] // 平均值
columns.forEach((column, columnIndex) => {
if (columnIndex === 0) {
means.push('合计')
fenceSums.push('平均值')
} else {
const values = data.map(item => Number(item[column.property]));
// 合计
if (!values.every(value => isNaN(value))) {
means[columnIndex] = values.reduce((prev, curr) => {
const value = Number(curr);
if (!isNaN(value)) {
return prev + curr;
} else {
return prev;
}
}, 0);
// means[columnIndex] += ' 元'
// 改变了ele的合计方式扩展了合计场景
// 你以为就只有上面这样玩吗?错啦,你还可以自定义样式哦
// means[columnIndex] = '<span style="color: red">' + means[columnIndex] + '元</span>'
means[columnIndex] = '<span style="color: red">' + means[columnIndex] + '元</span><br/><span>123</span>'
} else {
means[columnIndex] = '';
}
// 平均值
const precisions = [];
let notNumber = true;
values.forEach(value => {
if (!isNaN(value)) {
notNumber = false;
let decimal = ('' + value).split('.')[1];
precisions.push(decimal ? decimal.length : 0);
}
});
if (!notNumber) {
fenceSums[columnIndex] = values.avg()
} else {
fenceSums[columnIndex] = '';
}
}
})
// 返回一个二维数组的表尾合计
return [means, fenceSums]
},
setHei (val) {
this.height = val
},
tableBodyScroll ({ scrollTop }, e) {
this.top = scrollTop
},
allSelection () {
this.$refs.plTable.toggleAllSelection()
},
clearSelection () {
this.$refs.plTable.clearSelection()
this.$refs.plTable2.clearSelection()
},
setData (num) {
this.data.tableData = Array.from({ length: num }, (_, idx) => ({
id: idx + 1,
date: '2016-05-03',
name: 1,
ab: '欢迎使用pl-table',
address: 1 + idx
}))
},
scrollBottom () {
this.$refs.plTable.scrollBottom()
},
pagingScrollTopLeft (val) {
this.$refs.plTable.pagingScrollTopLeft(val, 0)
},
// 分页事件
handlePageSize ({page, size}) {
// console.log(page, size)
},
// 获取已经展开的节点
getTreeExpansionEvent () {
// console.log(this.$refs.plTreeTable.getTreeExpandRecords())
}
}
}
</script>
<style>
body, html {
margin: 0;
box-sizing: border-box;
width: 100%;
height: 100%;
}
body ::-webkit-scrollbar-thumb {
-webkit-border-radius: 5px;
border-radius: 5px;
background-color: rgba(144, 147, 153, 0.5);
}
.selectTr td {
background: #ccc !important;
color: red !important;
}
</style>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,573 @@
<template>
<div class="pd10" v-loading="isloading" element-loading-text="数据加载中">
<el-form :inline="true" :model="formData" class="demo-form-inline">
<el-form-item label="告警等级:" class="level">
<el-select
v-model="formData.alarmLevel"
placeholder="请选择告警等级"
clearable
>
<el-option
v-for="item in alarmList"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="监测点等级:" class="box">
<el-select
v-model="formData.lineGrade"
placeholder="请选择监测点等级"
clearable
>
<el-option
v-for="item in lineGradeList"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="是否处理:" class="box">
<el-select
v-model="formData.flag"
placeholder="请选择处理状态"
clearable
>
<el-option
v-for="item in statusList"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="告警类型:" class="box">
<el-select
v-model="formData.type"
placeholder="请选择告警类型"
filterable=""
clearable
>
<el-option
v-for="item in alarmTypeList"
: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" icon="el-icon-search" @click="onSubmit"
>查询</el-button
>
</el-form-item>
</el-form>
<el-table
stripe
:data="tableData"
border
header-cell-class-name="table_header"
:height="vh + 'px'"
style="width: 100%"
highlight-current-row
>
<el-table-column
align="center"
prop="type"
min-width="160"
label="告警类型"
></el-table-column>
<el-table-column
align="center"
prop="occurredTime"
min-width="180"
label="最新发生时间"
></el-table-column>
<el-table-column
align="center"
prop="level"
min-width="100"
label="告警等级"
>
<template slot-scope="scope">
<!-- <span v-if="scope.row.level === 0" style="color: #0f0">普通</span>
<span v-if="scope.row.level === 1" style="color: #f60">中等</span>
<span v-if="scope.row.level === 2" style="color: #f00">严重</span> -->
<el-tag
type="primary"
v-if="scope.row.level === 0"
style="color: #fff; background: #2e8b57"
size="small"
>普通</el-tag
>
<el-tag
type="primary"
v-if="scope.row.level === 1"
style="color: #fff; background: #996600"
size="small"
>中等</el-tag
>
<el-tag
type="primary"
v-if="scope.row.level === 2"
style="color: #fff; background: #cc0000"
size="small"
>严重</el-tag
>
</template>
</el-table-column>
<el-table-column
align="center"
prop="devLineName"
min-width="500"
label="告警定位(装置/监测点)"
:show-overflow-tooltip="true"
>
<template slot-scope="scope">
{{
"变电站名称" +
":" +
scope.row.subName +
" " +
"设备名称" +
":" +
scope.row.devLineName
}}
</template>
</el-table-column>
<el-table-column
align="center"
prop="remark"
label="描述"
min-width="200"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column
align="center"
prop="flag"
min-width="100"
label="是否处理"
>
<template slot-scope="scope">
<!-- <span v-if="scope.row.flag === 0" style="color: #f00">未处理</span>
<span v-if="scope.row.flag === 1" style="color: #0f0">已处理</span> -->
<el-tag
type="primary"
v-if="scope.row.flag === 0"
style="color: #fff; background: #cc0000"
size="small"
>未处理</el-tag
>
<el-tag
type="primary"
v-if="scope.row.flag === 1"
style="color: #fff; background: #2e8b57"
size="small"
>已处理</el-tag
>
</template>
</el-table-column>
<el-table-column
align="center"
prop="updateBy"
label="处理员"
min-width="180"
></el-table-column>
<el-table-column
align="center"
prop="processTime"
min-width="180"
label="处理时间"
>
<template slot-scope="scope">
<span v-if="scope.row.processTime == null">/</span>
<span v-else>{{ scope.row.processTime }}</span>
</template>
</el-table-column>
<el-table-column
align="center"
prop="lineGrade"
min-width="150"
label="监测点装置等级"
></el-table-column>
<el-table-column
align="center"
label="操作"
fixed="right"
min-width="240"
>
<template slot-scope="scope">
<el-button
type="primary"
@click="deilallData(scope.row)"
size="mini"
icon="el-icon-share"
>详细信息</el-button
>
<el-button
icon="el-icon-warning"
:disabled="scope.row.flag == 0 ? false : true"
@click.stop="untreated(scope.row)"
type="primary"
size="mini"
>{{ scope.row.flag == 0 ? "未处理" : "已处理" }}</el-button
>
</template>
</el-table-column>
</el-table>
<el-pagination
background
class="mt10"
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"
>
</el-pagination>
<el-dialog
:close-on-click-modal="false"
title="告警详细信息"
class="eldialot"
:visible.sync="dialogVisible"
width="70%"
>
<el-table
stripe
:data="tableDataDetail"
border
header-cell-class-name="table_header"
height="60vh"
v-loading="loading"
style="width: 100%"
:header-cell-style="{
height: '25px',
top: '0px',
padding: '0px',
}"
:row-style="{ height: '25px' }"
:cell-style="{ padding: '0px' }"
>
<el-table-column
align="center"
prop="type"
label="告警类型"
></el-table-column>
<el-table-column
align="center"
prop="occurredTime"
label="最新发生时间"
></el-table-column>
<el-table-column align="center" prop="level" label="告警等级">
<template slot-scope="scope">
<span v-if="scope.row.level === 0" style="color: #0f0">普通</span>
<span v-if="scope.row.level === 1" style="color: #f60">中等</span>
<span v-if="scope.row.level === 2" style="color: #f00">严重</span>
</template>
</el-table-column>
<el-table-column
align="center"
prop="remark"
label="描述"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column align="center" prop="flag" label="是否处理">
<template slot-scope="scope">
<span v-if="scope.row.flag === 0" style="color: #f00">未处理</span>
<span v-if="scope.row.flag === 1" style="color: #0f0">已处理</span>
</template>
</el-table-column>
<el-table-column
align="center"
prop="updateBy"
label="处理员"
></el-table-column>
<el-table-column align="center" prop="processTime" label="处理时间">
<template slot-scope="scope">
<span v-if="scope.row.processTime == null">/</span>
<span v-else>{{ scope.row.processTime }}</span>
</template>
</el-table-column>
</el-table>
<!-- <el-pagination
background
class="mt10"
align="right"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="formInline.pageNum"
:page-sizes="[20, 30, 40, 50, 100]"
:page-size="formInline.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
>
</el-pagination> -->
</el-dialog>
</div>
</template>
<script>
import { dicData } from "@/assets/commjs/dictypeData";
import {
alarmList,
alarmDetail,
updateAlarmInfo,
} from "@/api/BusinessAdministrator/AlarmInformation";
import Timeinterval from "@/views/components/TimePicker/index4";
// import alarm from "@/api/device/alarm";
export default {
name: "alarminformation",
components: { Timeinterval },
data() {
return {
isloading: false,
loading: false,
dialogVisible: false,
vh: undefined,
item: ["", ""],
formData: {
alarmLevel: "",
devLineId: "",
endTime: "",
flag: "",
lineGrade: "",
pageNum: 1,
pageSize: 20,
processTime: "",
startTime: "",
type: "",
},
total: undefined,
lineGradeList: [],
lineGrade: "",
statusList: [
{ id: 0, name: "未处理" },
{ id: 1, name: "已处理" },
],
alarmTypeList: [],
alarmType: "",
alarmList: [
{ id: 0, name: "普通" },
{ id: 1, name: "中等" },
{ id: 2, name: "严重" },
],
tableData: [],
tableDataDetail: [],
};
},
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") - 97;
},
//查询
onSubmit() {
if (
this.formData.alarmLevel !== "" ||
this.formData.lineGrade !== "" ||
this.formData.flag !== "" ||
this.formData.type !== ""
) {
this.formData.pageNum = 1;
}
this.isloading = true;
this.item = this.$refs.interval.timeValue;
this.formData.startTime = this.item[0];
this.formData.endTime = this.item[1];
alarmList(this.formData).then((res) => {
this.isloading = false;
this.tableData = res.data.records;
this.total = res.data.total;
});
},
//分页查询用
onSubmit1() {
this.isloading = true;
this.item = this.$refs.interval.timeValue;
this.formData.startTime = this.item[0];
this.formData.endTime = this.item[1];
alarmList(this.formData).then((res) => {
this.isloading = false;
this.tableData = res.data.records;
this.total = res.data.total;
});
},
//每页条数改变时触发 选择一页显示多少行
handleSizeChange(val) {
this.formData.pageSize = val;
this.onSubmit1();
},
//当前页改变时触发 跳转其他页
handleCurrentChange(val) {
this.formData.pageNum = val;
this.onSubmit1();
},
//详细信息
deilallData(row) {
this.dialogVisible = true;
let data = {
startTime: this.formData.startTime,
endTime: this.formData.endTime,
alarmLevel: row.level,
flag: row.flag,
type: row.typeId,
devLineId: row.devLineId,
processTime: row.processTime,
};
this.loading = true;
alarmDetail(data).then((res) => {
if (res.code === "A0000") {
this.tableDataDetail = res.data;
this.loading = false;
}
});
},
// handleClose() {
// this.dialogVisible = false;
// },
//获取类型
getclassificationData() {
//监测点等级
this.lineGradeList = dicData("Dev_Level", []);
this.formData.lineGrade = this.lineGradeList[0].id;
//告警类型
this.alarmTypeList = dicData("alarm_Type", []);
},
//未处理
untreated(row) {
if (row.type == "系统对时启动异常") {
this.$router.push({
path: "/device-boot/deviceter",
name: "terminalmage",
params: {
id: row.devLineId,
type: row.type,
},
});
} else if (row.type == "暂降事件推送异常") {
this.$router.push("/BusinessAdministrator/LogManagement/DropPush");
} else if (row.type == "流量告警") {
this.$router.push("/BusinessAdministrator/management/PlanTraffic");
} else if (row.type == "时钟出错") {
this.$router.push({
path: "/device-boot/deviceter",
name: "terminalmage",
params: {
id: row.devLineId,
type: row.type,
},
});
} else if (row.type == "统计闻隔时间设置出错") {
this.$router.push({
path: "/device-boot/deviceter",
name: "terminalmage",
params: {
id: row.devLineId,
type: row.type,
},
});
} else if (row.type == "统计间隔不匹配") {
this.$router.push({
path: "/device-boot/deviceter",
name: "terminalmage",
params: {
id: row.devLineId,
type: row.type,
},
});
} else if (row.type == "接线方式不匹配") {
this.$router.push({
path: "/device-boot/deviceter",
name: "terminalmage",
params: {
id: row.devLineId,
type: row.type,
},
});
} else if (row.type == "接线方式设置出错") {
this.$router.push({
path: "/device-boot/deviceter",
name: "terminalmage",
params: {
id: row.devLineId,
type: row.type,
},
});
}
let data = {
type: row.typeId,
devLineId: row.devLineId,
};
updateAlarmInfo(data).then((res) => {
if (res.code === "A0000") {
this.$message({
message: res.message,
type: "success",
});
this.onSubmit();
} else {
this.$message({
message: res.message,
type: "warning",
});
}
});
},
},
};
</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: 36px;
}
.el-table__fixed,
.el-table__fixed-right {
height: calc(100% - 20px) !important;
}
.el-table__fixed-body-wrapper {
height: 100 !important;
}
.el-table__fixed-body-wrapper .el-table__body {
padding-bottom: 20px; // 滚动条高度
}
::v-deep .box {
.el-select {
width: 160px;
}
}
::v-deep .level {
.el-select {
width: 145px;
}
}
// ::v-deep .table_header {
// height: 35px !important;
// }
</style>

View File

@@ -0,0 +1,382 @@
<template>
<div class="pd10">
<el-form :inline="true" class="demo-form-inline">
<div style="display: flex">
<div style="display: flex; justify-content: space-between; flex-grow: 1">
<el-form-item>
<el-button type="primary" class="el-icon-plus" @click="add">新增</el-button>
<!-- <el-button type="primary" @click="info" icon="el-icon-search"
>查询</el-button
> -->
</el-form-item>
<el-form-item>
<el-button type="primary" class="el-icon-download" @click="exportEvent">导出</el-button>
</el-form-item>
</div>
</div>
</el-form>
<vxe-table
header-cell-class-name="table_header"
:data="tableData"
v-loading="loading"
border
stripe
:row-config="{ isCurrent: true, isHover: true }"
ref="management"
size="mini"
:height="vh + 'px'"
style="width: 100%"
highlight-current-row
>
<vxe-table-column align="center" field="name" title="等级">
<template slot-scope="scope">
<span v-if="scope.row.name == '不重要'" style="color: green">不重要</span>
<span v-if="scope.row.name == '普通'" style="color: #0099ff">普通</span>
<span v-if="scope.row.name == '重要'" style="color: #cc9900">重要</span>
<span v-if="scope.row.name == '极重要'" style="color: red">极重要</span>
</template>
</vxe-table-column>
<vxe-table-column align="center" field="integrityValue" title="数据完整性" sortable>
<template slot-scope="scope">
<span
v-if="
scope.row.integrityValue > 0 &&
scope.row.integrityValue <= 60 &&
scope.row.integrityValue !== 3.14159
"
style="color: red"
>
{{ scope.row.integrityValue }}
</span>
<span
v-if="
scope.row.integrityValue > 60 &&
scope.row.integrityValue < 90 &&
scope.row.integrityValue !== 3.14159
"
style="color: #cc9900"
>
{{ scope.row.integrityValue }}
</span>
<span
v-if="scope.row.integrityValue >= 90 && scope.row.integrityValue !== 3.14159"
style="color: green"
>
{{ scope.row.integrityValue }}
</span>
<span v-if="scope.row.integrityValue == 3.14159">暂无数据</span>
</template>
</vxe-table-column>
<vxe-table-column align="center" field="onlineValue" title="在线率" sortable>
<template slot-scope="scope">
<span
v-if="
scope.row.onlineValue > 0 &&
scope.row.onlineValue <= 60 &&
scope.row.onlineValue !== 3.14159
"
style="color: red"
>
{{ scope.row.onlineValue }}
</span>
<span
v-if="
scope.row.onlineValue > 60 &&
scope.row.onlineValue < 90 &&
scope.row.onlineValue !== 3.14159
"
style="color: #cc9900"
>
{{ scope.row.onlineValue }}
</span>
<span v-if="scope.row.onlineValue >= 90 && scope.row.onlineValue !== 3.14159" style="color: green">
{{ scope.row.onlineValue }}
</span>
<span v-if="scope.row.onlineValue == 3.14159">暂无数据</span>
</template>
</vxe-table-column>
<vxe-table-column
align="center"
field="offTimeValue"
title="持续中断时长(s)"
:show-overflow-tooltip="true"
sortable
></vxe-table-column>
<vxe-table-column
align="center"
field="warnValue"
title="告警次数"
:show-overflow-tooltip="true"
sortable
></vxe-table-column>
<vxe-table-column align="center" field="updateTime" title="更新日期" sortable>
<template slot-scope="scope">
<span>{{ scope.row.updateTime.replace('T', ' ') }}</span>
</template>
</vxe-table-column>
<vxe-table-column align="center" field="updateBy" title="更新用户"></vxe-table-column>
<vxe-table-column align="center" title="操作" width="220">
<template slot-scope="scope">
<el-button type="primary" class="el-icon-edit" size="mini" @click="editData(scope.row)">
修改
</el-button>
<el-button type="danger" class="el-icon-delete" size="mini" @click="deleteData(scope.row)">
删除
</el-button>
<!-- <el-button v-if="scope.row.state==1" disabled type="primary">已处理</el-button> -->
</template>
</vxe-table-column>
</vxe-table>
<!--编辑弹出框-->
<el-dialog
:close-on-click-modal="false"
:title="title"
:visible.sync="dialogVisible"
width="30%"
:before-close="handleClose"
>
<el-form ref="form" :model="formInline" :rules="rules" label-width="150px">
<el-form-item label="终端等级:" prop="zddjid">
<el-select v-model="zddjid" :disabled="falg" style="width: 100%" placeholder="请选择终端等级">
<el-option
v-for="item in teriminaloption"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="数据完整性标准:" prop="integrityValue" class="top">
<el-input v-model="formInline.integrityValue" placeholder="请输入数据完整性标准"></el-input>
</el-form-item>
<el-form-item label="终端在线率标准:" prop="onlineValue" class="top">
<el-input v-model="formInline.onlineValue" placeholder="请输入终端在线率标准"></el-input>
</el-form-item>
<el-form-item label="持续中断时长:" prop="offTimeValue" class="top">
<el-input v-model="formInline.offTimeValue" placeholder="请输入持续中断时长"></el-input>
</el-form-item>
<el-form-item label="告警次数:" prop="warnValue" class="top">
<el-input v-model="formInline.warnValue" placeholder="请输入告警次数"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="handleClose">取 消</el-button>
<el-button type="primary" @click="submitData">确 定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import api from '@/api/device/alarm'
import { dicData } from '@/assets/commjs/dictypeData'
export default {
name: 'alarmstrategy',
data() {
return {
dialogVisible: false,
falg: false,
loading: true,
vh: undefined,
title: '',
height: '',
tableData: [],
zddjid: '',
//分页
formInline: {
integrityValue: null,
onlineValue: null,
offTimeValue: null,
warnValue: null,
pageNum: 1,
pageSize: 20
},
teriminaloption: [],
input: '',
Finput: '',
total: null,
biaozhi: 'add',
id: '',
rules: {
zddjid: [{ required: true, message: '终端等级不可为空', trigger: 'blur' }],
integrityValue: [{ required: true, message: '数据完整性标准不可为空', trigger: 'blur' }],
onlineValue: [{ required: true, message: '终端在线率标准不可为空', trigger: 'blur' }],
offTimeValue: [{ required: true, message: '持续中断时长不可为空', trigger: 'blur' }],
warnValue: [{ required: true, message: '告警次数不可为空', trigger: 'blur' }]
}
}
},
created() {
this.getdicData()
this.info()
},
mounted() {
//this.info();
this.setHeight()
window.addEventListener('resize', this.setHeight)
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem('appheight') - 55
},
// 表单重置
resetForm() {
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
},
//获取字典表数据
getdicData() {
let code = 'Dev_Level'
this.teriminaloption = dicData(code, [])
this.zddjid = this.teriminaloption[0].id
},
//获取列表数据
info() {
this.loading = true
api.getAlarmStrategyData().then(res => {
if (res.code == 'A0000') {
this.Finput = this.input
this.tableData = res.data
this.total = 4
this.loading = false
} else if ((res.data = null)) {
this.loading = false
}
})
},
//新增
add() {
this.formInline = {}
this.biaozhi = 'add'
this.falg = false
this.dialogVisible = true
this.title = '新增告警策略'
},
//编辑
editData(row) {
this.zddjid = row.id
this.formInline.id = row.name
this.formInline.integrityValue = row.integrityValue
this.formInline.onlineValue = row.onlineValue
this.formInline.offTimeValue = row.offTimeValue
this.formInline.warnValue = row.warnValue
this.falg = true
this.title = '修改告警策略'
this.biaozhi = 'edit'
this.dialogVisible = true
},
//提交
submitData() {
if (this.biaozhi == 'add') {
let data = {
id: this.zddjid,
integrityValue: Number(this.formInline.integrityValue),
onlineValue: Number(this.formInline.onlineValue),
offTimeValue: Number(this.formInline.offTimeValue),
warnValue: Number(this.formInline.warnValue)
}
api.addAlarmStrategyData(data).then(res => {
if (res.code == 'A0000') {
this.$message({
type: 'success',
message: '新增策略成功!'
})
this.dialogVisible = false
this.info()
}
})
} else if (this.biaozhi == 'edit') {
let data = {
id: this.zddjid,
integrityValue: Number(this.formInline.integrityValue),
onlineValue: Number(this.formInline.onlineValue),
offTimeValue: Number(this.formInline.offTimeValue),
warnValue: Number(this.formInline.warnValue)
}
api.upAlarmStrategyData(data).then(res => {
if (res.code == 'A0000') {
this.$message({
type: 'success',
message: '修改策略成功!'
})
this.dialogVisible = false
this.info()
}
})
}
},
//删除
deleteData(row) {
let data = {
id: row.id
}
this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
api.delAlarmStrategyData(data).then(res => {
if (res.code == 'A0000') {
this.$message({
type: 'success',
message: '删除成功!'
})
this.info()
}
})
})
.catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
})
})
},
//导出
exportEvent() {
this.$refs.management.exportData({
filename: '告警策略管理', // 文件名字
sheetName: '告警策略管理',
type: 'xlsx', //导出文件类型 xlsx 和 csv
useStyle: true,
data: this.tableData, // 数据源 // 过滤那个字段导出 // columnFilterMethod: function(column, $columnIndex) { //   return !(column.$columnIndex === 0 ) //   // 0是复选框 不导出 // }
columnFilterMethod: function (column, $columnIndex) {
return !(column.$columnIndex === 7)
}
})
},
handleClose() {
this.dialogVisible = false
this.resetForm()
},
//每页条数改变时触发 选择一页显示多少行
handleSizeChange(val) {
this.formInline.pageSize = val
this.info()
},
//当前页改变时触发 跳转其他页
handleCurrentChange(val) {
this.formInline.pageNum = val
this.info()
}
}
}
</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;
// }
// ::v-deep .el-select {
// width: 150px;
// }
</style>

View File

@@ -0,0 +1,467 @@
<template>
<div>
<el-tabs v-model.trim="activeName" type="border-card">
<el-tab-pane label="报告字典管理" name="first" :style="'height:' + vh + 'px;'" style="position: relative">
<el-row :gutter="20">
<el-col :span="5">
<div class="grid-content bg-purple">
<el-tree
:style="'height:' + (vh - 5) + 'px; overflow-y: auto;'"
@node-click="clickNode"
:expand-on-click-node="false"
:highlight-current="true"
:data="TreeData"
node-key="id"
:default-expanded-keys="treeExpandData"
:props="defaultProps"
ref="tree"
></el-tree>
</div>
</el-col>
<el-col :span="19">
<!-- <el-button
type="primary"
icon="el-icon-notebook-2"
@click="$emit('flag')"
>报告字典管理</el-button
> -->
<el-form :inline="true" :model="formData">
<el-form-item label="筛选数据:">
<el-input
v-model="formData.searchValue"
placeholder="请输入筛选数据"
clearable=""
></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="info">查询</el-button>
</el-form-item>
<el-form-item style="float: right">
<el-button type="primary" icon="el-icon-plus" @click="addTemplate">
新增配置项
</el-button>
<!-- <el-button type="primary" icon="el-icon-upload2">导出</el-button> -->
</el-form-item>
</el-form>
<el-table
stripe
v-loading="loading"
:data="tableData.slice((pageNum - 1) * pageSize, pageNum * pageSize)"
header-cell-class-name="table_header"
highlight-current-row
style="width: 100%"
border
:height="vh - 85 + 'px'"
>
<el-table-column prop="name" label="配置项名称"></el-table-column>
<el-table-column prop="reportDescribe" label="配置项描述"></el-table-column>
<el-table-column prop="pidName" label="上级节点">
<template slot-scope="scope">
<span>{{ scope.row.pid == '0' ? '无' : scope.row.pidName }}</span>
</template>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button
type="primary"
size="mini"
icon="el-icon-edit"
@click="modify(scope.row)"
>
修改
</el-button>
<el-button
type="danger"
size="mini"
icon="el-icon-delete"
@click="deletes(scope.row)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
background
align="right"
class="mt10"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="pageNum"
:page-sizes="[20, 30, 40, 50, 100]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
></el-pagination>
</el-col>
</el-row>
</el-tab-pane>
</el-tabs>
<svg-icon class="back" icon-class="back" @click="$emit('flag')" />
<!-- 新增 -->
<el-dialog
:close-on-click-modal="false"
title="新增配置项"
:visible.sync="dialogVisible"
width="30%"
:before-close="closeDialog"
>
<el-form ref="form" :rules="rules" :model="form" label-width="80px">
<el-form-item label="父节点:" prop="pid">
<el-select v-model="form.pid" style="width: 100%" placeholder="请选择父节点" clearable>
<el-option
v-for="item in secondLevelNode"
:key="item.id"
:label="item.reportDescribe"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="名称:" prop="name" class="top">
<el-input v-model.trim="form.name" placeholder="请输入名称"></el-input>
</el-form-item>
<el-form-item label="描述:" prop="reportDescribe" class="top">
<el-input type="textarea" placeholder="请输入描述" v-model.trim="form.reportDescribe"></el-input>
</el-form-item>
<!-- <el-form-item label="一级节点:" style="margin-top: 25px" class="box">
<el-select
v-model="pid1"
placeholder="请选择一级节点"
clearable
@change="changeFn"
>
<el-option
v-for="item in data"
:key="item.id"
:label="item.reportDescribe"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item> -->
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="closeDialog"> </el-button>
<el-button type="primary" @click="addFn"> </el-button>
</span>
</el-dialog>
<!-- 修改 -->
<el-dialog :close-on-click-modal="false" title="修改配置项信息" :visible.sync="dialogVisible1" width="30%">
<el-form ref="form" :rules="rules" :model="form" label-width="80px">
<el-form-item label="名称:" prop="name" style="margin-bottom: 20px !important">
<el-input v-model.trim="form.name" placeholder="请输入名称"></el-input>
</el-form-item>
<el-form-item label="描述:" prop="reportDescribe" style="margin-bottom: 20px !important">
<el-input
type="textarea"
:rows="2"
placeholder="请输入描述"
v-model.trim="form.reportDescribe"
></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible1 = false"> </el-button>
<el-button type="primary" @click="updateFn"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import {
getDictTree,
getReportDictList,
addDict,
updateDict,
deleteDict
} from '@/api/BusinessAdministrator/ReportTemplate/MonitoringPoint'
export default {
components: {},
props: {
type: {
type: Number,
default: undefined
}
},
data() {
return {
formData: {
searchValue: '',
id: '0',
type: this.type
},
pageNum: 1,
pageSize: 20,
total: 10,
form: {
name: '',
reportDescribe: '',
pid: '',
sort: 0,
type: this.type
},
pid1: '',
rules: {
name: [{ required: true, message: '名称不能为空', trigger: 'blur' }],
reportDescribe: [{ required: true, message: '描述不能为空', trigger: 'blur' }],
pid: [{ required: true, message: '请选择父节点', trigger: 'change' }]
},
activeName: 'first',
vh: undefined,
treeExpandData: [],
TreeData: [],
// data: [],
firstLevelNode: [],
secondLevelNode: [],
loading: true,
tableData: [],
dialogVisible: false,
dialogVisible1: false,
defaultProps: {
children: 'children',
label: 'reportDescribe'
}
}
},
created() {
this.Onsubmit()
},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.$nextTick(() => {
this.$refs.tree.setCurrentKey(1)
})
// console.log(this.type);
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem('appheight') - 70
},
closeDialog() {
this.dialogVisible = false
this.resetForm()
},
// 表单重置
resetForm() {
if (this.$refs['form']) {
this.$refs['form'].resetFields()
}
},
//查询数据
info() {
this.loading = true
getReportDictList(this.formData).then(res => {
this.tableData = res.data
this.total = this.tableData.length
this.loading = false
})
},
//字典树
Onsubmit() {
getDictTree(this.formData).then(res => {
this.TreeData = res.data
// this.data = this.TreeData;
this.formData.id = this.TreeData[0].id
// this.form.pid = this.data[0].id
this.info()
this.TreeData.forEach(item => {
this.treeExpandData.push(item.id)
})
})
},
// changeFn(val) {
// console.log(val);
// this.secondLevelNode = [];
// // val.forEach((item) => {
// // this.secondLevelNode.push(item);
// // });
// this.data.forEach((item) => {
// console.log(item);
// if (val == item.id) {
// this.secondLevelNode = item.children;
// }
// if(item.children.length == 0){
// this.form.pid = item.id
// }else{
// item.children.forEach((item1) => {
// console.log(item1);
// if (val == item1.id) {
// this.secondLevelNode = item.children;
// }
// });
// }
// });
// },
// 点击属于节点
clickNode(data) {
// this.secondLevelNode = []
//console.log(data);
this.secondLevelNode[0] = data
this.formData.id = data.id
this.info()
},
// 新增
addTemplate() {
this.title = '新增模板'
this.dialogVisible = true
this.pid1 = ''
this.form = {
name: '',
reportDescribe: '',
pid: '',
sort: 0,
type: this.type
}
},
//新增确定
addFn() {
this.$refs.form.validate(value => {
// console.log(value);
if (value == true) {
this.$confirm('是否确认新增?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
addDict(this.form).then(res => {
if (res.code == 'A0000') {
this.$message({
message: res.message,
type: 'success'
})
}
this.dialogVisible = false
this.Onsubmit()
})
})
.catch(() => {
this.$message({
type: 'info',
message: '已取消新增'
})
})
}
})
},
// 修改
modify(row) {
this.title = '修改模板'
;(this.form = {
name: row.name,
type: row.type,
reportDescribe: row.reportDescribe,
id: row.id,
pid: row.pid,
sort: row.sort
}),
(this.dialogVisible1 = true)
},
//修改确定
updateFn() {
this.$refs.form.validate(value => {
// console.log(value);
if (value == true) {
this.$confirm('是否确认修改?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
updateDict(this.form).then(res => {
if (res.code == 'A0000') {
this.$message({
message: res.message,
type: 'success'
})
}
this.dialogVisible1 = false
this.Onsubmit()
})
})
.catch(() => {
this.$message({
type: 'info',
message: '已取消修改'
})
})
}
})
},
// 删除
deletes(row) {
this.$confirm('是否确认删除?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
let data = {
id: row.id
}
deleteDict(data).then(res => {
if ((res.code == 'A0000')) {
this.$message({
type: 'success',
message: res.message
})
}
this.Onsubmit()
})
})
.catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
})
})
},
handleSizeChange(val) {
this.pageSize = val
this.info()
},
handleCurrentChange(val) {
this.pageNum = val
this.info()
}
},
computed: {},
watch: {}
}
</script>
<style lang="less" scoped>
@import url('../../../../styles/comStyle.less');
</style>
<style lang="scss" scoped>
.back {
position: absolute;
top: 15px;
right: 15px;
margin-right: 10px;
margin-left: auto;
font-size: 29px;
line-height: 32px;
color: $themeColor;
cursor: pointer;
&:hover {
color: $themeColor;
opacity: 0.9;
}
}
::v-deep textarea {
resize: none;
}
::v-deep .box {
overflow: inherit;
.el-input {
width: 283px;
}
}
</style>

View File

@@ -0,0 +1,371 @@
<template>
<!-- 监测点报告 -->
<div>
<el-form :inline="true" :model="formData">
<el-form-item label="模板类型:">
<el-select
v-model="formData.type"
placeholder="请选择模板类型"
clearable
@change="changeFn"
>
<el-option
v-for="item in templateType"
:key="item.id"
:label="item.label"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item style="float: right">
<el-button
type="primary"
icon="el-icon-notebook-2"
@click="$emit('flag')"
>报告字典管理</el-button
>
<el-button type="primary" icon="el-icon-plus" @click="addTemplate"
>新增模板</el-button
>
<!-- <el-button type="primary" icon="el-icon-upload2">导出</el-button> -->
</el-form-item>
</el-form>
<el-table
stripe
v-loading="loading"
:data="tableData"
header-cell-class-name="table_header"
style="width: 100%"
highlight-current-row
border
:height="vh"
>
<el-table-column prop="name" label="模板名称"> </el-table-column>
<el-table-column prop="code" label="模板描述"> </el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button
type="primary"
size="mini"
icon="el-icon-edit"
@click="modify(scope.row)"
>修改</el-button
>
<el-button
type="danger"
size="mini"
icon="el-icon-delete"
@click="deletes(scope.row)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<el-pagination
background
align="right"
class="mt10"
@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"
>
</el-pagination>
<!-- <Template v-if="dialogVisible" @close='close' :title="title" :dialogVisible="dialogVisible" :TemplateTree="TemplateTree"/> -->
<el-dialog
:close-on-click-modal="false"
:title="title"
:visible.sync="dialogVisible"
width="40%"
:before-close="closeDialog"
>
<el-row :gutter="20">
<el-col :span="11"
><div class="grid-content">
<el-tree
:data="data"
show-checkbox
node-key="id"
:props="defaultProps"
:default-checked-keys="treeCheckedData"
:default-expanded-keys="treeExpandData"
@check-change="handleCheckChange"
ref="tree"
>
</el-tree></div
></el-col>
<el-col :span="13"
><el-form ref="form" :rules="rules" :model="form" label-width="60px">
<el-form-item label="名称:" prop="name">
<el-input
v-model.trim="form.name"
placeholder="请输入名称"
></el-input>
</el-form-item>
<el-form-item label="描述:" prop="code" class="top">
<el-input
type="textarea"
:rows="2"
placeholder="请输入描述"
v-model.trim="form.code"
>
</el-input>
</el-form-item> </el-form
></el-col>
</el-row>
<span slot="footer" class="dialog-footer">
<el-button @click="closeDialog"> </el-button>
<el-button
v-if="this.title == '新增模板'"
type="primary"
@click="addDetermine"
> </el-button
>
<el-button
v-else-if="this.title == '修改模板'"
type="primary"
@click="updateDetermine"
> </el-button
>
</span>
</el-dialog>
</div>
</template>
<script>
import {
getList,
getDictTree,
add,
update,
deleteData,
} from "@/api/BusinessAdministrator/ReportConfiguration/MonitoringPoint";
export default {
props: {},
data() {
return {
loading: true,
vh: undefined,
formData: {
pageNum: 1,
pageSize: 20,
type: 0,
},
total: 0,
templateType: [
{
id: 0,
label: "监测点报告",
},
{
id: 1,
label: "区域报告",
},
],
tableData: [],
dialogVisible: false,
title: "",
TemplateTree: [],
treeCheckedData: [],
treeExpandData: [],
form: {
name: "",
type: 0,
code: "",
ids: [],
},
rules: {
name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
code: [{ required: true, message: "描述不能为空", trigger: "blur" }],
},
data: [],
defaultProps: {
children: "children",
label: "reportDescribe",
},
};
},
created() {
this.info();
},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem("appheight") - 155;
},
closeDialog(){
this.dialogVisible =false
this.resetForm()
},
// 表单重置
resetForm() {
if (this.$refs["form"]) {
this.$refs["form"].resetFields();
}
},
//查询列表
info() {
this.loading = true;
this.$emit("send", this.formData.type);
getList(this.formData).then((res) => {
this.tableData = res.data.records;
this.total = res.data.total;
});
this.loading = false;
},
changeFn(val) {
// console.log(val);
this.formData.type = val;
this.form.type = val;
this.info();
},
//查询字典树
searchTree() {
getDictTree(this.formData).then((res) => {
this.data = res.data;
this.data.forEach((item) => {
this.treeExpandData.push(item.id);
});
});
},
// 新增
addTemplate() {
this.title = "新增模板";
this.form = {};
this.treeCheckedData = [];
this.searchTree();
this.dialogVisible = true;
},
//新增确定
addDetermine() {
this.form.type = this.formData.type;
add(this.form).then((res) => {
if (res.code == "A0000") {
this.$message({
message: res.message,
type: "success",
});
}
this.dialogVisible = false;
this.info();
});
},
// 修改
modify(row) {
// console.log(row);
this.title = "修改模板";
this.searchTree();
(this.form = {
name: row.name,
type: row.type,
code: row.code,
id: row.id,
ids: row.rdIds,
}),
(this.treeCheckedData = row.rdIds);
this.dialogVisible = true;
},
//修改确定
updateDetermine() {
update(this.form).then((res) => {
if (res.code == "A0000") {
this.$message({
message: res.message,
type: "success",
});
}
this.dialogVisible = false;
this.info();
});
},
// 删除
deletes(row) {
this.$confirm("是否确认删除?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
let data = [row.id];
deleteData(data).then((res) => {
if ((res.code == "A0000")) {
this.$message({
type: "success",
message: res.message,
});
}
this.info();
});
})
.catch(() => {
this.$message({
type: "info",
message: "已取消删除",
});
});
},
handleSizeChange(val) {
this.formData.pageSize = val;
this.info();
},
handleCurrentChange(val) {
this.formData.pageNum = val;
this.info();
},
// 树多选
handleCheckChange(data, checked, indeterminate) {
// 获取当前选中的所有节点ID
// console.log(this.$refs.tree.getCheckedKeys());
// console.log(data, checked, indeterminate);
this.form.ids = this.$refs.tree.getCheckedKeys();
},
},
computed: {},
watch: {},
};
</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>
<style lang="scss" scoped>
.BOXbutton {
display: flex;
justify-content: end;
.el-button + .el-button,
.el-checkbox.is-bordered + .el-checkbox.is-bordered {
margin-left: 15px;
}
}
::v-deep.el-tree {
height: 400px;
overflow-y: auto;
}
::v-deep textarea {
resize: none;
}
::v-deep .el-form-item--small.el-form-item {
margin-bottom: 15px;
}
</style>

View File

@@ -0,0 +1,179 @@
<template>
<div>
<el-dialog
:close-on-click-modal="false"
:title="title"
:visible.sync="dialogVisible"
width="600px"
:before-close="handleClose"
>
<el-row :gutter="20">
<el-col :span="11"
><div class="grid-content bg-purple">
<el-tree
:data="data"
show-checkbox
node-key="id"
default-expand-all
:props="defaultProps"
ref="tree"
>
</el-tree></div
></el-col>
<el-col :span="13"
><el-form ref="form" :rules="rules" :model="form" label-width="60px">
<el-form-item label="名称:" prop="name">
<el-input
v-model.trim="form.name"
placeholder="请输入名称"
></el-input>
</el-form-item>
<el-form-item label="描述:" prop="text">
<el-input
type="textarea"
:rows="2"
placeholder="请输入描述"
v-model="form.text"
>
</el-input>
</el-form-item> </el-form
></el-col>
</el-row>
<span slot="footer" class="dialog-footer">
<el-button @click="handleClose"> </el-button>
<el-button type="primary" @click="determine"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
export default {
components: {},
props: {
title: {
type: String,
default: undefined,
},
dialogVisible: {
type: Boolean,
default: false,
},
TemplateTree: {
type: [Object, Array],
default: false,
},
},
data() {
return {
form: {
name: "",
text: "",
},
rules: {
name: [{ required: true, message: "名称不能为空", trigger: "blur" }],
text: [{ required: true, message: "描述不能为空", trigger: "blur" }],
},
data: [
{
id: 1,
label: "一级 1",
children: [
{
id: 4,
label: "二级 1-1",
children: [
{
id: 9,
label: "三级 1-1-1",
},
{
id: 10,
label: "三级 1-1-2",
},
],
},
],
},
{
id: 2,
label: "一级 2",
children: [
{
id: 5,
label: "二级 2-1",
},
{
id: 6,
label: "二级 2-2",
},
],
},
{
id: 3,
label: "一级 3",
children: [
{
id: 7,
label: "二级 3-1",
},
{
id: 8,
label: "二级 3-2",
},
],
},
],
defaultProps: {
children: "children",
label: "label",
},
};
},
created() {},
methods: {
// 确定
determine() {
let list = [];
this.$refs.tree.getCheckedNodes().forEach((item) => {
if (item.children == undefined) {
list.push(item.id);
}
});
// console.log("🚀 ~ file: Template.vue ~ line 137 ~ determine ~ list", list)
this.$refs["form"].validate((valid) => {
if (valid) {
this.handleClose();
} else {
}
});
},
// 关闭
handleClose() {
this.$emit("close");
},
// 树多选
handleCheckChange(data, checked, indeterminate) {
// 获取当前选中的所有节点ID
// console.log(this.$refs.tree.getCheckedKeys());
},
},
computed: {},
watch: {},
};
</script>
<style lang="scss" scoped>
::v-deep.el-tree {
height: 400px;
overflow-y: auto;
}
::v-deep textarea {
resize: none;
}
::v-deep .el-form-item--small.el-form-item {
margin-bottom: 15px;
}
</style>

View File

@@ -0,0 +1,202 @@
<template>
<!-- 监测点报告 -->
<div>
<div class="BOXbutton">
<el-button type="primary" icon="el-icon-notebook-2" @click="$emit('flag')"
>报告字典管理2</el-button
>
<el-button type="primary" icon="el-icon-plus" @click="addTemplate"
>新增模板</el-button
>
<el-button type="primary" icon="el-icon-upload2">导出</el-button>
</div>
<el-table
stripe
v-loading="loading"
:data="tableData.slice((pageNum - 1) * pageSize, pageNum * pageSize)"
header-cell-class-name="table_header"
style="width: 100%; margin: 10px 0"
border
:height="vh"
>
<el-table-column type="index" width="50" label="序号">
<template scope="scope">
<span>{{ (pageNum - 1) * pageSize + scope.$index + 1 }}</span>
</template></el-table-column
>
<el-table-column prop="date" label="模板名称"> </el-table-column>
<el-table-column prop="name" label="模板描述"> </el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button
type="primary"
size="mini"
icon="el-icon-edit"
@click="modify(scope.row)"
>修改</el-button
>
<el-button
type="primary"
size="mini"
icon="el-icon-delete"
@click="deletes(scope.row)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<el-pagination
background
align="right"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="pageNum"
:page-sizes="[20, 30, 40, 50, 100]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="tableData.length"
>
</el-pagination>
<Template
v-if="dialogVisible"
@close="close"
:title="title"
:dialogVisible="dialogVisible"
:TemplateTree="TemplateTree"
/>
</div>
</template>
<script>
import Template from "./Template.vue";
export default {
components: { Template },
props: {},
data() {
return {
loading: true,
vh: undefined,
pageNum: 1,
pageSize: 20,
tableData: [
{
date: "默认报告模板",
name: "默认报告模板",
address: "上海市普陀区金沙江路 1518 弄",
},
{
date: "默认报告模板",
name: "默认报告模板",
address: "上海市普陀区金沙江路 1518 弄",
},
{
date: "默认报告模板",
name: "默认报告模板",
address: "上海市普陀区金沙江路 1518 弄",
},
{
date: "默认报告模板",
name: "默认报告模板",
address: "上海市普陀区金沙江路 1518 弄",
},
{
date: "默认报告模板",
name: "默认报告模板",
address: "上海市普陀区金沙江路 1518 弄",
},
{
date: "默认报告模板",
name: "默认报告模板",
address: "上海市普陀区金沙江路 1518 弄",
},
{
date: "默认报告模板",
name: "默认报告模板",
address: "上海市普陀区金沙江路 1518 弄",
},
{
date: "默认报告模板",
name: "默认报告模板",
address: "上海市普陀区金沙江路 1518 弄",
},
],
dialogVisible: false,
title: "",
TemplateTree: [],
};
},
created() {
this.info();
},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem("appheight") - 165;
},
info() {
this.loading = false;
},
// 新增
addTemplate() {
this.title = "新增模板";
this.dialogVisible = true;
},
// 修改
modify() {
this.title = "修改模板";
this.dialogVisible = true;
},
// 关闭弹框
close() {
this.dialogVisible = false;
},
// 删除
deletes(id) {
this.$confirm("是否确认删除?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
this.$message({
type: "success",
message: "删除成功!",
});
});
},
handleSizeChange(val) {
this.pageSize = val;
},
handleCurrentChange(val) {
this.pageNum = val;
},
},
computed: {},
watch: {},
};
</script>
<style lang="less" scoped>
@import url("../../../../styles/comStyle.less");
</style>
<style lang="scss" scoped>
.BOXbutton {
display: flex;
justify-content: end;
.el-button + .el-button,
.el-checkbox.is-bordered + .el-checkbox.is-bordered {
margin-left: 15px;
}
}
</style>

View File

@@ -0,0 +1,56 @@
<template>
<div class="pd10">
<el-row style="overflow-y: hidden">
<el-col>
<Census></Census>
</el-col>
</el-row>
</div>
</template>
<script>
import Census from './Extension/Census.vue'
export default {
components: { Census },
data() {
return {
vh: '',
vh1: '',
activeName: 'first'
}
},
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'
this.vh1 = window.sessionStorage.getItem('appheight') - 20 + 'px'
},
handleClick(tab, event) {
// console.log(tab, event);
}
}
}
</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;
}
.block {
position: absolute;
right: 10px;
bottom: 10px;
}
</style>

View File

@@ -0,0 +1,297 @@
<template>
<div>
<el-row>
<el-col :span="24">
<div class="Top" ref="top">
<div class="pd10">
<el-form :inline="true" :model="form" class="demo-form-inline">
<div style="display: flex">
<el-form-item label="筛选">
<el-input v-model="i" placeholder="请输入内容"></el-input>
</el-form-item>
<div style="display: flex; justify-content: space-between; flex-grow: 1">
<el-form-item>
<el-button type="primary" class="ml10" icon="el-icon-search" @click="steady">
查询
</el-button>
</el-form-item>
<el-form-item>
<el-button type="primary" class="ml10" @click="add">新增</el-button>
</el-form-item>
</div>
</div>
</el-form>
<el-table
stripe
:data="totalData"
:height="height"
border
v-loading="isLoading"
style="width: 100%"
header-cell-class-name="table_header"
>
<el-table-column prop="point" label="套餐名"></el-table-column>
<el-table-column prop="point" label="套餐流量(MB)"></el-table-column>
<el-table-column prop="point" label="修改人"></el-table-column>
<el-table-column prop="point" label="修改时间"></el-table-column>
<el-table-column label="类型">
<template slot-scope="scope">
<el-tag @click="cha(scope.row)">{{ scope.row.point }}</el-tag>
</template>
</el-table-column>
<el-table-column label="类型">
<template slot-scope="scope">
<el-tag @click="cha(scope.row)">{{ scope.row.point }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="" label="操作">
<template slot-scope="scope">
<el-button size="mini" type="primary" @click="handleEdit(scope.$index, scope.row)">
编辑
</el-button>
<el-button size="mini" type="danger" @click="handleDelete(scope.$index, scope.row)">
删除
</el-button>
</template>
</el-table-column>
</el-table>
</div>
</div>
</el-col>
</el-row>
<el-dialog
:close-on-click-modal="false"
title="编辑"
:visible.sync="dialogVisible"
width="20%"
:before-close="handleClose"
>
<el-form ref="form" :model="form" label-width="130px" :inline="true" class="demo-form-inline">
<el-form-item label="套餐名称:" style="margin-top: 20px">
<el-input v-model="form.name" clearable></el-input>
</el-form-item>
<el-form-item label="套餐流量:" style="margin-top: 20px">
<el-input v-model="form.type" clearable></el-input>
</el-form-item>
<el-form-item label="套餐类型:" style="margin-top: 20px">
<el-select v-model="value" placeholder="请选择">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="二级类型:" style="margin-top: 20px">
<el-select v-model="value" placeholder="请选择">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
</el-form>
<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>
<el-dialog
:close-on-click-modal="false"
title="新增"
:visible.sync="dialogVisible1"
width="20%"
:before-close="handleClose"
>
<el-form ref="form" :model="form" label-width="130px" :inline="true" class="demo-form-inline">
<el-form-item label="套餐名称:" style="margin-top: 20px">
<el-input v-model="form.name" clearable></el-input>
</el-form-item>
<el-form-item label="套餐流量:" style="margin-top: 20px">
<el-input v-model="form.type" clearable></el-input>
</el-form-item>
<el-form-item label="套餐类型:" style="margin-top: 20px">
<el-select v-model="value" placeholder="请选择">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="二级类型:" style="margin-top: 20px">
<el-select v-model="value" placeholder="请选择">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible1 = false"> </el-button>
<el-button type="primary" @click="dialogVisible1 = false"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import Area from '@/views/components/Area/Area.vue'
import { figure, serial, diagram, monthly } from './indicatorClassification.js'
import { viewheight } from '@/assets/commjs/common'
import { Classification } from './indicatorClassification.js'
import Timslot from './Timeslot.vue'
export default {
components: { Area, Timslot },
data() {
return {
i: '',
vh1: '',
dialogVisible: false,
dialogVisible1: false,
options: [
{
value: '选项1',
label: '电铁'
},
{
value: '选项2',
label: '换流站'
},
{
value: '选项3',
label: '风电'
},
{
value: '选项4',
label: '光伏'
},
{
value: '选项5',
label: '其他非线性负荷'
},
{
value: '选项6',
label: '敏感重要高危用户'
},
{
value: '选项7',
label: '变电站'
},
{
value: '选项8',
label: '跨省关口'
},
{
value: '选项9',
label: '其他'
}
],
value: '',
form: {
date: ''
},
height: null,
isLoading: false,
//稳态指标超标统计
totalData: [{ point: 1111 }],
active_active: 'first-first',
zoom: undefined, //图表焦点校验
vh: '',
height: 265,
device: '',
getHeight: '',
tabPosition: 'top',
active: 'first',
isLoading: false,
isLoading2: false,
isLoading3: false,
isLoading4: false,
serialData: []
}
},
created() {
this.account()
this.steady()
},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
setTimeout(() => {
this.getHeight = Number(this.$refs.getHeight.offsetHeight - 45)
}, 0)
//echarts图表调用
this.zoom = 1 / document.body.style.zoom
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh1 = window.sessionStorage.getItem('appheight') - 20 + 'px'
this.device = window.devicePixelRatio
this.height = window.sessionStorage.getItem('appheight') - 175 + 'px'
this.vh = (viewheight() - 90) / 2 + 'px'
this.zoom = 1 / document.body.style.zoom
},
add() {
this.dialogVisible1 = true
},
handleClose() {
this.dialogVisible = false
this.dialogVisible1 = false
},
handleEdit(val) {
this.dialogVisible = true
// console.log(val, "valvalval");
},
cellStyle(row, column, rowIndex, columnIndex) {
// console.log(row);
if (row.columnIndex == 2 || row.columnIndex == 3 || row.columnIndex == 4 || row.columnIndex == 5) {
return 'font-weight: 600;'
}
},
//监测终端统计echarts图表
//方法调用台账统计数据接口
account() {
this.isLoading = true
this.isLoading2 = true
//监测终端统计单位表格数据
Classification().then(res => {
this.isLoading = false
this.serialData = res.data
})
}
}
}
</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;
}
.prop {
font-weight: 600;
}
::v-deep .el-table__body-wrapper.is-scrolling-none {
height: 227px !important;
}
</style>

View File

@@ -0,0 +1,787 @@
<template>
<div style="display: inline-block; width: 100%; margin-bottom: 10px">
<span style="font-size: 14px; font-weight: 550">
<span class="spanColor">间隔:</span>
</span>
<el-select
style="width: 90px; margin-left: 10px"
v-model="intervald"
@change="interchange"
placeholder="请选择"
>
<el-option
v-for="item in timeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
<el-date-picker
style="width: 230px"
:disabled="disabled"
:readonly="pickDisabled"
:clearable="false"
v-model="timeValue"
:picker-options="pickerOptions"
type="daterange"
value-format="yyyy-MM-dd"
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
align="right"
>
</el-date-picker>
<div style="display: inline" v-if="buttonShow">
<el-button
:disabled="backDisabled"
type="primary"
icon="el-icon-d-arrow-left"
@click="preClick"
style="margin-left: 10px"
></el-button>
<el-button @click="nowTime" type="primary" style="margin-left: 5px"
>当前</el-button
>
<el-button
:disabled="preDisabled"
type="primary"
icon="el-icon-d-arrow-right"
@click="back"
style="margin-left: 5px"
></el-button>
</div>
<!-- <el-button
@click="querfromdata"
type="primary"
icon="el-icon-search"
style="margin-left: 10px"
>查询</el-button
> -->
</div>
</template>
<script>
export default {
name: "index4",
props: {
name: {
type: String,
default: undefined,
},
path: {
type: String,
default: undefined,
},
tablename: {
type: String,
default: undefined,
},
interval: {
type: Number,
default: undefined,
},
type: {
type: Number,
default: undefined,
},
falg: {
type: Boolean,
default: false,
},
query: {
type: Boolean,
default: false,
},
thb: {
type: Boolean,
default: false,
},
},
watch: {
intervald(val) {
if (val != 5) {
let endTime = this.getEndTime();
let startTime = this.getStartTime(this.intervald, endTime);
this.timeValue = [startTime, endTime];
this.pickDisabled = false;
this.buttonShow = true;
} else {
let endTime = this.getEndTime();
let startTime = this.getStartTime(this.intervald, endTime);
this.timeValue = [startTime, endTime];
this.buttonShow = false;
this.pickDisabled = false;
}
},
},
data() {
return {
disabled: true,
buttonShow: true, //向前向后按钮显示隐藏控制按钮
pickDisabled: false, //时间组件只读控制se,
falg1: true,
timeOptions: [
{ label: "年份", value: 1 },
{ label: "季度", value: 2 },
{ label: "月份", value: 3 },
{ label: "周", value: 4 },
// { label: "自定义", value: 5 },
],
pickerOptions: {
shortcuts: [
{
text: "最近一周",
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
picker.$emit("pick", [start, end]);
},
},
{
text: "最近一个月",
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
picker.$emit("pick", [start, end]);
},
},
{
text: "最近三个月",
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
picker.$emit("pick", [start, end]);
},
},
],
},
intervald: this.interval,
tablenamed: this.tablename,
timeValue: [],
timehbValue: [],
backDisabled: false,
preDisabled: true,
huanbibiFalg: false,
tonbiFalg: false,
timeFlag: 0,
};
},
created() {},
mounted() {
let endTime = this.getEndTime();
let startTime = this.getStartTime(this.intervald, endTime);
// console.log(endTime,startTime,'endtime','startTime')
this.$store.commit("sagServerity/SET_TIMEINTERVAL",[startTime,endTime] )
this.timeValue = [startTime, endTime];
if (this.type == 2) {
this.huangbiyear();
} else if (!this.type) {
this.querfromdata();
}
},
methods: {
interchange(val) {
if (val == 1 || val == 2) {
this.timeFlag = 0;
} else {
this.timeFlag = 1;
}
// console.log(this.timeFlag);
this.intervald = val;
if (val == 5) {
this.tablenamed == "tab1";
this.disabled = false;
} else {
this.tablenamed == "tab2";
this.disabled = true;
}
},
// 获取当前日期,精确到日
getEndTime() {
var now = new Date();
var sep = "-";
var year = now.getFullYear();
var month = now.getMonth() + 1;
if (month < 10) {
month = "0" + month;
}
var date = now.getDate();
if (date < 10) {
date = "0" + date;
}
// 拼接当前的日期
var endTime = year + sep + month + sep + date;
return endTime;
},
// 获取起始日期
getStartTime(interval, endTime) {
var sep = "-";
var arr = endTime.split("-");
var year = arr[0];
var month = arr[1];
var date = arr[2];
// 按月份间隔
if (interval == 3) {
date = "01";
// 按季度间隔
} else if (interval == 2) {
if ((month > 0) & (month < 4)) {
// 第一季度
month = "01";
date = "01";
} else if (month > 3 && month < 7) {
// 第二季度
month = "04";
date = "01";
} else if (month > 6 && month < 10) {
// 第三季度
month = "07";
date = "01";
} else {
// 第四季度
month = "10";
date = "01";
}
} else if (interval == 1) {
month = "01";
date = "01";
} else if (interval == "半年") {
if (month < 7) {
month = "01";
date = "01";
} else {
month = "07";
date = "01";
}
} else if (interval == 4) {
//周
var start = new Date(year, month - 1, date);
var dayOfWeek = start.getDay() == 0 ? 7 : start.getDay(); // 如果为周日则置为7天
start.setDate(start.getDate() - dayOfWeek + 1); // 计算开始时间
if (this.formatTime(new Date()) != endTime) {
// 如果结束时间不是当前时间
var end = new Date(start);
end.setDate(end.getDate() + 6);
// $("#endTime").val(this.formatTime(end));
}
return this.formatTime(start);
}
var startTime = year + sep + month + sep + date;
return startTime;
},
// 时间格式化
formatTime(time) {
return (
time.getFullYear() +
"-" +
(time.getMonth() + 1 < 10 ? "0" : "") +
(time.getMonth() + 1) +
"-" +
(time.getDate() < 10 ? "0" : "") +
time.getDate()
);
},
//向前
preClick() {
let interval = this.intervald;
let startTime = this.timeValue[0];
let endTime = this.timeValue[1];
let year = parseInt(startTime.substring(0, 4));
let month = parseInt(startTime.substring(5, 7));
let date = parseInt(startTime.substring(8, 10));
//按月
if (interval == 3) {
// 换年份
if (month == 1) {
year = year - 1;
startTime = year + "-12-01";
endTime = year + "-12-31";
} else if (month <= 10) {
month = month - 1;
startTime = year + "-0" + month + "-01";
let day = this.getDays(year, month);
endTime = year + "-0" + month + "-" + day;
} else {
month = month - 1;
startTime = year + "-" + month + "-01";
let day = this.getDays(year, month);
endTime = year + "-" + month + "-" + day;
}
//按周
} else if (interval == 4) {
//根据开始时间推
let start = new Date(year, month - 1, date);
start.setDate(start.getDate() - 7);
startTime = this.formatTime(start);
var end = new Date(start);
end.setDate(start.getDate() + 6);
endTime = this.formatTime(end);
//按季度
} else if (interval == 2) {
// 换年份
if (month == 1) {
year = year - 1;
startTime = year + "-10-01";
endTime = year + "-12-31";
} else {
// 还是本年
month = month - 3;
startTime = year + "-0" + month + "-01";
month = month + 2;
var day = this.getDays(year, month);
endTime = year + "-0" + month + "-" + day;
}
//自定义
} else if (interval == 5) {
//按年
} else if (interval == 1) {
year = year - 1;
startTime = year + "-01-01";
endTime = year + "-12-31";
} else if (interval == 6) {
if (month <= 6) {
year = year - 1;
startTime = year + "-07-01";
endTime = year + "-12-31";
} else {
startTime = year + "-01-01";
endTime = year + "-06-30";
}
}
this.timeValue = [startTime, endTime];
// 判断向后键的状态
var temp = this.getEndTime();
this.timeStatus(temp, endTime);
},
//向后
back() {
let interval = this.intervald;
let startTime = this.timeValue[0];
let endTime = this.timeValue[1];
let year = parseInt(startTime.substring(0, 4));
let month = parseInt(startTime.substring(5, 7));
let date = parseInt(startTime.substring(8, 10));
var now = new Date();
// 获取当前年份
var presentY = now.getFullYear();
// 获取当前月份
var presentM = now.getMonth() + 1;
// 获取当前日期
var presentD = now.getDate();
if (interval == 3) {
if (month == 12) {
year = year + 1;
// 年份进位后,大于当前的年份,是不科学的
if (presentY < year) {
startTime = presentY + "-12-01";
if (presentD < 10) {
endTime = presentY + "-12" + "-0" + presentD;
} else {
endTime = presentY + "-12" + "-" + presentD;
}
// 年份进位后,等于当前的年份
} else if (presentY == year) {
startTime = year + "-01-01";
if (presentM > 1) {
endTime = year + "-01-31";
} else {
if (presentD < 10) {
endTime = year + "-01" + "-0" + presentD;
} else {
endTime = year + "-01" + "-" + presentD;
}
}
// 年份进位后,依旧小于当前的年份
} else {
startTime = year + "-01-01";
endTime = year + "-01-31";
}
} else {
month = month + 1;
// 年份等于当前年份
if (presentY == year) {
// 月份超过当前月份,是不科学的
if (month >= presentM) {
if (presentM < 10) {
startTime = year + "-0" + presentM + "-01";
if (presentD < 10) {
endTime = year + "-0" + presentM + "-0" + presentD;
} else {
endTime = year + "-0" + presentM + "-" + presentD;
}
} else {
startTime = year + "-" + presentM + "-01";
if (presentD < 10) {
endTime = year + "-" + presentM + "-0" + presentD;
} else {
endTime = year + "-" + presentM + "-" + presentD;
}
}
} else {
if (month < 10) {
startTime = year + "-0" + month + "-01";
var day = this.getDays(year, month);
endTime = year + "-0" + month + "-" + day;
} else {
startTime = year + "-" + month + "-01";
var day = this.getDays(year, month);
endTime = year + "-" + month + "-" + day;
}
}
// 年份小于当前的年份
} else {
if (month < 10) {
startTime = year + "-0" + month + "-01";
var day = this.getDays(year, month);
endTime = year + "-0" + month + "-" + day;
} else {
startTime = year + "-" + month + "-01";
var day = this.getDays(year, month);
endTime = year + "-" + month + "-" + day;
}
}
}
} else if (interval == 2) {
// 前进需要年份进位
if (month == 10) {
year = year + 1;
// 年份进位后大于当前年份是不科学的
if (year > presentY) {
startTime = presentY + "-10-01";
if (presentD < 10) {
endTime = year + "-" + presentM + "-0" + presentD;
} else {
endTime = year + "-" + presentM + "-" + presentD;
}
} else if (year == presentY) {
startTime = year + "-01-01";
// 当前月份大约3月份
if (presentM > 3) {
endTime = year + "-03-31";
} else {
// 当前月份也在第一季度里
if (presentD < 10) {
endTime = year + "-0" + presentM + "-0" + presentD;
} else {
endTime = year + "-0" + presentM + "-" + presentD;
}
}
} else {
startTime = year + "-01-01";
endTime = year + "-03-31";
}
} else {
month = month + 3;
// 季度进位后,超过当前月份是不科学的
if (year == presentY) {
if (month >= presentM) {
// 当季度进位后大于当前月,以当前月的时间显示季度
if (presentM > 0 && presentM < 4) {
// 第一季度
startTime = year + "-01-01";
if (presentD < 10) {
endTime = year + "-0" + presentM + "-0" + presentD;
} else {
endTime = year + "-0" + presentM + "-" + presentD;
}
} else if (presentM > 3 && presentM < 7) {
// 第二季度
startTime = year + "-04-01";
if (presentD < 10) {
endTime = year + "-0" + presentM + "-0" + presentD;
} else {
endTime = year + "-0" + presentM + "-" + presentD;
}
} else if (presentM > 6 && presentM < 10) {
// 第三季度
startTime = year + "-07-01";
if (presentD < 10) {
endTime = year + "-0" + presentM + "-0" + presentD;
} else {
endTime = year + "-0" + presentM + "-" + presentD;
}
} else {
// 第四季度
startTime = year + "-10-01";
if (presentD < 10) {
endTime = year + "-" + presentM + "-0" + presentD;
} else {
endTime = year + "-" + presentM + "-" + presentD;
}
}
} else {
if (month == 10) {
startTime = year + "-" + month + "-01";
} else {
startTime = year + "-0" + month + "-01";
}
month = month + 2;
if (month >= presentM) {
endTime = this.getEndTime();
} else {
var day = this.getDays(year, month);
endTime = year + "-" + month + "-" + day;
}
}
} else {
if (month == 10) {
startTime = year + "-" + month + "-01";
month = month + 2;
var day = this.getDays(year, month);
endTime = year + "-" + month + "-" + day;
} else {
startTime = year + "-0" + month + "-01";
month = month + 2;
var day = this.getDays(year, month);
endTime = year + "-0" + month + "-" + day;
}
}
}
} else if (interval == 5) {
} else if (interval == 4) {
//根据开始时间推
var start = new Date(year, month - 1, date);
start.setDate(start.getDate() + 7);
startTime = this.formatTime(start);
var end = new Date(start);
end.setDate(start.getDate() + 6);
endTime = this.formatTime(end);
if (parseInt((end - new Date()) / 1000 / 60) > 24) {
//相差小时大于24小时即超过当天置为当天日期
endTime = this.formatTime(new Date());
}
} else {
year = year + 1;
// 年份进位后大于当前年份,是不科学的
if (year >= presentY) {
startTime = presentY + "-01-01";
if (presentM < 10) {
if (presentD < 10) {
endTime = presentY + "-0" + presentM + "-0" + presentD;
} else {
endTime = presentY + "-0" + presentM + "-" + presentD;
}
} else {
endTime = presentY + "-" + presentM + "-" + presentD;
}
} else {
startTime = year + "-01-01";
endTime = year + "-12-31";
}
}
this.timeValue = [startTime, endTime];
// 判断向后键的状态
var temp = this.getEndTime();
this.timeStatus(temp, endTime);
},
//当前按钮点击事件
nowTime() {
let interval = this.intervald;
let endTime = this.getEndTime();
let startTime = this.getStartTime(interval, endTime);
this.timeValue = [startTime, endTime];
// 判断向后键的状态
let temp = this.getEndTime();
this.timeStatus(temp, endTime);
},
//判断向后按钮
timeStatus(temp, endTime) {
// 判断next按钮的状态
if (temp == endTime) {
this.preDisabled = true;
} else {
this.preDisabled = false;
}
},
// 获取月份的天数
getDays(year, month) {
let max = new Date(year, month, 0).getDate();
return max;
},
querfromdata() {
//type用于区分是按钮触发还是钩子函数触发 1按钮触发 underfind 钩子触发
if (!this.type) {
var data = this.timeValue;
var timehbValue = "";
this.$emit("querfromdata", data, timehbValue, this.intervald);
} else if (this.type == 2) {
this.huangbiyear();
}
},
goto() {
this.$router.push({
path: "/harmonic-boot/algorithm",
query: { name: this.name, path: this.path },
});
},
//环比
huangbiyear() {
this.huanbibiFalg = true;
let interval = this.intervald;
let startTime = this.timeValue[0];
let endTime = this.timeValue[1];
let year = parseInt(startTime.substring(0, 4));
let month = parseInt(startTime.substring(5, 7));
let date = parseInt(startTime.substring(8, 10));
//按月
if (interval == 3) {
// 换年份
if (month == 1) {
year = year - 1;
startTime = year + "-12-01";
endTime = year + "-12-31";
} else if (month <= 10) {
month = month - 1;
startTime = year + "-0" + month + "-01";
let day = this.getDays(year, month);
endTime = year + "-0" + month + "-" + day;
} else {
month = month - 1;
startTime = year + "-" + month + "-01";
let day = this.getDays(year, month);
endTime = year + "-" + month + "-" + day;
}
//按周
} else if (interval == 4) {
//根据开始时间推
let start = new Date(year, month - 1, date);
start.setDate(start.getDate() - 7);
startTime = this.formatTime(start);
var end = new Date(start);
end.setDate(start.getDate() + 6);
endTime = this.formatTime(end);
//按季度
} else if (interval == 2) {
// 换年份
if (month == 1) {
year = year - 1;
startTime = year + "-10-01";
endTime = year + "-12-31";
} else {
// 还是本年
month = month - 3;
startTime = year + "-0" + month + "-01";
month = month + 2;
var day = this.getDays(year, month);
endTime = year + "-0" + month + "-" + day;
}
//自定义
} else if (interval == 5) {
//按年
} else if (interval == 1) {
year = year - 1;
startTime = year + "-01-01";
endTime = year + "-12-31";
} else if (interval == 6) {
if (month <= 6) {
year = year - 1;
startTime = year + "-07-01";
endTime = year + "-12-31";
} else {
startTime = year + "-01-01";
endTime = year + "-06-30";
}
}
this.timehbValue = [startTime, endTime];
var data = this.timeValue;
var timehbValue = this.timehbValue;
// debugger
this.$emit("querfromdata", data, timehbValue, interval);
// 判断向后键的状态
// var temp = this.getEndTime();
//this.timeStatus(temp, endTime);
},
//同比
tongbiyear() {
this.tonbiFalg = true;
let interval = this.intervald;
let startTime = this.timeValue[0];
let endTime = this.timeValue[1];
let year = parseInt(startTime.substring(0, 4));
let month = parseInt(startTime.substring(5, 7));
let date = parseInt(startTime.substring(8, 10));
//按月
if (interval == 3) {
year = year - 1;
if (month <= 10) {
startTime = year + "-0" + month + "-01";
let day = this.getDays(year, month);
endTime = year + "-0" + month + "-" + day;
} else {
startTime = year + "-" + month + "-01";
let day = this.getDays(year, month);
endTime = year + "-" + month + "-" + day;
}
//按周
} else if (interval == 4) {
//根据开始时间推
let start = new Date(year - 1, month, date);
start.setDate(start.getDate() - 7);
startTime = this.formatTime(start);
var end = new Date(start);
end.setDate(start.getDate() + 6);
endTime = this.formatTime(end);
//按季度
} else if (interval == 2) {
year = year - 1;
if (month < 10) {
startTime = year + "-0" + month + "-01";
} else {
startTime = year + "-" + month + "-01";
}
month = month + 2;
if (month <= 10) {
var day = this.getDays(year, month);
endTime = year + "-0" + month + "-" + day;
} else {
var day = this.getDays(year, month);
endTime = year + "-" + month + "-" + day;
}
//自定义
} else if (interval == 5) {
//按年
} else if (interval == 1) {
year = year - 1;
startTime = year + "-01-01";
endTime = year + "-12-31";
} else if (interval == 6) {
if (month <= 6) {
year = year - 1;
startTime = year + "-07-01";
endTime = year + "-12-31";
} else {
startTime = year + "-01-01";
endTime = year + "-06-30";
}
}
this.timehbValue = [startTime, endTime];
var data = this.timeValue;
var timehbValue = this.timehbValue;
this.$emit("querfromdata", data, timehbValue, interval);
},
},
};
</script>
<style lang="scss" scoped>
.spanColor {
color: $themeColor;
}
</style>

View File

@@ -0,0 +1,19 @@
//台账统计
import request from "@/utils/request";
//监测终端统计单位图表
export function Classification() {
return request({
url: "/api1/Indicator/Classification",
method: "post"
});
}
export function figure() {
return request({
url: "/api1/system-boot/census/getFigure",
method: "get"
});
}

View File

@@ -0,0 +1,60 @@
<template>
<div class="pd10">
<el-row style="overflow-y: hidden">
<el-col>
<Census></Census>
</el-col>
</el-row>
</div>
</template>
<script>
import Census from './PlanTraffic/Census.vue'
export default {
components: { Census },
data() {
return {
vh: '',
vh1: '',
activeName: 'first',
device: ''
}
},
created() {},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
computed: {
//计算表格高度
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem('appheight') - 80 + 'px'
this.vh1 = window.sessionStorage.getItem('appheight') - 20 + 'px'
},
handleClick(tab, event) {
// console.log(tab, event);
}
}
}
</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;
}
.block {
position: absolute;
right: 10px;
bottom: 10px;
}
</style>

View File

@@ -0,0 +1,481 @@
<template>
<div>
<el-row>
<el-col :span="24">
<div class="Top" ref="top">
<el-tabs
:tab-position="tabPosition"
v-model="active"
type="border-card"
:style="'height:' + vh1 + ';'"
>
<el-tab-pane label="基础套餐" name="first">
<div class="pd10">
<el-form :inline="true" class="demo-form-inline">
<div style="display: flex">
<el-form-item label="筛选">
<el-input v-model="i" placeholder="请输入内容"></el-input>
</el-form-item>
<div style="display: flex; justify-content: space-between; flex-grow: 1">
<el-form-item>
<el-button
type="primary"
class="ml10"
icon="el-icon-search"
@click="steady"
>
查询
</el-button>
</el-form-item>
<el-form-item>
<el-button type="primary" class="ml10" @click="add">新增</el-button>
</el-form-item>
</div>
</div>
</el-form>
<el-table
stripe
:data="tableData"
header-cell-class-name="table_header"
border
:height="height"
v-loading="isLoading"
style="width: 100%"
>
<el-table-column align="center" prop="name" label="套餐名"></el-table-column>
<el-table-column align="center" prop="flow" label="套餐流量(MB)"></el-table-column>
<el-table-column align="center" prop="updateBy" label="修改人"></el-table-column>
<el-table-column
align="center"
prop="updateTime"
label="修改时间"
></el-table-column>
<el-table-column align="center" prop="type" label="类型">
<template slot-scope="scope">
<el-tag type="primary" v-if="scope.row.type === 0">基础套餐</el-tag>
<el-tag type="primary" v-if="scope.row.type === 1">扩展套餐</el-tag>
</template>
</el-table-column>
<el-table-column align="center" prop="flag" label="类型">
<template slot-scope="scope">
<el-tag type="primary" v-if="scope.row.flag === 0">其他</el-tag>
<el-tag type="primary" v-if="scope.row.flag === 1">默认</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="180">
<template slot-scope="scope">
<el-button @click="edit(scope.row)" type="primary" size="mini">
修改
</el-button>
<el-button type="primary" size="mini" @click="deleteData(scope.row)">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- <el-table stripe
:data="totalData"
:height="height"
border
v-loading="isLoading"
style="width: 100%"
header-cell-class-name="table_header"
>
<el-table-column prop="point" label="套餐名">
</el-table-column>
<el-table-column
prop="point"
label="套餐流量(MB)"
></el-table-column>
<el-table-column
prop="point"
label="修改人"
></el-table-column>
<el-table-column
prop="point"
label="修改时间"
></el-table-column>
<el-table-column label="类型">
<template slot-scope="scope">
<el-tag @click="cha(scope.row)">{{
scope.row.point
}}</el-tag>
</template>
</el-table-column>
<el-table-column label="类型">
<template slot-scope="scope">
<el-tag @click="cha(scope.row)">{{
scope.row.point
}}</el-tag>
</template>
</el-table-column>
<el-table-column prop="" label="操作">
<template slot-scope="scope">
<el-button size="mini" type="primary" @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
<el-button size="mini" type="danger" @click="handleDelete(scope.$index, scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table> -->
</div>
</el-tab-pane>
<el-tab-pane label="扩展套餐" name="second">
<div class="pd10">
<el-form :inline="true" class="demo-form-inline">
<div style="display: flex">
<el-form-item label="筛选">
<el-input v-model="i" placeholder="请输入内容"></el-input>
</el-form-item>
<div style="display: flex; justify-content: space-between; flex-grow: 1">
<el-form-item>
<el-button
type="primary"
class="ml10"
icon="el-icon-search"
@click="steady"
>
查询
</el-button>
</el-form-item>
<el-form-item>
<el-button type="primary" class="ml10" @click="add">新增</el-button>
</el-form-item>
</div>
</div>
</el-form>
<el-table
stripe
:data="tableData1"
header-cell-class-name="table_header"
border
:height="height"
style="width: 100%"
>
<el-table-column align="center" prop="name" label="套餐名"></el-table-column>
<el-table-column align="center" prop="flow" label="套餐流量(MB)"></el-table-column>
<el-table-column align="center" prop="updateBy" label="修改人"></el-table-column>
<el-table-column
align="center"
prop="updateTime"
label="修改时间"
></el-table-column>
<el-table-column align="center" prop="type" label="类型">
<template slot-scope="scope">
<el-tag type="primary" v-if="scope.row.type === 0">基础套餐</el-tag>
<el-tag type="primary" v-if="scope.row.type === 1">扩展套餐</el-tag>
</template>
</el-table-column>
<el-table-column align="center" label="类型">
<template slot-scope="scope">
<el-tag type="primary" v-if="scope.row.flag === 0">当月生效</el-tag>
<el-tag type="primary" v-if="scope.row.flag === 1">连续生效</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="180">
<template slot-scope="scope">
<el-button @click="edit(scope.row)" type="primary" size="mini">
修改
</el-button>
<el-button type="primary" size="mini" @click="deleteData(scope.row)">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- <el-table stripe
:data="totalData1"
:height="height"
border
v-loading="isLoading"
style="width: 100%"
header-cell-class-name="table_header"
>
<el-table-column prop="point" label="套餐名">
</el-table-column>
<el-table-column
prop="point"
label="套餐流量(MB)"
></el-table-column>
<el-table-column
prop="point"
label="修改人"
></el-table-column>
<el-table-column
prop="point"
label="修改时间"
></el-table-column>
<el-table-column label="类型">
<template slot-scope="scope">
<el-tag @click="cha(scope.row)">{{
scope.row.point
}}</el-tag>
</template>
</el-table-column>
<el-table-column label="类型">
<template slot-scope="scope">
<el-tag @click="cha(scope.row)">{{
scope.row.point
}}</el-tag>
</template>
</el-table-column>
<el-table-column prop="" label="操作">
<template slot-scope="scope">
<el-button size="mini" type="primary" @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
<el-button size="mini" type="danger" @click="handleDelete(scope.$index, scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table> -->
</div>
</el-tab-pane>
</el-tabs>
</div>
</el-col>
</el-row>
<el-dialog
:close-on-click-modal="false"
title="编辑"
:visible.sync="dialogVisible"
width="20%"
:before-close="handleClose"
>
<el-form ref="form" :model="form" label-width="130px" :inline="true" class="demo-form-inline">
<el-form-item label="套餐名称:" style="margin-top: 20px">
<el-input v-model="form.name" clearable></el-input>
</el-form-item>
<el-form-item label="套餐流量:" style="margin-top: 20px">
<el-input v-model="form.type" clearable></el-input>
</el-form-item>
<el-form-item label="套餐类型:" style="margin-top: 20px">
<el-select v-model="value" placeholder="请选择">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="二级类型:" style="margin-top: 20px">
<el-select v-model="value" placeholder="请选择">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
</el-form>
<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>
<el-dialog
:close-on-click-modal="false"
title="新增"
:visible.sync="dialogVisible1"
width="20%"
:before-close="handleClose"
>
<el-form ref="form" :model="form" label-width="130px" :inline="true" class="demo-form-inline">
<el-form-item label="套餐名称:" style="margin-top: 20px">
<el-input v-model="form.name" clearable></el-input>
</el-form-item>
<el-form-item label="套餐流量:" style="margin-top: 20px">
<el-input v-model="form.type" clearable></el-input>
</el-form-item>
<el-form-item label="套餐类型:" style="margin-top: 20px">
<el-select v-model="value" placeholder="请选择">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="二级类型:" style="margin-top: 20px">
<el-select v-model="value" placeholder="请选择">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible1 = false"> </el-button>
<el-button type="primary" @click="dialogVisible1 = false"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import Area from '@/views/components/Area/Area.vue'
import flow from '@/api/device/flow'
import { viewheight } from '@/assets/commjs/common'
import Timslot from './Timeslot.vue'
export default {
components: { Area, Timslot },
data() {
return {
i: '',
vh1: '',
dialogVisible: false,
dialogVisible1: false,
options: [
{
value: '选项1',
label: '电铁'
},
{
value: '选项2',
label: '换流站'
},
{
value: '选项3',
label: '风电'
},
{
value: '选项4',
label: '光伏'
},
{
value: '选项5',
label: '其他非线性负荷'
},
{
value: '选项6',
label: '敏感重要高危用户'
},
{
value: '选项7',
label: '变电站'
},
{
value: '选项8',
label: '跨省关口'
},
{
value: '选项9',
label: '其他'
}
],
value: '',
form: {
date: '',
name: '',
value: ''
},
height: null,
isLoading: false,
//稳态指标超标统计
totalData: [],
totalData1: [],
active_active: 'first-first',
zoom: undefined, //图表焦点校验
vh: '',
height: 265,
device: '',
getHeight: '',
tabPosition: 'top',
active: 'first',
isLoading: false,
isLoading2: false,
isLoading3: false,
isLoading4: false,
serialData: []
}
},
created() {},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
setTimeout(() => {
this.getHeight = Number(this.$refs.getHeight.offsetHeight - 45)
}, 0)
//echarts图表调用
this.zoom = 1 / document.body.style.zoom
this.getList()
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh1 = window.sessionStorage.getItem('appheight') - 20 + 'px'
this.device = window.devicePixelRatio
this.height = window.sessionStorage.getItem('appheight') - 175 + 'px'
this.vh = (viewheight() - 90) / 2 + 'px'
this.zoom = 1 / document.body.style.zoom
},
add() {
this.dialogVisible1 = true
},
handleClose() {
this.dialogVisible = false
this.dialogVisible1 = false
},
handleEdit(val) {
this.dialogVisible = true
// console.log(val, "valvalval");
},
cellStyle(row, column, rowIndex, columnIndex) {
// console.log(row);
if (row.columnIndex == 2 || row.columnIndex == 3 || row.columnIndex == 4 || row.columnIndex == 5) {
return 'font-weight: 600;'
}
},
//监测终端统计echarts图表
//获取主界面列表
getList() {
flow.getList().then(response => {
if (response.code === 'A0000') {
this.tableData = response.data.filter(item => {
if (item.type === 0) {
return item
}
})
this.totalData1 = response.data.filter(item => {
if (item.type === 1) {
return item
}
})
// this.stashList = this.tableData //暂存数组 当搜索为空时候 数组展示所有数据
// this.stashListExtend = this.tableDataExtend
}
})
}
}
}
</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;
}
.prop {
font-weight: 600;
}
::v-deep .el-table__body-wrapper.is-scrolling-none {
height: 227px !important;
}
</style>

View File

@@ -0,0 +1,787 @@
<template>
<div style="display: inline-block; width: 100%; margin-bottom: 10px">
<span style="font-size: 14px; font-weight: 550">
<span class="spanColor">间隔:</span>
</span>
<el-select
style="width: 90px; margin-left: 10px"
v-model="intervald"
@change="interchange"
placeholder="请选择"
>
<el-option
v-for="item in timeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
<el-date-picker
style="width: 230px"
:disabled="disabled"
:readonly="pickDisabled"
:clearable="false"
v-model="timeValue"
:picker-options="pickerOptions"
type="daterange"
value-format="yyyy-MM-dd"
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
align="right"
>
</el-date-picker>
<div style="display: inline" v-if="buttonShow">
<el-button
:disabled="backDisabled"
type="primary"
icon="el-icon-d-arrow-left"
@click="preClick"
style="margin-left: 10px"
></el-button>
<el-button @click="nowTime" type="primary" style="margin-left: 5px"
>当前</el-button
>
<el-button
:disabled="preDisabled"
type="primary"
icon="el-icon-d-arrow-right"
@click="back"
style="margin-left: 5px"
></el-button>
</div>
<!-- <el-button
@click="querfromdata"
type="primary"
icon="el-icon-search"
style="margin-left: 10px"
>查询</el-button
> -->
</div>
</template>
<script>
export default {
name: "index4",
props: {
name: {
type: String,
default: undefined,
},
path: {
type: String,
default: undefined,
},
tablename: {
type: String,
default: undefined,
},
interval: {
type: Number,
default: undefined,
},
type: {
type: Number,
default: undefined,
},
falg: {
type: Boolean,
default: false,
},
query: {
type: Boolean,
default: false,
},
thb: {
type: Boolean,
default: false,
},
},
watch: {
intervald(val) {
if (val != 5) {
let endTime = this.getEndTime();
let startTime = this.getStartTime(this.intervald, endTime);
this.timeValue = [startTime, endTime];
this.pickDisabled = false;
this.buttonShow = true;
} else {
let endTime = this.getEndTime();
let startTime = this.getStartTime(this.intervald, endTime);
this.timeValue = [startTime, endTime];
this.buttonShow = false;
this.pickDisabled = false;
}
},
},
data() {
return {
disabled: true,
buttonShow: true, //向前向后按钮显示隐藏控制按钮
pickDisabled: false, //时间组件只读控制se,
falg1: true,
timeOptions: [
{ label: "年份", value: 1 },
{ label: "季度", value: 2 },
{ label: "月份", value: 3 },
{ label: "周", value: 4 },
// { label: "自定义", value: 5 },
],
pickerOptions: {
shortcuts: [
{
text: "最近一周",
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
picker.$emit("pick", [start, end]);
},
},
{
text: "最近一个月",
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
picker.$emit("pick", [start, end]);
},
},
{
text: "最近三个月",
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
picker.$emit("pick", [start, end]);
},
},
],
},
intervald: this.interval,
tablenamed: this.tablename,
timeValue: [],
timehbValue: [],
backDisabled: false,
preDisabled: true,
huanbibiFalg: false,
tonbiFalg: false,
timeFlag: 0,
};
},
created() {},
mounted() {
let endTime = this.getEndTime();
let startTime = this.getStartTime(this.intervald, endTime);
// console.log(endTime,startTime,'endtime','startTime')
this.$store.commit("sagServerity/SET_TIMEINTERVAL",[startTime,endTime] )
this.timeValue = [startTime, endTime];
if (this.type == 2) {
this.huangbiyear();
} else if (!this.type) {
this.querfromdata();
}
},
methods: {
interchange(val) {
if (val == 1 || val == 2) {
this.timeFlag = 0;
} else {
this.timeFlag = 1;
}
// console.log(this.timeFlag);
this.intervald = val;
if (val == 5) {
this.tablenamed == "tab1";
this.disabled = false;
} else {
this.tablenamed == "tab2";
this.disabled = true;
}
},
// 获取当前日期,精确到日
getEndTime() {
var now = new Date();
var sep = "-";
var year = now.getFullYear();
var month = now.getMonth() + 1;
if (month < 10) {
month = "0" + month;
}
var date = now.getDate();
if (date < 10) {
date = "0" + date;
}
// 拼接当前的日期
var endTime = year + sep + month + sep + date;
return endTime;
},
// 获取起始日期
getStartTime(interval, endTime) {
var sep = "-";
var arr = endTime.split("-");
var year = arr[0];
var month = arr[1];
var date = arr[2];
// 按月份间隔
if (interval == 3) {
date = "01";
// 按季度间隔
} else if (interval == 2) {
if ((month > 0) & (month < 4)) {
// 第一季度
month = "01";
date = "01";
} else if (month > 3 && month < 7) {
// 第二季度
month = "04";
date = "01";
} else if (month > 6 && month < 10) {
// 第三季度
month = "07";
date = "01";
} else {
// 第四季度
month = "10";
date = "01";
}
} else if (interval == 1) {
month = "01";
date = "01";
} else if (interval == "半年") {
if (month < 7) {
month = "01";
date = "01";
} else {
month = "07";
date = "01";
}
} else if (interval == 4) {
//周
var start = new Date(year, month - 1, date);
var dayOfWeek = start.getDay() == 0 ? 7 : start.getDay(); // 如果为周日则置为7天
start.setDate(start.getDate() - dayOfWeek + 1); // 计算开始时间
if (this.formatTime(new Date()) != endTime) {
// 如果结束时间不是当前时间
var end = new Date(start);
end.setDate(end.getDate() + 6);
// $("#endTime").val(this.formatTime(end));
}
return this.formatTime(start);
}
var startTime = year + sep + month + sep + date;
return startTime;
},
// 时间格式化
formatTime(time) {
return (
time.getFullYear() +
"-" +
(time.getMonth() + 1 < 10 ? "0" : "") +
(time.getMonth() + 1) +
"-" +
(time.getDate() < 10 ? "0" : "") +
time.getDate()
);
},
//向前
preClick() {
let interval = this.intervald;
let startTime = this.timeValue[0];
let endTime = this.timeValue[1];
let year = parseInt(startTime.substring(0, 4));
let month = parseInt(startTime.substring(5, 7));
let date = parseInt(startTime.substring(8, 10));
//按月
if (interval == 3) {
// 换年份
if (month == 1) {
year = year - 1;
startTime = year + "-12-01";
endTime = year + "-12-31";
} else if (month <= 10) {
month = month - 1;
startTime = year + "-0" + month + "-01";
let day = this.getDays(year, month);
endTime = year + "-0" + month + "-" + day;
} else {
month = month - 1;
startTime = year + "-" + month + "-01";
let day = this.getDays(year, month);
endTime = year + "-" + month + "-" + day;
}
//按周
} else if (interval == 4) {
//根据开始时间推
let start = new Date(year, month - 1, date);
start.setDate(start.getDate() - 7);
startTime = this.formatTime(start);
var end = new Date(start);
end.setDate(start.getDate() + 6);
endTime = this.formatTime(end);
//按季度
} else if (interval == 2) {
// 换年份
if (month == 1) {
year = year - 1;
startTime = year + "-10-01";
endTime = year + "-12-31";
} else {
// 还是本年
month = month - 3;
startTime = year + "-0" + month + "-01";
month = month + 2;
var day = this.getDays(year, month);
endTime = year + "-0" + month + "-" + day;
}
//自定义
} else if (interval == 5) {
//按年
} else if (interval == 1) {
year = year - 1;
startTime = year + "-01-01";
endTime = year + "-12-31";
} else if (interval == 6) {
if (month <= 6) {
year = year - 1;
startTime = year + "-07-01";
endTime = year + "-12-31";
} else {
startTime = year + "-01-01";
endTime = year + "-06-30";
}
}
this.timeValue = [startTime, endTime];
// 判断向后键的状态
var temp = this.getEndTime();
this.timeStatus(temp, endTime);
},
//向后
back() {
let interval = this.intervald;
let startTime = this.timeValue[0];
let endTime = this.timeValue[1];
let year = parseInt(startTime.substring(0, 4));
let month = parseInt(startTime.substring(5, 7));
let date = parseInt(startTime.substring(8, 10));
var now = new Date();
// 获取当前年份
var presentY = now.getFullYear();
// 获取当前月份
var presentM = now.getMonth() + 1;
// 获取当前日期
var presentD = now.getDate();
if (interval == 3) {
if (month == 12) {
year = year + 1;
// 年份进位后,大于当前的年份,是不科学的
if (presentY < year) {
startTime = presentY + "-12-01";
if (presentD < 10) {
endTime = presentY + "-12" + "-0" + presentD;
} else {
endTime = presentY + "-12" + "-" + presentD;
}
// 年份进位后,等于当前的年份
} else if (presentY == year) {
startTime = year + "-01-01";
if (presentM > 1) {
endTime = year + "-01-31";
} else {
if (presentD < 10) {
endTime = year + "-01" + "-0" + presentD;
} else {
endTime = year + "-01" + "-" + presentD;
}
}
// 年份进位后,依旧小于当前的年份
} else {
startTime = year + "-01-01";
endTime = year + "-01-31";
}
} else {
month = month + 1;
// 年份等于当前年份
if (presentY == year) {
// 月份超过当前月份,是不科学的
if (month >= presentM) {
if (presentM < 10) {
startTime = year + "-0" + presentM + "-01";
if (presentD < 10) {
endTime = year + "-0" + presentM + "-0" + presentD;
} else {
endTime = year + "-0" + presentM + "-" + presentD;
}
} else {
startTime = year + "-" + presentM + "-01";
if (presentD < 10) {
endTime = year + "-" + presentM + "-0" + presentD;
} else {
endTime = year + "-" + presentM + "-" + presentD;
}
}
} else {
if (month < 10) {
startTime = year + "-0" + month + "-01";
var day = this.getDays(year, month);
endTime = year + "-0" + month + "-" + day;
} else {
startTime = year + "-" + month + "-01";
var day = this.getDays(year, month);
endTime = year + "-" + month + "-" + day;
}
}
// 年份小于当前的年份
} else {
if (month < 10) {
startTime = year + "-0" + month + "-01";
var day = this.getDays(year, month);
endTime = year + "-0" + month + "-" + day;
} else {
startTime = year + "-" + month + "-01";
var day = this.getDays(year, month);
endTime = year + "-" + month + "-" + day;
}
}
}
} else if (interval == 2) {
// 前进需要年份进位
if (month == 10) {
year = year + 1;
// 年份进位后大于当前年份是不科学的
if (year > presentY) {
startTime = presentY + "-10-01";
if (presentD < 10) {
endTime = year + "-" + presentM + "-0" + presentD;
} else {
endTime = year + "-" + presentM + "-" + presentD;
}
} else if (year == presentY) {
startTime = year + "-01-01";
// 当前月份大约3月份
if (presentM > 3) {
endTime = year + "-03-31";
} else {
// 当前月份也在第一季度里
if (presentD < 10) {
endTime = year + "-0" + presentM + "-0" + presentD;
} else {
endTime = year + "-0" + presentM + "-" + presentD;
}
}
} else {
startTime = year + "-01-01";
endTime = year + "-03-31";
}
} else {
month = month + 3;
// 季度进位后,超过当前月份是不科学的
if (year == presentY) {
if (month >= presentM) {
// 当季度进位后大于当前月,以当前月的时间显示季度
if (presentM > 0 && presentM < 4) {
// 第一季度
startTime = year + "-01-01";
if (presentD < 10) {
endTime = year + "-0" + presentM + "-0" + presentD;
} else {
endTime = year + "-0" + presentM + "-" + presentD;
}
} else if (presentM > 3 && presentM < 7) {
// 第二季度
startTime = year + "-04-01";
if (presentD < 10) {
endTime = year + "-0" + presentM + "-0" + presentD;
} else {
endTime = year + "-0" + presentM + "-" + presentD;
}
} else if (presentM > 6 && presentM < 10) {
// 第三季度
startTime = year + "-07-01";
if (presentD < 10) {
endTime = year + "-0" + presentM + "-0" + presentD;
} else {
endTime = year + "-0" + presentM + "-" + presentD;
}
} else {
// 第四季度
startTime = year + "-10-01";
if (presentD < 10) {
endTime = year + "-" + presentM + "-0" + presentD;
} else {
endTime = year + "-" + presentM + "-" + presentD;
}
}
} else {
if (month == 10) {
startTime = year + "-" + month + "-01";
} else {
startTime = year + "-0" + month + "-01";
}
month = month + 2;
if (month >= presentM) {
endTime = this.getEndTime();
} else {
var day = this.getDays(year, month);
endTime = year + "-" + month + "-" + day;
}
}
} else {
if (month == 10) {
startTime = year + "-" + month + "-01";
month = month + 2;
var day = this.getDays(year, month);
endTime = year + "-" + month + "-" + day;
} else {
startTime = year + "-0" + month + "-01";
month = month + 2;
var day = this.getDays(year, month);
endTime = year + "-0" + month + "-" + day;
}
}
}
} else if (interval == 5) {
} else if (interval == 4) {
//根据开始时间推
var start = new Date(year, month - 1, date);
start.setDate(start.getDate() + 7);
startTime = this.formatTime(start);
var end = new Date(start);
end.setDate(start.getDate() + 6);
endTime = this.formatTime(end);
if (parseInt((end - new Date()) / 1000 / 60) > 24) {
//相差小时大于24小时即超过当天置为当天日期
endTime = this.formatTime(new Date());
}
} else {
year = year + 1;
// 年份进位后大于当前年份,是不科学的
if (year >= presentY) {
startTime = presentY + "-01-01";
if (presentM < 10) {
if (presentD < 10) {
endTime = presentY + "-0" + presentM + "-0" + presentD;
} else {
endTime = presentY + "-0" + presentM + "-" + presentD;
}
} else {
endTime = presentY + "-" + presentM + "-" + presentD;
}
} else {
startTime = year + "-01-01";
endTime = year + "-12-31";
}
}
this.timeValue = [startTime, endTime];
// 判断向后键的状态
var temp = this.getEndTime();
this.timeStatus(temp, endTime);
},
//当前按钮点击事件
nowTime() {
let interval = this.intervald;
let endTime = this.getEndTime();
let startTime = this.getStartTime(interval, endTime);
this.timeValue = [startTime, endTime];
// 判断向后键的状态
let temp = this.getEndTime();
this.timeStatus(temp, endTime);
},
//判断向后按钮
timeStatus(temp, endTime) {
// 判断next按钮的状态
if (temp == endTime) {
this.preDisabled = true;
} else {
this.preDisabled = false;
}
},
// 获取月份的天数
getDays(year, month) {
let max = new Date(year, month, 0).getDate();
return max;
},
querfromdata() {
//type用于区分是按钮触发还是钩子函数触发 1按钮触发 underfind 钩子触发
if (!this.type) {
var data = this.timeValue;
var timehbValue = "";
this.$emit("querfromdata", data, timehbValue, this.intervald);
} else if (this.type == 2) {
this.huangbiyear();
}
},
goto() {
this.$router.push({
path: "/harmonic-boot/algorithm",
query: { name: this.name, path: this.path },
});
},
//环比
huangbiyear() {
this.huanbibiFalg = true;
let interval = this.intervald;
let startTime = this.timeValue[0];
let endTime = this.timeValue[1];
let year = parseInt(startTime.substring(0, 4));
let month = parseInt(startTime.substring(5, 7));
let date = parseInt(startTime.substring(8, 10));
//按月
if (interval == 3) {
// 换年份
if (month == 1) {
year = year - 1;
startTime = year + "-12-01";
endTime = year + "-12-31";
} else if (month <= 10) {
month = month - 1;
startTime = year + "-0" + month + "-01";
let day = this.getDays(year, month);
endTime = year + "-0" + month + "-" + day;
} else {
month = month - 1;
startTime = year + "-" + month + "-01";
let day = this.getDays(year, month);
endTime = year + "-" + month + "-" + day;
}
//按周
} else if (interval == 4) {
//根据开始时间推
let start = new Date(year, month - 1, date);
start.setDate(start.getDate() - 7);
startTime = this.formatTime(start);
var end = new Date(start);
end.setDate(start.getDate() + 6);
endTime = this.formatTime(end);
//按季度
} else if (interval == 2) {
// 换年份
if (month == 1) {
year = year - 1;
startTime = year + "-10-01";
endTime = year + "-12-31";
} else {
// 还是本年
month = month - 3;
startTime = year + "-0" + month + "-01";
month = month + 2;
var day = this.getDays(year, month);
endTime = year + "-0" + month + "-" + day;
}
//自定义
} else if (interval == 5) {
//按年
} else if (interval == 1) {
year = year - 1;
startTime = year + "-01-01";
endTime = year + "-12-31";
} else if (interval == 6) {
if (month <= 6) {
year = year - 1;
startTime = year + "-07-01";
endTime = year + "-12-31";
} else {
startTime = year + "-01-01";
endTime = year + "-06-30";
}
}
this.timehbValue = [startTime, endTime];
var data = this.timeValue;
var timehbValue = this.timehbValue;
// debugger
this.$emit("querfromdata", data, timehbValue, interval);
// 判断向后键的状态
// var temp = this.getEndTime();
//this.timeStatus(temp, endTime);
},
//同比
tongbiyear() {
this.tonbiFalg = true;
let interval = this.intervald;
let startTime = this.timeValue[0];
let endTime = this.timeValue[1];
let year = parseInt(startTime.substring(0, 4));
let month = parseInt(startTime.substring(5, 7));
let date = parseInt(startTime.substring(8, 10));
//按月
if (interval == 3) {
year = year - 1;
if (month <= 10) {
startTime = year + "-0" + month + "-01";
let day = this.getDays(year, month);
endTime = year + "-0" + month + "-" + day;
} else {
startTime = year + "-" + month + "-01";
let day = this.getDays(year, month);
endTime = year + "-" + month + "-" + day;
}
//按周
} else if (interval == 4) {
//根据开始时间推
let start = new Date(year - 1, month, date);
start.setDate(start.getDate() - 7);
startTime = this.formatTime(start);
var end = new Date(start);
end.setDate(start.getDate() + 6);
endTime = this.formatTime(end);
//按季度
} else if (interval == 2) {
year = year - 1;
if (month < 10) {
startTime = year + "-0" + month + "-01";
} else {
startTime = year + "-" + month + "-01";
}
month = month + 2;
if (month <= 10) {
var day = this.getDays(year, month);
endTime = year + "-0" + month + "-" + day;
} else {
var day = this.getDays(year, month);
endTime = year + "-" + month + "-" + day;
}
//自定义
} else if (interval == 5) {
//按年
} else if (interval == 1) {
year = year - 1;
startTime = year + "-01-01";
endTime = year + "-12-31";
} else if (interval == 6) {
if (month <= 6) {
year = year - 1;
startTime = year + "-07-01";
endTime = year + "-12-31";
} else {
startTime = year + "-01-01";
endTime = year + "-06-30";
}
}
this.timehbValue = [startTime, endTime];
var data = this.timeValue;
var timehbValue = this.timehbValue;
this.$emit("querfromdata", data, timehbValue, interval);
},
},
};
</script>
<style lang="scss" scoped>
.spanColor {
color: $themeColor;
}
</style>

View File

@@ -0,0 +1,56 @@
<template>
<div class="pd10">
<el-row style="overflow-y: hidden">
<el-col>
<Census></Census>
</el-col>
</el-row>
</div>
</template>
<script>
import Census from './Policy/Census.vue'
export default {
components: { Census },
data() {
return {
vh: '',
vh1: '',
activeName: 'first'
}
},
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'
this.vh1 = window.sessionStorage.getItem('appheight') - 20 + 'px'
},
handleClick(tab, event) {
// console.log(tab, event);
}
}
}
</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;
}
.block {
position: absolute;
right: 10px;
bottom: 10px;
}
</style>

View File

@@ -0,0 +1,296 @@
<template>
<div>
<el-row>
<el-col :span="24">
<div class="Top" ref="top">
<div class="pd10">
<el-form :inline="true" :model="form" class="demo-form-inline">
<div style="display: flex">
<el-form-item label="筛选">
<el-input v-model="i" placeholder="请输入内容"></el-input>
</el-form-item>
<div style="display: flex; justify-content: space-between; flex-grow: 1">
<el-form-item>
<el-button type="primary" class="ml10" icon="el-icon-search" @click="steady">
查询
</el-button>
</el-form-item>
<el-form-item>
<el-button type="primary" class="ml10" @click="add">新增</el-button>
</el-form-item>
</div>
</div>
</el-form>
<el-table
stripe
:data="totalData"
:height="height"
border
v-loading="isLoading"
style="width: 100%"
header-cell-class-name="table_header"
>
<el-table-column prop="point" label="套餐名"></el-table-column>
<el-table-column prop="point" label="套餐流量(MB)"></el-table-column>
<el-table-column prop="point" label="修改人"></el-table-column>
<el-table-column prop="point" label="修改时间"></el-table-column>
<el-table-column label="类型">
<template slot-scope="scope">
<el-tag @click="cha(scope.row)">{{ scope.row.point }}</el-tag>
</template>
</el-table-column>
<el-table-column label="类型">
<template slot-scope="scope">
<el-tag @click="cha(scope.row)">{{ scope.row.point }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="" label="操作">
<template slot-scope="scope">
<el-button size="mini" type="primary" @click="handleEdit(scope.$index, scope.row)">
编辑
</el-button>
<el-button size="mini" type="danger" @click="handleDelete(scope.$index, scope.row)">
删除
</el-button>
</template>
</el-table-column>
</el-table>
</div>
</div>
</el-col>
</el-row>
<el-dialog
:close-on-click-modal="false"
title="编辑"
:visible.sync="dialogVisible"
width="20%"
:before-close="handleClose"
>
<el-form ref="form" :model="form" label-width="130px" :inline="true" class="demo-form-inline">
<el-form-item label="套餐名称:" style="margin-top: 20px">
<el-input v-model="form.name" clearable></el-input>
</el-form-item>
<el-form-item label="套餐流量:" style="margin-top: 20px">
<el-input v-model="form.type" clearable></el-input>
</el-form-item>
<el-form-item label="套餐类型:" style="margin-top: 20px">
<el-select v-model="value" placeholder="请选择">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="二级类型:" style="margin-top: 20px">
<el-select v-model="value" placeholder="请选择">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
</el-form>
<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>
<el-dialog
:close-on-click-modal="false"
title="新增"
:visible.sync="dialogVisible1"
width="20%"
:before-close="handleClose"
>
<el-form ref="form" :model="form" label-width="130px" :inline="true" class="demo-form-inline">
<el-form-item label="套餐名称:" style="margin-top: 20px">
<el-input v-model="form.name" clearable></el-input>
</el-form-item>
<el-form-item label="套餐流量:" style="margin-top: 20px">
<el-input v-model="form.type" clearable></el-input>
</el-form-item>
<el-form-item label="套餐类型:" style="margin-top: 20px">
<el-select v-model="value" placeholder="请选择">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="二级类型:" style="margin-top: 20px">
<el-select v-model="value" placeholder="请选择">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible1 = false"> </el-button>
<el-button type="primary" @click="dialogVisible1 = false"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import Area from '@/views/components/Area/Area.vue'
import { figure, serial, diagram, monthly } from './indicatorClassification.js'
import { viewheight } from '@/assets/commjs/common'
import { Classification } from './indicatorClassification.js'
import Timslot from './Timeslot.vue'
export default {
components: { Area, Timslot },
data() {
return {
i: '',
vh1: '',
dialogVisible: false,
dialogVisible1: false,
options: [
{
value: '选项1',
label: '电铁'
},
{
value: '选项2',
label: '换流站'
},
{
value: '选项3',
label: '风电'
},
{
value: '选项4',
label: '光伏'
},
{
value: '选项5',
label: '其他非线性负荷'
},
{
value: '选项6',
label: '敏感重要高危用户'
},
{
value: '选项7',
label: '变电站'
},
{
value: '选项8',
label: '跨省关口'
},
{
value: '选项9',
label: '其他'
}
],
value: '',
form: {
date: ''
},
height: null,
isLoading: false,
//稳态指标超标统计
totalData: [],
active_active: 'first-first',
zoom: undefined, //图表焦点校验
vh: '',
height: 265,
device: '',
getHeight: '',
tabPosition: 'top',
active: 'first',
isLoading: false,
isLoading2: false,
isLoading3: false,
isLoading4: false,
serialData: []
}
},
created() {
this.account()
this.steady()
},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
setTimeout(() => {
this.getHeight = Number(this.$refs.getHeight.offsetHeight - 45)
}, 0)
//echarts图表调用
this.zoom = 1 / document.body.style.zoom
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh1 = window.sessionStorage.getItem('appheight') - 20 + 'px'
this.device = window.devicePixelRatio
this.height = window.sessionStorage.getItem('appheight') - 175 + 'px'
this.vh = (viewheight() - 90) / 2 + 'px'
this.zoom = 1 / document.body.style.zoom
},
add() {
this.dialogVisible1 = true
},
handleClose() {
this.dialogVisible = false
this.dialogVisible1 = false
},
handleEdit(val) {
this.dialogVisible = true
// console.log(val, "valvalval");
},
cellStyle(row, column, rowIndex, columnIndex) {
// console.log(row);
if (row.columnIndex == 2 || row.columnIndex == 3 || row.columnIndex == 4 || row.columnIndex == 5) {
return 'font-weight: 600;'
}
},
//监测终端统计echarts图表
//方法调用台账统计数据接口
account() {
this.isLoading = true
this.isLoading2 = true
Classification().then(res => {
this.isLoading = false
this.serialData = res.data
})
}
}
}
</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;
}
.prop {
font-weight: 600;
}
::v-deep .el-table__body-wrapper.is-scrolling-none {
height: 227px !important;
}
</style>

View File

@@ -0,0 +1,787 @@
<template>
<div style="display: inline-block; width: 100%; margin-bottom: 10px">
<span style="font-size: 14px; font-weight: 550">
<span class="spanColor">间隔:</span>
</span>
<el-select
style="width: 90px; margin-left: 10px"
v-model="intervald"
@change="interchange"
placeholder="请选择"
>
<el-option
v-for="item in timeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
<el-date-picker
style="width: 230px"
:disabled="disabled"
:readonly="pickDisabled"
:clearable="false"
v-model="timeValue"
:picker-options="pickerOptions"
type="daterange"
value-format="yyyy-MM-dd"
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
align="right"
>
</el-date-picker>
<div style="display: inline" v-if="buttonShow">
<el-button
:disabled="backDisabled"
type="primary"
icon="el-icon-d-arrow-left"
@click="preClick"
style="margin-left: 10px"
></el-button>
<el-button @click="nowTime" type="primary" style="margin-left: 5px"
>当前</el-button
>
<el-button
:disabled="preDisabled"
type="primary"
icon="el-icon-d-arrow-right"
@click="back"
style="margin-left: 5px"
></el-button>
</div>
<!-- <el-button
@click="querfromdata"
type="primary"
icon="el-icon-search"
style="margin-left: 10px"
>查询</el-button
> -->
</div>
</template>
<script>
export default {
name: "index4",
props: {
name: {
type: String,
default: undefined,
},
path: {
type: String,
default: undefined,
},
tablename: {
type: String,
default: undefined,
},
interval: {
type: Number,
default: undefined,
},
type: {
type: Number,
default: undefined,
},
falg: {
type: Boolean,
default: false,
},
query: {
type: Boolean,
default: false,
},
thb: {
type: Boolean,
default: false,
},
},
watch: {
intervald(val) {
if (val != 5) {
let endTime = this.getEndTime();
let startTime = this.getStartTime(this.intervald, endTime);
this.timeValue = [startTime, endTime];
this.pickDisabled = false;
this.buttonShow = true;
} else {
let endTime = this.getEndTime();
let startTime = this.getStartTime(this.intervald, endTime);
this.timeValue = [startTime, endTime];
this.buttonShow = false;
this.pickDisabled = false;
}
},
},
data() {
return {
disabled: true,
buttonShow: true, //向前向后按钮显示隐藏控制按钮
pickDisabled: false, //时间组件只读控制se,
falg1: true,
timeOptions: [
{ label: "年份", value: 1 },
{ label: "季度", value: 2 },
{ label: "月份", value: 3 },
{ label: "周", value: 4 },
// { label: "自定义", value: 5 },
],
pickerOptions: {
shortcuts: [
{
text: "最近一周",
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
picker.$emit("pick", [start, end]);
},
},
{
text: "最近一个月",
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
picker.$emit("pick", [start, end]);
},
},
{
text: "最近三个月",
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
picker.$emit("pick", [start, end]);
},
},
],
},
intervald: this.interval,
tablenamed: this.tablename,
timeValue: [],
timehbValue: [],
backDisabled: false,
preDisabled: true,
huanbibiFalg: false,
tonbiFalg: false,
timeFlag: 0,
};
},
created() {},
mounted() {
let endTime = this.getEndTime();
let startTime = this.getStartTime(this.intervald, endTime);
// console.log(endTime,startTime,'endtime','startTime')
this.$store.commit("sagServerity/SET_TIMEINTERVAL",[startTime,endTime] )
this.timeValue = [startTime, endTime];
if (this.type == 2) {
this.huangbiyear();
} else if (!this.type) {
this.querfromdata();
}
},
methods: {
interchange(val) {
if (val == 1 || val == 2) {
this.timeFlag = 0;
} else {
this.timeFlag = 1;
}
// console.log(this.timeFlag);
this.intervald = val;
if (val == 5) {
this.tablenamed == "tab1";
this.disabled = false;
} else {
this.tablenamed == "tab2";
this.disabled = true;
}
},
// 获取当前日期,精确到日
getEndTime() {
var now = new Date();
var sep = "-";
var year = now.getFullYear();
var month = now.getMonth() + 1;
if (month < 10) {
month = "0" + month;
}
var date = now.getDate();
if (date < 10) {
date = "0" + date;
}
// 拼接当前的日期
var endTime = year + sep + month + sep + date;
return endTime;
},
// 获取起始日期
getStartTime(interval, endTime) {
var sep = "-";
var arr = endTime.split("-");
var year = arr[0];
var month = arr[1];
var date = arr[2];
// 按月份间隔
if (interval == 3) {
date = "01";
// 按季度间隔
} else if (interval == 2) {
if ((month > 0) & (month < 4)) {
// 第一季度
month = "01";
date = "01";
} else if (month > 3 && month < 7) {
// 第二季度
month = "04";
date = "01";
} else if (month > 6 && month < 10) {
// 第三季度
month = "07";
date = "01";
} else {
// 第四季度
month = "10";
date = "01";
}
} else if (interval == 1) {
month = "01";
date = "01";
} else if (interval == "半年") {
if (month < 7) {
month = "01";
date = "01";
} else {
month = "07";
date = "01";
}
} else if (interval == 4) {
//周
var start = new Date(year, month - 1, date);
var dayOfWeek = start.getDay() == 0 ? 7 : start.getDay(); // 如果为周日则置为7天
start.setDate(start.getDate() - dayOfWeek + 1); // 计算开始时间
if (this.formatTime(new Date()) != endTime) {
// 如果结束时间不是当前时间
var end = new Date(start);
end.setDate(end.getDate() + 6);
// $("#endTime").val(this.formatTime(end));
}
return this.formatTime(start);
}
var startTime = year + sep + month + sep + date;
return startTime;
},
// 时间格式化
formatTime(time) {
return (
time.getFullYear() +
"-" +
(time.getMonth() + 1 < 10 ? "0" : "") +
(time.getMonth() + 1) +
"-" +
(time.getDate() < 10 ? "0" : "") +
time.getDate()
);
},
//向前
preClick() {
let interval = this.intervald;
let startTime = this.timeValue[0];
let endTime = this.timeValue[1];
let year = parseInt(startTime.substring(0, 4));
let month = parseInt(startTime.substring(5, 7));
let date = parseInt(startTime.substring(8, 10));
//按月
if (interval == 3) {
// 换年份
if (month == 1) {
year = year - 1;
startTime = year + "-12-01";
endTime = year + "-12-31";
} else if (month <= 10) {
month = month - 1;
startTime = year + "-0" + month + "-01";
let day = this.getDays(year, month);
endTime = year + "-0" + month + "-" + day;
} else {
month = month - 1;
startTime = year + "-" + month + "-01";
let day = this.getDays(year, month);
endTime = year + "-" + month + "-" + day;
}
//按周
} else if (interval == 4) {
//根据开始时间推
let start = new Date(year, month - 1, date);
start.setDate(start.getDate() - 7);
startTime = this.formatTime(start);
var end = new Date(start);
end.setDate(start.getDate() + 6);
endTime = this.formatTime(end);
//按季度
} else if (interval == 2) {
// 换年份
if (month == 1) {
year = year - 1;
startTime = year + "-10-01";
endTime = year + "-12-31";
} else {
// 还是本年
month = month - 3;
startTime = year + "-0" + month + "-01";
month = month + 2;
var day = this.getDays(year, month);
endTime = year + "-0" + month + "-" + day;
}
//自定义
} else if (interval == 5) {
//按年
} else if (interval == 1) {
year = year - 1;
startTime = year + "-01-01";
endTime = year + "-12-31";
} else if (interval == 6) {
if (month <= 6) {
year = year - 1;
startTime = year + "-07-01";
endTime = year + "-12-31";
} else {
startTime = year + "-01-01";
endTime = year + "-06-30";
}
}
this.timeValue = [startTime, endTime];
// 判断向后键的状态
var temp = this.getEndTime();
this.timeStatus(temp, endTime);
},
//向后
back() {
let interval = this.intervald;
let startTime = this.timeValue[0];
let endTime = this.timeValue[1];
let year = parseInt(startTime.substring(0, 4));
let month = parseInt(startTime.substring(5, 7));
let date = parseInt(startTime.substring(8, 10));
var now = new Date();
// 获取当前年份
var presentY = now.getFullYear();
// 获取当前月份
var presentM = now.getMonth() + 1;
// 获取当前日期
var presentD = now.getDate();
if (interval == 3) {
if (month == 12) {
year = year + 1;
// 年份进位后,大于当前的年份,是不科学的
if (presentY < year) {
startTime = presentY + "-12-01";
if (presentD < 10) {
endTime = presentY + "-12" + "-0" + presentD;
} else {
endTime = presentY + "-12" + "-" + presentD;
}
// 年份进位后,等于当前的年份
} else if (presentY == year) {
startTime = year + "-01-01";
if (presentM > 1) {
endTime = year + "-01-31";
} else {
if (presentD < 10) {
endTime = year + "-01" + "-0" + presentD;
} else {
endTime = year + "-01" + "-" + presentD;
}
}
// 年份进位后,依旧小于当前的年份
} else {
startTime = year + "-01-01";
endTime = year + "-01-31";
}
} else {
month = month + 1;
// 年份等于当前年份
if (presentY == year) {
// 月份超过当前月份,是不科学的
if (month >= presentM) {
if (presentM < 10) {
startTime = year + "-0" + presentM + "-01";
if (presentD < 10) {
endTime = year + "-0" + presentM + "-0" + presentD;
} else {
endTime = year + "-0" + presentM + "-" + presentD;
}
} else {
startTime = year + "-" + presentM + "-01";
if (presentD < 10) {
endTime = year + "-" + presentM + "-0" + presentD;
} else {
endTime = year + "-" + presentM + "-" + presentD;
}
}
} else {
if (month < 10) {
startTime = year + "-0" + month + "-01";
var day = this.getDays(year, month);
endTime = year + "-0" + month + "-" + day;
} else {
startTime = year + "-" + month + "-01";
var day = this.getDays(year, month);
endTime = year + "-" + month + "-" + day;
}
}
// 年份小于当前的年份
} else {
if (month < 10) {
startTime = year + "-0" + month + "-01";
var day = this.getDays(year, month);
endTime = year + "-0" + month + "-" + day;
} else {
startTime = year + "-" + month + "-01";
var day = this.getDays(year, month);
endTime = year + "-" + month + "-" + day;
}
}
}
} else if (interval == 2) {
// 前进需要年份进位
if (month == 10) {
year = year + 1;
// 年份进位后大于当前年份是不科学的
if (year > presentY) {
startTime = presentY + "-10-01";
if (presentD < 10) {
endTime = year + "-" + presentM + "-0" + presentD;
} else {
endTime = year + "-" + presentM + "-" + presentD;
}
} else if (year == presentY) {
startTime = year + "-01-01";
// 当前月份大约3月份
if (presentM > 3) {
endTime = year + "-03-31";
} else {
// 当前月份也在第一季度里
if (presentD < 10) {
endTime = year + "-0" + presentM + "-0" + presentD;
} else {
endTime = year + "-0" + presentM + "-" + presentD;
}
}
} else {
startTime = year + "-01-01";
endTime = year + "-03-31";
}
} else {
month = month + 3;
// 季度进位后,超过当前月份是不科学的
if (year == presentY) {
if (month >= presentM) {
// 当季度进位后大于当前月,以当前月的时间显示季度
if (presentM > 0 && presentM < 4) {
// 第一季度
startTime = year + "-01-01";
if (presentD < 10) {
endTime = year + "-0" + presentM + "-0" + presentD;
} else {
endTime = year + "-0" + presentM + "-" + presentD;
}
} else if (presentM > 3 && presentM < 7) {
// 第二季度
startTime = year + "-04-01";
if (presentD < 10) {
endTime = year + "-0" + presentM + "-0" + presentD;
} else {
endTime = year + "-0" + presentM + "-" + presentD;
}
} else if (presentM > 6 && presentM < 10) {
// 第三季度
startTime = year + "-07-01";
if (presentD < 10) {
endTime = year + "-0" + presentM + "-0" + presentD;
} else {
endTime = year + "-0" + presentM + "-" + presentD;
}
} else {
// 第四季度
startTime = year + "-10-01";
if (presentD < 10) {
endTime = year + "-" + presentM + "-0" + presentD;
} else {
endTime = year + "-" + presentM + "-" + presentD;
}
}
} else {
if (month == 10) {
startTime = year + "-" + month + "-01";
} else {
startTime = year + "-0" + month + "-01";
}
month = month + 2;
if (month >= presentM) {
endTime = this.getEndTime();
} else {
var day = this.getDays(year, month);
endTime = year + "-" + month + "-" + day;
}
}
} else {
if (month == 10) {
startTime = year + "-" + month + "-01";
month = month + 2;
var day = this.getDays(year, month);
endTime = year + "-" + month + "-" + day;
} else {
startTime = year + "-0" + month + "-01";
month = month + 2;
var day = this.getDays(year, month);
endTime = year + "-0" + month + "-" + day;
}
}
}
} else if (interval == 5) {
} else if (interval == 4) {
//根据开始时间推
var start = new Date(year, month - 1, date);
start.setDate(start.getDate() + 7);
startTime = this.formatTime(start);
var end = new Date(start);
end.setDate(start.getDate() + 6);
endTime = this.formatTime(end);
if (parseInt((end - new Date()) / 1000 / 60) > 24) {
//相差小时大于24小时即超过当天置为当天日期
endTime = this.formatTime(new Date());
}
} else {
year = year + 1;
// 年份进位后大于当前年份,是不科学的
if (year >= presentY) {
startTime = presentY + "-01-01";
if (presentM < 10) {
if (presentD < 10) {
endTime = presentY + "-0" + presentM + "-0" + presentD;
} else {
endTime = presentY + "-0" + presentM + "-" + presentD;
}
} else {
endTime = presentY + "-" + presentM + "-" + presentD;
}
} else {
startTime = year + "-01-01";
endTime = year + "-12-31";
}
}
this.timeValue = [startTime, endTime];
// 判断向后键的状态
var temp = this.getEndTime();
this.timeStatus(temp, endTime);
},
//当前按钮点击事件
nowTime() {
let interval = this.intervald;
let endTime = this.getEndTime();
let startTime = this.getStartTime(interval, endTime);
this.timeValue = [startTime, endTime];
// 判断向后键的状态
let temp = this.getEndTime();
this.timeStatus(temp, endTime);
},
//判断向后按钮
timeStatus(temp, endTime) {
// 判断next按钮的状态
if (temp == endTime) {
this.preDisabled = true;
} else {
this.preDisabled = false;
}
},
// 获取月份的天数
getDays(year, month) {
let max = new Date(year, month, 0).getDate();
return max;
},
querfromdata() {
//type用于区分是按钮触发还是钩子函数触发 1按钮触发 underfind 钩子触发
if (!this.type) {
var data = this.timeValue;
var timehbValue = "";
this.$emit("querfromdata", data, timehbValue, this.intervald);
} else if (this.type == 2) {
this.huangbiyear();
}
},
goto() {
this.$router.push({
path: "/harmonic-boot/algorithm",
query: { name: this.name, path: this.path },
});
},
//环比
huangbiyear() {
this.huanbibiFalg = true;
let interval = this.intervald;
let startTime = this.timeValue[0];
let endTime = this.timeValue[1];
let year = parseInt(startTime.substring(0, 4));
let month = parseInt(startTime.substring(5, 7));
let date = parseInt(startTime.substring(8, 10));
//按月
if (interval == 3) {
// 换年份
if (month == 1) {
year = year - 1;
startTime = year + "-12-01";
endTime = year + "-12-31";
} else if (month <= 10) {
month = month - 1;
startTime = year + "-0" + month + "-01";
let day = this.getDays(year, month);
endTime = year + "-0" + month + "-" + day;
} else {
month = month - 1;
startTime = year + "-" + month + "-01";
let day = this.getDays(year, month);
endTime = year + "-" + month + "-" + day;
}
//按周
} else if (interval == 4) {
//根据开始时间推
let start = new Date(year, month - 1, date);
start.setDate(start.getDate() - 7);
startTime = this.formatTime(start);
var end = new Date(start);
end.setDate(start.getDate() + 6);
endTime = this.formatTime(end);
//按季度
} else if (interval == 2) {
// 换年份
if (month == 1) {
year = year - 1;
startTime = year + "-10-01";
endTime = year + "-12-31";
} else {
// 还是本年
month = month - 3;
startTime = year + "-0" + month + "-01";
month = month + 2;
var day = this.getDays(year, month);
endTime = year + "-0" + month + "-" + day;
}
//自定义
} else if (interval == 5) {
//按年
} else if (interval == 1) {
year = year - 1;
startTime = year + "-01-01";
endTime = year + "-12-31";
} else if (interval == 6) {
if (month <= 6) {
year = year - 1;
startTime = year + "-07-01";
endTime = year + "-12-31";
} else {
startTime = year + "-01-01";
endTime = year + "-06-30";
}
}
this.timehbValue = [startTime, endTime];
var data = this.timeValue;
var timehbValue = this.timehbValue;
// debugger
this.$emit("querfromdata", data, timehbValue, interval);
// 判断向后键的状态
// var temp = this.getEndTime();
//this.timeStatus(temp, endTime);
},
//同比
tongbiyear() {
this.tonbiFalg = true;
let interval = this.intervald;
let startTime = this.timeValue[0];
let endTime = this.timeValue[1];
let year = parseInt(startTime.substring(0, 4));
let month = parseInt(startTime.substring(5, 7));
let date = parseInt(startTime.substring(8, 10));
//按月
if (interval == 3) {
year = year - 1;
if (month <= 10) {
startTime = year + "-0" + month + "-01";
let day = this.getDays(year, month);
endTime = year + "-0" + month + "-" + day;
} else {
startTime = year + "-" + month + "-01";
let day = this.getDays(year, month);
endTime = year + "-" + month + "-" + day;
}
//按周
} else if (interval == 4) {
//根据开始时间推
let start = new Date(year - 1, month, date);
start.setDate(start.getDate() - 7);
startTime = this.formatTime(start);
var end = new Date(start);
end.setDate(start.getDate() + 6);
endTime = this.formatTime(end);
//按季度
} else if (interval == 2) {
year = year - 1;
if (month < 10) {
startTime = year + "-0" + month + "-01";
} else {
startTime = year + "-" + month + "-01";
}
month = month + 2;
if (month <= 10) {
var day = this.getDays(year, month);
endTime = year + "-0" + month + "-" + day;
} else {
var day = this.getDays(year, month);
endTime = year + "-" + month + "-" + day;
}
//自定义
} else if (interval == 5) {
//按年
} else if (interval == 1) {
year = year - 1;
startTime = year + "-01-01";
endTime = year + "-12-31";
} else if (interval == 6) {
if (month <= 6) {
year = year - 1;
startTime = year + "-07-01";
endTime = year + "-12-31";
} else {
startTime = year + "-01-01";
endTime = year + "-06-30";
}
}
this.timehbValue = [startTime, endTime];
var data = this.timeValue;
var timehbValue = this.timehbValue;
this.$emit("querfromdata", data, timehbValue, interval);
},
},
};
</script>
<style lang="scss" scoped>
.spanColor {
color: $themeColor;
}
</style>

View File

@@ -0,0 +1,18 @@
//台账统计
import request from "@/utils/request";
//监测终端统计单位图表
export function Classification() {
return request({
url: "/device-boot/rateOfFlow/getRateOfFlowStrategy",
method: "post",
data: data
});
}
export function figure() {
return request({
url: "/api1/system-boot/census/getFigure",
method: "get"
});
}

View File

@@ -0,0 +1,597 @@
<template>
<div class="pd10">
<div v-show="flg" v-loading="loading" element-loading-text="数据加载中">
<el-form :inline="true" :model="formData" class="demo-form-inline">
<el-form-item>
<Timeinterval ref="interval" :interval="3"></Timeinterval>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit" icon="el-icon-search">查询</el-button>
</el-form-item>
<el-form-item style="float: right">
<el-button type="primary" icon="el-icon-download" @click="exportEvent">导出</el-button>
<el-button type="primary" @click="backups">文件备份</el-button>
<!-- <el-button type="primary" @click="restore">文件恢复</el-button> -->
<el-button type="primary" @click="details">统计</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" :model="formData" label-width="90px" class="">
<el-form-item label="用户名:">
<el-select v-model="formData.loginName" placeholder="用户名" clearable filterable>
<el-option
v-for="item in userName"
:key="item.id"
:label="item.loginName"
:value="item.loginName"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="事件类型:">
<el-select v-model="formData.type" placeholder="事件类型" clearable>
<el-option
v-for="item in eventType"
: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.operateType" placeholder="操作类型" clearable>
<el-option
v-for="item in operationType"
:key="item.value"
:label="item.value"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="操作结果:">
<el-select v-model="formData.result" placeholder="操作结果" clearable>
<el-option
v-for="item in resultList"
:key="item.id"
:label="item.label"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
</el-form>
</div>
<vxe-table
size="mini"
stripe
:row-config="{ isCurrent: true, isHover: true }"
border
ref="management"
@sort-change="sortChangeEvent"
header-cell-class-name="table_header"
show-overflow="tooltip"
:data="datamock"
style="width: 100%"
:height="vh + 'px'"
>
<vxe-table-column
field="time"
title="操作时间"
align="center"
sortable
width="160"
show-overflow
></vxe-table-column>
<vxe-table-column field="userName" title="操作人员" align="center" width="120"></vxe-table-column>
<vxe-table-column
field="operate"
title="操作类型"
align="center"
sortable
width="220"
></vxe-table-column>
<vxe-table-column field="describe" title="事件描述" align="center"></vxe-table-column>
<vxe-table-column field="type" title="事件类型" align="center" sortable width="120"></vxe-table-column>
<vxe-table-column
field="result"
title="操作结果"
align="center"
sortable
width="120"
></vxe-table-column>
<vxe-table-column field="ip" title="操作IP" width="150" align="center"></vxe-table-column>
<vxe-table-column field="level" title="事件等级" align="center" sortable width="120"></vxe-table-column>
</vxe-table>
<el-pagination
background
align="right"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="formData.pageNum"
:page-sizes="[100, 200, 300, 500, 1000]"
:page-size="formData.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
class="mt10"
></el-pagination>
</div>
<div v-if="!flg" v-loading="loading1" element-loading-text="数据加载中">
<el-form :inline="true" :model="formLine" class="demo-form-inline">
<el-form-item>
<Time ref="intervaltime" :interval="3"></Time>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="OnSubmit" icon="el-icon-search">查询</el-button>
</el-form-item>
<el-form-item style="position: absolute; right: 10px; float: right">
<el-button type="primary" icon="el-icon-download" @click="exportEventstatistics">导出</el-button>
<el-button type="primary" @click="back">返回</el-button>
</el-form-item>
<el-form-item>
<el-button type="text" @click="closeHandle1">
条件筛选
<i :class="!view1 ? 'el-icon-arrow-down' : 'el-icon-arrow-right'"></i>
</el-button>
</el-form-item>
</el-form>
<div class="container" id="container1">
<i @click="closeHandle1" class="el-icon-circle-close coles"></i>
<el-form :inline="true" :model="formData" label-width="90px" class="">
<el-form-item label="用户名:">
<el-select v-model="formLine.loginName" placeholder="用户名" clearable filterable>
<el-option
v-for="item in userName"
:key="item.id"
:label="item.loginName"
:value="item.loginName"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="事件类型:">
<el-select v-model="formLine.type" placeholder="用户名" clearable>
<el-option
v-for="item in eventType"
:key="item.id"
:label="item.label"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="操作类型:">
<el-select v-model="formLine.operateType" placeholder="用户名" clearable>
<el-option
v-for="item in operationType"
:key="item.value"
:label="item.value"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
</el-form>
</div>
<vxe-table
size="mini"
:row-config="{ isCurrent: true, isHover: true }"
border
ref="management1"
header-cell-class-name="table_header"
:data="statisticsData"
style="width: 100%"
:height="vh + 'px'"
>
<vxe-table-column field="loginName" title="操作人员" align="center"></vxe-table-column>
<vxe-table-column field="operateType" title="事件类型" align="center"></vxe-table-column>
<vxe-table-column field="count" title="事件总数" align="center"></vxe-table-column>
</vxe-table>
<el-pagination
background
align="right"
@size-change="handleSizeChange1"
@current-change="handleCurrentChange1"
:current-page="formLine.pageNum"
:page-sizes="[20, 30, 40, 50, 100]"
:page-size="formLine.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="statisticsTotal"
class="mt10"
></el-pagination>
</div>
<MqttWs v-if="showMqtt" />
</div>
</template>
<script>
import Timeinterval from '@/views/components/Timeinterval.vue'
import Time from '@/views/components/Time.vue'
import {
getAllUserList,
getAuditLog,
censusAuditLog,
logFileWriter,
recoverLogFile,
getMemoInfo,
getSysConfig
} from '@/api/AuditManagement/AuditManagement'
import MqttWs from '@/components/Mqtt/mqttWs.vue'
export default {
components: {
Timeinterval,
Time,
MqttWs
},
props: {},
data() {
return {
loading: false,
loading1: false,
view: false,
view1: false,
flg: true,
showMqtt:false,
zoom: '', //图表焦点校验
vh: undefined,
formData: {
loginName: '', //用户名
type: '', //事件类型
operateType: '', //操作类型
result: null,
searchBeginTime: '', //开始
searchEndTime: '', //结束
sortBy: '',
sortName: '',
orderBy: '',
pageNum: 1,
pageSize: 100
},
formLine: {
loginName: '', //用户名
type: '', //事件类型
operateType: '', //操作类型
searchBeginTime: '', //开始
searchEndTime: '', //结束
sortBy: '',
sortName: '',
orderBy: '',
pageNum: 1,
pageSize: 20
},
item: ['', ''],
item1: ['', ''],
userName: [], //
resultList: [
{ id: 1, label: '成功' },
{ id: 0, label: '失败' }
],
datamock: [],
statisticsData: [],
eventType: [
{
id: 0,
label: '业务事件类型'
},
{
id: 1,
label: '系统事件类型'
}
], //事件类型
operationType: [
{ id: 1, value: '查询' },
{ id: 2, value: '新增' },
{ id: 3, value: '更新' },
{ id: 4, value: '删除' },
{ id: 5, value: '认证' },
{ id: 6, value: '注销' },
{ id: 7, value: '上传' },
{ id: 8, value: '下载' },
{ id: 9, value: '越权访问' }
], //操作类型
timeFlag: '',
total: undefined,
statisticsTotal: undefined
}
},
created() {
this.search()
},
mounted() {
this.zoom = 1 / document.body.style.zoom
window.addEventListener('resize', () => {
this.zoom = 1 / document.body.style.zoom
})
if(process.env.VUE_APP_HB == 'hbqr'){
this.showMqtt = JSON.parse(window.sessionStorage.getItem('Info')).roleCode.includes('audit_manager')
}
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.onSubmit()
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem('appheight') - 95
},
//条件筛选
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'
}
},
closeHandle1() {
if (this.view1) {
this.view1 = false
} else {
this.view1 = true
}
//console.log('关闭和展开');
const dom = document.getElementById('container1')
const closeDom = document.getElementsByClassName('close')[0]
if (!dom.className.match(/(?:^|\s)expend(?!\S)/)) {
dom.className = 'container expend'
} else {
dom.className = 'container close-container'
}
},
//统计
details() {
this.flg = false
setTimeout(() => {
this.OnSubmit()
}, 0)
},
OnSubmit() {
this.loading1 = true
this.item1 = this.$refs.intervaltime.timeValue
this.formLine.searchBeginTime = this.item1[0]
this.formLine.searchEndTime = this.item1[1]
censusAuditLog(this.formLine).then(res => {
this.statisticsData = res.data.records
this.statisticsTotal = res.data.total
this.loading1 = false
})
},
// 排序
sortChangeEvent({ column, field, order }) {
this.formData.sortName = column.title
this.formLine.sortName = column.title
this.formData.sortBy = field == 'operate' ? 'operate_type' : field == 'time' ? 'create_time' : field
this.formLine.sortBy = field == 'operate' ? 'operate_type' : field == 'time' ? 'create_time' : field
this.formData.orderBy = order
this.formLine.orderBy = order
this.onSubmit()
},
//下拉框查询
search() {
getAllUserList().then(res => {
this.userName = res.data
})
},
//返回
back() {
this.flg = true
this.onSubmit()
},
//查询
onSubmit() {
this.loading = true
this.item = this.$refs.interval.timeValue
this.formData.searchBeginTime = this.item[0]
this.formData.searchEndTime = this.item[1]
getAuditLog(this.formData).then(res => {
this.datamock = res.data.records
this.total = res.data.total
this.loading = false
this.getLogSize()
})
},
//查询日志大小
getLogSize(){
getMemoInfo().then(res => {
getSysConfig().then(re=>{
if (res.data>re.data.logSize) {
this.$message({
showClose: true,
duration: 0,
message: '日志表存储空间已超过'+re.data.logSize+'(M)请及时备份清理!',
type: 'warning'
})
}
})
})
},
//备份
backups() {
this.loading = true
logFileWriter().then(res => {})
setTimeout(() => {
this.$message({
type: 'success',
message: '文件备份成功'
})
this.loading = false
}, 50000)
},
//恢复
restore() {
this.loading = true
recoverLogFile().then(res => {})
setTimeout(() => {
this.$message({
type: 'success',
message: '文件恢复成功'
})
this.loading = false
}, 50000)
},
//每页条数改变时触发 选择一页显示多少行
handleSizeChange(val) {
this.formData.pageSize = val
this.onSubmit()
},
//当前页改变时触发 跳转其他页
handleCurrentChange(val) {
this.formData.pageNum = val
this.onSubmit()
},
//每页条数改变时触发 选择一页显示多少行
handleSizeChange1(val) {
this.formLine.pageSize = val
this.OnSubmit()
},
//当前页改变时触发 跳转其他页
handleCurrentChange1(val) {
this.formLine.pageNum = val
this.OnSubmit()
},
//导出
exportEvent() {
getAuditLog({
loginName: this.formData.loginName,
type: this.formData.type,
operateType: this.formData.operateType,
searchBeginTime: this.formData.searchBeginTime,
searchEndTime: this.formData.searchEndTime,
sortBy: this.formData.sortBy,
sortName: this.formData.sortName,
orderBy: this.formData.orderBy,
export:true,
pageNum: 1,
pageSize: this.total
}).then(res => {
this.$refs.management.exportData({
filename: 'export', // 文件名字
sheetName: 'Sheet1',
type: 'xlsx', //导出文件类型 xlsx 和 csv
useStyle: true,
data: res.data.records // 数据源 // 过滤那个字段导出
// columnFilterMethod: function (column, $columnIndex) {
// return !(column.$columnIndex === 0);
// },
})
})
},
exportEventstatistics() {
censusAuditLog({
loginName: this.formLine.loginName,
type: this.formLine.type,
operateType: this.formLine.operateType,
searchBeginTime: this.formLine.searchBeginTime,
searchEndTime: this.formLine.searchEndTime,
pageNum: 1,
export:true,
pageSize: this.statisticsTotal
}).then(res => {
this.$refs.management1.exportData({
filename: 'export', // 文件名字
sheetName: 'Sheet1',
type: 'xlsx', //导出文件类型 xlsx 和 csv
useStyle: true,
data: res.data.records // 数据源 // 过滤那个字段导出
// columnFilterMethod: function (column, $columnIndex) {
// return !(column.$columnIndex === 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;
}
::v-deep .vxe-table .cell {
text-align: center;
}
.svgIcon {
display: flex;
justify-content: end;
}
.back {
position: absolute;
right: 10px;
float: right;
}
.container {
position: absolute;
/* margin: auto; */
top: 0;
right: 0;
z-index: 2000;
width: 50%;
height: 0;
overflow: auto;
background-color: #e4e7ebb9;
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: 0;
height: auto;
}
to {
top: 0;
height: auto;
}
}
@keyframes no-expend {
from {
top: 0;
height: 20%;
}
to {
top: 0;
height: 0;
}
}
.coles {
position: absolute;
right: 0;
font-size: 20px;
cursor: pointer;
}
</style>

View File

@@ -0,0 +1,115 @@
<template>
<div class="pd10" v-loading="loading" element-loading-text="数据加载中">
<el-form :inline="true" :model="formData" class="demo-form-inline">
<el-form-item>
<el-button type="primary" @click="onSubmit" icon="el-icon-search">查询</el-button>
</el-form-item>
</el-form>
<el-table
stripe
size="mini"
:row-config="{ isCurrent: true, isHover: true }"
border
highlight-current-row
header-cell-class-name="table_header"
:data="datamock"
style="width: 100%"
:height="vh + 'px'"
>
<el-table-column prop="name" label="昵称" align="center"></el-table-column>
<el-table-column prop="loginName" label="登录名" align="center"></el-table-column>
<el-table-column prop="phone" label="手机号" align="center">
<template slot-scope="scope">
<span>{{ scope.row.phone == '' ? '/' : scope.row.phone }}</span>
</template>
</el-table-column>
<el-table-column prop="time" label="登录过期时间" align="center"></el-table-column>
<el-table-column prop="result" label="状态" align="center">
<template>
<span>在线</span>
</template>
</el-table-column>
</el-table>
<el-pagination
background
align="right"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="formData.pageNum"
:page-sizes="[100, 200, 300, 500, 1000]"
:page-size="formData.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
class="mt10"
></el-pagination>
</div>
</template>
<script>
import { getOnlineUsers } from '@/api/AuditManagement/AuditManagement'
export default {
props: {},
data() {
return {
loading: false,
zoom: '', //图表焦点校验
vh: undefined,
formData: {
pageNum: 1,
pageSize: 100
},
datamock: [],
total: undefined
}
},
created() {},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.zoom = 1 / document.body.style.zoom
this.onSubmit()
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem('appheight') - 95
this.zoom = 1 / document.body.style.zoom
},
//查询
onSubmit() {
this.loading = true
getOnlineUsers().then(res => {
this.datamock = res.data
this.total = this.datamock.length
this.loading = false
})
},
//每页条数改变时触发 选择一页显示多少行
handleSizeChange(val) {
this.formData.pageSize = val
this.onSubmit()
},
//当前页改变时触发 跳转其他页
handleCurrentChange(val) {
this.formData.pageNum = val
this.onSubmit()
}
},
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;
// }
// ::v-deep .el-table .cell {
// text-align: center;
// }
</style>

View File

@@ -0,0 +1,120 @@
<template>
<div class="pd10">
<el-form :inline="true" :model="formData" class="demo-form-inline">
<el-form-item>
<Timeinterval ref="interval" :interval="3"></Timeinterval>
</el-form-item>
<el-form-item label="筛选数据:">
<el-input v-model.trim="formData.loginName" placeholder="请输入筛选数据" clearable></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit" icon="el-icon-search">查询</el-button>
</el-form-item>
</el-form>
<el-table
stripe
size="mini"
:row-config="{ isCurrent: true, isHover: true }"
border
highlight-current-row
v-loading="loading"
element-loading-text="数据加载中"
header-cell-class-name="table_header"
:data="datamock"
style="width: 100%"
:height="vh + 'px'"
>
<el-table-column prop="userName" label="登录用户" align="center"></el-table-column>
<el-table-column prop="ip" label="登录ip" align="center"></el-table-column>
<el-table-column prop="time" label="登录时间" align="center"></el-table-column>
</el-table>
<el-pagination
background
align="right"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="formData.pageNum"
:page-sizes="[20, 30, 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 { getAuditLog } from '@/api/AuditManagement/AuditManagement'
export default {
components: {
Timeinterval
},
props: {},
data() {
return {
loading: false,
zoom: '', //图表焦点校验
vh: undefined,
formData: {
operateType: '认证',
loginName: '',
pageNum: 1,
pageSize: 20
},
datamock: [],
total: undefined
}
},
created() {},
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
},
//查询
onSubmit() {
this.loading = true
this.item = this.$refs.interval.timeValue
this.formData.searchBeginTime = this.item[0]
this.formData.searchEndTime = this.item[1]
getAuditLog(this.formData).then(res => {
this.datamock = res.data.records
this.total = res.data.total
this.loading = false
})
},
//每页条数改变时触发 选择一页显示多少行
handleSizeChange(val) {
this.formData.pageSize = val
this.onSubmit()
},
//当前页改变时触发 跳转其他页
handleCurrentChange(val) {
this.formData.pageNum = val
this.onSubmit()
}
},
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;
}
::v-deep .el-table .cell {
text-align: center;
}
</style>

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