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,102 @@
<template>
<div class="pd10">
<el-row style="overflow-y: hidden">
<el-col>
<el-tabs v-model.trim="activeName" type="border-card" @tab-click="handleClick">
<!-- 首页 -->
<el-tab-pane label="概览" name="first" :style="'height:' + vh + ';'">
<homePage v-if="activeName == 'first'" />
</el-tab-pane>
<!-- 技术监督管理 -->
<el-tab-pane label="技术监督管理" name="technology" :style="'height:' + vh + ';'">
<technology v-if="activeName == 'technology'" />
</el-tab-pane>
<!-- 策略管理 -->
<el-tab-pane label="告警单策略管理" name="second" :style="'height:' + vh + ';'">
<el-tabs v-model="warn">
<!-- <el-tab-pane label="策略管理" name="1">
<PolicyManagement :typeKey="1" v-if="warn == '1'" />
</el-tab-pane> -->
<el-tab-pane label="策略绑定" name="2">
<WarningBinding :typeKey="1" v-if="warn == '2'" />
</el-tab-pane>
</el-tabs>
</el-tab-pane>
<el-tab-pane label="预警单策略管理" name="tactics" :style="'height:' + vh + ';'">
<el-tabs v-model="warn">
<!-- <el-tab-pane label="策略管理" name="3">
<PolicyManagement :typeKey="0" v-if="warn == '3'" />
</el-tab-pane>-->
<el-tab-pane label="策略绑定" name="4">
<WarningBinding :typeKey="0" v-if="warn == '4'" />
</el-tab-pane>
</el-tabs>
</el-tab-pane>
</el-tabs>
</el-col>
</el-row>
</div>
</template>
<script>
import homePage from './components/WorkOrder/homePage.vue'
import technology from './components/WorkOrder/technology.vue'
import WarningBinding from './components/WorkOrder/WarningBinding.vue'
import PolicyManagement from './components/WorkOrder/PolicyManagement.vue'
export default {
name: 'jsjdgl',
components: { homePage, technology, PolicyManagement, WarningBinding },
data() {
return {
vh: '',
vh1: '',
activeName: 'first',
warn: '',
device: ''
}
},
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') - 80 + 'px'
this.vh1 = window.sessionStorage.getItem('appheight') - 143 + 'px'
},
handleClick(tab, event) {
if (this.activeName == 'second') {
this.warn = '2'
} else if (this.activeName == 'tactics') {
this.warn = '4'
} else {
this.warn = ''
}
}
}
}
</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,178 @@
<template>
<!-- <div> -->
<!-- <el-form :inline="true" :model="form" class="demo-form-inline"> -->
<!-- <el-form-item label="组织机构名称:" prop="valueTitle" :rules="{ required: true, message: '物业公司名称不能为空', trigger: 'blur' }"> -->
<el-select
ref="selectTree1"
v-model="form.valueTitle"
placeholder="请输入组织机构名称"
>
<el-option
:value="form.editCheckCode"
:label="form.valueTitle"
class="options"
>
<el-tree
id="tree-option"
ref="selectTree"
:accordion="form.accordion"
:data="form.options"
:highlight-current="true"
:expand-on-click-node="false"
:default-expanded-keys="form.defaultExpandedKey"
@node-click="handleNodeClick"
>
<span slot-scope="{ node, data }">
<i
:class="[data.color != null ? 'ification_col' : '']"
:style="{ 'background-color': data.color }"
></i
>&nbsp;&nbsp;{{ data.name }}
</span>
</el-tree>
</el-option>
</el-select>
<!-- </el-form-item> -->
<!-- </el-form> -->
<!-- </div> -->
</template>
<script>
import { deptTree } from "@/api/admin/dept";
export default {
props: {
valueTitle: {
type: String,
required: true,
},
editCheckCode: {
type: String,
required: true,
},
},
watch: {
'valueTitle': {
handler(Value) {
// newValue 和 oldValue 是一样的
// console.log(Value,'++++++++++++++++++');
this.form.valueTitle=Value
},
deep: true
},
'editCheckCode': {
handler(Value) {
// newValue 和 oldValue 是一样的
// console.log(Value,'++++++++++++++++++');
this.form.editCheckCode=Value
},
deep: true
}
},
data() {
return {
vh: "",
IdData: "",
form: {
value: "",
valueTitle: "",
editCheckCode: "",//选择的id
accordion: true,
defaultExpandedKey: [],
//区域
options: [],
default: {
value: "id",
children: "children",
label: "name",
},
},
};
},
created() {
// this.form.valueTitle = JSON.parse(
// window.sessionStorage.getItem("Info")
// ).deptName;
this.area();
},
beforeMount(){
// this.form.valueTitle=this.valueTitle
// this.form.editCheckCode=this.editCheckCode
},
mounted() {
this.form.valueTitle=this.valueTitle
this.form.editCheckCode=this.editCheckCode
},
computed: {},
methods: {
//区域
area() {
deptTree().then((res) => {
if (res.code == "A0000") {
this.form.options = res.data;
//this.$emit("click", res.data[0]);
}
// debugger
this.IdData = this.form.options[0].children[0].id;
this.$emit("sendMessage", this.IdData);
//用于子组件向父组件传递部门id非code
});
},
// 切换选项
handleNodeClick(data) {
this.form.editCheckCode = data.id;
this.form.valueTitle = data.name;
this.form.defaultExpandedKey = [];
this.$emit("click", data);
this.$refs.selectTree1.blur();
},
},
};
</script>
<style lang="less" scoped>
@import url("../../../../styles/comStyle.less");
.el-scrollbar .el-scrollbar__view .el-select-dropdown__item {
height: auto;
// max-height: 1000px;
padding: 0;
overflow: hidden;
overflow-y: hidden;
}
.el-select-dropdown__item.selected {
font-weight: normal;
}
ul li > .el-tree .el-tree-node__content {
height: auto;
padding: 0 20px;
}
.el-tree-node__label {
font-weight: normal;
}
.el-tree > .is-current .el-tree-node__label {
font-weight: 700;
color: #409eff;
}
.el-tree > .is-current .el-tree-node__children .el-tree-node__label {
font-weight: normal;
color: #606266;
}
.el-popper {
z-index: 9999;
}
.ification_col {
display: inline-block;
width: 20px;
height: 10px;
}
</style>

View File

@@ -0,0 +1,168 @@
<template>
<!-- <div> -->
<!-- <el-form :inline="true" :model="form" class="demo-form-inline"> -->
<!-- <el-form-item label="运维单位名称:"> -->
<el-select
ref="selectTree1"
v-model="form.valueTitle"
placeholder="请输入运维单位名称"
>
<el-option
:value="form.editCheckCode"
:label="form.valueTitle"
class="options"
>
<el-tree
id="tree-option"
ref="selectTree"
:accordion="form.accordion"
:data="form.options"
:highlight-current="true"
:expand-on-click-node="false"
:default-expanded-keys="form.defaultExpandedKey"
@node-click="handleNodeClick"
>
<span slot-scope="{ node, data }">
<i
:class="[data.color != null ? 'ification_col' : '']"
:style="{ 'background-color': data.color }"
></i
>&nbsp;&nbsp;{{ data.name }}
</span>
</el-tree>
</el-option>
</el-select>
<!-- </el-form-item> -->
<!-- </el-form> -->
<!-- </div> -->
</template>
<script>
import { deptTree } from "@/api/admin/dept";
export default {
props: {
valueTitle: {
type: String,
required: true,
},
editCheckCode: {
type: String,
required: true,
},
},
watch: {
'valueTitle': {
handler(Value) {
// newValue 和 oldValue 是一样的
// console.log(Value,'++++++++++++++++++');
this.form.valueTitle=Value
},
deep: true
},
'editCheckCode': {
handler(Value) {
// newValue 和 oldValue 是一样的
// console.log(Value,'++++++++++++++++++');
this.form.editCheckCode=Value
},
deep: true
}
},
data() {
return {
vh: "",
IdData: "",
form: {
value: "",
valueTitle: "",
editCheckCode: null,//选择的id
accordion: true,
defaultExpandedKey: [],
//区域
options: [],
default: {
value: "id",
children: "children",
label: "name",
},
},
};
},
created() {
this.area();
},
mounted() {
this.form.valueTitle = JSON.parse(
window.sessionStorage.getItem("Info")
).deptName;
this.form.valueTitle=this.valueTitle
this.form.editCheckCode=this.editCheckCode
},
computed: {},
methods: {
//区域
area() {
deptTree().then((res) => {
if (res.code == "A0000") {
this.form.options = res.data;
}
// debugger
this.IdData = this.form.options[0].children[0].id;
this.$emit("sendMessage", this.IdData);
});
},
// 切换选项
handleNodeClick(data) {
this.form.editCheckCode = data.id;
this.form.valueTitle = data.name;
this.form.defaultExpandedKey = [];
this.$emit("click", data);
this.$refs.selectTree1.blur();
},
},
};
</script>
<style lang="less" scoped>
@import url("../../../../styles/comStyle.less");
.el-scrollbar .el-scrollbar__view .el-select-dropdown__item {
height: auto;
// max-height: 1000px;
padding: 0;
overflow: hidden;
overflow-y: hidden;
}
.el-select-dropdown__item.selected {
font-weight: normal;
}
ul li > .el-tree .el-tree-node__content {
height: auto;
padding: 0 20px;
}
.el-tree-node__label {
font-weight: normal;
}
.el-tree > .is-current .el-tree-node__label {
font-weight: 700;
color: #409eff;
}
.el-tree > .is-current .el-tree-node__children .el-tree-node__label {
font-weight: normal;
color: #606266;
}
.el-popper {
z-index: 9999;
}
.ification_col {
display: inline-block;
width: 20px;
height: 10px;
}
</style>

View File

@@ -0,0 +1,179 @@
<template>
<!-- <div> -->
<!-- <el-form :inline="true" :model="form" class="demo-form-inline"> -->
<!-- <el-form-item label="组织机构名称:" prop="valueTitle" :rules="{ required: true, message: '物业公司名称不能为空', trigger: 'blur' }"> -->
<el-select
ref="selectTree1"
v-model="form.valueTitle"
placeholder="请输入组织机构名称"
>
<el-option
:value="form.editCheckCode"
:label="form.valueTitle"
class="options"
>
<el-tree
id="tree-option"
ref="selectTree"
:accordion="form.accordion"
:data="form.options"
:highlight-current="true"
:expand-on-click-node="false"
:default-expanded-keys="form.defaultExpandedKey"
@node-click="handleNodeClick"
>
<span slot-scope="{ node, data }">
<i
:class="[data.color != null ? 'ification_col' : '']"
:style="{ 'background-color': data.color }"
></i
>&nbsp;&nbsp;{{ data.name }}
</span>
</el-tree>
</el-option>
</el-select>
<!-- </el-form-item> -->
<!-- </el-form> -->
<!-- </div> -->
</template>
<script>
import { deptTree } from "@/api/admin/dept";
export default {
props: {
valueTitle: {
type: String,
required: true,
},
editCheckCode: {
type: String,
required: true,
},
},
watch: {
'valueTitle': {
handler(Value) {
// newValue 和 oldValue 是一样的
// console.log(Value,'++++++++++++++++++');
this.form.valueTitle=Value
},
deep: true
},
'editCheckCode': {
handler(Value) {
// newValue 和 oldValue 是一样的
// console.log(Value,'++++++++++++++++++');
this.form.editCheckCode=Value
},
deep: true
}
},
data() {
return {
vh: "",
IdData: "",
form: {
value: "",
valueTitle: "",
editCheckCode: "",//选择的id
accordion: true,
defaultExpandedKey: [],
//区域
options: [],
default: {
value: "id",
children: "children",
label: "name",
},
},
};
},
created() {
// this.form.valueTitle = JSON.parse(
// window.sessionStorage.getItem("Info")
// ).deptName;
this.area();
},
beforeMount(){
// this.form.valueTitle=this.valueTitle
// this.form.editCheckCode=this.editCheckCode
},
mounted() {
this.form.valueTitle=this.valueTitle
this.form.editCheckCode=this.editCheckCode
},
computed: {},
methods: {
//区域
area() {
deptTree().then((res) => {
if (res.code == "A0000") {
this.form.options = res.data;
//this.$emit("click", res.data[0]);
}
// debugger
this.IdData = this.form.options[0].children[0].id;
this.$emit("sendMessage", this.IdData);
//用于子组件向父组件传递部门id非code
});
},
// 切换选项
handleNodeClick(data) {
this.form.editCheckCode = data.id;
this.form.valueTitle = data.name;
this.form.defaultExpandedKey = [];
this.$emit("click", data);
this.$refs.selectTree1.blur();
},
},
};
</script>
<style lang="less" scoped>
@import url("../../../../styles/comStyle.less");
.el-scrollbar .el-scrollbar__view .el-select-dropdown__item {
height: auto;
// max-height: 1000px;
padding: 0;
overflow: hidden;
overflow-y: hidden;
}
.el-select-dropdown__item.selected {
font-weight: normal;
}
ul li > .el-tree .el-tree-node__content {
height: auto;
padding: 0 20px;
}
.el-tree-node__label {
font-weight: normal;
}
.el-tree > .is-current .el-tree-node__label {
font-weight: 700;
color: #409eff;
}
.el-tree > .is-current .el-tree-node__children .el-tree-node__label {
font-weight: normal;
color: #606266;
}
.el-popper {
z-index: 9999;
}
.ification_col {
display: inline-block;
width: 20px;
height: 10px;
}
</style>

View File

@@ -0,0 +1,186 @@
<template>
<!-- <div> -->
<!-- <el-form :inline="true" :model="form" class="demo-form-inline"> -->
<!-- <el-form-item label="组织机构名称:" prop="valueTitle" :rules="{ required: true, message: '物业公司名称不能为空', trigger: 'blur' }"> -->
<el-select
ref="selectTree1"
v-model="form.valueTitle"
clearable
placeholder="请输入组织机构名称"
@clear="clear('valueTitle','editCheckCode')"
>
<el-option
:value="form.editCheckCode"
:label="form.valueTitle"
class="options"
>
<el-tree
id="tree-option"
ref="selectTree"
:accordion="form.accordion"
:data="form.options"
:highlight-current="true"
:expand-on-click-node="false"
:default-expanded-keys="form.defaultExpandedKey"
@node-click="handleNodeClick"
>
<span slot-scope="{ node, data }">
<i
:class="[data.color != null ? 'ification_col' : '']"
:style="{ 'background-color': data.color }"
></i
>&nbsp;&nbsp;{{ data.name }}
</span>
</el-tree>
</el-option>
</el-select>
<!-- </el-form-item> -->
<!-- </el-form> -->
<!-- </div> -->
</template>
<script>
import { deptTree } from "@/api/admin/dept";
export default {
props: {
valueTitle: {
type: String,
required: true,
},
editCheckCode: {
type: String,
required: true,
},
},
watch: {
'valueTitle': {
handler(Value) {
// newValue 和 oldValue 是一样的
// console.log(Value,'++++++++++++++++++');
this.form.valueTitle=Value
},
deep: true
},
'editCheckCode': {
handler(Value) {
// newValue 和 oldValue 是一样的
// console.log(Value,'++++++++++++++++++');
this.form.editCheckCode=Value
},
deep: true
}
},
data() {
return {
vh: "",
IdData: "",
form: {
value: "",
valueTitle: "",
editCheckCode: "",//选择的id
accordion: true,
defaultExpandedKey: [],
//区域
options: [],
default: {
value: "id",
children: "children",
label: "name",
},
},
};
},
created() {
// this.form.valueTitle = JSON.parse(
// window.sessionStorage.getItem("Info")
// ).deptName;
this.area();
},
beforeMount(){
// this.form.valueTitle=this.valueTitle
// this.form.editCheckCode=this.editCheckCode
},
mounted() {
this.form.valueTitle=this.valueTitle
this.form.editCheckCode=this.editCheckCode
},
computed: {},
methods: {
clear(key,key1) {
this.form[key] = ''
this.form[key1] = ''
this.$emit("clear", key,key1);
},
//区域
area() {
deptTree().then((res) => {
if (res.code == "A0000") {
this.form.options = res.data;
//this.$emit("click", res.data[0]);
}
// debugger
this.IdData = this.form.options[0].children[0].id;
this.$emit("sendMessage", this.IdData);
//用于子组件向父组件传递部门id非code
});
},
// 切换选项
handleNodeClick(data) {
this.form.editCheckCode = data.id;
this.form.valueTitle = data.name;
this.form.defaultExpandedKey = [];
this.$emit("click", data);
this.$refs.selectTree1.blur();
},
},
};
</script>
<style lang="less" scoped>
@import url("../../../../styles/comStyle.less");
.el-scrollbar .el-scrollbar__view .el-select-dropdown__item {
height: auto;
// max-height: 1000px;
padding: 0;
overflow: hidden;
overflow-y: hidden;
}
.el-select-dropdown__item.selected {
font-weight: normal;
}
ul li > .el-tree .el-tree-node__content {
height: auto;
padding: 0 20px;
}
.el-tree-node__label {
font-weight: normal;
}
.el-tree > .is-current .el-tree-node__label {
font-weight: 700;
color: #409eff;
}
.el-tree > .is-current .el-tree-node__children .el-tree-node__label {
font-weight: normal;
color: #606266;
}
.el-popper {
z-index: 9999;
}
.ification_col {
display: inline-block;
width: 20px;
height: 10px;
}
</style>

View File

@@ -0,0 +1,186 @@
<template>
<!-- <div> -->
<!-- <el-form :inline="true" :model="form" class="demo-form-inline"> -->
<!-- <el-form-item label="组织机构名称:" prop="valueTitle" :rules="{ required: true, message: '物业公司名称不能为空', trigger: 'blur' }"> -->
<el-select
ref="selectTree1"
v-model="form.valueTitle"
clearable
@clear="clear('valueTitle','editCheckCode')"
placeholder="请输入组织机构名称"
>
<el-option
:value="form.editCheckCode"
:label="form.valueTitle"
class="options"
>
<el-tree
id="tree-option"
ref="selectTree"
:accordion="form.accordion"
:data="form.options"
:highlight-current="true"
:expand-on-click-node="false"
:default-expanded-keys="form.defaultExpandedKey"
@node-click="handleNodeClick"
>
<span slot-scope="{ node, data }">
<i
:class="[data.color != null ? 'ification_col' : '']"
:style="{ 'background-color': data.color }"
></i
>&nbsp;&nbsp;{{ data.name }}
</span>
</el-tree>
</el-option>
</el-select>
<!-- </el-form-item> -->
<!-- </el-form> -->
<!-- </div> -->
</template>
<script>
import { deptTree } from "@/api/admin/dept";
export default {
props: {
valueTitle: {
type: String,
required: true,
},
editCheckCode: {
type: String,
required: true,
},
},
watch: {
'valueTitle': {
handler(Value) {
// newValue 和 oldValue 是一样的
// console.log(Value,'++++++++++++++++++');
this.form.valueTitle=Value
},
deep: true
},
'editCheckCode': {
handler(Value) {
// newValue 和 oldValue 是一样的
// console.log(Value,'++++++++++++++++++');
this.form.editCheckCode=Value
},
deep: true
}
},
data() {
return {
vh: "",
IdData: "",
form: {
value: "",
valueTitle: "",
editCheckCode: "",//选择的id
accordion: true,
defaultExpandedKey: [],
//区域
options: [],
default: {
value: "id",
children: "children",
label: "name",
},
},
};
},
created() {
// this.form.valueTitle = JSON.parse(
// window.sessionStorage.getItem("Info")
// ).deptName;
this.area();
},
beforeMount(){
// this.form.valueTitle=this.valueTitle
// this.form.editCheckCode=this.editCheckCode
},
mounted() {
this.form.valueTitle=this.valueTitle
this.form.editCheckCode=this.editCheckCode
},
computed: {},
methods: {
clear(key,key1) {
this.form[key] = ''
this.form[key1] = ''
this.$emit("clear", key,key1);
},
//区域
area() {
deptTree().then((res) => {
if (res.code == "A0000") {
this.form.options = res.data;
//this.$emit("click", res.data[0]);
}
// debugger
this.IdData = this.form.options[0].children[0].id;
this.$emit("sendMessage", this.IdData);
//用于子组件向父组件传递部门id非code
});
},
// 切换选项
handleNodeClick(data) {
this.form.editCheckCode = data.id;
this.form.valueTitle = data.name;
this.form.defaultExpandedKey = [];
this.$emit("click", data);
this.$refs.selectTree1.blur();
},
},
};
</script>
<style lang="less" scoped>
@import url("../../../../styles/comStyle.less");
.el-scrollbar .el-scrollbar__view .el-select-dropdown__item {
height: auto;
// max-height: 1000px;
padding: 0;
overflow: hidden;
overflow-y: hidden;
}
.el-select-dropdown__item.selected {
font-weight: normal;
}
ul li > .el-tree .el-tree-node__content {
height: auto;
padding: 0 20px;
}
.el-tree-node__label {
font-weight: normal;
}
.el-tree > .is-current .el-tree-node__label {
font-weight: 700;
color: #409eff;
}
.el-tree > .is-current .el-tree-node__children .el-tree-node__label {
font-weight: normal;
color: #606266;
}
.el-popper {
z-index: 9999;
}
.ification_col {
display: inline-block;
width: 20px;
height: 10px;
}
</style>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,612 @@
<template>
<div class="pd10" v-loading="isLoading" element-loading-text="数据加载中">
<el-form :inline="true" :model="formData" class="demo-form-inline">
<el-form-item>
<Area @click="handleNodeClick" ref="area" @send="takeover"></Area>
</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="onSubmit">查询</el-button>
<el-button size="small" type="primary" v-if="biaoCode === 'tjrbpush'" @click="push">上送网公司</el-button>
<el-button size="small" type="primary" icon="el-icon-download" @click="exportEvent">导出</el-button>
</el-form-item>
<el-form-item style="float: right;margin-right: 10px">
<el-button size="small" type="primary" @click="reportStatistics">
月报手动重新统计
</el-button>
</el-form-item>
</el-form>
<vxe-table stripe :data="tableData" size="mini" ref="Workstatistics"
:row-config="{ isCurrent: true, isHover: true }" :height="vh" 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' }" @checkbox-all="selectAllChangeEvent"
@checkbox-change="handleSelectionChange">
<vxe-table-column type="checkbox" align="center" width="55"></vxe-table-column>
<template v-for="(item, index) in Workstatistics">
<vxe-table-colgroup v-if="item.prop == 'isUploadHead'" :field="item.prop" :title="item.label"
:key="index" :min-width="item.width" show-overflow align="center" fixed="right">
<template slot-scope="scope">
<el-tag type="primary" size="small" style="color: #409eff; background: #ecf5ff"
v-if="scope.row.isUploadHead == 0">
未上送
</el-tag>
<el-tag type="primary" size="small" style="color: #67c23a; background: #f0f9eb"
v-if="scope.row.isUploadHead == 1">
已上送
</el-tag>
<el-tag type="primary" size="small" style="color: #909399; background: #f4f4f5"
v-if="scope.row.isUploadHead == 2">
取消上送
</el-tag>
</template>
</vxe-table-colgroup>
<vxe-table-colgroup v-else-if="item.prop == 'cityName'" :field="item.prop" :title="item.label"
:key="index" :min-width="item.width" show-overflow align="center">
<template slot-scope="scope">
{{ scope.row.cityName == null ? '/' : scope.row.cityName }}
</template>
</vxe-table-colgroup>
<vxe-table-colgroup v-else-if="item.prop == 'countyName'" :field="item.prop" :title="item.label"
:key="index" :min-width="item.width" show-overflow align="center">
<template slot-scope="scope">
{{ scope.row.countyName == null ? '/' : scope.row.countyName }}
</template>
</vxe-table-colgroup>
<vxe-table-colgroup v-else :field="item.prop" :title="item.label" :key="index" :min-width="item.width"
show-overflow align="center">
<template v-for="(item, index) in item.children">
<vxe-table-column :field="item.prop" :title="item.label" :key="index" :min-width="item.width"
show-overflow align="center"></vxe-table-column>
</template>
</vxe-table-colgroup>
</template>
</vxe-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>
<el-dialog :close-on-click-modal="false" title="统计时间" :visible.sync="problemTime" width="20%">
<el-form label-width="90px">
<el-form-item label="选择时间:" class="mt20">
<el-date-picker v-model="problemTimeValue" type="month" value-format="yyyy-MM"
:picker-options="pickerOptions" @change="changeFn" placeholder="选择月"></el-date-picker>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="problemTime = false"> </el-button>
<el-button type="primary" @click="timeQuery"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import Area from '@/views/components/Area/Area.vue'
import Timeinterval from '@/views/components/TimePicker/index4'
import { statisticReportPage, pushMonthReportStatistic, statisticReport } from '@/api/Supervisionmanage2/Workplan'
import { listRoleMenu, updateRoleMenu } from '@/api/admin/role'
export default {
components: { Area, Timeinterval },
props: {},
data() {
return {
biaoCode: '',
id: JSON.parse(window.sessionStorage.getItem('Info')).roleList[0],
isLoading: false,
problemTime: false,
zoom: '', //图表焦点校验
vh: undefined,
problemTimeValue: '',
timeData: '',
formData: {
searchValue: '',
searchBeginTime: '',
searchEndTime: '',
pageNum: 1,
pageSize: 20
},
pickerOptions: {
disabledDate: time => {
return this.checkTime(time)
}
},
total: 0,
tableData: [],
multipleSelection: [],
Workstatistics: [
{ prop: 'provinceName', label: '所属网省', width: 150 },
{ prop: 'cityName', label: '所属地市', width: 150 },
{ prop: 'countyName', label: '所属县区', width: 150 },
{
prop: 'converterStation',
label: '特高压换流站',
children: [
{
prop: 'convertYearSupvNum',
label: '本年计划监督数量',
width: 140
},
{ prop: 'convertMonthSupvNum', label: '本月监督数量', width: 120 },
{ prop: 'convertTotalSupvNum', label: '累计监督数量', width: 120 },
{ prop: 'convertMonthQuesNum', label: '本月问题数量', width: 120 },
{ prop: 'convertTotalQuesNum', label: '累计问题数量', width: 120 },
{
prop: 'convertMonthReformNum',
label: '本月整改问题数量',
width: 140
},
{
prop: 'convertTotalReformNum',
label: '累计整改问题数量',
width: 140
}
]
},
{
prop: 'newEnergy',
label: '新能源场站(在运站)',
children: [
{
prop: 'energyYearSupvNum',
label: '本年计划监督数量',
width: 140
},
{ prop: 'energyMonthSupvNum', label: '本月监督数量', width: 120 },
{ prop: 'energyTotalSupvNum', label: '累计监督数量', width: 120 },
{ prop: 'energyMonthQuesNum', label: '本月问题数量', width: 120 },
{ prop: 'energyTotalQuesNum', label: '累计问题数量', width: 120 },
{
prop: 'energyMonthReformNum',
label: '本月整改问题数量',
width: 140
},
{
prop: 'energyTotalReformNum',
label: '累计整改问题数量',
width: 140
}
]
},
{
prop: 'extension',
label: '新能源场站(改扩建)',
children: [
{
prop: 'energyYearSupvNewNum',
label: '本年计划监督数量',
width: 140
},
{
prop: 'energyMonthSupvNewNum',
label: '本月监督数量',
width: 120
},
{
prop: 'energyTotalSupvNewNum',
label: '累计监督数量',
width: 120
},
{
prop: 'energyMonthQuesNewNum',
label: '本月问题数量',
width: 120
},
{
prop: 'energyTotalQuesNewNum',
label: '累计问题数量',
width: 120
},
{
prop: 'energyMonthReformNewNum',
label: '本月整改问题数量',
width: 140
},
{
prop: 'energyTotalReformNewNum',
label: '累计整改问题数量',
width: 140
}
]
},
{
prop: 'sensitive ',
label: '电能质量敏感用户',
children: [
{
prop: 'sensitiveYearSupvNum',
label: '本年计划监督数量',
width: 140
},
{
prop: 'sensitiveMonthSupvNum',
label: '本月监督数量',
width: 120
},
{
prop: 'sensitiveTotalSupvNum',
label: '累计监督数量',
width: 120
},
{
prop: 'sensitiveMonthQuesNum',
label: '本月问题数量',
width: 120
},
{
prop: 'sensitiveTotalQuesNum',
label: '累计问题数量',
width: 120
},
{
prop: 'sensitiveMonthReformNum',
label: '本月整改问题数量',
width: 140
},
{
prop: 'sensitiveTotalReformNum',
label: '累计整改问题数量',
width: 140
}
]
},
{
prop: 'plan',
label: '供电电压计划',
children: [
{
prop: 'powerMonthPlanNum',
label: '本月前计划开展数量',
width: 150
},
{
prop: 'powerMonthConductedNum',
label: '本月前已开展数量',
width: 140
},
{ prop: 'powerMonthQuesNum', label: '本月问题数量', width: 140 },
{ prop: 'powerTotalQuesNum', label: '累计问题数量', width: 140 },
{
prop: 'powerMonthReformNum',
label: '本月整改问题数量',
width: 140
},
{
prop: 'powerTotalReformNum',
label: '累计整改问题数量',
width: 140
}
]
},
{
prop: 'capacitor ',
label: '电容器组监督',
children: [
{
prop: 'capacitorYearSupvNum',
label: '本年计划监督数量',
width: 140
},
{
prop: 'capacitorMonthSupvNum',
label: '本月监督数量',
width: 120
},
{
prop: 'capacitorTotalSupvNum',
label: '累计监督数量',
width: 120
},
{
prop: 'capacitorMonthQuesNum',
label: '本月问题数量',
width: 120
},
{
prop: 'capacitorTotalQuesNum',
label: '累计问题数量',
width: 120
},
{
prop: 'capacitorMonthReformNum',
label: '本月整改问题数量',
width: 140
},
{
prop: 'capacitorTotalReformNum',
label: '累计整改问题数量',
width: 140
}
]
},
{
prop: 'capacitor ',
label: '评估报告监督',
children: [
{
prop: 'appraisalReportYearSupvNum',
label: '本年计划监督数量',
width: 140
},
{
prop: 'appraisalReportMonthSupvNum',
label: '本月监督数量',
width: 120
},
{
prop: 'appraisalReportTotalSupvNum',
label: '累计监督数量',
width: 120
},
{
prop: 'appraisalReportMonthQuesNum',
label: '本月问题数量',
width: 120
},
{
prop: 'appraisalReportTotalQuesNum',
label: '累计问题数量',
width: 120
},
{
prop: 'appraisalReportMonthReformNum',
label: '本月整改问题数量',
width: 140
},
{
prop: 'appraisalReportTotalReformNum',
label: '累计整改问题数量',
width: 140
}
]
},
{ prop: 'planYearCountNum', label: '总本年监督数量', width: 130 },
{ prop: 'planCountNum', label: '总累计监督数量', width: 130 },
{ prop: 'problemCountNum', label: '总累计问题数量', width: 130 },
{ prop: 'reformCountNum', label: '总整改问题数量', width: 130 },
{ prop: 'alarmCountNum', label: '总预告警单数量', width: 130 },
{ prop: 'alarmBackCountNum', label: '总反馈单数量', width: 110 },
{ prop: 'isUploadHead', label: '上送标识', width: 100 },
]
}
},
created() { },
mounted() {
this.listmenuRoleList()
this.zoom = 1 / document.body.style.zoom
// this.onSubmit();
this.setHeight()
window.addEventListener('resize', this.setHeight)
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.zoom = 1 / document.body.style.zoom
this.vh = window.sessionStorage.getItem('appheight') - 95
},
checkTime(time) {
let t = new Date().getDate()
// 如果想包含本月本月 - 8.64e7 * t 就不需要了,
// 如果想之前的不能选择把 > 换成 <
return time.getTime() > Date.now()
},
//获取权限
listmenuRoleList() {
let p = { id: this.id }
listRoleMenu(p).then(response => {
let ids = []
//console.log("权限资源",response.data)
response.data.forEach(item => {
if (item.code === 'tjrbpush') {
this.biaoCode = item.code
}
})
})
},
takeover(val) {
this.formData.searchValue = val[0].id
this.onSubmit()
},
handleSelectionChange(val) {
// console.log(val);
this.multipleSelection = val.records
},
selectAllChangeEvent(val) {
// console.log(val);
this.multipleSelection = val.records
},
//查询
onSubmit() {
this.isLoading = true
this.$refs.Timeinterval.timeOptions = [
// { label: "年份", value: 1 },
// { label: "季度", value: 2 },
{ label: '月份', value: 3 }
// { label: "周", value: 4 },
// // { label: "自定义", value: 5 },
]
this.item = this.$refs.Timeinterval.timeValue
this.formData.searchBeginTime = this.item[0]
this.formData.searchEndTime = this.item[1]
statisticReportPage(this.formData).then(res => {
this.tableData = res.data.records
this.total = res.data.total
this.isLoading = false
})
},
changeFn(val) {
// console.log(val);
let year = parseInt(val.substring(0, 4))
let month = parseInt(val.substring(5, 7))
// console.log(year, month);
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
if (month < 10) {
this.timeData = year + '-' + '0' + month + '-31'
} else {
this.timeData = year + '-' + month + '-31'
}
} else if (month == 4 || month == 6 || month == 9 || month == 11) {
if (month < 10) {
this.timeData = year + '-' + '0' + month + '-30'
} else {
this.timeData = year + '-' + month + '-30'
}
} else if (month == 2) {
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
this.timeData = year + '-' + '0' + month + '-29'
} else {
this.timeData = year + '-' + '0' + month + '-28'
}
}
// console.log(this.timeData);
},
//月报统计
reportStatistics() {
this.problemTime = true
// let form = {
// timeId: this.formData.searchEndTime
// }
// statisticReport(form).then(res=>{
// if ((res.code = "A0000")) {
// this.$message({
// type: "success",
// message: res.message,
// });
// }
// })
},
//确认
timeQuery() {
let form = {
timeId: this.timeData
}
statisticReport(form).then(res => {
if ((res.code == 'A0000')) {
this.$message({
type: 'success',
message: res.message
})
}
// this.problemTime = false;
})
},
//导出
exportEvent() {
this.item = this.$refs.Timeinterval.timeValue
this.formData.searchBeginTime = this.item[0]
this.formData.searchEndTime = this.item[1]
statisticReportPage(this.formData).then(res => {
res.data.records.forEach(item => {
if (item.isUploadHead == 0) {
item.isUploadHead = '未上送'
} else if (item.isUploadHead == 1) {
item.isUploadHead = '已上送'
} else if (item.isUploadHead == 2) {
item.isUploadHead = '取消上送'
}
})
let month = parseInt(this.formData.searchBeginTime.substring(5, 7))
// if(month <10)
this.$refs.Workstatistics.exportData({
filename: month + '月统计月报', // 文件名字
sheetName: 'Sheet1',
type: 'xlsx', //导出文件类型 xlsx 和 csv
useStyle: true,
data: res.data.records, // 数据源 // 过滤那个字段导出
columnFilterMethod: function (column, $columnIndex) {
return !(column.$columnIndex === 0)
}
})
})
},
//计划上送网公司
push() {
if (this.multipleSelection.length == 0) {
this.$message({
showClose: true,
message: '请选择一条数据上送网公司!!!',
type: 'warning'
})
return
}
let isUpload = []
this.multipleSelection.forEach(item => {
isUpload.push(item.isUploadHead)
})
// if(isUpload.includes(1) == true){
// this.$message({
// type: "warning",
// message: '已上送,无需重复上送',
// });
// return
// }else{
this.$confirm('是否确认上送网公司?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
let monthReportId = []
this.multipleSelection.forEach(item => {
monthReportId.push(item.monthReportId)
})
pushMonthReportStatistic(monthReportId).then(res => {
if ((res.code == 'A0000')) {
this.$message({
type: 'success',
message: res.message
})
}
this.onSubmit()
})
})
.catch(() => {
this.$message({
type: 'info',
message: '已取消上送'
})
})
// }
},
//每页条数改变时触发 选择一页显示多少行
handleSizeChange(val) {
this.formData.pageSize = val
this.onSubmit()
},
//当前页改变时触发 跳转其他页
handleCurrentChange(val) {
this.formData.pageNum = val
this.onSubmit()
},
handleNodeClick(data) {
this.formData.searchValue = data.id
}
},
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;
}
</style>

View File

@@ -0,0 +1,514 @@
<template>
<div class="pd10" v-loading="isLoading" element-loading-text="数据加载中">
<el-form :inline="true" :model="formData" class="demo-form-inline">
<!-- <el-form-item>
<Area @click="handleNodeClick" ref="area" @send="takeover"></Area>
</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="onSubmit">查询</el-button>
<!-- <el-button size="small" type="primary" icon="el-icon-circle-plus" @click="addFn">新增</el-button> -->
<el-button size="small" type="primary" icon="el-icon-delete" @click="deleteFn">删除</el-button>
<el-button size="small" type="primary" v-if="biaoCode === 'tjrbpush'" @click="push">上送网公司</el-button>
<el-button size="small" type="primary" icon="el-icon-download" @click="exportEvent">导出</el-button>
</el-form-item>
</el-form>
<vxe-table stripe :data="tableData" size="mini" ref="prealarmData"
:row-config="{ isCurrent: true, isHover: true }" :height="vh" 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' }" @checkbox-all="selectAllChangeEvent"
@checkbox-change="handleSelectionChange">
<vxe-table-column type="checkbox" align="center" width="55"></vxe-table-column>
<vxe-table-column field="billNo" show-overflow align="center" title="单据编号"
min-width="120px"></vxe-table-column>
<vxe-table-column field="billName" show-overflow align="center" title="单据名称"
min-width="120px"></vxe-table-column>
<vxe-table-column field="executeOrgName" show-overflow align="center" title="项目执行单位名称"
min-width="120px"></vxe-table-column>
<vxe-table-column field="treatmentMeasures" show-overflow align="center" title="采取措施"
min-width="120px"></vxe-table-column>
<vxe-table-column field="fillUserName" show-overflow align="center" title="填报人名称"
min-width="120px"></vxe-table-column>
<vxe-table-column field="completeTime" show-overflow align="center" title="完成时间"
min-width="120px"></vxe-table-column>
<!-- <vxe-table-column field="workAlarmId" show-overflow align="center" title="告预警单id" min-width="120px"></vxe-table-column> -->
<vxe-table-column field="feedbackOrgName" show-overflow align="center" title="反馈单位名称"
min-width="120px"></vxe-table-column>
<vxe-table-column field="provinceName" show-overflow align="center" title="省名称"
min-width="120px"></vxe-table-column>
<vxe-table-column field="province" show-overflow align="center" title="操作" min-width="120px">
<template slot-scope="scope">
<el-button type="primary" size="mini" @click="modifyFn(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, 50, 100]" :page-size="formData.pageSize"
layout="total, sizes, prev, pager, next, jumper" :total="total" class="mt10"></el-pagination>
<!-- 新增/修改 -->
<el-dialog :close-on-click-modal="false" title="修改反馈数据" :visible.sync="modifyInformation" width="40%"
height="80%">
<el-form :inline="true" :model="form1" class="form" ref="form" label-width="130px" :rules="rules">
<el-form-item label="项目执行单位名称:" class="mt10" prop="executeOrgName">
<Organization2 @click="handleNodeClick6" ref="Organization2" :valueTitle="valueTitle5"
@clear="clear('executeOrgId', 'executeOrgName')" :editCheckCode="editCheckCode5">
</Organization2>
</el-form-item>
<el-form-item label="填报人名称:" prop="fillUserId" class="mt10">
<el-select v-model="form1.fillUserId" clearable placeholder="请选择接收人名称" @change="changeFn">
<el-option v-for="item in ImplementationPeople" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="完成时间:" prop="completeTime" class="mt10">
<el-date-picker v-model="form1.completeTime" value-format="yyyy-MM-dd HH:mm:ss" type="datetime"
placeholder="选择日期"></el-date-picker>
</el-form-item>
<!-- <el-form-item label="告预警单id:" prop="workAlarmId" class="mt10">
<el-input v-model="form1.workAlarmId" ></el-input>
</el-form-item> -->
<el-form-item label="反馈单位名称:" class="mt10" prop="feedbackOrgName">
<Organization1 @click="handleNodeClick7" ref="Organization1" :valueTitle="valueTitle6"
@clear="clear('feedbackOrgId', 'feedbackOrgName')" :editCheckCode="editCheckCode6">
</Organization1>
</el-form-item>
<el-form-item label="采取措施:" prop="treatmentMeasures" class="mt10">
<el-input v-model="form1.treatmentMeasures" autosize type="textarea"></el-input>
</el-form-item>
<!-- <el-form-item label="省名称:" class="mt10" prop="provinceName" >
<Organization1
@click="handleNodeClick8" ref="Organization1" :valueTitle="valueTitle7"
:editCheckCode="editCheckCode7"></Organization1>
</el-form-item> -->
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="modifyInformation = false"> </el-button>
<el-button type="primary" @click="modifyinformationFn"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import Area from '@/views/components/Area/Area.vue'
import Organization2 from './Area/Organization2.vue'
import Organization1 from './Area/Organization1.vue'
import Company from './Area/Company.vue'
import Timeinterval from '@/views/components/TimePicker/index4'
// import { dicData } from "@/assets/commjs/dictypeData";
import {
getUserListByDeptId,
pageAlarmBack,
updateAlarmBack,
delAlarmBack,
pushAlarmHis,
downAlarmBack
} from '@/api/Supervisionmanage2/feedbackdata'
import { listRoleMenu, updateRoleMenu } from '@/api/admin/role'
export default {
components: { Area, Timeinterval, Organization2, Organization1 },
props: {},
data() {
return {
biaoCode: '',
id: JSON.parse(window.sessionStorage.getItem('Info')).roleList[0],
isLoading: false,
modifyInformation: false,
zoom: '', //图表焦点校验
vh: undefined,
editCheckCode6: '',
valueTitle6: '',
editCheckCode5: '',
valueTitle5: '',
formData: {
searchBeginTime: '',
searchEndTime: '',
pageNum: 1,
pageSize: 20
},
form1: {
completeTime: '',
executeOrgId: '',
executeOrgName: '',
feedbackOrgId: '',
feedbackOrgName: '',
fillUserId: '',
fillUserName: '',
treatmentMeasures: '',
workAlarmId: ''
},
rules: {
treatmentMeasures: [{ required: true, message: '请输入采取措施', trigger: 'blur' }],
fillUserId: [{ required: true, message: '请选择接收人名称', trigger: 'change' }],
completeTime: [{ required: true, message: '选择日期', trigger: 'change' }]
},
total: 0,
tableData: [],
multipleSelection: [],
ImplementationPeople: []
}
},
created() {
this.getUserId()
},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.listmenuRoleList()
this.onSubmit()
this.getUserId()
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem('appheight') - 95
},
clear(key, key1) {
this.form1[key] = ''
this.form1[key1] = ''
},
//获取权限
listmenuRoleList() {
let p = { id: this.id }
listRoleMenu(p).then(response => {
let ids = []
//console.log("权限资源",response.data)
response.data.forEach(item => {
if (item.code === 'tjrbpush') {
this.biaoCode = item.code
}
})
})
},
// //获取类型
// getclassificationData() {
// //计划状态
// this.planStatus = dicData("plan_status", []);
// },
// takeover(val){
// this.formData.searchValue = val[0].id
// this.onSubmit();
// },
getUserId() {
let form = {
deptId: JSON.parse(window.sessionStorage.getItem('Info')).deptId
}
getUserListByDeptId(form).then(res => {
this.ImplementationPeople = res.data
})
},
handleSelectionChange(val) {
// console.log(val);
this.multipleSelection = val.records
},
selectAllChangeEvent(val) {
// console.log(val);
this.multipleSelection = val.records
},
//查询
onSubmit() {
this.isLoading = true
// this.$refs.Timeinterval.timeOptions = [
// // { label: "年份", value: 1 },
// // { label: "季度", value: 2 },
// { label: "月份", value: 3 },
// // { label: "周", value: 4 },
// // // { label: "自定义", value: 5 },
// ]
this.item = this.$refs.Timeinterval.timeValue
this.formData.searchBeginTime = this.item[0]
this.formData.searchEndTime = this.item[1]
pageAlarmBack(this.formData).then(res => {
this.tableData = res.data.records
this.total = res.data.total
this.isLoading = false
})
},
//数据过滤
// formFilter(row,column){
// if(row.column.property == "planStatus"){
// let title = ''
// this.planStatus.forEach(item=>{
// if( item.id == row.row.planStatus ){
// title =item.name
// }
// })
// return title
// }else {
// return row.row[row.column.property];
// }
// },
//新增
// addFn(){
// this.modifyInformation = true
// this.valueTitle = ''
// this.editCheckCode = ''
// this.form = {
// billNo:'',
// billName:'',
// billType:'',
// createrOrgName:'',
// specialityType:'',
// orgName:'',
// receiveUserName:'',
// createrTime:'',
// managerDeptName:'',
// mainSenderName:'',
// copySenderName:'',
// techSupvBasis:'',
// problemDesc:'',
// dealAdvise:'',
// }
// },
//修改
modifyFn(val) {
this.modifyInformation = true
this.valueTitle5 = val.executeOrgName
this.editCheckCode5 = val.executeOrgId
this.valueTitle6 = val.feedbackOrgName
this.editCheckCode6 = val.feedbackOrgId
this.form1 = JSON.parse(JSON.stringify(val))
},
//修改确定
modifyinformationFn() {
this.$confirm('是否确认修改?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
updateAlarmBack(this.form1).then(res => {
if (res.code == 'A0000') {
this.$message({
type: 'success',
message: res.message
})
}
this.onSubmit()
this.modifyInformation = false
})
})
.catch(() => {
this.$message({
type: 'info',
message: '已取消修改'
})
})
},
//导出
exportEvent() {
// pageAlarmBack({
// searchBeginTime:this.formData.searchBeginTime,
// searchEndTime:this.formData.searchEndTime,
// orgId:this.formData.orgId ,
// pageNum: 1,
// pageSize: this.total,
// }).then((res) => {
// res.data.records.forEach(item=>{
// if(item.isUploadHead == 0){
// item.isUploadHead = '未上送'
// }else if(item.isUploadHead == 1){
// item.isUploadHead = '已上送'
// }else if(item.isUploadHead == 2){
// item.isUploadHead = '取消上送'
// }
// })
// this.$refs.prealarmData.exportData({
// filename: '技术监督预告警单反馈数据', // 文件名字
// sheetName: "Sheet1",
// type: "xlsx", //导出文件类型 xlsx 和 csv
// useStyle: true,
// data: res.data.records, // 数据源 // 过滤那个字段导出
// columnFilterMethod: function (column, $columnIndex) {
// return !(column.$columnIndex === 0);
// },
// });
// });
downAlarmBack().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 = '技术监督预告警单反馈数据.xls' // 设置下载的文件名
document.body.appendChild(link)
link.click() //执行下载
document.body.removeChild(link)
})
},
//计划上送网公司
push() {
if (this.multipleSelection.length == 0) {
this.$message({
showClose: true,
message: '请选择一条数据上送网公司!!!',
type: 'warning'
})
return
}
// let isUpload = []
// this.multipleSelection.forEach(item=>{
// isUpload.push(item.isUploadHead)
// })
// if(isUpload.includes(1) == true){
// this.$message({
// type: "warning",
// message: '已上送,无需重复上送',
// });
// return
// }else{
this.$confirm('是否确认上送网公司?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
let ids = []
this.multipleSelection.forEach(item => {
ids.push(item.alarmBackId)
})
pushAlarmHis(ids).then(res => {
if ((res.code == 'A0000')) {
this.$message({
type: 'success',
message: res.message
})
}
this.onSubmit()
})
})
.catch(() => {
this.$message({
type: 'info',
message: '已取消上送'
})
})
// }
},
// 删除
deleteFn() {
if (this.multipleSelection.length == 0) {
this.$message({
showClose: true,
message: '请选择一条数据删除!!!',
type: 'warning'
})
return
}
this.$confirm('是否确认删除?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
let planIds = []
this.multipleSelection.forEach(item => {
planIds.push(item.alarmBackId)
})
delAlarmBack(planIds).then(res => {
if ((res.code == 'A0000')) {
this.$message({
type: 'success',
message: res.message
})
}
this.onSubmit()
})
})
.catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
})
})
},
changeFn(val) {
this.ImplementationPeople.forEach(item => {
if (val == item.id) {
this.form1.fillUserName = item.name
}
})
},
//每页条数改变时触发 选择一页显示多少行
handleSizeChange(val) {
this.formData.pageSize = val
this.onSubmit()
},
//当前页改变时触发 跳转其他页
handleCurrentChange(val) {
this.formData.pageNum = val
this.onSubmit()
},
handleNodeClick(data) {
// this.formData.searchValue = data.id
},
handleNodeClick6(data) {
this.form1.executeOrgId = data.code
this.form1.executeOrgName = data.name
},
handleNodeClick7(data) {
this.form1.feedbackOrgId = data.code
this.form1.feedbackOrgName = data.name
}
},
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 .form {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
.el-form-item {
display: flex;
width: 48%;
.el-form-item__content {
flex: 1 !important;
.el-select {
width: 100%;
}
.el-input__inner {
width: 100% !important;
}
.el-date-editor {
width: 100%;
}
}
}
}
::v-deep .el-form-item--small .el-form-item__error {
padding-top: 8px;
}
::v-deep .vxe-table .cell {
text-align: center;
}
</style>

View File

@@ -0,0 +1,505 @@
<template>
<div class="pd10" v-loading="isLoading" element-loading-text="数据加载中">
<el-form :inline="true" :model="formData" class="demo-form-inline">
<el-form-item>
<Area @click="handleNodeClick" ref="area" @send="takeover"></Area>
</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="onSubmit1">查询</el-button>
<el-button size="small" type="primary" icon="el-icon-delete" @click="deleteFn">删除</el-button>
<el-button size="small" type="primary" v-if="biaoCode === 'tjrbpush'" @click="push">上送网公司</el-button>
<el-button size="small" type="primary" icon="el-icon-download" @click="exportEvent">导出</el-button>
</el-form-item>
</el-form>
<vxe-table stripe :data="tableData" size="mini" ref="historyData"
:row-config="{ isCurrent: true, isHover: true }" :height="vh" 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' }" @checkbox-all="selectAllChangeEvent"
@checkbox-change="handleSelectionChange">
<vxe-table-column type="checkbox" align="center" width="55"></vxe-table-column>
<vxe-table-column field="workPlanName" show-overflow align="center" title="计划名称"
min-width="120px"></vxe-table-column>
<vxe-table-column field="supvOrgName" show-overflow align="center" title="监督单位"
min-width="120px"></vxe-table-column>
<vxe-table-column field="planSupvDate" show-overflow align="center" title="计划监督时间"
min-width="120px"></vxe-table-column>
<vxe-table-column field="applyComment" show-overflow align="center" title="调整原因"
min-width="120px"></vxe-table-column>
<vxe-table-column field="adjustTime" show-overflow align="center" title="调整时间"
min-width="120px"></vxe-table-column>
<vxe-table-column field="otherRemark" show-overflow align="center" title="其他要求"
min-width="120px"></vxe-table-column>
<vxe-table-column field="planStatus" show-overflow align="center" title="计划状态" min-width="120px"
:formatter="formFilter"></vxe-table-column>
<!-- <vxe-table-column field="province" show-overflow align="center" title="上次调整时间" min-width="120px"></vxe-table-column> -->
<vxe-table-column field="isUploadHead" show-overflow align="center" title="上送标识" min-width="120px">
<template slot-scope="scope">
<el-tag type="primary" size="small" style="color: #409eff; background: #ecf5ff"
v-if="scope.row.isUploadHead == 0">
未上送
</el-tag>
<el-tag type="primary" size="small" style="color: #67c23a; background: #f0f9eb"
v-if="scope.row.isUploadHead == 1">
已上送
</el-tag>
<el-tag type="primary" size="small" style="color: #909399; background: #f4f4f5"
v-if="scope.row.isUploadHead == 2">
取消上送
</el-tag>
<el-tag type="primary" size="small" style="color: orange; background: #f4f4f5"
v-if="scope.row.isUploadHead == 3">
待重新上送
</el-tag>
</template>
</vxe-table-column>
<vxe-table-column field="updateUserName" show-overflow align="center" title="更新人"
min-width="120px"></vxe-table-column>
<vxe-table-column field="updateTime" show-overflow align="center" title="更新时间"
min-width="120px"></vxe-table-column>
<vxe-table-column field="province" show-overflow align="center" title="操作" min-width="120px">
<template slot-scope="scope">
<el-button type="primary" size="mini" @click="modifyFn(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, 50, 100]" :page-size="formData.pageSize"
layout="total, sizes, prev, pager, next, jumper" :total="total" class="mt10"></el-pagination>
<!-- 修改 -->
<el-dialog :close-on-click-modal="false" title="修改" :visible.sync="modifyInformation" width="40%" height="80%">
<el-form :inline="true" :model="form" class="form" ref="form" label-width="120px" :rules="rules">
<el-form-item label="计划名称:" prop="workPlanName" class="mt10">
<el-input v-model="form.workPlanName" :disabled="disabled"></el-input>
</el-form-item>
<el-form-item label="监督单位:" class="mt10" prop="supvOrgName">
<Organization @click="handleNodeClick1" ref="Organization" :valueTitle="valueTitle"
:disabled="disabled" :editCheckCode="editCheckCode"></Organization>
</el-form-item>
<el-form-item label="计划监督时间:" prop="planSupvDate" class="mt10">
<el-date-picker v-model="form.planSupvDate" value-format="yyyy-MM-dd" type="month"
:disabled="disabled" placeholder="选择日期"></el-date-picker>
</el-form-item>
<el-form-item label="调整原因:" prop="applyComment" class="mt10">
<el-input v-model="form.applyComment"></el-input>
</el-form-item>
<el-form-item label="调整时间:" prop="adjustTime" class="mt10">
<el-date-picker v-model="form.adjustTime" value-format="yyyy-MM-dd HH:mm:ss" type="datetime"
placeholder="选择日期"></el-date-picker>
</el-form-item>
<el-form-item label="其他要求:" prop="otherRemark" class="mt10">
<el-input v-model="form.otherRemark"></el-input>
</el-form-item>
<el-form-item label="计划状态:" prop="planStatus" class="mt10">
<el-select v-model="form.planStatus" clearable placeholder="请选择计划状态">
<el-option v-for="item in planStatus" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
<!-- <el-form-item label="上次调整时间:" prop="adjustTime" class="mt10">
<el-date-picker
v-model="form.adjustTime"
value-format="yyyy-MM-dd HH:mm:ss"
type="datetime"
:disabled="disabled"
placeholder="选择日期"
>
</el-date-picker>
</el-form-item> -->
<!-- <el-form-item label="更新人:" prop="updateUserName" class="mt10">
<el-input v-model="form.updateUserName" :disabled="disabled"></el-input>
</el-form-item>
<el-form-item label="更新时间:" prop="updateTime" class="mt10">
<el-date-picker
v-model="form.updateTime"
value-format="yyyy-MM-dd HH:mm:ss"
type="datetime"
:disabled="disabled"
placeholder="选择日期"
>
</el-date-picker>
</el-form-item> -->
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="modifyInformation = false"> </el-button>
<el-button type="primary" @click="modifyinformationFn"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import Area from '@/views/components/Area/Area.vue'
import Organization from './Area/Organization.vue'
import Timeinterval from '@/views/components/TimePicker/index4'
import { dicData } from '@/assets/commjs/dictypeData'
import { pagePlanHis, updatePlanHis, delPlanHis, pushPlanHis } from '@/api/Supervisionmanage2/history'
import { listRoleMenu, updateRoleMenu } from '@/api/admin/role'
export default {
components: { Area, Timeinterval, Organization },
props: {},
data() {
return {
biaoCode: '',
id: JSON.parse(window.sessionStorage.getItem('Info')).roleList[0],
isLoading: false,
modifyInformation: false,
disabled: false,
zoom: '', //图表焦点校验
vh: undefined,
editCheckCode: '',
valueTitle: '',
formData: {
orgId: '',
searchBeginTime: '',
searchEndTime: '',
pageNum: 1,
pageSize: 20
},
form: {
id: '',
workPlanName: '',
supvOrgName: '',
supvOrgId: '',
planSupvDate: '',
applyComment: '',
adjustTime: '',
otherRemark: '',
planStatus: '',
updateUserName: '',
updateTime: ''
},
rules: {
applyComment: [{ required: true, message: '请输入调整原因', trigger: 'blur' }],
adjustTime: [{ required: true, message: '请输入调整时间', trigger: 'change' }],
otherRemark: [{ required: true, message: '请输入其他要求', trigger: 'blur' }],
planStatus: [{ required: true, message: '请选择计划状态', trigger: 'change' }]
},
total: 0,
tableData: [],
planStatus: [],
multipleSelection: []
}
},
created() {
this.getclassificationData()
},
mounted() {
this.listmenuRoleList()
this.zoom = 1 / document.body.style.zoom
// this.onSubmit();
this.setHeight()
window.addEventListener('resize', this.setHeight)
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem('appheight') - 95
this.zoom = 1 / document.body.style.zoom
},
//获取权限
listmenuRoleList() {
let p = { id: this.id }
listRoleMenu(p).then(response => {
let ids = []
//console.log("权限资源",response.data)
response.data.forEach(item => {
if (item.code === 'tjrbpush') {
this.biaoCode = item.code
}
})
})
},
takeover(val) {
this.formData.orgId = val[0].code
this.onSubmit()
},
//获取类型
getclassificationData() {
//计划状态
this.planStatus = dicData('plan_status', [])
},
handleSelectionChange(val) {
// console.log(val);
this.multipleSelection = val.records
},
selectAllChangeEvent(val) {
// console.log(val);
this.multipleSelection = val.records
},
onSubmit1() {
this.formData.pageNum = 1
this.onSubmit()
},
//查询
onSubmit() {
this.isLoading = true
// this.$refs.Timeinterval.timeOptions = [
// // { label: "年份", value: 1 },
// // { label: "季度", value: 2 },
// { label: "月份", value: 3 },
// // { label: "周", value: 4 },
// // // { label: "自定义", value: 5 },
// ]
this.item = this.$refs.Timeinterval.timeValue
this.formData.searchBeginTime = this.item[0]
this.formData.searchEndTime = this.item[1]
pagePlanHis(this.formData).then(res => {
this.tableData = res.data.records
this.total = res.data.total
this.isLoading = false
})
},
//数据过滤
formFilter(row, column) {
if (row.column.property == 'planStatus') {
let title = ''
this.planStatus.forEach(item => {
if (item.id == row.row.planStatus) {
title = item.name
}
})
return title
} else {
return row.row[row.column.property]
}
},
//修改
modifyFn(val) {
this.modifyInformation = true
this.form = JSON.parse(JSON.stringify(val))
// this.planStatus.forEach(item=>{
// if( item.gvalue == this.form.planStatus ){
// this.form.planStatus =item.name
// }
// })
this.disabled = true
this.valueTitle = val.supvOrgName
this.editCheckCode = val.supvOrgId
},
//修改确定
modifyinformationFn() {
this.$refs.form.validate(value => {
// console.log(value);
if (value == true) {
this.$confirm('是否确认修改?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
// this.planStatus.forEach(item=>{
// // console.log(item);
// if(this.form.planStatus == item.id){
// this.form.planStatus = item.gvalue
// }
// })
updatePlanHis(this.form).then(res => {
if (res.code == 'A0000') {
this.$message({
type: 'success',
message: res.message
})
}
this.onSubmit()
this.modifyInformation = false
})
})
.catch(() => {
this.$message({
type: 'info',
message: '已取消修改'
})
})
}
})
},
//导出
exportEvent() {
pagePlanHis({
searchBeginTime: this.formData.searchBeginTime,
searchEndTime: this.formData.searchEndTime,
orgId: this.formData.orgId,
pageNum: 1,
pageSize: this.total
}).then(res => {
res.data.records.forEach(item => {
if (item.isUploadHead == 0) {
item.isUploadHead = '未上送'
} else if (item.isUploadHead == 1) {
item.isUploadHead = '已上送'
} else if (item.isUploadHead == 2) {
item.isUploadHead = '取消上送'
}
})
this.$refs.historyData.exportData({
filename: '监督计划变更历史数据', // 文件名字
sheetName: 'Sheet1',
type: 'xlsx', //导出文件类型 xlsx 和 csv
useStyle: true,
data: res.data.records, // 数据源 // 过滤那个字段导出
columnFilterMethod: function (column, $columnIndex) {
return !(column.$columnIndex === 0)
}
})
})
},
//计划上送网公司
push() {
if (this.multipleSelection.length == 0) {
this.$message({
showClose: true,
message: '请选择一条数据上送网公司!!!',
type: 'warning'
})
return
}
// let isUpload = []
// this.multipleSelection.forEach(item=>{
// isUpload.push(item.isUploadHead)
// })
// if(isUpload.includes(1) == true){
// this.$message({
// type: "warning",
// message: '已上送,无需重复上送',
// });
// return
// }else{
this.$confirm('是否确认上送网公司?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
let ids = []
this.multipleSelection.forEach(item => {
ids.push(item.id)
})
pushPlanHis(ids).then(res => {
if ((res.code == 'A0000')) {
this.$message({
type: 'success',
message: res.message
})
}
this.onSubmit()
})
})
.catch(() => {
this.$message({
type: 'info',
message: '已取消上送'
})
})
// }
},
// 删除
deleteFn() {
if (this.multipleSelection.length == 0) {
this.$message({
showClose: true,
message: '请选择一条数据删除!!!',
type: 'warning'
})
return
}
this.$confirm('是否确认删除?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
let planIds = []
this.multipleSelection.forEach(item => {
planIds.push(item.id)
})
delPlanHis(planIds).then(res => {
if ((res.code == 'A0000')) {
this.$message({
type: 'success',
message: res.message
})
}
this.onSubmit()
})
})
.catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
})
})
},
//每页条数改变时触发 选择一页显示多少行
handleSizeChange(val) {
this.formData.pageSize = val
this.onSubmit()
},
//当前页改变时触发 跳转其他页
handleCurrentChange(val) {
this.formData.pageNum = val
this.onSubmit()
},
handleNodeClick(data) {
this.formData.orgId = data.code
},
handleNodeClick1(data) {
this.form.supvOrgId = data.code
this.form.supvOrgName = data.name
}
},
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 .form {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
.el-form-item {
display: flex;
width: 48%;
.el-form-item__content {
flex: 1 !important;
.el-select {
width: 100%;
}
.el-input__inner {
width: 100% !important;
}
.el-date-editor {
width: 100%;
}
}
}
}
::v-deep .vxe-table .cell {
text-align: center;
}
</style>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,94 @@
66
<template>
<div class="pd10">
<el-row style="overflow-y: hidden">
<el-col>
<el-tabs v-model.trim="activeName" type="border-card">
<!-- 监测终端统计 -->
<el-tab-pane label="终端入网检测" name="first" :style="'height:' + vh + ';'">
<el-tabs v-if="activeName == 'first'" v-model="TerminalDetection">
<!-- 区域暂态事件统计 -->
<el-tab-pane label="列表" name="Ttable">
<Ttable v-if="TerminalDetection == 'Ttable'"></Ttable>
</el-tab-pane>
<!-- 区域暂态指标分类统计表 -->
<el-tab-pane label="图表" name="Tchart">
<Tchart v-if="TerminalDetection == 'Tchart'"></Tchart>
</el-tab-pane>
</el-tabs>
</el-tab-pane>
<!-- 监测点统计 -->
<el-tab-pane label="终端周期检测" name="second" :style="'height:' + vh + ';'">
<el-tabs v-if="activeName == 'second'" v-model="CycleDetection">
<!-- 区域暂态事件统计 -->
<el-tab-pane label="列表" name="Ctable">
<Ctable v-if="CycleDetection == 'Ctable'"></Ctable>
</el-tab-pane>
<!-- 区域暂态指标分类统计表 -->
<el-tab-pane label="图表" name="Cchart">
<Cchart v-if="CycleDetection == 'Cchart'"></Cchart>
</el-tab-pane>
</el-tabs>
</el-tab-pane>
</el-tabs>
</el-col>
</el-row>
</div>
</template>
<script>
import Ttable from './components/TerminalDetection/table.vue'
import Tchart from './components/TerminalDetection/chart.vue'
import Ctable from './components/CycleDetection/table.vue'
import Cchart from './components/CycleDetection/chart.vue'
export default {
name: 'zdjcgl',
components: { Ttable, Tchart, Cchart, Ctable },
data() {
return {
vh: '',
vh1: '',
activeName: 'first',
TerminalDetection: 'Ttable',
CycleDetection: 'Ctable',
device: ''
}
},
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') - 80 + 'px'
this.vh1 = window.sessionStorage.getItem('appheight') - 143 + '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,429 @@
<template>
<div>
<el-form :inline="true" class="demo-form-inline">
<Area @click="handleNodeClick"></Area>
<el-form-item>
<Timeinterval :interval="3" ref="Timeinterval"></Timeinterval>
</el-form-item>
<el-form-item>
<el-button type="primary" class="ml10" icon="el-icon-search" @click="info">查询</el-button>
<!-- <el-button type="primary" icon="el-icon-download">导出</el-button> -->
</el-form-item>
</el-form>
<el-row :gutter="20">
<el-col :span="12" :style="`height: ${vh}; overflow: hidden;`">
<div v-loading="isLoading1" id="electr1" style="height: 100%" />
</el-col>
<el-col :span="12" :style="`height: ${vh}; overflow: hidden;`">
<div v-loading="isLoading2" id="electr2" style="height: 100%" />
</el-col>
</el-row>
</div>
</template>
<script>
import Area from '@/views/components/Area/Area.vue'
import Timeinterval from '@/views/components/Timeinterval.vue'
import { getCycleStatistics } from '@/api/Process-supervision/Terminaldetection/index.js'
export default {
components: { Area, Timeinterval },
props: {},
data() {
return {
zoom: '',
isLoading1: false,
isLoading2: false,
vh: null,
id: JSON.parse(window.sessionStorage.getItem('Info')).deptId,
list: []
}
},
created() {},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.info()
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem('appheight') - 170 + 'px'
let domID1 = document.getElementById('electr1')
setTimeout(() => {
;(domID1.style.width = document.getElementById('app-main-in').offsetWidth / 2 + 'px'),
(domID1.style.height = window.sessionStorage.getItem('appheight') - 170 + 'px')
}, 0)
let domID2 = document.getElementById('electr2')
setTimeout(() => {
;(domID2.style.width = document.getElementById('app-main-in').offsetWidth / 2 + 'px'),
(domID2.style.height = window.sessionStorage.getItem('appheight') - 170 + 'px')
}, 0)
},
info() {
getCycleStatistics({
endTime: this.$refs.Timeinterval.timeValue[1],
id: this.id,
startTime: this.$refs.Timeinterval.timeValue[0]
}).then(res => {
this.list = res.data
this.electr1()
this.electr2()
})
},
electr1() {
this.isLoading1 = true
let echartsColor = JSON.parse(window.localStorage.echartsColor)
let echarts = require('echarts')
let domID1 = document.getElementById('electr1')
setTimeout(() => {
;(domID1.style.width = document.getElementById('app-main-in').offsetWidth / 2 + 'px'),
(domID1.style.height = window.sessionStorage.getItem('appheight') - 170 + 'px')
}, 0)
let myChart = echarts.init(domID1)
let title = []
let data = []
let data1 = []
this.list.dateStatistics.forEach(item => {
title.push(item.orgName)
data.push(item.expanded)
data1.push(item.notExpanded)
})
let option = {
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)',
borderWidth: 0
},
grid: {
right: '50px',
top: '50px',
left: '30px',
bottom: '50px',
containLabel: true
},
legend: {
data: ['已展开', '未展开'],
itemWidth: 16,
itemHeight: 16,
right: 40,
top: 20,
itemGap: 28,
textStyle: {
color: echartsColor.WordColor,
rich: {
a: {
verticalAlign: 'middle'
}
},
padding: [2, 0, 0, 0] //[上、右、下、左]
}
},
xAxis: [
{
type: 'category',
axisTick: { show: false },
data: title,
axisLine: {
lineStyle: {
color: echartsColor.thread
}
},
axisLabel: {
color: echartsColor.WordColor,
rotate: 30, interval: 0,
}
}
],
yAxis: [
{
name: '(单位/台)',
nameTextStyle: {
color: echartsColor.WordColor
},
minInterval: 1,
type: 'value',
axisLine: {
show: true,
lineStyle: {
color: echartsColor.thread
}
},
axisLabel: {
color: echartsColor.WordColor
},
splitLine: {
lineStyle: {
// 使用深浅的间隔色
color: [echartsColor.thread],
type: 'dashed',
opacity: 0.5
}
}
}
],
// dataZoom: [
// {
// show: true,
// height: 12,
// xAxisIndex: [0],
// bottom: '10px',
// start: 0,
// end: 100,
// handleIcon:
// 'path://M306.1,413c0,2.2-1.8,4-4,4h-59.8c-2.2,0-4-1.8-4-4V200.8c0-2.2,1.8-4,4-4h59.8c2.2,0,4,1.8,4,4V413z',
// handleSize: '110%',
// handleStyle: {
// color: '#d3dee5'
// },
// textStyle: {
// color: '#fff'
// },
// borderColor: '#90979c'
// },
// {
// type: 'inside',
// show: true,
// height: 15,
// start: 0,
// end: 100
// }
// ],
series: [
{
name: '已展开',
type: 'bar',
barMaxWidth: 30, //最大宽度
label: {
show: true,
position: 'top',
textStyle: {
//数值样式
color: echartsColor.WordColor
},
fontSize: 12
},
itemStyle: {
normal: { show: true, color: echartsColor.FigureColor[0] }
},
data: data
},
{
name: '未展开',
type: 'bar',
barMaxWidth: 30, //最大宽度
label: {
show: true,
position: 'top',
textStyle: {
//数值样式
color: echartsColor.WordColor
},
fontSize: 12
},
itemStyle: {
normal: { show: true, color: echartsColor.FigureColor[1] }
},
data: data1
}
]
}
option && myChart.setOption(option, true)
window.echartsArr.push(myChart)
setTimeout(function () {
myChart.resize()
}, 0)
this.isLoading1 = false
},
electr2() {
this.isLoading2 = true
let echartsColor = JSON.parse(window.localStorage.echartsColor)
let echarts = require('echarts')
let domID2 = document.getElementById('electr2')
setTimeout(() => {
;(domID2.style.width = document.getElementById('app-main-in').offsetWidth / 2 + 'px'),
(domID2.style.height = window.sessionStorage.getItem('appheight') - 170 + 'px')
}, 0)
let myChart = echarts.init(domID2)
let title = []
let data = []
this.list.orgStatistics.forEach(item => {
title.push(item.orgName)
data.push(item.count)
})
let option = {
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)',
borderWidth: 0
},
grid: {
right: '30px',
top: '50px',
left: '50px',
bottom: '50px',
containLabel: true
},
legend: {
data: ['检测终端数量'],
itemWidth: 16,
itemHeight: 16,
right: 40,
top: 20,
itemGap: 28,
textStyle: {
color: echartsColor.WordColor,
rich: {
a: {
verticalAlign: 'middle'
}
},
padding: [2, 0, 0, 0] //[上、右、下、左]
}
},
// dataZoom: [
// {
// show: true,
// height: 12,
// xAxisIndex: [0],
// bottom: '10px',
// start: 0,
// end: 100,
// handleIcon:
// 'path://M306.1,413c0,2.2-1.8,4-4,4h-59.8c-2.2,0-4-1.8-4-4V200.8c0-2.2,1.8-4,4-4h59.8c2.2,0,4,1.8,4,4V413z',
// handleSize: '110%',
// handleStyle: {
// color: '#d3dee5'
// },
// textStyle: {
// color: '#fff'
// },
// borderColor: '#90979c'
// },
// {
// type: 'inside',
// show: true,
// height: 15,
// start: 0,
// end: 100
// }
// ],
xAxis: [
{
type: 'category',
axisTick: { show: false },
data: title,
axisLine: {
lineStyle: {
color: echartsColor.thread
}
},
axisLabel: {
color: echartsColor.WordColor,
rotate: 30, interval: 0,
}
}
],
yAxis: [
{
name: '(单位/台)',
nameTextStyle: {
color: echartsColor.WordColor
},
minInterval: 1,
type: 'value',
axisLine: {
show: true,
lineStyle: {
color: echartsColor.thread
}
},
axisLabel: {
color: echartsColor.WordColor
},
splitLine: {
lineStyle: {
// 使用深浅的间隔色
color: [echartsColor.thread],
type: 'dashed',
opacity: 0.5
}
}
}
],
series: [
{
name: '检测终端数量',
type: 'bar',
barMaxWidth: 30, //最大宽度
label: {
show: true,
position: 'top',
textStyle: {
//数值样式
color: echartsColor.WordColor
},
fontSize: 12
},
itemStyle: {
normal: { show: true, color: echartsColor.FigureColor[0] }
},
data: data
}
]
}
option && myChart.setOption(option, true)
window.echartsArr.push(myChart)
setTimeout(function () {
myChart.resize()
}, 0)
this.isLoading2 = false
},
handleNodeClick(data) {
this.id = data.id
}
},
computed: {},
watch: {}
}
</script>
<style lang="scss" scoped></style>

View File

@@ -0,0 +1,417 @@
<template>
<div>
<el-form :inline="true" :model="ruleForm" class="demo-form-inline">
<el-form-item>
<Area @click="handleNodeClick" ref="area"></Area>
</el-form-item>
<el-form-item label=" 终端名称:">
<el-input v-model="ruleForm.name" clearable placeholder="请输入终端名称"></el-input>
</el-form-item>
<el-form-item label="生产厂家:">
<el-select
v-model="ruleForm.manufacture"
placeholder="请选择生产厂家"
multiple
collapse-tags
clearable
class="select"
>
<el-option
v-for="item in manufactorList"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="检测结果:">
<el-select v-model="ruleForm.testResults" placeholder="请选择检测结果" clearable class="select">
<el-option
v-for="item in testResultsList"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" class="ml10" icon="el-icon-search" @click="Monitoring">查询</el-button>
<el-button type="primary" icon="el-icon-download" @click="exportEvent">导出</el-button>
</el-form-item>
<el-form-item>
<el-form-item>
<el-button @click="UploadDetection" type="primary" icon="el-icon-upload2">上传检测报告</el-button>
</el-form-item>
</el-form-item>
</el-form>
<vxe-table
:data="totalData"
:height="height"
border
:row-config="{ isCurrent: true, isHover: true }"
size="mini"
ref="Monitoringpoint"
style="width: 100%"
v-loading="isLoading"
header-cell-class-name="table_header"
@checkbox-change="handleSelectionChange"
>
<vxe-table-column align="center" type="checkbox" width="55"></vxe-table-column>
<vxe-table-column
v-for="(item, index) in tableHeaderMonitoring"
align="center"
:field="item.prop"
:title="item.label"
:min-width="item.width"
:key="index"
:formatter="formFilter"
:show-overflow="true"
></vxe-table-column>
<vxe-column title="操作" width="320" align="center">
<template #default="{ row }">
<el-button
type="primary"
size="mini"
@click="download(row, 0)"
icon="el-icon-download"
:disabled="row.originalReport == null"
>
下载原始数据报告
</el-button>
<el-button
type="primary"
size="mini"
@click="download(row, 1)"
icon="el-icon-download"
:disabled="row.inspectionReport == null"
>
下载检测报告
</el-button>
</template>
</vxe-column>
</vxe-table>
<el-pagination
background
align="right"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="ruleForm.pageNum"
:page-sizes="[20, 30, 40, 50, 100]"
:page-size="ruleForm.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
class="mt10"
></el-pagination>
<el-dialog
:close-on-click-modal="false"
:title="titles"
:visible.sync="showBatchUpload"
width="30%"
:before-close="handleClose"
>
<el-upload
multiple
action="#"
:http-request="TerminalUpload"
:limit="999"
accept="doc"
:before-remove="beforeRemove"
:before-upload="handleBeforeUpload"
:on-error="handleUploadError"
:file-list="fileList"
:headers="headers"
class="upload-file-uploader"
ref="upload"
>
<el-button @click="fileType = ['doc']" type="primary" icon="el-icon-upload2">选择文件</el-button>
<span :style="`color:#f58003`">  (*传入的检测报告文件格式(终端编号-检测报告(yyyy-MM-dd).docx))</span>
</el-upload>
<span slot="footer" class="dialog-footer">
<el-button @click="handleClose"> </el-button>
<el-button type="primary" @click="BatchUpload"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
// import {deptTree} from '@/api/admin/dept'
import { getTerminalPage, importReport, reportDownload } from '@/api/Process-supervision/Terminaldetection/index.js'
import Area from '@/views/components/Area/Area.vue'
import { dicData } from '@/assets/commjs/dictypeData'
export default {
components: { Area },
data() {
return {
headers: {
Authorization: window.sessionStorage.getItem('cntoken')
}, // 设置上传的请求头部
vh: '',
title: '',
// 查询数据
titles: '',
ruleForm: {
name: '',
type: 1,
id: JSON.parse(window.sessionStorage.getItem('Info')).deptId,
manufacture: [],
testResults: '',
pageNum: 1,
pageSize: 20
},
total: 0,
height: null,
isLoading: false,
multipleSelection: [],
testResultsList: [
{
id: 0,
name: '未展开'
},
{
id: 1,
name: '已展开'
}
],
fileList: [],
fileType: [],
uploadType: '',
showBatchUpload: false,
manufactorList: [],
//台区台账表头
tableHeaderMonitoring: [
{ prop: 'id', label: '终端编号', width: 120 },
{ prop: 'name', label: '上产厂家', width: 180 },
{ prop: 'orgName', label: '安装位置', width: 150 },
{ prop: 'inspectionUnit', label: '送检单位', width: 150 },
{ prop: 'testResults', label: '检测结果', width: 120 },
{ prop: 'nextInspectionTime', label: '下次监测时间', width: 170 }
],
totalData: [],
monitorStateList: [], //监测点状态
monitorTypeList: [], //监测点类型
potentialTransFormerTypeList: [], //电压互感器类型
neutralGroundingModeList: [] //中性点接地方式
}
},
created() {
this.getclassificationData()
},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.Monitoring()
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.height = window.sessionStorage.getItem('appheight') - 217
},
//获取类型
getclassificationData() {
//监测点状态
this.monitorStateList = dicData('Line_State', [])
//监测点类型
this.monitorTypeList = dicData('Line_Type', [])
//电压互感器类型
this.potentialTransFormerTypeList = dicData('Voltage_Transformer', [])
//中性点接地方式
this.neutralGroundingModeList = dicData('Neutral_Point', [])
//监测点标签
this.resultList = dicData('Monitoring_Labels', [])
//生产厂家
//生产厂家
this.manufactorList = dicData('Dev_Manufacturers', [])
this.manufactorList.forEach(item => {
this.ruleForm.manufacture.push(item.id)
})
},
//查询用户用电信息
Monitoring() {
getTerminalPage(this.ruleForm).then(res => {
this.totalData = res.data.records
this.isLoading = false
})
},
// 数据过滤
formFilter(row, column) {
if (row.column.property == 'testResults') {
return row.row.testResults == 0 ? '未展开' : '已展开'
} else {
return row.row[row.column.property]
}
},
// 区域勾选
handleNodeClick(data) {
this.ruleForm.id = data.id
},
//数据上传
upload() {
if (this.multipleSelection.length == 0) {
this.$message({
showClose: true,
message: '请选择台账!!!',
type: 'warning'
})
return
}
this.$message({
showClose: true,
message: '上传成功!!!',
type: 'success'
})
},
// 重置
Reset() {
// 查询数据
this.ruleForm.searchValue = ''
},
//checkbox选择事件
handleSelectionChange(row) {
this.multipleSelection = row.records
},
//每页条数改变时触发 选择一页显示多少行
handleSizeChange(val) {
this.ruleForm.pageSize = val
this.Monitoring()
},
//当前页改变时触发 跳转其他页
handleCurrentChange(val) {
this.ruleForm.pageNum = val
this.Monitoring()
},
// 上传报告
TerminalUpload(params) {
this.fileList.push(params.file)
// form.append("files", params.file);
},
//导出
exportEvent() {
this.$refs.Monitoringpoint.exportData({
filename: 'export', // 文件名字
sheetName: 'Sheet1',
type: 'xlsx', //导出文件类型 xlsx 和 csv
useStyle: true,
data: this.totalData, // 数据源 // 过滤那个字段导出 //
columnFilterMethod: function (column, $columnIndex) {
return !(column.$columnIndex === 0 || column.$columnIndex === 7)
}
})
},
beforeRemove(file, fileList) {
this.fileList = fileList
},
// 上传前校检格式和大小
handleBeforeUpload(file) {
// 校检文件类型
if (this.fileType) {
let fileExtension = ''
if (file.name.lastIndexOf('.') > -1) {
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
}
}
this.$message('正在上传文件,请稍候...')
this.number++
return true
},
// 上传检测报告
UploadDetection() {
this.fileType = ['doc']
this.titles = '上传检测报告__支持批量上传'
this.uploadType = 1
this.showBatchUpload = true
},
// 关闭上传弹框
handleClose() {
this.fileList = []
this.showBatchUpload = false
},
// 上传失败
handleUploadError(err) {
this.$message.error(err)
},
BatchUpload() {
let form = new FormData()
form.append('type', this.uploadType)
this.fileList.forEach(item => {
form.append('files', item)
})
importReport(form)
.then(res => {
if (res.type == 'application/json') {
this.$message({
message: '上传成功!',
type: 'success'
})
this.handleClose()
this.Monitoring()
} else {
this.$message({
message: '上传失败!',
type: 'error'
})
}
})
.catch(response => {
// console.log(response);
})
},
// 下载报告
download(row, type) {
reportDownload({
id: row.id,
type: type
}).then(res => {
let blob = new Blob([res], {
type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=UTF-8'
})
const url = window.URL.createObjectURL(blob)
const link = document.createElement('a') // 创建a标签
link.href = url
link.download = type == 1 ? row.inspectionName : row.originalName // 设置下载的文件名
document.body.appendChild(link)
link.click() //执行下载
document.bodyNaNpxoveChild(link)
})
}
}
}
</script>
<style lang="less" scoped>
@import url('../../../../styles/comStyle.less');
::v-deep .vxe-table .cell {
text-align: center;
}
::v-deep .el-tabs--border-card > .el-tabs__content {
padding: 0;
}
.pms {
margin-left: 10px;
}
.obtain {
margin-left: 1220px;
}
</style>

View File

@@ -0,0 +1,236 @@
<template>
<div class="upload-file">
<el-upload
multiple
:action="uploadFileUrl"
:before-upload="handleBeforeUpload"
:limit="limit"
:on-error="handleUploadError"
:on-exceed="handleExceed"
:on-success="handleUploadSuccess"
:show-file-list="false"
:headers="headers"
class="upload-file-uploader"
accept=".doc,.docx,.xls,.xlsx,.pdf,.txt"
ref="upload"
>
<!-- 上传按钮 -->
<div style="display: flex">
<el-input
style="width: 240px"
v-model="fileList.name"
placeholder="文件名称"
disabled
></el-input>
<el-button
size="small"
style="margin-left: 10px"
type="primary"
icon="el-icon-upload2"
>上传本地报告</el-button
>
</div>
<!-- 上传提示 -->
</el-upload>
</div>
</template>
<script>
// import { getAccessToken } from "@/utils/auth";
// import { getfile } from "@/api/core/ProjectList";
export default {
name: "FileUpload",
props: {
// 值
value: [String, Object, Array],
// 数量限制
limit: {
type: Number,
default: 100,
},
id: {},
originalName: {},
originalReport: {},
// 大小限制(MB)
fileSize: {
type: Number,
default: 512,
},
// 文件类型, 例如['png', 'jpg', 'jpeg']
fileType: {
type: Array,
default: () => ["doc"],
},
// 是否显示提示
isShowTip: {
type: Boolean,
default: true,
},
},
data() {
return {
number: 0,
uploadList: [],
uploadFileUrl: "/api/process-boot/process/pmsTerminalDetection/upload", // 请求地址
headers: {
Authorization: window.sessionStorage.getItem("cntoken"),
}, // 设置上传的请求头部
fileList: {
name: "",
data: "",
},
};
},
watch: {
// value: {
// handler(val) {
// if (val) {
// let temp = 1;
// // 首先将值转为数组
// const list = Array.isArray(val) ? val : this.value.split(",");
// // 然后将数组转为对象数组
// this.fileList = list.map((item) => {
// if (typeof item === "string") {
// item = { name: item, url: item };
// }
// item.uid = item.uid || new Date().getTime() + temp++;
// return item;
// });
// } else {
// this.fileList = [];
// return [];
// }
// },
// deep: true,
// immediate: true,
// },
},
computed: {
// 是否显示提示
showTip() {
return this.isShowTip && (this.fileType || this.fileSize);
},
},
mounted() {
this.fileList = {
name: this.originalName,
data: this.originalReport,
};
},
methods: {
// 上传前校检格式和大小
handleBeforeUpload(file) {
// 校检文件类型
if (this.fileType) {
let fileExtension = "";
if (file.name.lastIndexOf(".") > -1) {
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.fileSize) {
const isLt = file.size / 1024 / 1024 < this.fileSize;
if (!isLt) {
this.$message.error(`上传文件大小不能超过 ${this.fileSize} MB!`);
return false;
}
}
this.$message("正在上传文件,请稍候...");
this.number++;
return true;
},
// 文件个数超出
handleExceed() {
// this.$message.error(`上传文件数量不能超过 ${this.limit} 个!`);
},
// 上传失败
handleUploadError(err) {
this.$message.error(err);
},
// 上传成功回调
handleUploadSuccess(res) {
this.$message({
message: "上传成功!",
type: "success",
});
this.fileList.name = `${this.id}-原始数据报告`;
this.fileList.data = res.data;
// console.log(`123`, res);
},
// 删除文件
handleDelete(index) {
// this.fileList.splice(index, 1);
// this.$emit("input", this.fileList);
},
// 获取文件名称
getFileName(name) {
if (name.lastIndexOf("/") > -1) {
return name.slice(name.lastIndexOf("/") + 1);
} else {
return "";
}
},
// 对象转成指定字符串分隔
listToString(list, separator) {
let strs = "";
separator = separator || ",";
for (let i in list) {
strs += list[i].url + separator;
}
return strs !== "" ? strs.substr(0, strs.length - 1) : "";
},
// 下载
exportExcels(e) {
getfile(e.url.substring(32)).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 = e.url.substring(
e.url.lastIndexOf("/") + 1,
e.url.length
); // 设置下载的文件名
document.body.appendChild(link);
link.click(); //执行下载
document.body.removeChild(link);
});
},
},
};
</script>
<style scoped lang="scss">
.upload-file-uploader {
margin-bottom: 5px;
}
.upload-file-list .el-upload-list__item {
border: 1px solid #e4e7ed;
line-height: 2;
margin-bottom: 10px;
position: relative;
}
.upload-file-list .ele-upload-list__item-content {
display: flex;
justify-content: space-between;
align-items: center;
color: inherit;
}
.ele-upload-list__item-content-action .el-link {
margin-right: 10px;
}
</style>

View File

@@ -0,0 +1,410 @@
<template>
<div>
<el-form :inline="true" class="demo-form-inline">
<Area @click="handleNodeClick"></Area>
<el-form-item>
<Timeinterval :interval="3" ref="Timeinterval"></Timeinterval>
</el-form-item>
<el-form-item>
<el-button type="primary" class="ml10" icon="el-icon-search" @click="info">查询</el-button>
<!-- <el-button type="primary" icon="el-icon-download">导出</el-button> -->
</el-form-item>
</el-form>
<el-row :gutter="20">
<el-col :span="12" :style="`height: ${vh}; overflow: hidden;`">
<div v-loading="isLoading1" id="electr1" style="height: 100%" />
</el-col>
<el-col :span="12" :style="`height: ${vh}; overflow: hidden;`">
<div v-loading="isLoading2" id="electr2" style="height: 100%" />
</el-col>
</el-row>
</div>
</template>
<script>
import Area from '@/views/components/Area/Area.vue'
import Timeinterval from '@/views/components/Timeinterval.vue'
import { getStatistics } from '@/api/Process-supervision/Terminaldetection/index.js'
export default {
components: { Area, Timeinterval },
props: {},
data() {
return {
zoom: '',
isLoading1: false,
isLoading2: false,
vh: null,
id: JSON.parse(window.sessionStorage.getItem('Info')).deptId,
list: []
}
},
created() {},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.info()
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem('appheight') - 170 + 'px'
let domID1 = document.getElementById('electr1')
setTimeout(() => {
;(domID1.style.width = document.getElementById('app-main-in').offsetWidth / 2 + 'px'),
(domID1.style.height = window.sessionStorage.getItem('appheight') - 170 + 'px')
}, 0)
let domID2 = document.getElementById('electr2')
setTimeout(() => {
;(domID2.style.width = document.getElementById('app-main-in').offsetWidth / 2 + 'px'),
(domID2.style.height = window.sessionStorage.getItem('appheight') - 170 + 'px')
}, 0)
},
info() {
getStatistics({
endTime: this.$refs.Timeinterval.timeValue[1],
id: this.id,
startTime: this.$refs.Timeinterval.timeValue[0]
}).then(res => {
this.list = res.data
this.electr1()
this.electr2()
})
},
electr1() {
this.isLoading1 = true
let echartsColor = JSON.parse(window.localStorage.echartsColor)
let echarts = require('echarts')
let domID1 = document.getElementById('electr1')
setTimeout(() => {
;(domID1.style.width = document.getElementById('app-main-in').offsetWidth / 2 + 'px'),
(domID1.style.height = window.sessionStorage.getItem('appheight') - 170 + 'px')
}, 0)
let myChart = echarts.init(domID1)
let title = []
let data = []
this.list.dateStatistics.forEach(item => {
title.push(item.statisticsDate)
data.push(item.count)
})
let option = {
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)',
borderWidth: 0
},
grid: {
right: '50px',
top: '50px',
left: '30px',
bottom: '50px',
containLabel: true
},
// dataZoom: [
// {
// show: true,
// height: 12,
// xAxisIndex: [0],
// bottom: '10px',
// start: 0,
// end: 100,
// handleIcon:
// 'path://M306.1,413c0,2.2-1.8,4-4,4h-59.8c-2.2,0-4-1.8-4-4V200.8c0-2.2,1.8-4,4-4h59.8c2.2,0,4,1.8,4,4V413z',
// handleSize: '110%',
// handleStyle: {
// color: '#d3dee5'
// },
// textStyle: {
// color: '#fff'
// },
// borderColor: '#90979c'
// },
// {
// type: 'inside',
// show: true,
// height: 15,
// start: 0,
// end: 100
// }
// ],
legend: {
data: ['日检测终端数量'],
itemWidth: 16,
right: 40,
top: 20,
itemHeight: 16,
itemGap: 28,
textStyle: {
color: echartsColor.WordColor,
rich: {
a: {
verticalAlign: 'middle'
}
},
padding: [2, 0, 0, 0] //[上、右、下、左]
}
},
xAxis: [
{
type: 'category',
axisTick: { show: false },
data: title,
axisLine: {
lineStyle: {
color: echartsColor.thread
}
},
axisLabel: {
color: echartsColor.WordColor,
rotate: 30, interval: 0,
}
}
],
yAxis: [
{
name: '(单位/台)',
nameTextStyle: {
color: echartsColor.WordColor
},
minInterval: 1,
type: 'value',
axisLine: {
show: true,
lineStyle: {
color: echartsColor.thread
}
},
axisLabel: {
color: echartsColor.WordColor
},
splitLine: {
lineStyle: {
// 使用深浅的间隔色
color: [echartsColor.thread],
type: 'dashed',
opacity: 0.5
}
}
}
],
series: [
{
name: '日检测终端数量',
type: 'bar',
barMaxWidth: 30, //最大宽度
label: {
show: true,
position: 'top',
textStyle: {
//数值样式
color: echartsColor.WordColor
},
fontSize: 12
},
itemStyle: {
normal: { show: true, color: echartsColor.FigureColor[0] }
},
data: data
}
]
}
option && myChart.setOption(option, true)
window.echartsArr.push(myChart)
setTimeout(function () {
myChart.resize()
}, 0)
this.isLoading1 = false
},
electr2() {
this.isLoading2 = true
let echartsColor = JSON.parse(window.localStorage.echartsColor)
let echarts = require('echarts')
let domID2 = document.getElementById('electr2')
setTimeout(() => {
;(domID2.style.width = document.getElementById('app-main-in').offsetWidth / 2 + 'px'),
(domID2.style.height = window.sessionStorage.getItem('appheight') - 170 + 'px')
}, 0)
let myChart = echarts.init(domID2)
let title = []
let data = []
this.list.orgStatistics.forEach(item => {
title.push(item.orgName)
data.push(item.count)
})
let option = {
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)',
borderWidth: 0
},
grid: {
right: '30px',
top: '50px',
left: '50px',
bottom: '50px',
containLabel: true
},
// dataZoom: [
// {
// show: true,
// height: 12,
// xAxisIndex: [0],
// bottom: '10px',
// start: 0,
// end: 100,
// handleIcon:
// 'path://M306.1,413c0,2.2-1.8,4-4,4h-59.8c-2.2,0-4-1.8-4-4V200.8c0-2.2,1.8-4,4-4h59.8c2.2,0,4,1.8,4,4V413z',
// handleSize: '110%',
// handleStyle: {
// color: '#d3dee5'
// },
// textStyle: {
// color: '#fff'
// },
// borderColor: '#90979c'
// },
// {
// type: 'inside',
// show: true,
// height: 15,
// start: 0,
// end: 100
// }
// ],
legend: {
data: ['检测终端数量'],
itemWidth: 16,
itemHeight: 16,
itemGap: 28,
right: 40,
top: 20,
textStyle: {
color: echartsColor.WordColor,
rich: {
a: {
verticalAlign: 'middle'
}
},
padding: [2, 0, 0, 0] //[上、右、下、左]
}
},
xAxis: [
{
type: 'category',
axisTick: { show: false },
data: title,
axisLine: {
lineStyle: {
color: echartsColor.thread
}
},
axisLabel: {
color: echartsColor.WordColor,
rotate: 30, interval: 0,
}
}
],
yAxis: [
{
name: '(单位/台)',
nameTextStyle: {
color: echartsColor.WordColor
},
minInterval: 1,
type: 'value',
axisLine: {
show: true,
lineStyle: {
color: echartsColor.thread
}
},
axisLabel: {
color: echartsColor.WordColor
},
splitLine: {
lineStyle: {
// 使用深浅的间隔色
color: [echartsColor.thread],
type: 'dashed',
opacity: 0.5
}
}
}
],
series: [
{
name: '检测终端数量',
type: 'bar',
barMaxWidth: 30, //最大宽度
label: {
show: true,
position: 'top',
textStyle: {
//数值样式
color: echartsColor.WordColor
},
fontSize: 12
},
itemStyle: {
normal: { show: true, color: echartsColor.FigureColor[0] }
},
data: data
}
]
}
option && myChart.setOption(option, true)
window.echartsArr.push(myChart)
setTimeout(function () {
myChart.resize()
}, 0)
this.isLoading2 = false
},
handleNodeClick(data) {
this.id = data.id
}
},
computed: {},
watch: {}
}
</script>
<style lang="scss" scoped></style>

View File

@@ -0,0 +1,252 @@
<template>
<div>
<el-dialog
:close-on-click-modal="false"
:title="title"
:visible.sync="dialogVisible"
width="700px"
:before-close="handleClose"
>
<el-form
:inline="true"
:model="form"
:rules="rules"
class="form"
ref="elform"
label-width="100px"
>
<el-form-item label="终端编号:" prop="id">
<el-input
clearable
:disabled="title == `修改`"
v-model="form.id"
placeholder="请输入终端编号"
></el-input>
</el-form-item>
<el-form-item label="终端名称:" prop="name">
<el-input
clearable
v-model="form.name"
placeholder="请输入终端名称"
></el-input>
</el-form-item>
<el-form-item label="送检单位:" prop="inspectionUnit">
<el-input
clearable
v-model="form.inspectionUnit"
placeholder="请输入送检单位"
></el-input>
</el-form-item>
<el-form-item label="检测时间:" prop="inspectionTime">
<el-date-picker
v-model="form.inspectionTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="选择日期"
>
</el-date-picker>
</el-form-item>
<el-form-item label="安装位置:" prop="installPlace">
<el-input
clearable
v-model="form.installPlace"
placeholder="请输入安装位置"
></el-input>
</el-form-item>
<el-form-item label="生产厂家:" prop="manufacture">
<el-select
v-model="form.manufacture"
placeholder="请选择生产厂家"
clearable
class="select"
>
<el-option
v-for="item in manufactorList"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
</el-form>
<el-form label-width="100px">
<el-form-item label="原始数据报告:">
<File
ref="File"
:originalName="form.originalName"
:originalReport="form.originalReport"
:id="form.id"
/>
<!-- <el-upload
ref="upload"
class="upload-files"
action=""
:limit="1"
:headers="headers"
name="file"
multiple
:auto-upload="false"
:file-list="fileList"
:on-change="handleChange"
>
<el-button slot="trigger" size="small" type="primary"
>选取文件</el-button
>
</el-upload> -->
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" size="small" @click="handleClose"
> </el-button
>
<el-button type="primary" size="small" @click="submitForm"
> </el-button
>
</span>
</el-dialog>
</div>
</template>
<script>
import {
insertTerminal,
updateTerminal,
} from "@/api/Process-supervision/Terminaldetection/index.js";
import { dicData } from "@/assets/commjs/dictypeData";
import File from "./File.vue";
export default {
components: { File },
props: {
title: {
type: String,
},
list: {
type: [Array, Object],
},
},
data() {
return {
headers: {
Authorization: window.sessionStorage.getItem("cntoken"),
},
fileList: [],
dialogVisible: true,
form: {
id: "",
inspectionUnit: "",
inspectionTime: "",
installPlace: "",
manufacture: "",
name: "",
originalName: "",
orgNo: JSON.parse(window.sessionStorage.getItem("Info")).deptId,
orgName: JSON.parse(window.sessionStorage.getItem("Info")).deptName,
},
rules: {
id: [{ required: true, message: "请输入终端编号", trigger: "blur" }],
name: [{ required: true, message: "请输入终端名称", trigger: "blur" }],
installPlace: [
{ required: true, message: "请输入安装位置", trigger: "blur" },
],
inspectionUnit: [
{ required: true, message: "请输入送检单位", trigger: "blur" },
],
inspectionTime: [
{ required: true, message: "请选择时间", trigger: "change" },
],
manufacture: [
{ required: true, message: "请选择生产厂家", trigger: "change" },
],
},
manufactorList: [],
};
},
created() {},
mounted() {
//生产厂家
this.manufactorList = dicData("Dev_Manufacturers", []);
this.title == "修改"
? (this.form = JSON.parse(JSON.stringify(this.list)))
: "";
},
methods: {
submitForm() {
this.form.originalReport = this.$refs.File.fileList.data;
this.$refs.elform.validate((valid) => {
if (valid) {
if (this.title == "新增") {
insertTerminal(this.form).then((res) => {
if (res.code == "A0000") {
this.$message({
message: res.message,
type: "success",
});
this.$emit("onSubmit");
this.$emit("handleClose");
} else {
this.$message({
message: res.message,
type: "warning",
});
}
});
} else if (this.title == "修改") {
updateTerminal(this.form).then((res) => {
if (res.code == "A0000") {
this.$message({
message: res.message,
type: "success",
});
this.$emit("onSubmit");
this.$emit("handleClose");
} else {
this.$message({
message: res.message,
type: "warning",
});
}
});
}
}
});
},
handleChange(file, fileList) {
// console.log(file, fileList);
this.fileList = fileList;
},
handleClose() {
this.$emit("handleClose");
},
},
computed: {},
watch: {},
};
</script>
<style lang="less" scoped>
@import url("../../../../styles/comStyle.less");
::v-deep .form {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
.el-form-item {
display: flex;
width: 48%;
margin-bottom: 15px !important;
.el-form-item__content {
flex: 1 !important;
.el-select {
width: 100%;
}
.el-input__inner {
width: 100% !important;
}
.el-date-editor {
width: 100%;
}
}
}
}
</style>

View File

@@ -0,0 +1,560 @@
<template>
<div>
<el-form :inline="true" :model="ruleForm" class="demo-form-inline">
<el-form-item>
<Area @click="handleNodeClick" ref="area"></Area>
</el-form-item>
<el-form-item label="终端名称:">
<el-input v-model="ruleForm.name" clearable placeholder="请输入终端名称"></el-input>
</el-form-item>
<el-form-item label="生产厂家:">
<el-select
v-model="ruleForm.manufacture"
placeholder="请选择生产厂家"
multiple
collapse-tags
clearable
class="select"
>
<el-option
v-for="item in manufactorList"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="检测结果:">
<el-select v-model="ruleForm.testResults" placeholder="请选择检测结果" clearable class="select">
<el-option
v-for="item in testResultsList"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" class="ml10" 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-upload
action="#"
:http-request="upAndDowndoad"
:before-upload="handleBeforeUpload"
:on-error="handleUploadError"
:on-success="handleUploadSuccess"
:show-file-list="false"
:headers="headers"
accept="xls"
class="upload-file-uploader"
ref="upload"
>
<el-button @click="fileType = ['xls']" type="primary" icon="el-icon-folder-opened">
excel导入
</el-button>
</el-upload>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="UploadOriginal" icon="el-icon-upload2">上传原始报告</el-button>
</el-form-item>
</el-form>
<div class="mb10">
<el-button type="primary" size="mini" icon="el-icon-plus" @click="addFn">新增</el-button>
<el-button type="primary" size="mini" icon="el-icon-edit" @click="modifyFn">修改</el-button>
<el-button type="primary" size="mini" icon="el-icon-delete" @click="deleteFn">删除</el-button>
<el-button type="primary" size="mini" icon="el-icon-download" @click="DownloadTemplate">下载模板</el-button>
</div>
<vxe-table
:data="totalData"
:height="height"
border
:row-config="{ isCurrent: true, isHover: true }"
size="mini"
ref="Monitoringpoint"
style="width: 100%"
v-loading="isLoading"
header-cell-class-name="table_header"
@checkbox-change="handleSelectionChange"
>
<vxe-table-column align="center" type="checkbox" width="55"></vxe-table-column>
<vxe-table-column
v-for="(item, index) in tableHeaderMonitoring"
align="center"
:field="item.prop"
:title="item.label"
:min-width="item.width"
:key="index"
:formatter="formFilter"
:show-overflow="true"
></vxe-table-column>
<vxe-column title="操作" width="320" align="center">
<template #default="{ row }">
<el-button
type="primary"
size="mini"
@click="download(row, 0)"
icon="el-icon-download"
:disabled="row.originalReport == null"
>
下载原始数据报告
</el-button>
<el-button
type="primary"
size="mini"
@click="download(row, 1)"
icon="el-icon-download"
:disabled="row.inspectionReport == null"
>
下载检测报告
</el-button>
</template>
</vxe-column>
</vxe-table>
<el-pagination
background
align="right"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="ruleForm.pageNum"
:page-sizes="[20, 30, 40, 50, 100]"
:page-size="ruleForm.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
class="mt10"
></el-pagination>
<newlyIncreased
:title="title"
v-if="dialogVisible"
:list="list"
@onSubmit="onSubmit"
@handleClose="dialogVisible = false"
/>
<el-dialog
:close-on-click-modal="false"
:title="titles"
:visible.sync="showBatchUpload"
width="30%"
:before-close="handleClose"
>
<el-upload
multiple
action="#"
:http-request="TerminalUpload"
:limit="999"
accept="doc"
:before-remove="beforeRemove"
:before-upload="handleBeforeUpload"
:on-error="handleUploadError"
:on-success="handleUploadSuccess"
:file-list="fileList"
:headers="headers"
class="upload-file-uploader"
ref="upload"
>
<el-button @click="fileType = ['doc']" type="primary" icon="el-icon-upload2">选择文件</el-button>
<span :style="`color:#f58003`">  (*传入的原始数据文件格式(终端编号-原始数据报告.docx))</span>
</el-upload>
<span slot="footer" class="dialog-footer">
<el-button @click="handleClose"> </el-button>
<el-button type="primary" @click="BatchUpload"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
// import {deptTree} from '@/api/admin/dept'
import {
getTerminalPage,
DownloadExport,
delTerminal,
reportDownload,
batchTerminal,
importReport
} from '@/api/Process-supervision/Terminaldetection/index.js'
import Area from '@/views/components/Area/Area.vue'
import { dicData } from '@/assets/commjs/dictypeData'
import newlyIncreased from './newlyIncreased'
export default {
components: { Area, newlyIncreased },
data() {
return {
WordColor: JSON.parse(window.localStorage.echartsColor).WordColor,
excelUrl: '/api/process-boot/process/pmsTerminalDetection/batchTerminal', // 请求地址
headers: {
Authorization: window.sessionStorage.getItem('cntoken')
}, // 设置上传的请求头部
showBatchUpload: false,
vh: '',
title: '',
titles: '',
// 查询数据
ruleForm: {
name: '',
type: 0,
id: JSON.parse(window.sessionStorage.getItem('Info')).deptId,
manufacture: [],
testResults: '',
pageNum: 1,
pageSize: 20
},
fileList: [],
fileType: [],
list: [],
total: 0,
height: null,
isLoading: false,
dialogVisible: false,
multipleSelection: [],
testResultsList: [
{
id: 0,
name: '未展开'
},
{
id: 1,
name: '已展开'
}
],
uploadType: '',
manufactorList: [],
//台区台账表头
tableHeaderMonitoring: [
{ prop: 'orgName', label: '所属单位', width: 120 },
{ prop: 'id', label: '终端编号', width: 120 },
{ prop: 'name', label: '终端名称', width: 120 },
{ prop: 'manufacture', label: '生产厂家', width: 180 },
{ prop: 'installPlace', label: '安装位置', width: 150 },
{ prop: 'inspectionUnit', label: '送检单位', width: 150 },
{ prop: 'testResults', label: '检测结果', width: 120 },
{ prop: 'inspectionTime', label: '检测时间', width: 150 },
{ prop: 'nextInspectionTime', label: '下次检测时间', width: 150 }
],
totalData: [],
monitorStateList: [], //监测点状态
monitorTypeList: [], //监测点类型
potentialTransFormerTypeList: [], //电压互感器类型
neutralGroundingModeList: [] //中性点接地方式
}
},
created() {},
mounted() {
this.getclassificationData()
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.onSubmit()
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.height = window.sessionStorage.getItem('appheight') - 252
},
//获取类型
getclassificationData() {
//监测点状态
this.monitorStateList = dicData('Line_State', [])
//监测点类型
this.monitorTypeList = dicData('Line_Type', [])
//电压互感器类型
this.potentialTransFormerTypeList = dicData('Voltage_Transformer', [])
//中性点接地方式
this.neutralGroundingModeList = dicData('Neutral_Point', [])
//监测点标签
this.resultList = dicData('Monitoring_Labels', [])
//生产厂家
this.manufactorList = dicData('Dev_Manufacturers', [])
this.manufactorList.forEach(item => {
this.ruleForm.manufacture.push(item.id)
})
},
//查询用户用电信息
onSubmit() {
getTerminalPage(this.ruleForm).then(res => {
this.totalData = res.data.records
this.total = res.data.total
this.isLoading = false
})
},
// 数据过滤
formFilter(row, column) {
if (row.column.property == 'testResults') {
return row.row.testResults == 0 ? '未展开' : '已展开'
}
if (row.column.property == 'manufacture') {
let title = ''
this.manufactorList.forEach(item => {
if (item.value == row.row.manufacture) {
title = item.label
}
})
return title
} else {
return row.row[row.column.property]
}
},
// 区域勾选
handleNodeClick(data) {
this.ruleForm.id = data.id
},
// 下载报告
download(row, type) {
reportDownload({
id: row.id,
type: type
}).then(res => {
let blob = new Blob([res], {
type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=UTF-8'
})
const url = window.URL.createObjectURL(blob)
const link = document.createElement('a') // 创建a标签
link.href = url
link.download = type == 1 ? row.inspectionName : row.originalName // 设置下载的文件名
document.body.appendChild(link)
link.click() //执行下载
document.bodyNaNpxoveChild(link)
})
},
// excl导入
leadingIn() {},
//数据上传
upload() {
if (this.multipleSelection.length == 0) {
this.$message({
showClose: true,
message: '请选择台账!!!',
type: 'warning'
})
return
}
this.$message({
showClose: true,
message: '上传成功!!!',
type: 'success'
})
},
// 下载模板
DownloadTemplate() {
DownloadExport().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 = '终端入网检测录入模板' // 设置下载的文件名
document.body.appendChild(link)
link.click() //执行下载
document.bodyNaNpxoveChild(link)
})
},
//新增
addFn(e) {
this.title = '新增'
this.dialogVisible = true
},
//修改数据
modifyFn() {
if (this.multipleSelection.length == 1) {
this.title = '修改'
this.list = this.multipleSelection[0]
this.dialogVisible = true
} else {
this.$message({
message: '请选择1条数据进行修改!',
type: 'warning'
})
}
},
// 删除
deleteFn() {
if (this.multipleSelection.length > 0) {
let list = []
this.multipleSelection.forEach(item => {
list.push(item.id)
})
delTerminal(list).then(res => {
if (res.code == 'A0000') {
this.$message({
message: '删除成功!',
type: 'success'
})
this.onSubmit()
}
})
} else {
this.$message({
message: '请选择1条数据进行删除!',
type: 'warning'
})
}
},
//checkbox选择事件
handleSelectionChange(row) {
this.multipleSelection = row.records
},
//每页条数改变时触发 选择一页显示多少行
handleSizeChange(val) {
this.ruleForm.pageSize = val
this.onSubmit()
},
//当前页改变时触发 跳转其他页
handleCurrentChange(val) {
this.ruleForm.pageNum = val
this.onSubmit()
},
//导出
exportEvent() {
this.$refs.Monitoringpoint.exportData({
filename: 'export', // 文件名字
sheetName: 'Sheet1',
type: 'xlsx', //导出文件类型 xlsx 和 csv
useStyle: true,
data: this.totalData, // 数据源 // 过滤那个字段导出 //
columnFilterMethod: function (column, $columnIndex) {
return !(column.$columnIndex === 0 || column.$columnIndex === 10)
}
})
},
// 上传前校检格式和大小
handleBeforeUpload(file) {
// 校检文件类型
if (this.fileType) {
let fileExtension = ''
if (file.name.lastIndexOf('.') > -1) {
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
}
}
this.$message('正在上传文件,请稍候...')
this.number++
return true
},
// 上传失败
handleUploadError(err) {
this.$message.error(err)
},
// 导出 excl
upAndDowndoad(params) {
// 获取文件 通过FormData将文件转化为二进制流的形式传给后端
let form = new FormData()
form.append('file', params.file)
batchTerminal(form).then(res => {
if (res.type == 'application/json') {
this.$message({
message: '上传成功,无错误数据!',
type: 'success'
})
this.onSubmit()
} else {
this.onSubmit()
this.$message({
message: '上传成功,有错误数据 自动下载 请查看',
type: 'warning'
})
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 = '模板错误信息' // 设置下载的文件名
document.body.appendChild(link)
link.click() //执行下载
document.bodyNaNpxoveChild(link)
}
})
},
// 上传报告
TerminalUpload(params) {
this.fileList.push(params.file)
// form.append("files", params.file);
},
BatchUpload() {
let form = new FormData()
form.append('type', this.uploadType)
this.fileList.forEach(item => {
form.append('files', item)
})
importReport(form)
.then(res => {
if (res.type == 'application/json') {
this.$message({
message: '上传成功!',
type: 'success'
})
this.handleClose()
this.onSubmit()
} else {
this.$message({
message: '上传失败!',
type: 'error'
})
}
})
.catch(response => {
// console.log(response);
})
},
// 上传成功回调
handleUploadSuccess(res) {},
// 上传原始报告
UploadOriginal() {
this.fileType = ['doc']
this.titles = '上传原始报告__支持批量上传'
this.uploadType = 0
this.showBatchUpload = true
},
// 关闭上传弹框
handleClose() {
this.fileList = []
this.showBatchUpload = false
},
beforeRemove(file, fileList) {
this.fileList = fileList
}
}
}
</script>
<style lang="less" scoped>
@import url('../../../../styles/comStyle.less');
::v-deep .vxe-table .cell {
text-align: center;
}
::v-deep .el-tabs--border-card > .el-tabs__content {
padding: 0;
}
.pms {
margin-left: 0.625rem;
}
.obtain {
margin-left: 76.25rem;
}
</style>

View File

@@ -0,0 +1,410 @@
<template>
<div>
<el-form :model="form" :inline="true" class="demo-form-inline">
<el-form-item label="策略等级:">
<el-select v-model="form.grade" 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="查询策略名称:">
<el-input v-model="form.name" clearable placeholder="请选择查询策略名称"></el-input>
</el-form-item>
<!-- <el-form-item>
<Timeinterval :interval="3" ref="interval"></Timeinterval>
</el-form-item> -->
<el-form-item>
<el-button type="primary" size="small" icon="el-icon-search" @click="onSubmit">查询</el-button>
<!-- <el-button type="primary" icon="el-icon-download">导出</el-button> -->
</el-form-item>
</el-form>
<div>
<el-button
@click="
dialogVisible = true
title = `新增告警单`
"
type="primary"
size="mini"
icon="el-icon-plus"
>
新增
</el-button>
</div>
<el-table
stripe
:data="tableList"
header-cell-class-name="table_header"
:height="vh"
highlight-current-row
style="width: 100%"
class="mt10"
border
v-loading="loading"
@selection-change="handleSelectionChange"
>
<!-- <el-table-column type="selection" width="55"></el-table-column> -->
<template v-for="(item, index) in warningList">
<el-table-column
:prop="item.prop"
:label="item.label"
align="center"
:min-width="item.width"
:key="index"
:formatter="formatter"
></el-table-column>
</template>
<!-- <el-table-column prop="address" label="流程状态" min-width="100px">
<template slot-scope="scope">
<span style="cursor: pointer" @click="flagLook = true">{{
scope.row.address
}}</span>
</template>
</el-table-column> -->
<el-table-column label="状态" align="center" width="120">
<template slot-scope="scope">
<el-switch
:width="60"
v-model.number="scope.row.state"
active-color="#13ce66"
inactive-color="#ff4949"
:active-value="1"
:inactive-value="2"
@change="stateChange($event, scope.row.id)"
></el-switch>
</template>
</el-table-column>
<el-table-column align="center" label="操作" width="320">
<template slot-scope="scope">
<el-button size="mini" type="primary" icon="el-icon-sort" @click="clickBinding(scope.row.id)">
绑定
</el-button>
<el-button size="mini" type="primary" icon="el-icon-edit" @click="upform(scope.row)">
编辑
</el-button>
<el-button size="mini" type="primary" icon="el-icon-delete" @click="delStrategy(scope.row.id)">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
background
align="right"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="form.pageNum"
:page-sizes="[20, 30, 40, 50, 100]"
:page-size="form.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
class="mt10"
></el-pagination>
<!-- 绑定 -->
<binding v-if="binding" :id="id" @close="binding = false" />
<!-- 新增 -->
<el-dialog
:close-on-click-modal="false"
:title="title"
:visible.sync="dialogVisible"
width="400px"
:before-close="handleClose"
>
<el-form :model="addform" :inline="true" label-width="100px" ref="addform" :rules="rules" class="forms">
<el-form-item label="策略等级:">
<el-select v-model="addform.grade" 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="策略选择:">
<el-select v-model="addform.bigType" placeholder="请选择策略">
<el-option
v-for="item in options1"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="预警单名称:" prop="name">
<el-input v-model="addform.name" 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="addInfo"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import Timeinterval from '@/views/components/Timeinterval.vue'
import binding from './binding.vue'
import {
getStrategyPage,
insertStrategy,
delStrategy,
updateStrategyState,
updateStrategy
} from '@/api/Processsupervision/tactics.js'
export default {
components: { Timeinterval, binding },
props: {
typeKey: {
type: [String, Number],
default: 0
}
},
data() {
return {
binding: false,
flagLook: false,
dialogVisible: false,
loading: true,
form: {
name: '',
grade: '',
pageNum: 1,
pageSize: 20,
type: ''
},
rules: {
name: [{ required: true, message: '请输入预警单名称', trigger: 'blur' }]
},
addform: {
grade: 0,
name: '',
type: '',
bigType: 0
},
title: '新增告警单',
vh: null,
id: '',
total: 0,
tableList: [],
warningList: [
{ prop: 'name', label: '名称', width: 150 },
{ prop: 'grade', label: '等级', width: 100 },
{ prop: 'bigType', label: '策略选择', width: 100 },
{ prop: 'updateBy', label: '更新人员', width: 100 },
{ prop: 'updateTime', label: '更新时间', width: 150 }
],
options1: [
{
value: 0,
label: '通用策略'
},
{
value: 1,
label: '定值策略'
}
],
options: [
{
value: 0,
label: '自动策略'
},
{
value: 1,
label: '手动策略'
},
{
value: 2,
label: '排除策略'
}
],
multipleSelection: []
}
},
created() {
// console.log(1233, this.typeKey);
},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.form.type = this.typeKey
this.addform.type = this.typeKey
this.onSubmit()
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem('appheight') - 253 + 'px'
},
onSubmit() {
this.loading = true
getStrategyPage(this.form).then(res => {
this.tableList = res.data.records
this.total = res.data.total
})
this.loading = false
},
handleSelectionChange(val) {
this.multipleSelection = val
},
handleNodeClick(data) {
// this.id = data.id;
},
handleSizeChange(e) {
this.form.pageSize = e
this.onSubmit()
},
handleCurrentChange(e) {
this.form.pageNum = e
this.onSubmit()
},
// 添加
addInfo() {
this.$refs['addform'].validate(valid => {
if (valid) {
if (this.title == '新增告警单') {
insertStrategy(this.addform).then(res => {
if (res.code == 'A0000') {
this.$message({
message: '新增成功!',
type: 'success'
})
this.handleClose()
this.onSubmit()
}
})
} else {
updateStrategy(this.addform).then(res => {
if (res.code == 'A0000') {
this.$message({
message: '修改成功!',
type: 'success'
})
this.handleClose()
this.onSubmit()
}
})
}
}
})
},
// 删除(id)
delStrategy(id) {
this.$confirm('确认是否删除?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
delStrategy({
ids: id
}).then(res => {
if (res.code == 'A0000') {
this.$message({
message: '删除成功!',
type: 'success'
})
this.onSubmit()
}
})
})
},
// 关闭新增
handleClose() {
this.dialogVisible = false
this.addform = {
grade: 0,
name: '',
type: this.typeKey
}
},
// 修改表格状态
stateChange(e, id) {
updateStrategyState({ id: id, state: e }).then(res => {
if (res.code == 'A0000') {
this.$message({
message: '告警单修改状态,成功!',
type: 'success'
})
}
this.onSubmit()
})
},
// 编辑
upform(row) {
this.title = '编辑告警单'
this.addform = JSON.parse(JSON.stringify(row))
this.dialogVisible = true
},
// 绑定
clickBinding(id) {
this.id = id
this.binding = true
},
// 表格过滤
formatter(row, column) {
if (column.property == 'grade') {
return row.grade == 0 ? '自动策略' : row.grade == 1 ? '手动策略' : row.grade == 2 ? '排除策略' : ''
} else if (column.property == 'bigType') {
return row.bigType == 0 ? '通用策略' : row.bigType == 1 ? '定值策略' : ''
} else {
return row[column.property]
}
}
},
computed: {},
watch: {}
}
</script>
<style lang="less" scoped>
@import url('../../../../styles/comStyle.less');
::v-deep .el-switch__core::before {
content: '关闭';
position: absolute;
top: 0;
right: 8px;
color: #fff;
}
.is-checked ::v-deep .el-switch__core::before {
content: '启用';
position: absolute;
top: 0;
left: 1px;
color: #fff;
}
::v-deep .forms {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
.el-form-item {
display: flex;
width: 100%;
.el-form-item__content {
flex: 1 !important;
.el-select {
width: 100%;
}
.el-date-editor {
width: 100%;
}
}
}
}
::v-deep .el-table .cell {
text-align: center !important;
}
</style>

View File

@@ -0,0 +1,269 @@
<template>
<div>
<!-- 上传 -->
<el-dialog
:close-on-click-modal="false"
:title="title"
:visible.sync="dialogVisible"
:before-close="handleClose"
width="80%"
>
<el-form :model="form" :inline="true" class="demo-form-inline">
<el-form-item v-if="title != '修改技术监督事务'">
<Area @click="handleNodeClick"></Area>
</el-form-item>
<!-- <el-form-item>
<Timeinterval :interval="3" ref="interval"></Timeinterval>
</el-form-item> -->
<!-- <el-form-item label="筛选数据:">
<el-input
v-model="form.value"
placeholder="请输入需要筛选的数据"
clearable
></el-input>
</el-form-item> -->
<el-form-item v-if="title != '修改技术监督事务'" label="反馈类型:">
<el-select v-model="form.type" 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>
<el-button
v-if="title != '修改技术监督事务'"
type="primary"
size="small"
icon="el-icon-search"
@click="onSubmit"
>查询</el-button
>
<el-button
v-if="title != '修改技术监督事务'"
type="primary"
size="small"
icon="el-icon-plus"
@click="create"
>生成</el-button
>
<el-button
v-else
type="primary"
size="small"
icon="el-icon-edit"
@click="update"
>修改</el-button
>
<!-- <el-button type="primary" icon="el-icon-download">导出</el-button> -->
</el-form-item>
</el-form>
<el-table
stripe
:data="tableList"
header-cell-class-name="table_header"
height="500px"
style="width: 100%"
v-loading="loading"
border
ref="multipleTable"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55"> </el-table-column>
<template v-for="(item, index) in warningList">
<el-table-column
:prop="item.prop"
:label="item.label"
:min-width="item.width"
show-overflow-tooltip
:key="index"
>
</el-table-column>
</template>
<!-- <el-table-column label="操作" width="210">
<template slot-scope="scope">
<el-button size="mini" type="primary" icon="el-icon-view"
>趋势图</el-button
>
<el-button size="mini" type="primary" 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="form.pageNum"
:page-sizes="[20, 30, 40, 50, 100]"
:page-size="form.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
class="mt10"
>
</el-pagination> -->
<!-- <span slot="footer" class="dialog-footer">
<el-button @click="handleClose"> </el-button>
<el-button type="primary" @click="handleClose"> </el-button>
</span> -->
</el-dialog>
</div>
</template>
<script>
import Timeinterval from "@/views/components/Timeinterval.vue";
import Area from "@/views/components/Area/Area.vue";
import {
initSupervise,
saveOverRunLog,
superviseDetail,
updateSupervice,
} from "@/api/Processsupervision/technology.js";
export default {
components: { Timeinterval, Area },
props: {
title: {
type: String,
},
rowList: {
type: [Array, Object],
},
},
data() {
return {
form: {
deptId: JSON.parse(window.sessionStorage.getItem("Info")).deptId,
type: "0",
initType: 1,
},
loading: false,
dialogVisible: true,
multipleSelection: [],
pageNum: 1,
pageSize: 20,
total: 1,
thsSupervise: {},
tableList: [],
options: [
{
name: "预警单",
id: "0",
},
{
name: "告警单",
id: "1",
},
],
warningList: [
{ prop: "companyName", label: "变电站", width: 100 },
{ prop: "lineIndexName", label: "监测点", width: 100 },
{ prop: "overTime", label: "越限次数", width: 100 },
{ prop: "description", label: "描述", width: 200 },
],
};
},
created() {},
mounted() {
if (this.title == "修改技术监督事务") {
this.updateList();
} else {
this.onSubmit();
}
},
methods: {
// 查询
async onSubmit() {
this.loading = true;
await initSupervise(this.form).then((res) => {
this.tableList = res.data.overRunLog;
this.thsSupervise = res.data.thsSupervise;
});
this.loading = false;
},
updateList() {
superviseDetail({ supIndex: this.rowList.supIndex }).then((res) => {
this.tableList = res.data.overRunLog;
this.thsSupervise = res.data.thsSupervise;
});
},
// 生成
create() {
if (this.multipleSelection == 0) {
this.$message({
message: "请选择1条数据 进行生成!",
type: "warning",
});
} else {
let data = {
overRunLog: this.multipleSelection,
thsSupervise: this.thsSupervise,
};
saveOverRunLog(data).then((res) => {
if (res.code == "A0000") {
this.$message({
message: "生成成功!",
type: "success",
});
this.$emit("success");
}
});
}
},
// 修改
update() {
if (this.multipleSelection == 0) {
this.$message({
message: "请选择1条数据 进行修改!",
type: "warning",
});
} else {
let data = {
overRunLog: this.multipleSelection,
thsSupervise: this.thsSupervise,
};
updateSupervice(data).then((res) => {
if (res.code == "A0000") {
this.$message({
message: "修改成功!",
type: "success",
});
this.$emit("success");
}
});
}
},
handleSelectionChange(val) {
this.multipleSelection = val;
},
handleNodeClick(data) {
this.form.deptId = data.id;
// this.id = data.id;
},
handleClose() {
this.$emit("handleClose");
},
handleSizeChange(e) {
this.form.pageSize = e;
},
handleCurrentChange(e) {
this.form.pageNum = e;
},
},
computed: {},
watch: {},
};
</script>
<style lang="less" scoped>
@import url("../../../../styles/comStyle.less");
.boxDiv {
display: flex;
justify-content: space-between;
line-height: 28px;
}
</style>

View File

@@ -0,0 +1,420 @@
<template>
<div>
<!-- <el-button class="elbut" type="primary" icon="el-icon-check" @click="clickbindMonitor">新增策略</el-button>-->
<el-button v-if="showButton" class="elbut" type="primary" icon="el-icon-check" @click="addDeptStrategy">新增策略</el-button>
<el-row :gutter="20">
<el-col :span="9" class="col1">
<el-input
placeholder="输入关键字进行过滤"
style="width: 240px"
class="mb10"
v-model="filterText"
clearable
></el-input>
<el-tree
:style="`height: ${vh}px; overflow-y: auto`"
class="filter-tree"
:data="data"
:props="defaultProps"
default-expand-all
highlight-current
:expand-on-click-node="false"
:filter-node-method="filterNode"
ref="tree"
>
<span class="custom-tree-node" slot-scope="{ node, data }">
<span @click="click1(node)">{{ node.label }}</span>
<div v-if="data.level==2">
<span>
<el-button
type="text"
icon="el-icon-document"
:style="`color:${color}`"
@click="tactics(data.id, 0)"
>
自动策略
</el-button>
<el-button
type="text"
icon="el-icon-document"
:style="`color:${color};margin-left: 15px`"
@click="tactics(data.id, 1)"
>
手动策略
</el-button>
<el-button
type="text"
icon="el-icon-document"
:style="`color:${color};margin-left: 15px`"
@click="tactics(data.id, 2)"
>
排除策略
</el-button>
</span>
</div>
</span>
</el-tree>
</el-col>
<el-col :span="15">
<vxe-table
border
stripe
style="width: 100%; margin-top: 45px"
ref="xTable"
size="mini"
highlight-current-row
row-id="id"
v-loading="loading1"
:height="vh + 'px'"
:data="tableData1"
:radio-config="{ highlight: true }"
header-cell-class-name="table_header"
>
<!-- <vxe-column type="radio" align="center" width="60"></vxe-column>-->
<vxe-column field="name" align="center" title="策略名称"></vxe-column>
<vxe-column field="type" width="150" align="center" title="策略类型">
<template v-slot="row">
<span>{{row.row.type===0 ? '预警单':'告警单' }}</span>
</template>
</vxe-column>
<vxe-column field="grade" width="150" align="center" title="策略等级">
<template v-slot="row">
<span>{{row.row.grade===0 ? '自动策略':row.row.grade === 1?'手动策略':'排他策略' }}</span>
</template>
</vxe-column>
<vxe-column field="grade" width="150" align="center" title="状态">
<template slot-scope="scope">
<el-switch
:width="60"
v-model.number="scope.row.state"
active-color="#13ce66"
inactive-color="#ff4949"
:active-value="1"
:inactive-value="2"
@change="stateChange($event, scope.row.id)"
></el-switch>
</template>
</vxe-column>
<vxe-column title="操作" align="center">
<template #default="{ row }">
<el-button type="primary" size="mini" @click="lookOver(row)" icon="el-icon-view">
查看
</el-button>
<el-button type="primary" size="mini" @click="lookOver(row)" icon="el-icon-view">
修改
</el-button>
<el-button type="primary" size="mini" @click="delStrategy(row.id)" icon="el-icon-view">
删除
</el-button>
</template>
</vxe-column>
</vxe-table>
</el-col>
<!-- <el-col :span="8">
<el-input
placeholder="输入关键字进行过滤"
style="width: 240px; margin-top: 45px"
class="mb10"
v-model="filterText1"
clearable
></el-input>
<el-tree
:data="tableData"
show-checkbox
v-loading="loading"
default-expand-all
highlight-current
node-key="id"
ref="trees"
:filter-node-method="filterNode1"
:style="`height: ${vh - 45}px; overflow-y: auto; `"
:tree-config="{ children: 'children' }"
:props="defaultProps"
></el-tree>
</el-col>-->
</el-row>
<!-- 绑定 -->
<binding v-if="binding" :id="bindingID" :operateType="operateType" :deptId="formInline.deptId" :grade="formInline.grade" :type="typeKey" @close="reClose" />
</div>
</template>
<script>
import { existMonitorDeptTree } from '@/api/admin/dept'
import {
getMonitor,
bindMonitor,
getStrategyList,
echoMonitor,
delStrategy,
updateStrategyState
} from '@/api/Processsupervision/tactics.js'
import binding from './binding.vue'
export default {
components: { binding },
props: {
typeKey: {
type: [String, Number]
}
},
data() {
return {
vh: null,
data: [],
deptId: JSON.parse(window.sessionStorage.getItem('Info')).deptId,
filterText: '',
filterText1: '',
defaultProps: {
children: 'children',
label: 'name'
},
loading: false,
loading1: false,
binding: false,
multipleSelection: [],
color: JSON.parse(window.localStorage.echartsColor).WordColor,
tableData: [],
tableData1: [],
showButton:false,
id: '',
bindingID: '',
formInline: {
alarmId: [],
grade: null,
deptId: '',
monitorId: [],
type: ''
},
operateType:0, //0.新增操作 1.查看操作
}
},
created() {},
mounted() {
this.formInline.type = this.typeKey
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.queryData()
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem('appheight') - 177
},
//获取部门树
queryData() {
existMonitorDeptTree().then(res => {
this.data = res.data
})
},
// 树点击按钮
async tactics(deptId, grade) {
this.showButton = true
this.loading = true
this.loading1 = true
this.formInline.deptId = deptId
this.formInline.grade = grade
await getMonitor({
orgId: deptId
}).then(res => {
this.tableData = res.data
this.loading = false
})
await getStrategyList({
grade: grade,
type: this.typeKey,
deptId:this.formInline.deptId
}).then(res => {
this.tableData1 = res.data
this.loading1 = false
})
await echoMonitor({
deptId: deptId,
type: this.typeKey,
grade: grade
}).then(res => {
this.$refs.trees.setCheckedKeys(res.data.children)
if (res.data.id != null) {
this.tableData1.forEach(item => {
if (item.id == res.data.id) {
this.$refs.xTable.setRadioRow(item)
}
})
}
})
},
// 保存
clickbindMonitor() {
this.multipleSelection = this.$refs.trees.getCheckedNodes()
this.formInline.alarmId = [this.$refs.xTable.getRadioRecord().id]
if (this.formInline.deptId == '') {
this.$message({
message: '请选择单位!',
type: 'warning'
})
} else if (this.formInline.alarmId.length == 0) {
this.$message({
message: '请选择策略!',
type: 'warning'
})
} else if (this.multipleSelection.length == 0) {
this.$message({
message: '请选择监测点!',
type: 'warning'
})
} else {
;(this.formInline.monitorId = []),
this.multipleSelection.forEach(item => {
if (item.leven == 3) {
this.formInline.monitorId.push(item.id)
}
})
bindMonitor(this.formInline).then(res => {
if (res.code == 'A0000') {
this.$message({
message: '保存成功!',
type: 'success'
})
}
})
}
},
click1(e){
console.log("🚀 ~ click1 ~ e:", e)
},
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
},
filterNode1(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)
}
},
selectChangeEvent({ records }) {
this.multipleSelection = records
},
// // 单选点击事件
// radioChangeEvent1({ row }) {
// this.formInline.alarmId = [row.id];
// },
// 查看
lookOver(row) {
this.bindingID = row.id
this.binding = true
this.operateType = 1
},
//新增单位策略
addDeptStrategy(){
this.binding = true
this.bindingID = ''
this.operateType = 0
},
// 删除(id)
delStrategy(id) {
this.$confirm('确认是否删除?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
delStrategy({
ids: id
}).then(res => {
if (res.code == 'A0000') {
this.$message({
message: '删除成功!',
type: 'success'
})
this.tactics(this.formInline.deptId,this.formInline.grade)
}
})
})
},
// 修改表格状态
stateChange(e, id) {
updateStrategyState({ id: id, state: e }).then(res => {
if (res.code == 'A0000') {
this.$message({
message: '告警单修改状态,成功!',
type: 'success'
})
}
this.tactics(this.formInline.deptId,this.formInline.grade)
})
},
reClose(){
this.binding = false;
this.tactics(this.formInline.deptId,this.formInline.grade)
}
},
computed: {},
watch: {
filterText(val) {
this.$refs.tree.filter(val)
},
filterText1(val) {
this.$refs.trees.filter(val)
}
}
}
</script>
<style lang="less" scoped>
@import url('../../../../styles/comStyle.less');
.custom-tree-node {
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
font-size: 14px;
padding-right: 8px;
}
.tab .cell {
text-align: left;
}
.elbut {
position: absolute;
z-index: 999;
right: 10px;
}
</style>

View File

@@ -0,0 +1,352 @@
<template>
<div>
<el-dialog
:close-on-click-modal="false"
title="告警单策略绑定"
:visible.sync="dialogVisible"
width="1300px"
:before-close="handleClose"
>
<el-row :gutter="20">
<el-col :span="24">
<el-form :model="form" ref="form">
<el-form-item label="策略名称:">
<el-input
placeholder="请输入策略名称"
style="width: 240px; margin-top: 5px"
class="mb10"
v-model="form.strategyName"
clearable
></el-input>
</el-form-item>
</el-form>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="6">
<div class="title" :style="`color:${WordColor}`">干扰源类型</div>
<div class="checkbox">
<el-checkbox
:indeterminate="isIndeterminate"
v-model="checkAll"
:disabled="flag"
@change="handleCheckAllChange($event, 0)"
>
全选
</el-checkbox>
<el-checkbox-group v-model="form.monitorTag" @change="handleCheckedCitiesChange($event, 0)">
<el-checkbox
:disabled="flag"
v-for="(item, ind) in typeList"
:key="ind"
:label="item.id"
style="display: block"
>
{{ item.name }}
</el-checkbox>
</el-checkbox-group>
</div>
</el-col>
<el-col :span="6">
<div class="title" :style="`color:${WordColor}`">指标类型</div>
<div class="checkbox">
<div style="display: flex; justify-content: space-between">
<el-checkbox
:indeterminate="isIndeterminates"
v-model="parameterAll"
@change="handleCheckAllChange($event, 1)"
:disabled="flag"
>
全选
</el-checkbox>
<div>
<el-radio v-model="form.operation" :disabled="flag" :label="0"></el-radio>
<el-radio v-model="form.operation" :disabled="flag" :label="1"></el-radio>
</div>
</div>
<el-checkbox-group v-model="form.indicatorTypes" @change="handleCheckedCitiesChange($event, 1)">
<el-checkbox
:disabled="flag"
v-for="(item, ind) in parameterList"
:key="ind"
:label="item.id"
style="display: block"
>
{{ item.name }}
</el-checkbox>
</el-checkbox-group>
</div>
</el-col>
<el-col :span="12">
<div class="title" :style="`color:${WordColor}`">监测点</div>
<div class="checkbox">
<el-input
placeholder="输入关键字进行过滤"
style="width: 240px; margin-top: 5px"
class="mb10"
v-model="filterText"
clearable
></el-input>
<el-tree
:data="tableData"
show-checkbox
v-loading="loading"
default-expand-all
highlight-current
node-key="id"
ref="trees"
style="height: 550px; overflow: auto"
:filter-node-method="filterNode"
:tree-config="{ children: 'children' }"
:props="defaultProps"
></el-tree>
</div>
</el-col>
</el-row>
<span slot="footer" class="dialog-footer">
<el-button @click="handleClose"> </el-button>
<el-button type="primary" @click="onSubmit"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { dicData } from '@/assets/commjs/dictypeData'
import {
getUpdateStrategy,
bindStrategy,
getMonitor,
getStrategyList,
echoMonitor
} from '@/api/Processsupervision/tactics.js'
export default {
components: {},
props: {
id: {
type: String,
required: true
},
//0.新增 1.修改 2.查看
operateType: {
type: Number,
required: true
},
grade: {
type: Number,
required: true
},
type: {
type: Number,
required: true
},
deptId: {
type: String,
required: true
}
},
data() {
return {
WordColor: JSON.parse(window.localStorage.echartsColor).WordColor,
radio: '1',
flag: false,
dialogVisible: true,
checkAll: false,
typeList: [], //负荷类型
form: {
deptId: '',
strategyName: '',
indicatorTypes: [],
monitorTag: [],
monitorIds: [],
operation: 0,
grade: 0,
strategyType: 0,
id: ''
},
isIndeterminate: false,
isIndeterminates: false,
parameterList: [], //指标参数
parameterAll: false,
multipleSelection: [],
filterText: '',
loading: false,
tableData: [],
defaultProps: {
children: 'children',
label: 'name'
},
rules: {
strategyName: [{ required: true, message: '请输入策略名称', trigger: 'blur' }]
}
}
},
created() {
this.info()
},
mounted() {
this.typeList = dicData('Monitoring_Labels', [])
this.parameterList = dicData('Steady_Statis', [])
},
methods: {
info() {
this.getMonitorTree(this.deptId, 1)
this.form.strategyType = this.type
this.form.deptId = this.deptId
this.form.grade = this.grade
if (this.operateType !== 0) {
this.loading = true
getUpdateStrategy({
id: this.id
}).then(res => {
this.form = res.data
this.form.strategyName = res.data.name
this.form.strategyType = res.data.type
this.$refs.trees.setCheckedKeys(res.data.monitorIds)
this.loading = false
})
} else {
//新增
}
},
onSubmit() {
if (this.form.strategyName == '') {
this.$message({
message: '策略名称不可为空!',
type: 'warning'
})
return false
}
this.form.monitorIds = []
this.multipleSelection = this.$refs.trees.getCheckedNodes()
this.multipleSelection.forEach(item => {
if (item.leven == 3) {
this.form.monitorIds.push(item.id)
}
})
console.log(this.form)
bindStrategy(this.form).then(res => {
if (res.code == 'A0000') {
this.$message({
message: '绑定成功!',
type: 'success'
})
this.handleClose()
}
})
},
handleCheckedCitiesChange(value, num) {
if (num == 0) {
let checkedCount = value.length
this.checkAll = checkedCount === this.typeList.length
this.isIndeterminate = checkedCount > 0 && checkedCount < this.typeList.length
} else {
let checkedCount = value.length
this.parameterAll = checkedCount === this.parameterList.length
this.isIndeterminates = checkedCount > 0 && checkedCount < this.parameterList.length
}
},
handleCheckAllChange(val, num) {
if (num == 0) {
this.form.monitorTag = val ? this.ChangeMethods(this.typeList) : []
this.isIndeterminate = false
} else {
this.form.indicatorTypes = val ? this.ChangeMethods(this.parameterList) : []
this.isIndeterminates = false
}
},
ChangeMethods(e) {
let list = []
e.forEach(item => {
list.push(item.id)
})
return list
},
handleClose() {
this.$emit('close')
},
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)
}
},
//获取监测点树
async getMonitorTree(deptId, grade) {
//this.loading = true
await getMonitor({
orgId: deptId
}).then(res => {
this.tableData = res.data
//this.loading = false
})
/*await echoMonitor({
deptId: data.id,
type: this.typeKey,
grade: grade
}).then(res => {
this.$refs.trees.setCheckedKeys(res.data.children)
if (res.data.id != null) {
this.tableData1.forEach(item => {
if (item.id == res.data.id) {
this.$refs.xTable.setRadioRow(item)
}
})
}
})*/
}
},
computed: {},
watch: {
filterText(val) {
this.$refs.tree.filter(val)
}
}
}
</script>
<style lang="scss" scoped>
.title {
font-size: 16px;
font-weight: 600;
}
.checkbox {
height: 600px;
overflow-y: auto;
padding-left: 10px;
}
</style>

View File

@@ -0,0 +1,692 @@
<template>
<div>
<div v-show="showFlag && flags" @ViewReport="ViewReport">
<el-form :model="form" :inline="true" class="demo-form-inline">
<!-- <Area @click="handleNodeClick"></Area> -->
<el-form-item label="筛选数据:">
<el-input v-model="form.searchValue" placeholder="请输入需要筛选的数据" clearable></el-input>
</el-form-item>
<el-form-item>
<Timeinterval :interval="3" ref="Timeinterval"></Timeinterval>
</el-form-item>
<el-form-item>
<el-button type="primary" size="small" icon="el-icon-search" @click="initQuery">查询</el-button>
<!-- <el-button type="primary" icon="el-icon-download">导出</el-button> -->
</el-form-item>
</el-form>
<el-row :gutter="20">
<el-col :span="8" :style="`height: 350px; overflow: hidden;`">
<div v-loading="isLoading1" id="electr1" style="height: 100%" />
</el-col>
<el-col :span="16" :style="`height: 350px; overflow: hidden;`">
<div v-loading="isLoading2" id="electr2" style="height: 100%" />
</el-col>
</el-row>
<el-table
stripe
highlight-current-row
:data="electrList.superviseVoList"
header-cell-class-name="table_header"
:height="vh"
style="width: 100%"
class="mt10"
border
>
<template v-for="(item, index) in list">
<el-table-column
show-overflow-tooltip
:prop="item.prop"
:label="item.label"
:min-width="item.width"
:key="index"
:formatter="formatter"
></el-table-column>
</template>
<el-table-column label="操作" width="210">
<template slot-scope="scope">
<el-button
v-if="scope.row.progress == 0 || scope.row.progress == 4"
size="mini"
type="primary"
icon="el-icon-bottom"
@click="Issued(scope.row)"
>
下发
</el-button>
<el-button
v-else-if="scope.row.progress != 6"
size="mini"
type="primary"
icon="el-icon-top"
@click="ClickUpload(scope.row)"
>
上传
</el-button>
<el-button
v-if="scope.row.progress != 0"
type="primary"
icon="el-icon-view"
size="mini"
@click="Look(scope.row)"
>
查看
</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
background
align="right"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="form.pageNum"
:page-sizes="[20, 30, 40, 50, 100]"
:page-size="form.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
class="mt10"
></el-pagination>
<!-- 上传 -->
<uploadFrame
:title="title"
v-if="flag"
:rowList="rowList"
@handleClose="
flag = false
initQuery()
"
/>
<!-- 查看 -->
<lookOver
v-if="flagLook"
:title="title"
:rowList="rowList"
@ViewReport="ViewReport"
@handleClose="flagLook = false"
/>
</div>
<!-- 趋势图 -->
<TrendChart
v-if="!showFlag"
:reportID="reportID"
@close="
showFlag = true
flags = true
"
/>
<!-- 报表 -->
<reportForm
v-if="!flags"
:reportID="reportID"
@close="
flags = true
showFlag = true
"
/>
</div>
</template>
<script>
import { superviseIndex, dowloadAlarmFormwork } from '@/api/Processsupervision/technology.js'
import reportForm from '@/views/Distributionnetwork-analysis/components/StatisticalReport/components/reportForm'
import Area from '@/views/components/Area/Area.vue'
import Timeinterval from '@/views/components/Timeinterval.vue'
import uploadFrame from './uploadFrame'
import lookOver from './lookOver'
import TrendChart from '@/views/Statistical-analysis/steadyStateIndicators/components/TrendChart.vue'
export default {
components: {
Area,
Timeinterval,
reportForm,
uploadFrame,
lookOver,
TrendChart
},
props: {},
data() {
return {
showFlag: true,
reportID: '',
flag: false,
flags: true,
flagLook: false,
zoom: '',
rowList: {},
isLoading1: false,
isLoading2: false,
vh: null,
form: {
deptId:JSON.parse(window.sessionStorage.getItem('Info')).deptId,
searchValue: '',
pageNum: 1,
pageSize: 20,
searchState: '',
type: ''
},
total: 0,
title: '预警反馈单',
electrList: {},
flagClick: true,
list: [
{ prop: 'name', label: '事务名称', width: 200 },
{ prop: 'type', label: '事务类型', width: 80 },
{ prop: 'createUser', label: '创建人员', width: 100 },
{ prop: 'companyName', label: '创建部门', width: 130 },
{ prop: 'modifyUser', label: '处理人员', width: 100 },
{ prop: 'modifyTime', label: '处理时间', width: 140 },
{ prop: 'progressTime', label: '进行时间(天)', width: 110 },
{ prop: 'progress', label: '流程状态', width: 100 },
{ prop: 'alertType', label: '预警类型', width: 100 }
]
}
},
created() {},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.initQuery()
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem('appheight') - 525 + 'px'
let domID1 = document.getElementById('electr1')
setTimeout(() => {
;(domID1.style.width = '100%'),
(domID1.style.height = '350px')
}, 0)
let domID2 = document.getElementById('electr2')
setTimeout(() => {
;(domID2.style.width = '100%'),
(domID2.style.height = '350px')
}, 0)
},
initQuery() {
this.form.searchBeginTime = this.$refs.Timeinterval.timeValue[0]
this.form.searchEndTime = this.$refs.Timeinterval.timeValue[1]
superviseIndex(this.form).then(res => {
this.flagClick = true
this.electrList = res.data
this.total = res.data.total
this.electr1()
this.electr2()
})
},
// 组件切换
ViewReport(id, val) {
if (val == 0) {
this.flags = false
} else {
this.showFlag = false
}
this.reportID = id
},
// 下发
Issued(data) {
dowloadAlarmFormwork({
type: data.type,
supIndex: data.supIndex,
formworkType: data.progress == 0 ? 0 : 1
}).then(res => {
if(res.code === 'A0000'){
let link = document.createElement('a')
link.href = res.data //url文件地址
link.click()
link.remove()
this.initQuery()
}
})
},
// 查看
Look(row) {
this.title =
row.progress == 2
? '预/告警单详情'
: row.progress == 3
? '反馈单详情'
: row.progress == 4
? '报告详情'
: row.progress == 5
? '通知单详情'
: row.progress == 6
? '预/告警单详情'
: ''
this.rowList = row
this.flagLook = true
},
// 上传
ClickUpload(row) {
this.title =
row.progress == 2
? '反馈单上传'
: row.progress == 3
? '报告上传'
: row.progress == 5
? '整改通知反馈单上传'
: ''
this.rowList = row
this.flag = true
},
electr1() {
let _this = this
this.isLoading1 = true
let echartsColor = JSON.parse(window.localStorage.echartsColor)
let echarts = require('echarts')
let domID1 = document.getElementById('electr1')
setTimeout(() => {
;(domID1.style.width = '100%'),
(domID1.style.height = '350px')
}, 0)
let myChart = echarts.init(domID1)
let option = {
title: {
text: '商务类型',
top: 20,
left: 'center',
textStyle: {
color: echartsColor.WordColor
}
//
// top: 5,
},
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)',
borderWidth: 0
},
grid: {
right: '50px',
top: '50px',
left: '30px',
bottom: '30px'
},
// legend: {
// data: ["生产量"],
// itemWidth: 16,
// itemHeight: 16,
// itemGap: 28,
// textStyle: {
// color: echartsColor.WordColor,
// rich: {
// a: {
// verticalAlign: "middle",
// },
// },
// padding: [2, 0, 0, 0], //[上、右、下、左]
// },
// },
xAxis: [
{
type: 'category',
axisTick: { show: false },
data: ['全部', '预警单', '告警单'],
axisLine: {
lineStyle: {
color: echartsColor.thread
}
},
axisLabel: {
color: echartsColor.WordColor,
}
}
],
yAxis: [
{
minInterval: 1,
type: 'value',
axisLine: {
show: true,
lineStyle: {
color: echartsColor.thread
}
},
axisLabel: {
color: echartsColor.WordColor
},
splitLine: {
lineStyle: {
// 使用深浅的间隔色
color: [echartsColor.thread],
type: 'dashed',
opacity: 0.5
}
}
}
],
series: [
{
name: '数量',
type: 'bar',
barMaxWidth: 30, //最大宽度
label: {
show: true,
position: 'top',
textStyle: {
//数值样式
color: echartsColor.WordColor
},
fontSize: 12
},
itemStyle: {
normal: { show: true, color: echartsColor.FigureColor[0] }
},
data: [
{
value: this.electrList.earlyWarnNum + this.electrList.reportWarnNum,
id: ''
},
{
value: this.electrList.earlyWarnNum == null ? 0 : this.electrList.earlyWarnNum,
id: '0'
},
{
value: this.electrList.reportWarnNum == null ? 0 : this.electrList.reportWarnNum,
id: '1'
}
]
}
]
}
option && myChart.setOption(option, true)
window.echartsArr.push(myChart)
setTimeout(function () {
myChart.resize()
myChart.on('click', function (params) {
if (_this.flagClick) {
_this.form.type = params.data.id + 0
_this.initQuery()
_this.flagClick = false
}
})
}, 0)
this.isLoading1 = false
},
electr2() {
let _this = this
this.isLoading2 = true
let echartsColor = JSON.parse(window.localStorage.echartsColor)
let echarts = require('echarts')
let domID2 = document.getElementById('electr2')
setTimeout(() => {
;(domID2.style.width = '100%'),
(domID2.style.height = '350px')
}, 0)
let myChart = echarts.init(domID2)
let option = {
title: {
text: '事务流程',
top: 20,
left: 'center',
textStyle: {
color: echartsColor.WordColor
}
//
// top: 5,
},
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)',
borderWidth: 0
},
grid: {
right: '30px',
top: '50px',
left: '50px',
bottom: '30px'
},
xAxis: [
{
type: 'category',
axisTick: { show: false },
data: [
'全部',
'开始',
'预/告警单下发',
'预/告警单反馈',
'现场测试',
'整改通知单下发',
'整改通知单反馈',
'完结'
],
axisLine: {
lineStyle: {
color: echartsColor.thread
}
},
axisLabel: {
color: echartsColor.WordColor
}
}
],
yAxis: [
{
name: '事务流程',
nameTextStyle: {
color: echartsColor.WordColor,
fontSize: 20,
fontWeight: 'bold',
padding: [0, 0, 5, 30]
},
minInterval: 1,
type: 'value',
axisLine: {
show: true,
lineStyle: {
color: echartsColor.thread
}
},
axisLabel: {
color: echartsColor.WordColor
},
splitLine: {
lineStyle: {
// 使用深浅的间隔色
color: [echartsColor.thread],
type: 'dashed',
opacity: 0.5
}
}
}
],
series: [
{
name: '数量',
type: 'bar',
barMaxWidth: 20, //最大宽度
label: {
show: true,
position: 'top',
textStyle: {
//数值样式
color: echartsColor.WordColor
},
fontSize: 12
},
itemStyle: {
normal: { show: true, color: echartsColor.FigureColor[0] }
},
data: [
{
value:
this.electrList.startNum +
this.electrList.alarmTicketIssueNum +
this.electrList.feedbackUploadNum +
this.electrList.feedbackUploadNum +
this.electrList.testReportNum +
this.electrList.reviseNoticeIssueNum +
this.electrList.reviseFeedbackNum +
this.electrList.endNum,
id: ''
},
{
value: this.electrList.startNum == null ? 0 : this.electrList.startNum,
id: '0'
},
{ value: this.electrList.alarmTicketIssueNum, id: '1' },
{
value:
this.electrList.feedbackUploadNum == null ? 0 : this.electrList.feedbackUploadNum,
id: '2'
},
{
value: this.electrList.testReportNum == null ? 0 : this.electrList.testReportNum,
id: '3'
},
{
value:
this.electrList.reviseNoticeIssueNum == null
? 0
: this.electrList.reviseNoticeIssueNum,
id: '4'
},
{
value:
this.electrList.reviseFeedbackNum == null ? 0 : this.electrList.reviseFeedbackNum,
id: '5'
},
{
value: this.electrList.endNum == null ? 0 : this.electrList.endNum,
id: '6'
}
]
}
]
}
option && myChart.setOption(option, true)
window.echartsArr.push(myChart)
setTimeout(function () {
myChart.resize()
myChart.on('click', function (params) {
if (_this.flagClick) {
_this.form.searchState = params.data.id
_this.initQuery()
_this.flagClick = false
}
})
}, 0)
this.isLoading2 = false
},
// 数据过滤
formatter(row, column) {
if (column.property == 'type') {
return row.type == 0 ? '预警单' : '告警单'
} else if (column.property == 'alertType') {
return row.alertType == 0 ? (
'无预警'
) : row.alertType == 1 ? (
'一级预警'
) : row.alertType == 2 ? (
' 二级预警'
) : row.alertType == 3 ? (
<span style="color='red'">超时</span>
) : (
''
)
} else if (column.property == 'progress') {
return row.progress == 0 ? (
<el-button type="text" class="formatterButton">
开始
</el-button>
) : row.progress == 1 ? (
<el-button type="text" class="formatterButton">
/告警单下发
</el-button>
) : row.progress == 2 ? (
<el-button type="text" class="formatterButton">
反馈单上传
</el-button>
) : row.progress == 3 ? (
<el-button type="text" class="formatterButton">
现场测试
</el-button>
) : row.progress == 4 ? (
<el-button type="text" class="formatterButton">
整改通知单下发
</el-button>
) : row.progress == 5 ? (
<el-button type="text" class="formatterButton">
整改通知反馈单
</el-button>
) : row.progress == 6 ? (
<el-button type="text" class="formatterButton">
完结
</el-button>
) : (
''
)
} else {
return row[column.property]
}
},
handleSizeChange(e) {
this.form.pageSize = e
this.initQuery()
},
handleCurrentChange(e) {
this.form.pageNum = e
this.initQuery()
}
},
computed: {},
watch: {}
}
</script>
<style lang="less" scoped>
@import url('../../../../styles/comStyle.less');
.boxDiv {
display: flex;
justify-content: space-between;
line-height: 28px;
}
.formatterButton {
color: #0cf;
text-decoration: underline;
}
</style>

View File

@@ -0,0 +1,315 @@
<template>
<div>
<!-- 上传 -->
<el-dialog
:close-on-click-modal="false"
:title="title"
:visible.sync="dialogVisible"
:before-close="handleClose"
width="70%"
>
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="监督单详情" name="first">
<el-button
style="margin-bottom: 10px"
type="primary"
size="mini"
icon="el-icon-download"
@click="exportEvent"
>
导出
</el-button>
<el-button
style="margin-bottom: 10px"
type="primary"
size="mini"
icon="el-icon-download"
v-if="!(title == '预/告警单详情' || title == '通知单详情')"
@click="download"
>
批量下载文件
</el-button>
<span :style="`color:#f58003`">  (*默认全部,可勾选自己需要的监测点进行导出或下载!)</span>
<div :style="`color:${WordColor}`">
事务名称:{{ thsSupervise.name }}     创建时间:{{ thsSupervise.createTime }}
</div>
<!-- <el-form :model="form" :inline="true" class="demo-form-inline">
<el-form-item>
<Area @click="handleNodeClick"></Area>
</el-form-item>
<el-form-item>
<Timeinterval :interval="3" ref="interval"></Timeinterval>
</el-form-item>
<el-form-item label="筛选数据:">
<el-input
v-model="form.value"
placeholder="请输入需要筛选的数据"
clearable
></el-input>
</el-form-item>
<el-form-item label="反馈类型:">
<el-select v-model="form.region" 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>
<el-button type="primary" size="small" icon="el-icon-search"
>查询</el-button
>
</el-form-item>
</el-form> -->
<vxe-table
:data="tableList"
border
:row-config="{ isCurrent: true, isHover: true }"
size="mini"
ref="Monitoringpoint"
header-cell-class-name="table_header"
height="500px"
style="width: 100%"
>
<vxe-table-column align="center" type="checkbox" width="55" />
<template v-for="(item, index) in warningList">
<vxe-table-column
align="center"
:show-overflow="true"
:field="item.prop"
:title="item.label"
:min-width="item.width"
:key="index"
></vxe-table-column>
</template>
<vxe-table-column
v-if="!(title == '预/告警单详情' || title == '通知单详情')"
title="文件"
align="center"
min-width="180"
:show-overflow="true"
>
<template #default="{ row }">
<a
class="formatterButton"
:href="
title == '反馈单详情'
? row.feedback
: title == '报告详情'
? row.testReport
: title == '通知反馈单详情'
? row.reviseFeedback
: ''
"
>
{{
title == '反馈单详情'
? row.feedback
: title == '报告详情'
? row.testReport
: title == '通知反馈单详情'
? row.reviseFeedback
: ''
}}
</a>
</template>
</vxe-table-column>
<vxe-column
v-if="title == '预/告警单详情' || title == '通知单详情'"
title="操作"
align="center"
width="210"
>
<template #default="{ row }">
<el-button size="mini" type="primary" icon="el-icon-view" @click="ViewReport(row, 1)">
趋势图
</el-button>
<el-button size="mini" @click="ViewReport(row, 0)" type="primary" icon="el-icon-view">
日报
</el-button>
</template>
</vxe-column>
</vxe-table>
</el-tab-pane>
<el-tab-pane label="流程图详情" name="second">
<div>
<flow-view ref="flow" :flowData="flowData" />
</div>
</el-tab-pane>
</el-tabs>
<!-- <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="total"
class="mt10"
>
</el-pagination> -->
<!-- <span slot="footer" class="dialog-footer">
<el-button @click="handleClose"> </el-button>
<el-button type="primary" @click="handleClose"> </el-button>
</span> -->
</el-dialog>
</div>
</template>
<script>
import Timeinterval from '@/views/components/Timeinterval.vue'
import Area from '@/views/components/Area/Area.vue'
import { superviseDetail, downloadFeedBackFile } from '@/api/Processsupervision/technology.js'
import FlowView from '@/views/flowable/flowview.vue'
import { flowXmlAndNode } from '@/api/flowable/definition'
export default {
components: { Timeinterval, Area, FlowView },
props: {
title: {
type: String
},
rowList: {
type: [Array, Object]
}
},
data() {
return {
activeName: 'first',
// 模型xml数据
flowData: {},
titles: '',
form: {},
WordColor: JSON.parse(window.localStorage.echartsColor).WordColor,
dialogVisible: true,
pageNum: 1,
pageSize: 20,
total: 1,
tableList: [],
warningList: [
{ prop: 'companyName', label: '供电公司', width: 100 },
{ prop: 'name', label: '变电站', width: 100 },
{ prop: 'lineIndexName', label: '监测点', width: 100 },
{ prop: 'overTime', label: '越限次数', width: 100 },
{ prop: 'description', label: '描述', width: 200 }
],
options: [],
thsSupervise: {}
}
},
created() {},
mounted() {
this.titles = this.title
this.onSubmit()
},
methods: {
handleClick(tab, event) {
if (this.activeName == 'second') {
flowXmlAndNode({
procInsId: this.rowList.execId,
deployId: this.rowList.deploymentId
}).then(res => {
this.flowData = res.data
})
}
},
onSubmit() {
superviseDetail({ supIndex: this.rowList.supIndex }).then(res => {
this.tableList = res.data.overRunLog
this.thsSupervise = res.data.thsSupervise
})
},
// handleNodeClick(data) {
// // this.id = data.id;
// },
handleClose() {
this.$emit('handleClose')
},
handleSizeChange(e) {
this.pageSize = e
},
handleCurrentChange(e) {
this.pageNum = e
},
//导出
exportEvent() {
this.$refs.Monitoringpoint.exportData({
filename: 'export', // 文件名字
sheetName: 'Sheet1',
type: 'xlsx', //导出文件类型 xlsx 和 csv
useStyle: true,
data:
this.$refs.Monitoringpoint.getCheckboxRecords().length == 0
? this.tableList
: this.$refs.Monitoringpoint.getCheckboxRecords(), // 数据源 // 过滤那个字段导出 //
columnFilterMethod: function (column, $columnIndex) {
return !(column.$columnIndex === 6 || column.$columnIndex === 0)
}
})
},
// 批量下载文件
download() {
let data = {
ids: [],
ticketType:
this.title == '反馈单详情'
? 1
: this.title == '报告详情'
? 2
: this.title == '通知反馈单详情'
? 3
: ''
}
if (this.$refs.Monitoringpoint.getCheckboxRecords().length == 0) {
this.tableList.forEach(item => {
data.ids.push(item.id)
})
} else {
this.$refs.Monitoringpoint.getCheckboxRecords().forEach(item => {
data.ids.push(item.id)
})
}
downloadFeedBackFile(data).then(response => {
//console.log(res)
let blob = new Blob([response], { type: 'application/zip' }) // console.log(blob) // var href = window.URL.createObjectURL(blob); //创建下载的链接
const url = window.URL.createObjectURL(blob)
const link = document.createElement('a') // 创建a标签
link.href = url
link.download = '监测点文件' // 设置下载的文件名
document.body.appendChild(link)
link.click() //执行下载
document.body.removeChild(link) //释放标签
})
},
// 查看趋势图
ViewReport(row, val) {
this.$emit('ViewReport', row.id, val)
}
},
computed: {},
watch: {}
}
</script>
<style lang="less" scoped>
@import url('../../../../styles/comStyle.less');
.boxDiv {
display: flex;
justify-content: space-between;
line-height: 28px;
}
.formatterButton {
color: #0cf;
text-decoration: underline;
}
</style>

View File

@@ -0,0 +1,603 @@
<template>
<div>
<el-form :model="form" :inline="true" class="demo-form-inline">
<el-form-item label="筛选数据:">
<el-input v-model="form.searchValue" placeholder="请输入关键字" clearable></el-input>
</el-form-item>
<el-form-item label="事务类型:">
<el-select v-model="form.type" 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="所属流程:">
<el-select v-model="form.searchState" 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>
<Timeinterval :timeOptions="optionsw" :interval="3" ref="Timeinterval"></Timeinterval>
</el-form-item>
<el-form-item>
<el-button type="primary" size="small" icon="el-icon-search" @click="onSubmit">查询</el-button>
<!-- <el-button type="primary" icon="el-icon-download">导出</el-button> -->
</el-form-item>
</el-form>
<div>
<!-- <el-button type="primary" size="mini" icon="el-icon-caret-right"
>开始</el-button
> -->
<el-button
@click="
flagSupervision = true
title = '新增技术监督事务'
"
type="primary"
size="mini"
icon="el-icon-plus"
>
新建
</el-button>
<el-button type="primary" size="mini" icon="el-icon-top" @click="showBatchUpload = true">
上传模板
</el-button>
</div>
<el-table
stripe
:data="tableList"
highlight-current-row
header-cell-class-name="table_header"
:height="vh"
v-loading="loading"
style="width: 100%"
class="mt10"
border
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55"></el-table-column>
<el-table-column
v-for="(item, index) in warningList"
:prop="item.prop"
show-overflow-tooltip
:label="item.label"
:min-width="item.width"
:key="index"
:formatter="formatter"
></el-table-column>
<el-table-column label="操作" width="200">
<template slot-scope="scope">
<el-button
size="mini"
type="primary"
icon="el-icon-edit"
:disabled="scope.row.progress != 0"
@click="update(scope.row)"
>
修改
</el-button>
<el-button
size="mini"
type="primary"
icon="el-icon-delete"
:disabled="scope.row.progress != 0"
@click="delSupervise(scope.row)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
background
align="right"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="form.pageNum"
:page-sizes="[20, 30, 40, 50, 100]"
:page-size="form.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
class="mt10"
></el-pagination>
<!-- 详情 -->
<lookOver v-if="flagLook" :title="title" :rowList="rowList" @handleClose="flagLook = false" />
<!-- 上传 -->
<uploadFrame
:title="title"
:rowList="rowList"
v-if="flag"
@handleClose="
flag = false
onSubmit()
"
/>
<!-- 新增 修改 -->
<Supervision
v-if="flagSupervision"
:title="title"
:rowList="rowList"
@handleClose="flagSupervision = false"
@success="
flagSupervision = false
onSubmit()
"
/>
<!-- 上传模板 -->
<el-dialog
:close-on-click-modal="false"
title="上传模板"
:visible.sync="showBatchUpload"
width="30%"
:before-close="handleCloseP"
>
<el-form :model="formInline" :inline="true">
<el-form-item label="模板:">
<el-select v-model="formInline.formworkType" placeholder="选择模板">
<el-option label="预/告警单模板" value="0"></el-option>
<el-option label="整改通知反馈单模板" value="1"></el-option>
</el-select>
</el-form-item>
<el-form-item label="类型:">
<el-select v-model="formInline.type" placeholder="选择类型">
<el-option label="预警" value="0"></el-option>
<el-option label="告警" value="1"></el-option>
</el-select>
</el-form-item>
</el-form>
<el-upload
multiple
action="#"
:http-request="TerminalUpload"
:limit="limit"
accept="doc"
:before-remove="beforeRemove"
:on-error="handleUploadError"
:file-list="fileList"
:headers="headers"
:on-exceed="handleExceed"
class="upload-file-uploader"
ref="upload"
>
<el-button type="primary" icon="el-icon-upload2">选择文件</el-button>
</el-upload>
<span slot="footer" class="dialog-footer">
<el-button @click="handleCloseP"> </el-button>
<el-button type="primary" @click="BatchUpload"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import Timeinterval from '@/views/components/Timeinterval.vue'
import lookOver from './lookOver'
import uploadFrame from './uploadFrame'
import Supervision from './Supervision'
import {
querySuperviseList,
dowloadAlarmFormwork,
deleteSupervise,
uploadAlarmFormwork
} from '@/api/Processsupervision/technology.js'
export default {
components: { Timeinterval, lookOver, Supervision, uploadFrame },
props: {},
data() {
return {
formInline: {
formworkType: '0',
type: '0'
},
optionsw: [
{ label: '年份', value: 1 },
{ label: '季度', value: 2 },
{ label: '月份', value: 3 },
{ label: '周', value: 4 }
],
limit: 1,
fileList: [],
headers: {
Authorization: window.sessionStorage.getItem('cntoken')
}, // 设置上传的请求头部
showBatchUpload: false,
loading: false,
flagLook: false,
flagSupervision: false,
form: {
pageNum: 1,
pageSize: 20,
searchBeginTime: '',
searchEndTime: '',
searchState: '',
type: '',
searchValue: ''
},
rowList: {},
title: '新增技术监督事务',
vh: null,
total: 0,
tableList: [],
flag: false,
warningList: [
{ prop: 'name', label: '监督名称', width: 180 },
{ prop: 'type', label: '事务类型', width: 100 },
{ prop: 'createUser', label: '创建用户', width: 100 },
{ prop: 'companyName', label: '创建部门', width: 160 },
{ prop: 'createTime', label: '创建时间', width: 160 },
//{ prop: 'modifyTime', label: '修改时间', width: 160 },
{ prop: 'haveAlarmticket', label: '预/告警单', width: 100 },
{ prop: 'haveFeedback', label: '反馈单', width: 100 },
{ prop: 'haveTestReport', label: '报告', width: 100 },
{ prop: 'haveReviseNotice', label: '通知单', width: 100 },
{ prop: 'haveReviseFeedback', label: '通知反馈单', width: 120 },
{ prop: 'progress', label: '流程状态', width: 140 }
],
options: [
{
name: '预警单',
id: '0'
},
{
name: '告警单',
id: '1'
}
],
options1: [
{
name: '开始',
id: '0'
},
{
name: '预/告警单下发',
id: '1'
},
{
name: '反馈单上传',
id: '2'
},
{
name: '现场测试',
id: '3'
},
{
name: '整改通知单下发',
id: '4'
},
{
name: '整改通知单反馈',
id: '5'
},
{
name: '完结',
id: '6'
}
],
multipleSelection: []
}
},
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') - 203 + 'px'
},
// 查询
async onSubmit() {
this.loading = true
this.form.searchBeginTime = this.$refs.Timeinterval.timeValue[0]
this.form.searchEndTime = this.$refs.Timeinterval.timeValue[1]
await querySuperviseList(this.form).then(res => {
this.tableList = res.data.records
this.total = res.data.total
})
this.loading = false
},
// 修改
update(row) {
this.flagSupervision = true
this.rowList = row
this.title = '修改技术监督事务'
},
// 删除
delSupervise(row) {
deleteSupervise({
deleteIds: [row.supIndex]
}).then(res => {
if (res.code == 'A0000') {
this.$message({
message: '删除成功!',
type: 'success'
})
this.onSubmit()
}
})
},
// 下发
Issued(data, formworkType) {
dowloadAlarmFormwork({
type: data.type,
supIndex: data.supIndex,
formworkType: formworkType
}).then(res => {
this.onSubmit()
let link = document.createElement('a')
link.href = res.data //url文件地址
link.click()
link.remove()
})
},
// 流程状态
ProcessStatus() {
// console.log(123);
},
// 数据过滤
formatter(row, column) {
if (column.property == 'type') {
return row.type == 0 ? '预警单' : '告警单'
} else if (column.property == 'progress') {
return row.progress == 0 ? (
<el-button type="text" class="formatterButton" on-click={() => this.ProcessStatus()}>
开始
</el-button>
) : row.progress == 1 ? (
<el-button type="text" class="formatterButton" on-click={() => this.ProcessStatus()}>
/告警单下发
</el-button>
) : row.progress == 2 ? (
<el-button type="text" class="formatterButton" on-click={() => this.ProcessStatus()}>
反馈单上传
</el-button>
) : row.progress == 3 ? (
<el-button type="text" class="formatterButton" on-click={() => this.ProcessStatus()}>
现场测试
</el-button>
) : row.progress == 4 ? (
<el-button type="text" class="formatterButton" on-click={() => this.ProcessStatus()}>
整改通知单下发
</el-button>
) : row.progress == 5 ? (
<el-button type="text" class="formatterButton" on-click={() => this.ProcessStatus()}>
整改通知反馈单
</el-button>
) : row.progress == 6 ? (
<el-button type="text" class="formatterButton" on-click={() => this.ProcessStatus()}>
完结
</el-button>
) : (
''
)
} else if (column.property == 'haveAlarmticket') {
// 预/告警单
if (row.progress == 0) {
return (
<el-button type="text" class="formatterButton" on-click={() => this.Issued(row, 0)}>
下发
</el-button>
)
} else {
return (
<el-button
type="text"
class="formatterButton"
on-click={() => {
;(this.flagLook = true), (this.title = '预/告警单详情'), (this.rowList = row)
}}
>
详情
</el-button>
)
}
} else if (column.property == 'haveFeedback') {
// 反馈单
if (row.progress == 2) {
return (
<el-button
type="text"
class="formatterButton"
on-click={() => {
;(this.title = '反馈单上传'), (this.flag = true), (this.rowList = row)
}}
>
上传
</el-button>
)
} else {
if (!row.haveFeedback) {
return '-'
} else {
return (
<el-button
type="text"
class="formatterButton"
on-click={() => {
;(this.flagLook = true), (this.title = '反馈单详情'), (this.rowList = row)
}}
>
详情
</el-button>
)
}
}
} else if (column.property == 'haveTestReport') {
// 报告
if (row.progress == 3) {
return (
<el-button
type="text"
class="formatterButton"
on-click={() => {
;(this.title = '报告上传'), (this.flag = true), (this.rowList = row)
}}
>
上传
</el-button>
)
} else {
if (!row.haveTestReport) {
return '-'
} else {
return (
<el-button
type="text"
class="formatterButton"
on-click={() => {
;(this.flagLook = true), (this.title = '报告详情'), (this.rowList = row)
}}
>
详情
</el-button>
)
}
}
} else if (column.property == 'haveReviseNotice') {
// 通知单
if (row.progress == 4) {
return (
<el-button type="text" class="formatterButton" on-click={() => this.Issued(row, 1)}>
下发
</el-button>
)
} else {
if (!row.haveReviseNotice) {
return '-'
} else {
return (
<el-button
type="text"
class="formatterButton"
on-click={() => {
;(this.flagLook = true), (this.title = '通知单详情'), (this.rowList = row)
}}
>
详情
</el-button>
)
}
}
} else if (column.property == 'haveReviseFeedback') {
// 通知反馈单
if (row.progress == 5) {
return (
<el-button
type="text"
class="formatterButton"
on-click={() => {
;(this.title = '通知反馈单上传'), (this.flag = true), (this.rowList = row)
}}
>
上传
</el-button>
)
} else {
if (!row.haveReviseFeedback) {
return '-'
} else {
return (
<el-button
type="text"
class="formatterButton"
on-click={() => {
;(this.flagLook = true), (this.title = '通知反馈单详情'), (this.rowList = row)
}}
>
详情
</el-button>
)
}
}
} else {
return row[column.property]
}
},
// 关闭上传弹框
handleCloseP() {
this.fileList = []
this.showBatchUpload = false
},
// 批量上传报告
TerminalUpload(params) {
this.fileList.push(params.file)
// form.append("files", params.file);
},
beforeRemove(file, fileList) {
this.fileList = fileList
},
// 上传失败
handleUploadError(err) {
this.$message.error(err)
},
// 批量上传
BatchUpload() {
this.$message('上传中...')
let form = new FormData()
form.append('formworkType', this.formInline.formworkType)
form.append('type', this.formInline.type)
this.fileList.forEach(item => {
form.append('file', item)
})
uploadAlarmFormwork(form)
.then(res => {
if (res.type == 'application/json') {
this.$message({
message: '上传成功!',
type: 'success'
})
this.handleCloseP()
this.onSubmit()
} else {
this.$message({
message: '上传失败!',
type: 'error'
})
}
})
.catch(response => {
// console.log(response);
})
},
handleSelectionChange(val) {
this.multipleSelection = val
},
handleNodeClick(data) {
// this.id = data.id;
},
handleExceed(files, fileList) {
this.$message.warning('不是批量上传只能上传1个文件!')
},
handleSizeChange(e) {
this.form.pageSize = e
},
handleCurrentChange(e) {
this.form.pageNum = e
}
},
computed: {},
watch: {}
}
</script>
<style lang="less" scoped>
@import url('../../../../styles/comStyle.less');
.boxDiv {
display: flex;
justify-content: space-between;
line-height: 28px;
}
.formatterButton {
color: #0cf;
text-decoration: underline;
}
</style>

View File

@@ -0,0 +1,280 @@
<template>
<div>
<!-- 上传 -->
<el-dialog
:close-on-click-modal="false"
:title="title"
:visible.sync="dialogVisible"
:before-close="handleClose"
width="80%"
>
<div class="boxDiv">
<div :style="`color:${WordColor}`">
事务名称:{{ thsSupervise.name }}     创建时间:{{
thsSupervise.createTime
}}
</div>
<div>
<el-button
type="primary"
@click="
showBatchUpload = true;
limit = 999;
"
size="mini"
icon="el-icon-upload2"
>批量上传</el-button
>
</div>
</div>
<el-table
stripe
:data="tableList"
header-cell-class-name="table_header"
height="25rem"
style="width: 100%"
class="mt10"
border
>
<template v-for="(item, index) in warningList">
<el-table-column
:prop="item.prop"
show-overflow-tooltip
:label="item.label"
:min-width="item.width"
:key="index"
>
</el-table-column>
</template>
<el-table-column label="文件" show-overflow-tooltip min-width="180">
<template slot-scope="scope">
<a
class="formatterButton"
:href="
title == '反馈单上传'
? scope.row.feedback
: title == '报告上传'
? scope.row.testReport
: title == '通知反馈单上传'
? scope.row.reviseFeedback
: ''
"
>{{
title == "反馈单上传"
? scope.row.feedback
: title == "报告上传"
? scope.row.testReport
: title == "通知反馈单上传"
? scope.row.reviseFeedback
: ""
}}</a
>
</template>
</el-table-column>
<el-table-column label="操作" min-width="130">
<template slot-scope="scope">
<el-button
size="mini"
@click="
showBatchUpload = true;
limit = 1;
id = scope.row.id;
"
type="primary"
icon="el-icon-top"
>上传</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="total"
class="mt10"
>
</el-pagination> -->
<!-- <span slot="footer" class="dialog-footer">
<el-button @click="handleClose"> </el-button>
<el-button type="primary" @click="handleClose"> </el-button>
</span> -->
<!-- 批量上传 -->
</el-dialog>
<el-dialog
:close-on-click-modal="false"
title="上传"
:visible.sync="showBatchUpload"
width="30%"
:before-close="handleCloseP"
>
<el-upload
multiple
action="#"
:http-request="TerminalUpload"
:limit="limit"
accept="doc"
:before-remove="beforeRemove"
:on-error="handleUploadError"
:file-list="fileList"
:headers="headers"
:on-exceed="handleExceed"
class="upload-file-uploader"
ref="upload"
>
<el-button type="primary" icon="el-icon-upload2">选择文件</el-button>
</el-upload>
<span slot="footer" class="dialog-footer">
<el-button @click="handleCloseP"> </el-button>
<el-button type="primary" @click="BatchUpload"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import {
superviseDetail,
uploadSuperviseTicket,
} from "@/api/Processsupervision/technology.js";
export default {
components: {},
props: {
title: {
type: String,
},
rowList: {
type: [Array, Object],
},
},
data() {
return {
limit: 1,
id: "",
headers: {
Authorization: window.sessionStorage.getItem("cntoken"),
}, // 设置上传的请求头部
showBatchUpload: false,
WordColor: JSON.parse(window.localStorage.echartsColor).WordColor,
dialogVisible: true,
pageNum: 1,
pageSize: 20,
total: 1,
tableList: [],
warningList: [
{ prop: "companyName", label: "供电公司", width: 100 },
{ prop: "name", label: "变电站", width: 100 },
{ prop: "lineIndexName", label: "监测点", width: 100 },
{ prop: "description", label: "描述", width: 200 },
{ prop: "feedback", label: "文件名", width: 200 },
],
thsSupervise: {},
fileList: [],
};
},
created() {},
mounted() {
this.onSubmit();
},
methods: {
onSubmit() {
superviseDetail({ supIndex: this.rowList.supIndex }).then((res) => {
this.tableList = res.data.overRunLog;
this.thsSupervise = res.data.thsSupervise;
});
},
handleClose() {
this.$emit("handleClose");
},
handleSizeChange(e) {
this.pageSize = e;
},
handleCurrentChange(e) {
this.pageNum = e;
},
// 批量上传
BatchUpload() {
this.$message("上传中...");
let form = new FormData();
form.append("supIndex", this.rowList.supIndex);
form.append(
"ticketType",
this.title == "反馈单上传"
? "1"
: this.title == "报告上传"
? "2"
: this.title == "整改通知反馈单上传"
? "4"
: ""
);
if (this.limit == 1) {
form.append("id", this.id);
}
this.fileList.forEach((item) => {
form.append("files", item);
});
uploadSuperviseTicket(form)
.then((res) => {
if (res.type == "application/json") {
this.$message({
message: "上传成功!",
type: "success",
});
this.handleCloseP();
this.onSubmit();
} else {
this.$message({
message: "上传失败!",
type: "error",
});
}
})
.catch((response) => {
// console.log(response);
});
},
// 批量上传报告
TerminalUpload(params) {
this.fileList.push(params.file);
// form.append("files", params.file);
},
beforeRemove(file, fileList) {
this.fileList = fileList;
},
// 上传失败
handleUploadError(err) {
this.$message.error(err);
},
// 关闭上传弹框
handleCloseP() {
this.fileList = [];
this.showBatchUpload = false;
},
handleExceed(files, fileList) {
this.$message.warning("不是批量上传只能上传1个文件!");
},
},
computed: {},
watch: {},
};
</script>
<style lang="less" scoped>
@import url("../../../../styles/comStyle.less");
.boxDiv {
display: flex;
justify-content: space-between;
line-height: 1.75rem;
}
.formatterButton {
color: #0cf;
text-decoration: underline;
}
</style>

View File

@@ -0,0 +1,551 @@
<template>
<div>
<el-form :inline="true" class="demo-form-inline form">
<el-form-item>
<Area @click="handleNodeClick" ref="area"></Area>
</el-form-item>
<el-form-item>
<Timeinterval :interval="3" ref="interval"></Timeinterval>
</el-form-item>
<el-form-item>
<el-button type="primary" class="ml10" icon="el-icon-search" @click="onsubmit">查询</el-button>
<el-button type="primary" icon="el-icon-refresh" @click="Reset">重置</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" style="margin-top: 10px" label-width="110px" class="">
<el-form-item label="问题来源:" class="box1">
<el-select v-model="formData.problemSources" clearable placeholder="请选择">
<el-option
v-for="item in problemData"
:key="item.code"
:label="item.label"
:value="item.code"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="填报节点:">
<el-select v-model="formData.reportProcess" clearable placeholder="请选择">
<el-option
v-for="item in fillingProgress"
:key="item.code"
:label="item.label"
:value="item.code"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="问题名称:">
<el-input
v-model="formData.problemName"
clearable
placeholder="请填写"
style="width: 100%"
></el-input>
</el-form-item>
</el-form>
</div>
<el-row>
<el-col :span="24">
<div class="button mb10">
<el-button type="primary" icon="el-icon-s-claim" @click="toExamine" size="mini">审核</el-button>
<el-button type="primary" icon="el-icon-s-claim" @click="historyFn" size="mini">
历史审核记录
</el-button>
</div>
<el-table
stripe
:data="queryMaintenanceData"
:height="height"
border
style="width: 100%"
v-loading="isLoading"
header-cell-class-name="table_header"
@selection-change="handleSelectionChange"
:row-class-name="rowClassName"
>
<el-table-column type="selection" width="55"></el-table-column>
<el-table-column prop="number" label="序号" width="100" :show-overflow-tooltip="true">
<template scope="scope">
<span>{{ (formData.pageNum - 1) * formData.pageSize + scope.$index + 1 }}</span>
</template>
</el-table-column>
<el-table-column prop="orgName" label="所属单位" :show-overflow-tooltip="true"></el-table-column>
<el-table-column
prop="problemSources"
label="问题来源"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column
prop="powerQualityProblemNo"
label="问题编号"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column
prop="problemName"
label="问题名称"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column prop="dataDate" label="提交时间" :show-overflow-tooltip="true"></el-table-column>
<el-table-column
prop="reportProcess"
label="填报节点"
:formatter="formatter"
:show-overflow-tooltip="true"
></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>
<el-dialog
:close-on-click-modal="false"
title="问题审核"
v-if="dialogVisible"
:visible.sync="dialogVisible"
width="70%"
:before-close="handleClose"
>
<SectionTwoPage :addData="multipleSelection[0]" :onlineDetailsData="onlineDetailsData" />
<el-divider content-position="left" style="font-size: 18px; font-weight: bolder">审核意见</el-divider>
<el-form :model="dateForm" ref="dateForm" label-width="100px">
<el-form-item
prop="opinion"
label="审核意见:"
:rules="[{ required: true, message: '请输入审核意见', trigger: 'blur' }]"
>
<el-input type="textarea" :rows="1" placeholder="请输入内容" v-model="dateForm.opinion"></el-input>
</el-form-item>
</el-form>
<div style="display: flex; justify-content: center; margin-top: 10px">
<el-button type="primary" class="ml20" @click="adopt(1)"> </el-button>
<el-button type="primary" class="ml20" @click="adopt(0)"> </el-button>
<el-button type="primary" class="ml20" @click="handleClose"> </el-button>
</div>
</el-dialog>
<!-- 历史审核记录 -->
<el-dialog :close-on-click-modal="false" title="历史审核记录" :visible.sync="history" width="70%">
<el-table
stripe
:data="historyData"
:height="height1"
border
style="width: 100%"
v-loading="isLoading1"
header-cell-class-name="table_header"
>
<el-table-column
prop="reportProcess"
label="审核节点"
:formatter="formatter"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column
prop="type"
label="审核结果"
:formatter="formatterType"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column prop="checker" label="审核人" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="orgName" label="审核人单位" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="dataDate" label="审核时间" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="description" label="审核意见" :show-overflow-tooltip="true"></el-table-column>
</el-table>
<div style="display: flex; justify-content: center; margin-top: 10px">
<el-button type="primary" class="ml20" @click="history = false">关闭</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import Area from '@/views/components/Area/Area.vue'
import { dicData } from '@/assets/commjs/dictypeData'
import Timeinterval from './components/Timeinterval.vue'
import {
getIssues,
getAbnormalDetail,
getExcessiveDetail,
getComplaintDetail,
getGeneralSurveyDetail,
checkPowerQuality,
queryCheckTrack
} from '@/api/Process-supervision/electricitymanagement/electricitymanagement'
import SectionTwoPage from './components/SectionTwoPage.vue'
export default {
components: { Area, Timeinterval, SectionTwoPage },
data() {
return {
vh: '',
queryMaintenanceData: [],
dialogVisible: false,
SectionTwoPage: false,
onlineDetailsData: {},
height: null,
height1: null,
view: false,
isLoading: false,
isLoading1: false,
history: false,
formData: {
orgNo: '',
problemSources: '',
reportProcess: '',
problemName: '',
reportProcessStatus: 'Auditt',
dataType: '3', // 时间类型123
pageNum: 1,
pageSize: 20
},
dateForm: {
opinion: ''
},
//问题来源
problemData: [],
//填报进度
fillingProgress: [],
historyData: [],
multipleSelection: [],
device: '',
total: 0, // 总条数
fvh: ''
}
},
created() {},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.Dictionaries()
this.onsubmit()
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.device = window.devicePixelRatio
this.height = window.sessionStorage.getItem('appheight') - 205
this.height1 = window.sessionStorage.getItem('appheight') - 290
},
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'
}
},
// 字典表
Dictionaries() {
this.formData.orgNo = JSON.parse(window.sessionStorage.getItem('Info')).deptId
// /问题来源
this.problemData = dicData('Problem_Sources', ['Load_Type'])
// 填报进度 /:
this.fillingProgress = dicData('Fill_Progress', ['Load_Type'])
},
handleChange(file) {
// console.log((file.name.split('.')).splice(0,1).toString());
this.causeAnalysisData.documentName = file.name.split('.').splice(0, 1).toString()
},
//查询
onsubmit() {
this.isLoading = true
this.formData.dataDate = this.$refs.interval.timeValue[0]
// this.form.endTime = this.$refs.interval.timeValue[1];
this.formData.dataType = this.$refs.interval.intervald
getIssues(this.formData).then(res => {
this.isLoading = false
this.queryMaintenanceData = res.data.records
this.queryMaintenanceData.forEach(item => {
item.dataDate = item.dataDate.replace('T', ' ')
})
this.total = res.data.total
})
},
//审核
toExamine() {
if (this.multipleSelection.length == 1) {
// this.SectionTwoPage = false;
// getAbnormalDetail(this.multipleSelection[0].powerQualityProblemNo).then(
if (this.multipleSelection[0].problemSources == '在线监测告警') {
getExcessiveDetail(this.multipleSelection[0].powerQualityProblemNo).then(res => {
this.onlineDetailsData = res.data
})
} else if (this.multipleSelection[0].problemSources == '普测超标') {
getGeneralSurveyDetail(this.multipleSelection[0].powerQualityProblemNo).then(res => {
this.onlineDetailsData = res.data
})
} else if (this.multipleSelection[0].problemSources == '用户投诉') {
getComplaintDetail(this.multipleSelection[0].powerQualityProblemNo).then(res => {
this.onlineDetailsData = res.data
})
} else if (this.multipleSelection[0].problemSources == '设备异常') {
getAbnormalDetail(this.multipleSelection[0].powerQualityProblemNo).then(res => {
this.onlineDetailsData = res.data
})
}
setTimeout(() => {
this.dialogVisible = true
}, 0)
} else {
this.$message({
message: this.multipleSelection.length == 0 ? '请选择1条数据!' : '只能选择1条数据!',
type: 'warning'
})
}
},
// 通过
adopt(checkResult) {
this.$refs.dateForm.validate(valid => {
if (valid) {
checkPowerQuality({
checkComment: this.dateForm.opinion,
checkPerson: JSON.parse(window.sessionStorage.getItem('Info')).name,
checkResult: checkResult,
powerQualityProblemNo: this.onlineDetailsData.powerQualityProblemNo,
reportProcess: this.multipleSelection[0].reportProcess
}).then(res => {
if (res.code == 'A0000') {
this.$message({
message: '审核成功!',
type: 'success'
})
this.handleClose()
this.onsubmit()
} else {
this.$message({
message: res.message,
type: 'success'
})
}
})
}
})
},
// 取消
handleClose() {
this.dialogVisible = false
this.dateForm.opinion = ''
},
//历史审核记录
historyFn() {
if (this.multipleSelection.length == 1) {
queryCheckTrack(this.multipleSelection[0].powerQualityProblemNo).then(res => {
this.historyData = res.data
this.history = true
})
} else {
this.$message({
message: this.multipleSelection.length == 0 ? '请选择1条数据!' : '只能选择1条数据!',
type: 'warning'
})
}
},
// 切换选项
handleNodeClick(data) {
this.formData.orgNo = data.id
},
//勾选
handleSelectionChange(val) {
this.multipleSelection = val
},
//重置
Reset() {
this.formData = {
dataDate: '',
orgNo: '', //所属单位
problemName: '', // 问题名称
problemSources: '', // 问题来源
reportProcess: '', //填报进度
reportProcessStatus: 'Auditt', // 审核状态
dataType: '3', // 时间类型123
pageNum: 1,
pageSize: 20
}
this.$refs.area.form.valueTitle = JSON.parse(window.sessionStorage.getItem('Info')).deptName
this.formData.orgNo = JSON.parse(window.sessionStorage.getItem('Info')).deptId
this.$refs.interval.intervald = 3
this.onSubmit()
},
//序号
rowClassName({ row, rowIndex }) {
row.number = rowIndex + 1
},
//每页条数改变时触发 选择一页显示多少行
handleSizeChange(val) {
this.pageSize = val
this.onsubmit()
},
//当前页改变时触发 跳转其他页
handleCurrentChange(val) {
this.currentPage = val
this.onsubmit()
},
// 字典处理
formatter(row, column) {
let title = ''
this.fillingProgress.forEach(item => {
if (item.code == row.reportProcess) {
title = item.name
}
})
return title
},
formatterType(row, column) {
let title = ''
dicData('Audit_Status', ['Load_Type']).forEach(item => {
if (item.code == row.type) {
title = item.name
}
})
return title
}
}
}
</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 .form {
.el-form-item {
margin-bottom: 0;
}
}
::v-deep .box {
.el-input {
width: 140px;
}
}
::v-deep .box1 {
.el-input {
width: 100%;
}
}
::v-deep .box2 {
.el-textarea {
width: 1000px;
}
}
::v-deep .box3 {
.el-textarea {
width: 1200px;
}
}
::v-deep .el-card {
height: 40px;
}
.button {
float: right;
margin-right: 5px;
}
::v-deep .el-dialog .el-dialog__body {
max-height: 100%;
padding: 10px;
}
::v-deep .swiper {
.el-divider--horizontal {
margin: 10px 0;
}
}
.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;
}
</style>

View File

@@ -0,0 +1,841 @@
<template>
<div>
<el-form :inline="true" class="demo-form-inline form">
<el-form-item>
<Area @click="handleNodeClick" ref="area"></Area>
</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-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" style="margin-top: 10px" label-width="110px" class="">
<el-form-item label="问题来源:">
<el-select v-model="formData.problemSources" clearable placeholder="请选择">
<el-option
v-for="item in problemData"
:key="item.code"
:label="item.label"
:value="item.code"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="填报进度:">
<el-select v-model="formData.reportProcess" clearable placeholder="请选择">
<el-option
v-for="item in fillingProgress"
:key="item.code"
:label="item.label"
:value="item.code"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="审核状态:">
<el-select v-model="formData.reportProcessStatus" clearable placeholder="请选择">
<el-option
v-for="item in auditStatus"
:key="item.code"
:label="item.label"
:value="item.code"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="问题名称:">
<el-input
v-model="formData.problemName"
clearable
placeholder="请填写"
style="width: 100%"
></el-input>
</el-form-item>
</el-form>
</div>
<el-row>
<el-col :span="24">
<div class="button">
<el-button type="primary" icon="el-icon-circle-plus" @click="newlyAdded" size="mini">
新增
</el-button>
<el-button type="primary" size="mini" icon="el-icon-edit" @click="filling">填报</el-button>
<el-button type="primary" size="mini" icon="el-icon-delete" @click="deleteFn">删除</el-button>
<el-button type="primary" size="mini" icon="el-icon-s-claim" @click="fileFn">归档</el-button>
<el-button type="primary" size="mini" icon="el-icon-pie-chart" @click="historyFn">
历史审核记录
</el-button>
</div>
<el-table
stripe
:data="queryMaintenanceData"
:height="height"
border
style="width: 100%"
v-loading="isLoading"
header-cell-class-name="table_header"
@selection-change="handleSelectionChange"
:row-class-name="rowClassName"
:cell-style="cellStyle"
>
<el-table-column type="selection" width="35"></el-table-column>
<el-table-column prop="number" label="序号" width="100" :show-overflow-tooltip="true">
<template scope="scope">
<span>{{ (formData.pageNum - 1) * formData.pageSize + scope.$index + 1 }}</span>
</template>
</el-table-column>
<el-table-column prop="orgName" label="所属单位" :show-overflow-tooltip="true"></el-table-column>
<el-table-column
prop="problemSources"
label="问题来源"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column
prop="powerQualityProblemNo"
label="问题编号"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column
prop="problemName"
label="问题名称"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column
prop="dataDate"
label="问题新建时间"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column
prop="reportProcess"
label="填报进度"
:formatter="formatter"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column
prop="reportProcessStatus"
label="审核状态"
:formatter="formatterStatus"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column label="详情">
<template slot-scope="scope">
<!-- <span
v-if="
scope.row.reportProcess != 'Not_Reported' &&
scope.row.reportProcess != 'Archived'
"
type="primary"
size="small"
style="color: blue; text-decoration: underline"
@click="seeFn(scope.row)"
>查看</span
> -->
<el-button
type="primary"
size="mini"
v-if="
scope.row.reportProcess != 'Not_Reported' && scope.row.reportProcess != 'Archived'
"
@click="seeFn(scope.row)"
>
查看
</el-button>
<span v-else type="primary" size="small">-</span>
</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>
</el-col>
</el-row>
<!-- 新增 -->
<NewlyAdd v-if="showNewlyAdded" @handleClose="showNewlyAdded = false" @onSubmit="onSubmit" ref="NewlyAdd" />
<!-- 未通过弹窗 -->
<el-dialog :close-on-click-modal="false" title="未通过审批意见查看" :visible.sync="failed" width="50%">
<el-divider content-position="left" style="font-size: 18px; font-weight: bolder">审核意见</el-divider>
<el-input type="textarea" :rows="7" placeholder="请输入内容" v-model="textarea"></el-input>
</el-dialog>
<!-- 填报弹窗(原因分析()) -->
<CauseAnalysisJP
v-if="showCauseAnalysisJP"
@handleClose="showCauseAnalysisJP = false"
@onSubmit="onSubmit"
ref="CauseAnalysisJP"
:addData="multipleSelection[0]"
/>
<!-- 填报弹窗(计划整改措施) -->
<PlannedRectification
v-if="showPlannedRectification"
@handleClose="showPlannedRectification = false"
@onSubmit="onSubmit"
ref="PlannedRectification"
:addData="multipleSelection[0]"
/>
<!-- 填报弹窗(实际采取措施) -->
<ActualMeasures
v-if="showActualMeasures"
@handleClose="showActualMeasures = false"
@onSubmit="onSubmit"
ref="ActualMeasures"
:addData="multipleSelection[0]"
/>
<!-- 填报弹窗(成效分析) -->
<Effectiveness
v-if="showEffectiveness"
@handleClose="showEffectiveness = false"
@onSubmit="onSubmit"
ref="Effectiveness"
:addData="multipleSelection[0]"
/>
<!-- 详情(在线监测超标问题) -->
<MonitoringDetails
v-if="showMonitoringDetails"
ref="MonitoringDetails"
:detailsList="detailsList"
@handleClose="showMonitoringDetails = false"
/>
<!-- 详情(普测超标问题) -->
<GeneralSurveyDetails
v-if="showGeneralSurveyDetails"
ref="GeneralSurveyDetails"
:detailsList="detailsList"
@handleClose="showGeneralSurveyDetails = false"
/>
<!-- 详情(用户投诉问题) -->
<ComplaintDetails
v-if="showComplaintDetails"
ref="ComplaintDetails"
:detailsList="detailsList"
@handleClose="showComplaintDetails = false"
/>
<!-- 详情(运维异常问题) -->
<ExceptionDetails
v-if="showExceptionDetails"
ref="ExceptionDetails"
:detailsList="detailsList"
@handleClose="showExceptionDetails = false"
/>
<!-- 历史审核记录 -->
<el-dialog :close-on-click-modal="false" title="历史审核记录" :visible.sync="history" width="70%">
<el-table
stripe
:data="historyData"
:height="height1"
border
style="width: 100%"
v-loading="isLoading4"
header-cell-class-name="table_header"
>
<el-table-column
prop="reportProcess"
label="审核节点"
:show-overflow-tooltip="true"
:formatter="formatter"
></el-table-column>
<el-table-column
prop="type"
label="审核结果"
:formatter="formatterType"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column prop="checker" label="审核人" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="orgName" label="审核人单位" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="dataDate" label="审核时间" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="description" label="审核意见" :show-overflow-tooltip="true"></el-table-column>
</el-table>
<div style="display: flex; justify-content: center; margin-top: 10px">
<el-button type="primary" class="ml20" @click="history = false">关闭</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import Area from '@/views/components/Area/Area.vue'
import { dicData } from '@/assets/commjs/dictypeData'
import Timeinterval from './components/Timeinterval.vue'
import CauseAnalysisJP from './components/CauseAnalysisJP.vue'
import PlannedRectification from './components/PlannedRectification.vue'
import ActualMeasures from './components/ActualMeasures.vue'
import Effectiveness from './components/Effectiveness.vue'
import MonitoringDetails from './components/MonitoringDetails.vue'
import GeneralSurveyDetails from './components/GeneralSurveyDetails.vue'
import ComplaintDetails from './components/ComplaintDetails.vue'
import ExceptionDetails from './components/ExceptionDetails.vue'
import NewlyAdd from './components/NewlyAdd'
import {
getIssues,
deleteIssues,
archive,
queryCheckTrack
} from '@/api/Process-supervision/electricitymanagement/electricitymanagement'
import { login } from '@/api/user'
export default {
components: {
Area,
Timeinterval,
NewlyAdd,
CauseAnalysisJP,
PlannedRectification,
ActualMeasures,
Effectiveness,
MonitoringDetails,
GeneralSurveyDetails,
ComplaintDetails,
ExceptionDetails
},
data() {
return {
detailsList: {},
showNewlyAdded: false,
showCauseAnalysisJP: false,
showPlannedRectification: false,
showActualMeasures: false,
showEffectiveness: false,
showMonitoringDetails: false,
showGeneralSurveyDetails: false,
showComplaintDetails: false,
showExceptionDetails: false,
height: null,
height1: null,
view: false,
height3: null,
isLoading: false,
isLoading4: false,
failed: false,
ordinaryAdd: false,
causeAnalysis1: false,
rectificationMeasures: false,
takeSteps: false,
effectivenessAnalysis: false,
onlineDetails: false,
ordinaryDetails: false,
userDetails: false,
operationDetails: false,
history: false,
textarea: '原因分析报告不完整,请补充完整后重新提交!',
formData: {
dataDate: '',
orgNo: '', //所属单位
problemName: '', // 问题名称
problemSources: '', // 问题来源
reportProcess: '', //填报进度
reportProcessStatus: '', // 审核状态
dataType: '3', // 时间类型123
pageNum: 1,
pageSize: 20
},
addData: {
company: '杭州公司本部',
problem: '',
name: ''
},
questionNo: '',
//问题来源
problemData: [],
//填报进度
fillingProgress: [],
//审核状态
auditStatus: [],
queryMaintenanceData: [],
total: 0,
historyData: [],
multipleSelection: [],
device: '',
fvh: ''
}
},
created() {},
mounted() {
this.device = window.devicePixelRatio
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.Dictionaries()
this.onSubmit()
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.height = window.sessionStorage.getItem('appheight') - 205
this.height1 = window.sessionStorage.getItem('appheight') - 360
},
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'
}
},
// 新增
newlyAdded() {
this.showNewlyAdded = true
setTimeout(() => {
this.$refs.NewlyAdd.add = true
}, 0)
},
// 字典表
Dictionaries() {
this.formData.orgNo = JSON.parse(window.sessionStorage.getItem('Info')).deptId
// /问题来源
this.problemData = dicData('Problem_Sources', ['Load_Type'])
// 填报进度 /:
this.fillingProgress = dicData('Fill_Progress', ['Load_Type'])
// 审核状态 :
this.auditStatus = dicData('Audit_Status', ['Load_Type'])
},
// 详情
seeFn(row) {
this.detailsList = row
if (row.problemSources == '在线监测告警') {
this.showMonitoringDetails = true
setTimeout(() => {
this.$refs.MonitoringDetails.onlineDetails = true
}, 0)
} else if (row.problemSources == '普测超标') {
this.showGeneralSurveyDetails = true
setTimeout(() => {
this.$refs.GeneralSurveyDetails.onlineDetails = true
}, 0)
} else if (row.problemSources == '用户投诉') {
this.showComplaintDetails = true
setTimeout(() => {
this.$refs.ComplaintDetails.onlineDetails = true
}, 0)
} else if (row.problemSources == '设备异常') {
this.showExceptionDetails = true
setTimeout(() => {
this.$refs.ExceptionDetails.onlineDetails = true
}, 0)
} else {
this.$message({
message: '暂无数据!!!',
type: 'warning'
})
}
},
//查询
onSubmit() {
this.isLoading = true
this.formData.dataDate = this.$refs.interval.timeValue[0]
// this.form.endTime = this.$refs.interval.timeValue[1];
this.formData.dataType = this.$refs.interval.intervald
getIssues(this.formData).then(res => {
this.isLoading = false
this.queryMaintenanceData = res.data.records
this.queryMaintenanceData.forEach(item => {
item.dataDate = item.dataDate.replace('T', ' ')
})
this.total = res.data.total
})
},
//填报
filling() {
// reportProcessStatus
if (this.multipleSelection.length == 1) {
if (this.multipleSelection[0].reportProcess == 'Not_Reported') {
// 原因分析
this.showCauseAnalysisJP = true
setTimeout(() => {
this.$refs.CauseAnalysisJP.causeAnalysis = true
}, 0)
} else if (
this.multipleSelection[0].reportProcess == 'Cause_Analysis' &&
this.multipleSelection[0].reportProcessStatus == 'Success'
) {
// 计划整改措施
this.showPlannedRectification = true
setTimeout(() => {
this.$refs.PlannedRectification.rectificationMeasures = true
}, 0)
} else if (
this.multipleSelection[0].reportProcess == 'Plan_Measures' &&
this.multipleSelection[0].reportProcessStatus == 'Success'
) {
// 实际采取措施
this.showActualMeasures = true
setTimeout(() => {
this.$refs.ActualMeasures.rectificationMeasures = true
}, 0)
} else if (
this.multipleSelection[0].reportProcess == 'Actual_Measures' &&
this.multipleSelection[0].reportProcessStatus == 'Success'
) {
// 成效分析
this.showEffectiveness = true
setTimeout(() => {
this.$refs.Effectiveness.effectivenessAnalysis = true
}, 0)
} else if (
this.multipleSelection[0].reportProcess == 'Insights' &&
this.multipleSelection[0].reportProcessStatus == 'Success'
) {
this.$message({
message: '填报已结束,无需填报!',
type: 'warning'
})
} else {
this.$message({
message: '审核未通过,不能进行填报',
type: 'warning'
})
}
} else {
this.$message({
message: this.multipleSelection.length == 0 ? '请选择1条数据!' : '只能选择1条数据!',
type: 'warning'
})
}
},
//删除
deleteFn() {
if (this.multipleSelection.length == 1) {
this.$confirm('是否确认删除?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
deleteIssues(this.multipleSelection[0].powerQualityProblemNo).then(res => {
if (res.code == 'A0000') {
this.$message({
message: '删除成功!',
type: 'success'
})
}
this.formData.pageNum = 1
this.onSubmit()
})
})
.catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
})
})
} else {
this.$message({
message: '请选择1数据,进行删除!!!',
type: 'warning'
})
}
},
//归档
fileFn() {
if (this.multipleSelection.length == 1) {
if (
this.multipleSelection[0].reportProcess == 'Insights' &&
this.multipleSelection[0].reportProcessStatus == 'Success'
) {
this.$confirm('是否确认归档?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
archive(this.multipleSelection[0].powerQualityProblemNo).then(res => {
if (res.code == 'A0000') {
this.$message({
message: '归档成功!',
type: 'success'
})
}
this.onSubmit()
})
})
} else {
this.$message({
message: '不满足归档调节,操作失败!',
type: 'warning'
})
}
} else {
this.$message({
message: '请选择1条数据,进行归档!',
type: 'warning'
})
}
},
//历史审核记录
historyFn() {
if (this.multipleSelection.length == 1) {
queryCheckTrack(this.multipleSelection[0].powerQualityProblemNo).then(res => {
this.historyData = res.data
this.history = true
})
} else {
this.$message({
message: this.multipleSelection.length == 0 ? '请选择1条数据!' : '只能选择1条数据!',
type: 'warning'
})
}
},
//勾选
handleSelectionChange(val) {
this.multipleSelection = val
},
// 区域勾选
handleNodeClick(data) {
this.formData.orgNo = data.id
},
//每页条数改变时触发 选择一页显示多少行
handleSizeChange(val) {
this.formData.pageSize = val
this.onSubmit()
},
//当前页改变时触发 跳转其他页
handleCurrentChange(val) {
this.formData.pageNum = val
this.onSubmit()
},
//序号
rowClassName({ row, rowIndex }) {
row.number = rowIndex + 1
},
//重置
resetFn() {
this.formData = {
dataDate: '',
orgNo: '', //所属单位
problemName: '', // 问题名称
problemSources: '', // 问题来源
reportProcess: '', //填报进度
reportProcessStatus: '', // 审核状态
dataType: '3', // 时间类型123
pageNum: 1,
pageSize: 20
}
this.$refs.area.form.valueTitle = JSON.parse(window.sessionStorage.getItem('Info')).deptName
this.formData.orgNo = JSON.parse(window.sessionStorage.getItem('Info')).deptId
this.$refs.interval.intervald = 3
this.onSubmit()
},
//判断
cellStyle(row) {
if (row.row.fillingProgress == '未填报') {
row.row.auditStatus = '--'
row.row.plandetails = '--'
} else if (row.row.fillingProgress == '已归档') {
row.row.auditStatus = '--'
}
},
// 字典处理
formatter(row, column) {
let title = ''
this.fillingProgress.forEach(item => {
if (item.code == row.reportProcess) {
title = item.name
}
})
return title
},
formatterType(row, column) {
let title = ''
this.auditStatus.forEach(item => {
if (item.code == row.type) {
title = item.name
}
})
return title
},
formatterStatus(row, column) {
let title = ''
this.auditStatus.forEach(item => {
if (item.code == row.reportProcessStatus) {
title = item.name
}
})
if (title == '待审核') {
return (
<span type="primary" size="small" style="color: #48d1cc">
待审核
</span>
)
} else if (title == '未通过') {
return (
<span type="primary" size="small" style="color: #dc143c">
未通过
</span>
)
} else if (title == '已通过') {
return (
<span type="primary" size="small" style="color: #9acd32">
已通过
</span>
)
} else if (title == '新建') {
return (
<span type="primary" size="small">
新建
</span>
)
}
}
}
}
</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 .form {
.el-form-item {
margin-bottom: 5px;
}
}
::v-deep .box {
.el-textarea {
width: 1200px;
}
}
::v-deep .box1 {
.el-textarea {
width: 1000px;
}
}
::v-deep .el-card {
height: 40px;
}
.button {
float: right;
margin-right: 5px;
margin-bottom: 10px;
}
::v-deep .el-dialog .el-dialog__body {
max-height: 100%;
padding: 10px;
}
::v-deep .el-carousel__button {
width: 10px;
height: 10px;
background-color: #037272bc;
border-radius: 50%;
opacity: 0.3;
}
::v-deep .swiper {
.el-divider--horizontal {
margin: 10px 0;
}
}
::v-deep .el-checkbox {
margin-right: 20px !important;
}
.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;
}
</style>

View File

@@ -0,0 +1,277 @@
<template>
<div>
<!-- 计划整改 -->
<el-dialog
:close-on-click-modal="false"
title="填报"
:visible.sync="rectificationMeasures"
width="70%"
:before-close="handleClose"
>
<el-divider
content-position="left"
style="font-size: 18px; font-weight: bolder"
>问题基本信息</el-divider
>
<el-form :inline="true">
<el-form-item label="所属单位:">
<el-input
v-model="addData.orgName"
clearable
placeholder="请填写"
disabled
>
</el-input>
</el-form-item>
<el-form-item label="问题来源:">
<el-select
disabled
v-model="addData.problemSources"
placeholder="请选择"
>
<el-option
v-for="item in OnlineList"
:key="item.code"
:label="item.name"
:value="item.code"
>
</el-option>
</el-select>
<!-- <el-input
v-model="addData.problemSources"
clearable
placeholder="请填写"
disabled
>
</el-input> -->
</el-form-item>
<el-form-item label="问题名称:">
<el-input
v-model="addData.problemName"
clearable
placeholder="请填写"
disabled
>
</el-input>
</el-form-item>
<el-form-item label="问题编号:">
<el-input
v-model="addData.powerQualityProblemNo"
disabled
clearable
placeholder="请填写"
>
</el-input>
</el-form-item>
</el-form>
<el-divider
content-position="left"
style="font-size: 18px; font-weight: bolder"
>填报流程</el-divider
>
<el-row type="flex" justify="space-between">
<el-col :span="4">
<el-steps
style="height: 250px"
direction="vertical"
:active="2"
finish-status="success"
>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:gray"
>
<p style="color: white">原因分析</p>
</el-card>
</el-step>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:gray"
>
<p style="color: white">计划整改措施</p>
</el-card>
</el-step>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:#037272bc"
>
<p style="color: white">实际采取措施</p>
</el-card>
</el-step>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:gray"
>
<p style="color: white">成效分析</p>
</el-card>
</el-step>
</el-steps>
</el-col>
<el-col :span="20">
<el-form
:model="rectificationMeasuresData"
:rules="rules"
ref="form"
class="form"
>
<el-form-item
label="电网侧实际采取措施:"
prop="reportProcessContentSjcq"
>
<el-checkbox-group
v-model="rectificationMeasuresData.reportProcessContentSjcq"
>
<el-checkbox
v-for="(item, ind) in List"
:key="ind"
:label="item.code"
>{{ item.name }}</el-checkbox
>
</el-checkbox-group>
</el-form-item>
<el-divider></el-divider>
<el-form-item
label="用户侧实际采取措施:"
prop="userReportProcessContentSjcq"
>
<el-checkbox-group
v-model="rectificationMeasuresData.userReportProcessContentSjcq"
>
<el-checkbox
v-for="(item, ind) in List"
:key="ind"
:label="item.code"
>{{ item.name }}</el-checkbox
>
</el-checkbox-group>
</el-form-item>
<el-divider></el-divider>
<el-form-item
class="item"
label="实际采取措施报告:"
prop="fileNameSjcq"
>
<File ref="File" />
</el-form-item>
</el-form>
</el-col>
</el-row>
<div style="display: flex; justify-content: center; margin-top: 10px">
<el-button type="primary" class="ml20" @click="Submit"
>提交审核</el-button
>
<el-button type="primary" class="ml20" @click="handleClose"
>取消</el-button
>
</div>
</el-dialog>
</div>
</template>
<script>
import { dicData } from "@/assets/commjs/dictypeData";
import { takeAction } from "@/api/Process-supervision/electricitymanagement/electricitymanagement";
import File from "./File.vue";
export default {
components: { File },
props: {
addData: {
type: [Object, Array],
default: {
orgName: "",
problemSources: "",
problemName: "",
powerQualityProblemNo: "",
},
},
},
data() {
return {
rectificationMeasures: false,
rectificationMeasuresData: {
reportProcessContentSjcq: [],
userReportProcessContentSjcq: [],
fileNameSjcq: "", //实际采取措施报告文件名称
filePathSjcq: "", // 实际采取措施报告文件路径
},
OnlineList: [],
List: [],
rules: {
reportProcessContentSjcq: [
{ required: true, message: "请选择", trigger: "change" },
],
userReportProcessContentSjcq: [
{ required: true, message: "请选择", trigger: "change" },
],
fileNameSjcq: [
{ required: true, message: "请上传文件", trigger: "blur" },
],
},
};
},
created() {},
mounted() {
this.Dictionaries();
},
methods: {
// 字典表
Dictionaries() {
// 电网侧原因
this.List = dicData("Plan_Take", ["Load_Type"]);
this.OnlineList = dicData("Problem_Sources", []);
},
handleClose() {
this.$emit("handleClose");
},
//提交
Submit() {
this.rectificationMeasuresData.fileNameSjcq =
this.$refs.File.fileList.minFileName;
this.rectificationMeasuresData.filePathSjcq =
this.$refs.File.fileList.minFileUrl;
this.$refs["form"].validate((valid) => {
if (valid) {
this.rectificationMeasuresData.powerQualityProblemNo =
this.addData.powerQualityProblemNo;
takeAction(this.rectificationMeasuresData).then((res) => {
if (res.code == "A0000") {
this.$message({
message: "填报成功!",
type: "success",
});
this.$emit("handleClose");
this.$emit("onSubmit");
}
});
}
});
},
},
computed: {},
watch: {},
};
</script>
<style lang="less" scoped>
::v-deep .el-card__body,
.el-main {
padding: 10px;
}
</style>

View File

@@ -0,0 +1,350 @@
<template>
<div>
<!-- 填报弹窗(原因分析(在线监测和普测超标)) -->
<el-dialog
:close-on-click-modal="false"
title="填报"
:visible.sync="causeAnalysis"
width="70%"
:before-close="handleClose"
>
<el-divider
content-position="left"
style="font-size: 18px; font-weight: bolder"
>问题基本信息</el-divider
>
<el-form :inline="true">
<el-form-item label="所属单位:">
<el-input
v-model="addData.orgName"
clearable
placeholder="请填写"
disabled
>
</el-input>
</el-form-item>
<el-form-item label="问题来源:">
<el-select
disabled
v-model="addData.problemSources"
placeholder="请选择"
>
<el-option
v-for="item in OnlineList"
:key="item.code"
:label="item.name"
:value="item.code"
>
</el-option>
</el-select>
<!-- <el-input
v-model="addData.problemSources"
clearable
placeholder="请填写"
disabled
>
</el-input> -->
</el-form-item>
<el-form-item label="问题名称:">
<el-input
v-model="addData.problemName"
clearable
placeholder="请填写"
disabled
>
</el-input>
</el-form-item>
<el-form-item label="问题编号:">
<el-input
v-model="addData.powerQualityProblemNo"
disabled
clearable
placeholder="请填写"
>
</el-input>
</el-form-item>
</el-form>
<el-divider
content-position="left"
style="font-size: 18px; font-weight: bolder"
>填报流程</el-divider
>
<el-row type="flex" justify="space-between">
<el-col :span="4">
<el-steps
style="height: 250px"
direction="vertical"
:active="0"
finish-status="success"
>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:#037272bc"
>
<p style="color: white">原因分析</p>
</el-card>
</el-step>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:gray"
>
<p style="color: white">计划整改措施</p>
</el-card>
</el-step>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:gray"
>
<p style="color: white">实际采取措施</p>
</el-card>
</el-step>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:gray"
>
<p style="color: white">成效分析</p>
</el-card>
</el-step>
</el-steps>
</el-col>
<el-col :span="20">
<el-form
:model="causeAnalysisData"
:rules="rules"
ref="form"
label-width="140px"
class="form"
>
<el-form-item label="电网侧原因:" prop="reportProcessContentYyfx">
<el-checkbox-group
v-model="causeAnalysisData.reportProcessContentYyfx"
>
<el-checkbox
v-for="(item, ind) in reportProcessContentYyfxList"
:key="ind"
:label="item.code"
>{{ item.name }}</el-checkbox
>
</el-checkbox-group>
</el-form-item>
<el-divider></el-divider>
<el-form-item
label="用户侧原因:"
prop="userReportProcessContentYyfx"
>
<el-checkbox-group
v-model="causeAnalysisData.userReportProcessContentYyfx"
>
<el-checkbox
v-for="(item, ind) in userReportProcessContentYyfxList"
:key="ind"
:label="item.code"
>{{ item.name }}</el-checkbox
>
</el-checkbox-group>
</el-form-item>
<el-row
v-if="
addData.problemSources == '用户投诉' ||
addData.problemSources == '设备异常'
"
>
<el-divider></el-divider>
<el-form-item label="电网侧受影响设备:" prop="powerGridAffectDev">
<el-checkbox-group
v-model="causeAnalysisData.powerGridAffectDev"
>
<el-checkbox
v-for="(item, ind) in powerGridAffectDevList"
:key="ind"
:label="item.code"
>{{ item.name }}</el-checkbox
>
</el-checkbox-group>
</el-form-item>
<el-divider></el-divider>
<el-form-item label="用户侧受影响设备:" prop="userAffectDev">
<el-checkbox-group v-model="causeAnalysisData.userAffectDev">
<el-checkbox
v-for="(item, ind) in userAffectDevList"
:key="ind"
:label="item.code"
>{{ item.name }}</el-checkbox
>
</el-checkbox-group>
</el-form-item>
</el-row>
<el-divider></el-divider>
<el-form-item label="事件描述:" prop="eventDescriptionYyfx">
<el-input
style="width: 90%"
type="textarea"
:rows="1"
placeholder="请输入内容"
v-model="causeAnalysisData.eventDescriptionYyfx"
></el-input>
</el-form-item>
<el-form-item
class="item"
label="原因分析报告:"
style="margin-top: 10px"
prop="fileNameYyfx"
>
<File ref="File" />
<!-- <el-button size="small" type="primary"
>上传本地评估报告</el-button
> -->
</el-form-item>
</el-form>
</el-col>
</el-row>
<div style="display: flex; justify-content: center; margin-top: 10px">
<el-button type="primary" class="ml20" @click="onSubmit"
>提交审核</el-button
>
<el-button type="primary" class="ml20" @click="handleClose"
>取消</el-button
>
</div>
</el-dialog>
</div>
</template>
<script>
import { dicData } from "@/assets/commjs/dictypeData";
import { reasonAnalysis } from "@/api/Process-supervision/electricitymanagement/electricitymanagement";
import File from "./File.vue";
export default {
components: { File },
props: {
addData: {
type: [Object, Array],
default: {
orgName: "",
problemSources: "",
problemName: "",
powerQualityProblemNo: "",
},
},
},
data() {
return {
causeAnalysis: false,
OnlineList: [],
causeAnalysisData: {
reportProcessContentYyfx: [],
userReportProcessContentYyfx: [],
eventDescriptionYyfx: "",
fileNameYyfx: "", //原因分析报告文件名称
filePathYyfx: "", //原因分析报告文件路径
powerGridAffectDev: [],
userAffectDev: [],
},
rules: {
reportProcessContentYyfx: [
{ required: true, message: "请选择", trigger: "change" },
],
userReportProcessContentYyfx: [
{ required: true, message: "请选择", trigger: "change" },
],
eventDescriptionYyfx: [
{ required: true, message: "请填写", trigger: "blur" },
],
powerGridAffectDev: [
{ required: true, message: "请选择", trigger: "change" },
],
userAffectDev: [
{ required: true, message: "请选择", trigger: "change" },
],
fileNameYyfx: [
{ required: true, message: "请上传文件", trigger: "blur" },
],
},
reportProcessContentYyfxList: [],
userReportProcessContentYyfxList: [],
powerGridAffectDevList: [],
userAffectDevList: [],
};
},
created() {},
mounted() {
this.Dictionaries();
},
methods: {
// 字典表
Dictionaries() {
// 电网侧原因
this.reportProcessContentYyfxList = dicData("Grid-side_Reasons", [
"Load_Type",
]);
// 用户侧原因
this.userReportProcessContentYyfxList = dicData("User_Reasons", [
"Load_Type",
]);
// 电网侧受影响设备
this.powerGridAffectDevList = dicData("Grid_Unit", ["Load_Type"]);
// 用户侧受影响设备
this.userAffectDevList = dicData("Customer_Unit", ["Load_Type"]);
this.OnlineList = dicData("Problem_Sources", []);
},
// 提交
onSubmit() {
this.causeAnalysisData.fileNameYyfx =
this.$refs.File.fileList.minFileName;
this.causeAnalysisData.filePathYyfx = this.$refs.File.fileList.minFileUrl;
this.$refs["form"].validate((valid) => {
if (valid) {
this.causeAnalysisData.powerQualityProblemNo =
this.addData.powerQualityProblemNo;
reasonAnalysis(this.causeAnalysisData).then((res) => {
if (res.code == "A0000") {
this.$message({
message: "填报成功!",
type: "success",
});
this.$emit("handleClose");
this.$emit("onSubmit");
}
});
}
});
},
handleClose() {
this.$emit("handleClose");
},
},
computed: {},
watch: {},
};
</script>
<style lang="less" scoped>
::v-deep .el-divider--horizontal {
display: block;
height: 1px;
width: 100%;
margin: 22px 0;
}
::v-deep .el-card__body,
.el-main {
padding: 10px;
}
</style>

View File

@@ -0,0 +1,228 @@
<template>
<div>
<!-- 详情(用户投诉问题) -->
<el-dialog
:close-on-click-modal="false"
title="详情"
:visible.sync="onlineDetails"
width="70%"
:before-close="handleClose"
>
<el-carousel
trigger="click"
height="600px"
arrow="never"
:autoplay="false"
>
<el-carousel-item>
<el-divider
content-position="left"
style="font-size: 18px; font-weight: bolder"
>问题基本信息</el-divider
>
<el-form :inline="true" label-width="105px">
<el-form-item label="所属单位:">
<el-input
v-model="onlineDetailsData.orgName"
clearable
placeholder="请填写"
disabled
></el-input>
</el-form-item>
<el-form-item label="问题来源:">
<el-select
disabled
v-model="onlineDetailsData.problemSources"
placeholder="请选择"
>
<el-option
v-for="item in OnlineList"
:key="item.code"
:label="item.name"
:value="item.code"
>
</el-option>
</el-select>
<!-- <el-input
v-model="onlineDetailsData.problemSources"
clearable
placeholder="请填写"
disabled
></el-input> -->
</el-form-item>
<el-form-item label="问题名称:">
<el-input
v-model="onlineDetailsData.problemName"
clearable
placeholder="请填写"
disabled
></el-input>
</el-form-item>
<el-form-item label="问题编号:">
<el-input
v-model="onlineDetailsData.powerQualityProblemNo"
clearable
placeholder="请填写"
disabled
></el-input>
</el-form-item>
</el-form>
<el-form :inline="true" label-width="105px" class="form mt20">
<el-form-item label="用户投诉名称:">
<el-input
v-model="onlineDetailsData.userName"
clearable
placeholder="请填写"
disabled
></el-input>
</el-form-item>
<el-form-item label="投诉用户编号:">
<el-input
v-model="onlineDetailsData.userNo"
clearable
placeholder="请填写"
disabled
></el-input>
</el-form-item>
<el-form-item label="投诉时间:">
<el-input
v-model="onlineDetailsData.complaintTime"
clearable
placeholder="请填写"
disabled
></el-input>
</el-form-item>
</el-form>
<el-form :inline="true" label-width="105px" class="box mt20">
<el-form-item label="投诉内容:" style="margin-top: 10px">
<el-input
type="textarea"
:rows="1"
placeholder="请输入内容"
v-model="onlineDetailsData.complaintContent"
disabled
></el-input>
</el-form-item>
</el-form>
<el-divider
content-position="left"
style="font-size: 18px; font-weight: bolder"
>问题指标</el-divider
>
<el-form :inline="true" label-width="105px" class="form">
<el-form-item label="稳态指标:" style="margin-top: 10px">
<el-checkbox-group
v-model="onlineDetailsData.steadyIndicator"
disabled
>
<el-checkbox
v-for="(item, ind) in steadyIndicatorList"
:key="ind"
:label="item.code"
>{{ item.name }}</el-checkbox
>
</el-checkbox-group>
</el-form-item>
<el-form-item label="暂态指标:" style="margin-top: 10px">
<el-checkbox-group
v-model="onlineDetailsData.transientIndicators"
disabled
>
<el-checkbox
v-for="(item, ind) in transientIndicatorsList"
:key="ind"
:label="item.code"
>{{ item.name }}</el-checkbox
>
</el-checkbox-group>
</el-form-item>
</el-form>
</el-carousel-item>
<el-carousel-item>
<SectionTwoPage
:addData="detailsList"
:onlineDetailsData="onlineDetailsData"
/>
</el-carousel-item>
</el-carousel>
<div style="display: flex; justify-content: center; margin-top: 10px">
<el-button type="primary" class="ml20" @click="handleClose"
>关闭</el-button
>
</div>
</el-dialog>
</div>
</template>
<script>
import { getComplaintDetail } from "@/api/Process-supervision/electricitymanagement/electricitymanagement";
import SectionTwoPage from "./SectionTwoPage.vue";
import { dicData } from "@/assets/commjs/dictypeData";
export default {
components: { SectionTwoPage },
props: {
detailsList: {
type: [Object, Array],
},
},
data() {
return {
onlineDetails: false,
onlineDetailsData: {},
steadyIndicatorList: [],
transientIndicatorsList: [],
OnlineList: [],
};
},
mounted() {
this.Dictionaries();
this.info();
},
created() {},
methods: {
// 字典表
Dictionaries() {
// 稳态指标
this.steadyIndicatorList = dicData("Steady_Indicator", ["Load_Type"]);
// 暂态指标
this.transientIndicatorsList = dicData("Transient_Indicators", [
"Load_Type",
]);
this.OnlineList = dicData("Problem_Sources", []);
},
// 获取信息
info() {
getComplaintDetail(this.detailsList.powerQualityProblemNo).then((res) => {
this.onlineDetailsData = res.data;
});
},
// 关闭
handleClose() {
this.$emit("handleClose");
},
},
computed: {},
watch: {},
};
</script>
<style lang="less" scoped>
::v-deep .el-divider--horizontal {
display: block;
height: 1px;
width: 100%;
margin: 22px 0;
}
::v-deep .el-dialog .el-dialog__body {
max-height: 100%;
}
</style>

View File

@@ -0,0 +1,245 @@
<template>
<div>
<el-dialog
:close-on-click-modal="false"
title="填报"
:visible.sync="effectivenessAnalysis"
width="70%"
:before-close="handleClose"
>
<el-divider
content-position="left"
style="font-size: 18px; font-weight: bolder"
>问题基本信息</el-divider
>
<el-form :inline="true">
<el-form-item label="所属单位:">
<el-input
v-model="addData.orgName"
clearable
placeholder="请填写"
disabled
>
</el-input>
</el-form-item>
<el-form-item label="问题来源:">
<el-select
disabled
v-model="addData.problemSources"
placeholder="请选择"
>
<el-option
v-for="item in OnlineList"
:key="item.code"
:label="item.name"
:value="item.code"
>
</el-option>
</el-select>
<!-- <el-input
v-model="addData.problemSources"
clearable
placeholder="请填写"
disabled
>
</el-input> -->
</el-form-item>
<el-form-item label="问题名称:">
<el-input
v-model="addData.problemName"
clearable
placeholder="请填写"
disabled
>
</el-input>
</el-form-item>
<el-form-item label="问题编号:">
<el-input
v-model="addData.powerQualityProblemNo"
disabled
clearable
placeholder="请填写"
>
</el-input>
</el-form-item>
</el-form>
<el-divider
content-position="left"
style="font-size: 18px; font-weight: bolder"
>填报流程</el-divider
>
<el-row :gutter="20">
<el-col :span="4">
<el-steps
style="height: 250px"
direction="vertical"
:active="3"
finish-status="success"
>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:gray"
>
<p style="color: white">原因分析</p>
</el-card>
</el-step>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:gray"
>
<p style="color: white">计划整改措施</p>
</el-card>
</el-step>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:gray"
>
<p style="color: white">实际采取措施</p>
</el-card>
</el-step>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:#037272bc"
>
<p style="color: white">成效分析</p>
</el-card>
</el-step>
</el-steps>
</el-col>
<el-col :span="20">
<el-form
:model="effectivenessAnalysisData"
:rules="rules"
ref="form"
class="box1"
>
<el-form-item
label="成效分析概述:"
style="margin-top: 10px"
prop="descriptionZlxg"
>
<el-input
type="textarea"
style="width: 80%"
:rows="1"
placeholder="请输入内容"
v-model="effectivenessAnalysisData.descriptionZlxg"
></el-input>
</el-form-item>
<el-divider></el-divider>
<el-form-item
class="item"
label="成效分析报告:"
prop="fileNameZlxg"
>
<File ref="File" />
</el-form-item>
</el-form>
</el-col>
</el-row>
<div style="display: flex; justify-content: center; margin-top: 10px">
<el-button type="primary" class="ml20" @click="Submit"
>提交审核</el-button
>
<el-button type="primary" class="ml20" @click="handleClose"
>取消</el-button
>
</div>
</el-dialog>
</div>
</template>
<script>
import { dicData } from "@/assets/commjs/dictypeData";
import { effectAnalysis } from "@/api/Process-supervision/electricitymanagement/electricitymanagement";
import File from "./File.vue";
export default {
components: { File },
props: {
addData: {
type: [Object, Array],
default: {
orgName: "",
problemSources: "",
problemName: "",
powerQualityProblemNo: "",
},
},
},
data() {
return {
effectivenessAnalysis: false,
effectivenessAnalysisData: {
descriptionZlxg: "",
fileNameZlxg: "", //实际采取措施报告文件名称
filePathZlxg: "", //实际采取措施报告文件路径
},
OnlineList: [],
rules: {
descriptionZlxg: [
{ required: true, message: "请填写", trigger: "blur" },
],
fileNameZlxg: [
{ required: true, message: "请上传文件", trigger: "blur" },
],
},
};
},
created() {},
mounted() {
this.OnlineList = dicData("Problem_Sources", []);
},
methods: {
handleClose() {
this.$emit("handleClose");
},
//提交
Submit() {
this.effectivenessAnalysisData.fileNameZlxg =
this.$refs.File.fileList.minFileName;
this.effectivenessAnalysisData.filePathZlxg =
this.$refs.File.fileList.minFileUrl;
this.$refs["form"].validate((valid) => {
if (valid) {
this.effectivenessAnalysisData.powerQualityProblemNo =
this.addData.powerQualityProblemNo;
effectAnalysis(this.effectivenessAnalysisData).then((res) => {
if (res.code == "A0000") {
this.$message({
message: "填报成功!",
type: "success",
});
this.$emit("handleClose");
this.$emit("onSubmit");
}
});
}
});
},
},
computed: {},
watch: {},
};
</script>
<style lang="less" scoped>
::v-deep .el-card__body,
.el-main {
padding: 10px;
}
</style>

View File

@@ -0,0 +1,219 @@
<template>
<div>
<!-- 详情(运维异常问题) -->
<el-dialog
:close-on-click-modal="false"
title="详情"
:visible.sync="onlineDetails"
width="70%"
:before-close="handleClose"
>
<el-carousel
trigger="click"
height="600px"
arrow="never"
:autoplay="false"
>
<el-carousel-item>
<el-divider
content-position="left"
style="font-size: 18px; font-weight: bolder"
>问题基本信息</el-divider
>
<el-form :inline="true" label-width="105px">
<el-form-item label="所属单位:">
<el-input
v-model="onlineDetailsData.orgName"
clearable
placeholder="请填写"
disabled
></el-input>
</el-form-item>
<el-form-item label="问题来源:">
<el-select
disabled
v-model="onlineDetailsData.problemSources"
placeholder="请选择"
>
<el-option
v-for="item in OnlineList"
:key="item.code"
:label="item.name"
:value="item.code"
>
</el-option>
</el-select>
<!-- <el-input
v-model="onlineDetailsData.problemSources"
clearable
placeholder="请填写"
disabled
></el-input> -->
</el-form-item>
<el-form-item label="问题名称:">
<el-input
v-model="onlineDetailsData.problemName"
clearable
placeholder="请填写"
disabled
></el-input>
</el-form-item>
<el-form-item label="问题编号:">
<el-input
v-model="onlineDetailsData.powerQualityProblemNo"
clearable
placeholder="请填写"
disabled
></el-input>
</el-form-item>
</el-form>
<el-form :inline="true" label-width="105px" class="form mt20">
<el-form-item label="异常设备名称:">
<el-input
v-model="onlineDetailsData.abnormalDevName"
clearable
placeholder="请填写"
disabled
></el-input>
</el-form-item>
<el-form-item label="发现异常时间:">
<el-input
v-model="onlineDetailsData.abnormalDevTime"
clearable
placeholder="请填写"
disabled
></el-input>
</el-form-item>
</el-form>
<el-form :inline="true" label-width="105px" class="box mt20">
<el-form-item label="设备异常描述:" style="margin-top: 10px">
<el-input
type="textarea"
:rows="1"
placeholder="请输入内容"
v-model="onlineDetailsData.eventDescription"
disabled
></el-input>
</el-form-item>
</el-form>
<el-divider
content-position="left"
style="font-size: 18px; font-weight: bolder"
>问题指标</el-divider
>
<el-form :inline="true" label-width="105px" class="form">
<el-form-item label="稳态指标:" style="margin-top: 10px">
<el-checkbox-group
v-model="onlineDetailsData.steadyIndicator"
disabled
>
<el-checkbox
v-for="(item, ind) in steadyIndicatorList"
:key="ind"
:label="item.code"
>{{ item.name }}</el-checkbox
>
</el-checkbox-group>
</el-form-item>
<el-form-item label="暂态指标:" style="margin-top: 10px">
<el-checkbox-group
v-model="onlineDetailsData.transientIndicators"
disabled
>
<el-checkbox
v-for="(item, ind) in transientIndicatorsList"
:key="ind"
:label="item.code"
>{{ item.name }}</el-checkbox
>
</el-checkbox-group>
</el-form-item>
</el-form>
</el-carousel-item>
<el-carousel-item>
<SectionTwoPage
:addData="detailsList"
:onlineDetailsData="onlineDetailsData"
/>
</el-carousel-item>
</el-carousel>
<div style="display: flex; justify-content: center; margin-top: 10px">
<el-button type="primary" class="ml20" @click="handleClose"
>关闭</el-button
>
</div>
</el-dialog>
</div>
</template>
<script>
import { getAbnormalDetail } from "@/api/Process-supervision/electricitymanagement/electricitymanagement";
import SectionTwoPage from "./SectionTwoPage.vue";
import { dicData } from "@/assets/commjs/dictypeData";
export default {
components: { SectionTwoPage },
props: {
detailsList: {
type: [Object, Array],
},
},
data() {
return {
onlineDetails: false,
onlineDetailsData: {},
steadyIndicatorList: [],
transientIndicatorsList: [],
OnlineList: [],
};
},
mounted() {
this.Dictionaries();
this.info();
},
created() {},
methods: {
// 字典表
Dictionaries() {
// 稳态指标
this.steadyIndicatorList = dicData("Steady_Indicator", ["Load_Type"]);
// 暂态指标
this.transientIndicatorsList = dicData("Transient_Indicators", [
"Load_Type",
]);
this.OnlineList = dicData("Problem_Sources", []);
},
// 获取信息
info() {
getAbnormalDetail(this.detailsList.powerQualityProblemNo).then((res) => {
this.onlineDetailsData = res.data;
});
},
// 关闭
handleClose() {
this.$emit("handleClose");
},
},
computed: {},
watch: {},
};
</script>
<style lang="less" scoped>
::v-deep .el-divider--horizontal {
display: block;
height: 1px;
width: 100%;
margin: 22px 0;
}
::v-deep .el-dialog .el-dialog__body {
max-height: 100%;
}
</style>

View File

@@ -0,0 +1,224 @@
<template>
<div class="upload-file">
<el-upload
multiple
:action="uploadFileUrl"
:before-upload="handleBeforeUpload"
accept=".doc,.docx,.xls,.xlsx,.pdf,.txt"
:limit="limit"
:on-error="handleUploadError"
:on-exceed="handleExceed"
:on-success="handleUploadSuccess"
:show-file-list="false"
:headers="headers"
class="upload-file-uploader"
ref="upload"
>
<!-- 上传按钮 -->
<div style="display: flex">
<el-input
style="width: 240px"
v-model="fileList.minFileName"
placeholder="文件名称"
disabled
></el-input>
<el-button
size="small"
style="margin-left: 10px"
type="primary"
icon="el-icon-upload2"
>上传本地报告</el-button
>
</div>
<!-- 上传提示 -->
</el-upload>
</div>
</template>
<script>
// import { getAccessToken } from "@/utils/auth";
// import { getfile } from "@/api/core/ProjectList";
export default {
name: "FileUpload",
props: {
// 值
value: [String, Object, Array],
// 数量限制
limit: {
type: Number,
default: 100,
},
// 大小限制(MB)
fileSize: {
type: Number,
default: 512,
},
// 文件类型, 例如['png', 'jpg', 'jpeg']
fileType: {
type: Array,
default: () => ["doc", "xls", "ppt", "txt", "pdf"],
},
// 是否显示提示
isShowTip: {
type: Boolean,
default: true,
},
},
data() {
return {
number: 0,
uploadList: [],
uploadFileUrl: "/api/process-boot/electricityQuality/uploadFile", // 请求地址
headers: {
Authorization: window.sessionStorage.getItem("cntoken"),
}, // 设置上传的请求头部
fileList: [],
};
},
watch: {
// value: {
// handler(val) {
// if (val) {
// let temp = 1;
// // 首先将值转为数组
// const list = Array.isArray(val) ? val : this.value.split(",");
// // 然后将数组转为对象数组
// this.fileList = list.map((item) => {
// if (typeof item === "string") {
// item = { name: item, url: item };
// }
// item.uid = item.uid || new Date().getTime() + temp++;
// return item;
// });
// } else {
// this.fileList = [];
// return [];
// }
// },
// deep: true,
// immediate: true,
// },
},
computed: {
// 是否显示提示
showTip() {
return this.isShowTip && (this.fileType || this.fileSize);
},
},
methods: {
// 上传前校检格式和大小
handleBeforeUpload(file) {
// 校检文件类型
// if (this.fileType) {
// let fileExtension = "";
// if (file.name.lastIndexOf(".") > -1) {
// 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.$modal.msgError(`文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`);
// return false;
// }
// }
// // 校检文件大小
// if (this.fileSize) {
// const isLt = file.size / 1024 / 1024 < this.fileSize;
// if (!isLt) {
// this.$modal.msgError(`上传文件大小不能超过 ${this.fileSize} MB!`);
// return false;
// }
// }
// this.$modal.loading("正在上传文件,请稍候...");
this.number++;
return true;
},
// 文件个数超出
handleExceed() {
// this.$modal.msgError(`上传文件数量不能超过 ${this.limit} 个!`);
},
// 上传失败
handleUploadError(err) {
this.$message.error("上传失败!");
// this.$modal.msgError("上传图片失败,请重试");
// this.$modal.closeLoading();
},
// 上传成功回调
handleUploadSuccess(res) {
this.$message({
message: "上传成功!",
type: "success",
});
this.fileList = res.data;
// console.log(`123`, res);
},
// 删除文件
handleDelete(index) {
// this.fileList.splice(index, 1);
// this.$emit("input", this.fileList);
},
// 获取文件名称
getFileName(name) {
if (name.lastIndexOf("/") > -1) {
return name.slice(name.lastIndexOf("/") + 1);
} else {
return "";
}
},
// 对象转成指定字符串分隔
listToString(list, separator) {
let strs = "";
separator = separator || ",";
for (let i in list) {
strs += list[i].url + separator;
}
return strs !== "" ? strs.substr(0, strs.length - 1) : "";
},
// 下载
exportExcels(e) {
getfile(e.url.substring(32)).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 = e.url.substring(
e.url.lastIndexOf("/") + 1,
e.url.length
); // 设置下载的文件名
document.body.appendChild(link);
link.click(); //执行下载
document.body.removeChild(link);
});
},
},
};
</script>
<style scoped lang="scss">
.upload-file-uploader {
margin-bottom: 5px;
}
.upload-file-list .el-upload-list__item {
border: 1px solid #e4e7ed;
line-height: 2;
margin-bottom: 10px;
position: relative;
}
.upload-file-list .ele-upload-list__item-content {
display: flex;
justify-content: space-between;
align-items: center;
color: inherit;
}
.ele-upload-list__item-content-action .el-link {
margin-right: 10px;
}
</style>

View File

@@ -0,0 +1,217 @@
<template>
<div>
<!-- 详情(普测超标问题) -->
<el-dialog
:close-on-click-modal="false"
title="详情"
:visible.sync="onlineDetails"
width="70%"
:before-close="handleClose"
>
<el-carousel
trigger="click"
height="450px"
arrow="never"
:autoplay="false"
>
<el-carousel-item>
<el-divider
content-position="left"
style="font-size: 18px; font-weight: bolder"
>问题基本信息</el-divider
>
<el-form :inline="true" label-width="105px">
<el-form-item label="所属单位:">
<el-input
v-model="onlineDetailsData.orgName"
clearable
placeholder="请填写"
disabled
></el-input>
</el-form-item>
<el-form-item label="问题来源:">
<el-select
disabled
v-model="onlineDetailsData.problemSources"
placeholder="请选择"
>
<el-option
v-for="item in OnlineList"
:key="item.code"
:label="item.name"
:value="item.code"
>
</el-option>
</el-select>
<!-- <el-input
v-model="onlineDetailsData.problemSources"
clearable
placeholder="请填写"
disabled
></el-input> -->
</el-form-item>
<el-form-item label="问题名称:">
<el-input
v-model="onlineDetailsData.problemName"
clearable
placeholder="请填写"
disabled
></el-input>
</el-form-item>
<el-form-item label="问题编号:">
<el-input
v-model="onlineDetailsData.powerQualityProblemNo"
clearable
placeholder="请填写"
disabled
></el-input>
</el-form-item>
</el-form>
<el-form :inline="true" label-width="105px" class="form mt20">
<el-form-item label="普测计划名称:">
<el-input
v-model="onlineDetailsData.planName"
clearable
placeholder="请填写"
disabled
></el-input>
</el-form-item>
<el-form-item label="所属变电站:">
<el-input
v-model="onlineDetailsData.substationName"
clearable
placeholder="请填写"
disabled
></el-input>
</el-form-item>
<el-form-item label="母线名称:">
<el-input
v-model="onlineDetailsData.busBarName"
clearable
placeholder="请填写"
disabled
></el-input>
</el-form-item>
</el-form>
<el-divider
content-position="left"
style="font-size: 18px; font-weight: bolder"
>问题指标</el-divider
>
<el-form :inline="true" label-width="105px" class="form">
<el-form-item label="稳态指标:" style="margin-top: 10px">
<el-checkbox-group
v-model="onlineDetailsData.steadyIndicator"
disabled
>
<el-checkbox
v-for="(item, ind) in steadyIndicatorList"
:key="ind"
:label="item.code"
>{{ item.name }}</el-checkbox
>
</el-checkbox-group>
</el-form-item>
<el-form-item label="暂态指标:" style="margin-top: 10px">
<el-checkbox-group
v-model="onlineDetailsData.transientIndicators"
disabled
>
<el-checkbox
v-for="(item, ind) in transientIndicatorsList"
:key="ind"
:label="item.code"
>{{ item.name }}</el-checkbox
>
</el-checkbox-group>
</el-form-item>
</el-form>
</el-carousel-item>
<el-carousel-item>
<SectionTwoPage
:addData="detailsList"
:onlineDetailsData="onlineDetailsData"
/>
</el-carousel-item>
</el-carousel>
<div style="display: flex; justify-content: center; margin-top: 10px">
<el-button type="primary" class="ml20" @click="handleClose"
>关闭</el-button
>
</div>
</el-dialog>
</div>
</template>
<script>
import { getGeneralSurveyDetail } from "@/api/Process-supervision/electricitymanagement/electricitymanagement";
import SectionTwoPage from "./SectionTwoPage.vue";
import { dicData } from "@/assets/commjs/dictypeData";
export default {
components: { SectionTwoPage },
props: {
detailsList: {
type: [Object, Array],
},
},
data() {
return {
onlineDetails: false,
onlineDetailsData: {},
steadyIndicatorList: [],
transientIndicatorsList: [],
OnlineList: [],
};
},
mounted() {
this.Dictionaries();
this.info();
},
created() {},
methods: {
// 字典表
Dictionaries() {
// 稳态指标
this.steadyIndicatorList = dicData("Steady_Indicator", ["Load_Type"]);
// 暂态指标
this.transientIndicatorsList = dicData("Transient_Indicators", [
"Load_Type",
]);
this.OnlineList = dicData("Problem_Sources", []);
},
// 获取信息
info() {
getGeneralSurveyDetail(this.detailsList.powerQualityProblemNo).then(
(res) => {
this.onlineDetailsData = res.data;
}
);
},
// 关闭
handleClose() {
this.$emit("handleClose");
},
},
computed: {},
watch: {},
};
</script>
<style lang="less" scoped>
::v-deep .el-divider--horizontal {
display: block;
height: 1px;
width: 100%;
margin: 22px 0;
}
::v-deep .el-dialog .el-dialog__body {
max-height: 100%;
}
</style>

View File

@@ -0,0 +1,185 @@
<template>
<div>
<!-- 详情(在线监测超标问题) -->
<el-dialog
:close-on-click-modal="false"
title="详情"
:visible.sync="onlineDetails"
width="70%"
:before-close="handleClose"
>
<el-carousel
trigger="click"
height="450px"
arrow="never"
:autoplay="false"
>
<el-carousel-item>
<el-divider
content-position="left"
style="font-size: 18px; font-weight: bolder"
>问题基本信息</el-divider
>
<el-form :inline="true" label-width="105px">
<el-form-item label="所属单位:">
<el-input
v-model="onlineDetailsData.orgName"
clearable
placeholder="请填写"
disabled
></el-input>
</el-form-item>
<el-form-item label="问题来源:">
<el-select
disabled
v-model="onlineDetailsData.problemSources"
placeholder="请选择"
>
<el-option
v-for="item in OnlineList"
:key="item.code"
:label="item.name"
:value="item.code"
>
</el-option>
</el-select>
<!-- <el-input
v-model="onlineDetailsData.problemSources"
clearable
placeholder="请填写"
disabled
></el-input> -->
</el-form-item>
<el-form-item label="问题名称:">
<el-input
v-model="onlineDetailsData.problemName"
clearable
placeholder="请填写"
disabled
></el-input>
</el-form-item>
<el-form-item label="问题编号:">
<el-input
v-model="onlineDetailsData.powerQualityProblemNo"
clearable
placeholder="请填写"
disabled
></el-input>
</el-form-item>
</el-form>
<el-form :inline="true" class="form mt20" label-width="105px">
<el-form-item label="监测点名称:">
<el-input
v-model="onlineDetailsData.measurementPointName"
clearable
placeholder="请填写"
disabled
></el-input>
</el-form-item>
<el-form-item label="告警持续时间:">
<el-input
v-model="onlineDetailsData.warnLastTime"
clearable
placeholder="请填写"
disabled
></el-input>
</el-form-item>
<el-form-item label="告警指标:">
<el-select
disabled
v-model="onlineDetailsData.warnTarget"
placeholder="请选择"
>
<el-option
v-for="item in warnTargetList"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
<!-- <el-input
type="textarea"
:rows="1"
placeholder="请输入内容"
disabled
v-model="onlineDetailsData.warnTarget"
></el-input> -->
</el-form-item>
</el-form>
<el-form class="box mt20" label-width="105px">
<el-form-item label="告警描述:" style="margin-top: 10px">
<el-input
type="textarea"
:rows="1"
placeholder="请输入内容"
disabled
v-model="onlineDetailsData.warnReason"
></el-input>
</el-form-item>
</el-form>
</el-carousel-item>
<el-carousel-item>
<SectionTwoPage
:addData="detailsList"
:onlineDetailsData="onlineDetailsData"
/>
</el-carousel-item>
</el-carousel>
<div style="display: flex; justify-content: center; margin-top: 10px">
<el-button type="primary" class="ml20" @click="handleClose"
>关闭</el-button
>
</div>
</el-dialog>
</div>
</template>
<script>
import { dicData } from "@/assets/commjs/dictypeData";
import { getExcessiveDetail } from "@/api/Process-supervision/electricitymanagement/electricitymanagement";
import SectionTwoPage from "./SectionTwoPage.vue";
export default {
components: { SectionTwoPage },
props: {
detailsList: {
type: [Object, Array],
},
},
data() {
return {
warnTargetList: [],
onlineDetails: false,
onlineDetailsData: {},
OnlineList: [],
};
},
mounted() {
this.info();
this.warnTargetList = dicData("alarm_Type", []);
this.OnlineList = dicData("Problem_Sources", []);
},
created() {},
methods: {
// 获取信息
info() {
getExcessiveDetail(this.detailsList.powerQualityProblemNo).then((res) => {
this.onlineDetailsData = res.data;
});
},
// 关闭
handleClose() {
this.$emit("handleClose");
},
},
computed: {},
watch: {},
};
</script>
<style lang="scss" scoped></style>

View File

@@ -0,0 +1,818 @@
<template>
<div >
<!-- <span style="font-size: 14px; font-weight: 550">
<span class="spanColor">间隔:</span>
</span> -->
<el-form>
<el-form-item>
<el-select
style="width: 90px;"
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-form-item>
<el-form-item>
<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>
</el-form-item>
<el-form-item 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>
</el-form-item>
<el-form>
<el-button v-show="false" style="margin-bottom: 0.5%" type="primary"
>导出文件</el-button
>
</el-form>
</el-form>
<!-- <el-button
v-show="buttonShow && thb"
@click="tongbiyear"
style="margin-left: 5px"
type="primary"
>同比</el-button
>
<el-button
v-show="buttonShow && thb"
@click="huangbiyear"
style="margin-left: 5px"
type="primary"
>环比</el-button
> -->
<!-- <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];
this.$emit("time",[startTime,endTime,this.intervald] );
if (this.type == 2) {
this.huangbiyear();
} else if (!this.type) {
this.querfromdata();
}
},
methods: {
interchange(val) {
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.$emit("time",[startTime,endTime,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,847 @@
<template>
<div>
<!-- 新增第一步 -->
<el-dialog
:close-on-click-modal="false"
title="问题新增"
:visible.sync="add"
width="50%"
:before-close="handleClose"
>
<el-divider content-position="left" style="font-size: 18px; font-weight: bolder">
第一步 基本信息填报
</el-divider>
<el-form :inline="true" ref="ruleForm" :rules="rules" :model="addData">
<el-form-item label="所属单位:">
<el-input v-model="addData.orgName" clearable placeholder="请填写" disabled></el-input>
</el-form-item>
<el-form-item label="问题来源:" prop="problemSources">
<el-select v-model="addData.problemSources" clearable placeholder="请选择">
<el-option
v-for="item in problemData"
:key="item.code"
:label="item.label"
:value="item.code"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="问题名称:" prop="problemName">
<el-input v-model="addData.problemName" clearable placeholder="请填写"></el-input>
</el-form-item>
</el-form>
<div style="display: flex; justify-content: center; margin-top: 10px">
<el-button type="primary" class="ml20" @click="nextStep">下一步</el-button>
<el-button type="primary" class="ml20" @click="handleClose">取消</el-button>
</div>
</el-dialog>
<!-- 新增第二步(在线监测超标问题新增) -->
<el-dialog
:close-on-click-modal="false"
title="在线监测超标问题新增"
:visible.sync="onlineAdd"
width="70%"
:before-close="handleClose"
>
<el-divider content-position="left" style="font-size: 18px; font-weight: bolder">
第二步 选择问题测点(请选择需要生成问题的告警监测点)
</el-divider>
<el-form :model="onlineAdddata" :inline="true" class="form">
<el-form-item label="告警时间:">
<Month :interval="3" ref="interval" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="searchOnLine">查询</el-button>
<!-- <el-button type="primary" icon="el-icon-refresh" @click="resetFn1"
>重置</el-button
> -->
</el-form-item>
</el-form>
<el-table
stripe
:data="onlineAddData"
:height="height1"
border
style="width: 100%"
v-loading="isLoading1"
header-cell-class-name="table_header"
@selection-change="ChangeOnline"
:row-class-name="rowClassName"
>
<el-table-column type="selection" width="35"></el-table-column>
<el-table-column prop="number" label="序号" width="100" :show-overflow-tooltip="true"></el-table-column>
<el-table-column
prop="measurementPointName"
label="监测点名称"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column
prop="alarmType"
label="告警类型"
:formatter="formatter"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column prop="alarmInfo" label="告警描述" :show-overflow-tooltip="true"></el-table-column>
<el-table-column
prop="alarmLastTime"
label="告警持续时间(s)"
:show-overflow-tooltip="true"
></el-table-column>
</el-table>
<div style="display: flex; justify-content: center; margin-top: 10px">
<el-button type="primary" class="ml20" @click="previouStep">上一步</el-button>
<el-button type="primary" class="ml20" @click="OnlineMonitoring">生成问题</el-button>
<el-button type="primary" class="ml20" @click="handleClose">取消</el-button>
</div>
</el-dialog>
<!-- 新增第二步(普测超标问题新增) -->
<el-dialog
:close-on-click-modal="false"
title="普测超标问题新增"
:visible.sync="ordinaryAdd"
width="70%"
:before-close="handleClose"
>
<el-divider content-position="left" style="font-size: 18px; font-weight: bolder">
第二步 选择普测计划及问题类型(请查找需要生成问题的普测计划并选择一条需要生成问题的测试线路)
</el-divider>
<el-form :model="ordinaryA" :inline="true" class="form">
<el-form-item>
<Area @click="handleNodeClick1" ref="area1"></Area>
</el-form-item>
<el-form-item label="普测结果上传时间:">
<el-date-picker
v-model="ordinaryA.planStartTime"
type="month"
format="yyyy 年 MM 月"
value-format="yyyy-MM-dd"
placeholder="选择月"
@change="queryPlanName"
></el-date-picker>
</el-form-item>
<el-form-item label="普测计划名称:">
<el-select v-model="ordinaryA.planName" clearable placeholder="请选择">
<el-option
v-for="item in planNameList"
:key="item.planName"
:label="item.planName"
:value="item.planName"
></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="searchFnExcessive">查询</el-button>
<!-- <el-button type="primary" icon="el-icon-refresh" @click="resetFn2"
>重置</el-button
> -->
</el-form-item>
</el-form>
<el-table
stripe
:data="ordinaryAddData"
:height="height2"
border
style="width: 100%"
v-loading="isLoading2"
header-cell-class-name="table_header"
@selection-change="handleSelectionChangeGeneral"
:row-class-name="rowClassName"
>
<el-table-column type="selection" width="35"></el-table-column>
<el-table-column prop="number" label="序号" width="100" :show-overflow-tooltip="true"></el-table-column>
<el-table-column
prop="voltageLevel"
label="变电站电压等级(kV)"
:formatter="formFilter"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column prop="subName" label="变电站名称" :show-overflow-tooltip="true"></el-table-column>
<!-- <el-table-column
prop="busbarName"
label="母线名称"
:show-overflow-tooltip="true"
></el-table-column> -->
</el-table>
<el-divider content-position="left" style="font-size: 18px; font-weight: bolder">
第三步 选择问题指标
</el-divider>
<el-form :model="ordinaryAdddata" :rules="rules" ref="GeneralSurvey" :inline="true" class="form">
<el-form-item label="稳态指标:" prop="steadyState">
<el-checkbox-group v-model="ordinaryAdddata.steadyState">
<el-checkbox v-for="(item, ind) in steadyStateList" :key="ind" :label="item.code">
{{ item.name }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="暂态指标:" prop="transientIndicators">
<el-checkbox-group v-model="ordinaryAdddata.transientIndicators">
<el-checkbox v-for="(item, ind) in transientIndicatorsList" :key="ind" :label="item.code">
{{ item.name }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-form>
<div style="display: flex; justify-content: center; margin-top: 10px">
<el-button type="primary" class="ml20" @click="previouStep">上一步</el-button>
<el-button type="primary" class="ml20" @click="GeneralSurvey">生成问题</el-button>
<el-button type="primary" class="ml20" @click="handleClose">取消</el-button>
</div>
</el-dialog>
<!-- 新增第二步(用户投诉问题新增) -->
<el-dialog
:close-on-click-modal="false"
title="用户投诉问题新增"
:visible.sync="userAdd"
width="70%"
:before-close="handleClose"
>
<el-divider content-position="left" style="font-size: 18px; font-weight: bolder">
第二步 选择投诉用户(请精确查找用户户号并选中投诉用户)
</el-divider>
<el-form :model="userA" :inline="true" class="">
<el-form-item label="用户类型:">
<el-select v-model="userA.userType" placeholder="请选择用户类型">
<el-option
v-for="item in userTypeData"
:key="item.code"
:label="item.label"
:value="item.code"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="用户编号:">
<el-input v-model="userA.id" clearable placeholder="请输入用户编号"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="searchFnComplain">查询</el-button>
<!-- <el-button type="primary" icon="el-icon-refresh" @click="resetFn3"
>重置</el-button
> -->
</el-form-item>
</el-form>
<el-table
stripe
:data="userAddDataList"
height="180px"
border
style="width: 100%"
v-loading="isLoading3"
header-cell-class-name="table_header"
@selection-change="handleSelectionChangeUser"
:row-class-name="rowClassName"
>
<el-table-column type="selection" width="35"></el-table-column>
<el-table-column type="index" label="序号" width="100" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="id" label="用户编号" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="name" label="用户名称" :show-overflow-tooltip="true"></el-table-column>
<!-- 用电用户 -->
<el-table-column
v-if="showUserType"
prop="electricityType"
label="用电类别/电源类别"
:formatter="formatter1"
:show-overflow-tooltip="true"
></el-table-column>
<!-- 发电用户 -->
<el-table-column
v-else
prop="powerCategory"
label="用电类别/电源类别"
:formatter="formatter2"
:show-overflow-tooltip="true"
></el-table-column>
</el-table>
<el-divider content-position="left" style="font-size: 18px; font-weight: bolder">
第三步 填写投诉详情
</el-divider>
<el-form :model="userAdddata" ref="userAdddata" :rules="rules" :inline="true" class="box">
<el-form-item label="投诉内容:" style="margin-top: 10px" prop="complaintContent">
<el-input
type="textarea"
:rows="2"
placeholder="请输入内容"
v-model="userAdddata.complaintContent"
></el-input>
</el-form-item>
<el-form-item label="投诉时间:" style="margin-top: 10px" prop="complaintTime">
<el-date-picker
v-model="userAdddata.complaintTime"
type="date"
placeholder="选择日期"
value-format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
<el-divider content-position="left" style="font-size: 18px; font-weight: bolder">
第四步 选择问题指标
</el-divider>
<el-form-item label="稳态指标:" prop="steadyState">
<el-checkbox-group v-model="userAdddata.steadyState">
<el-checkbox v-for="(item, ind) in steadyStateList" :key="ind" :label="item.code">
{{ item.name }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="暂态指标:" prop="transientIndicators">
<el-checkbox-group v-model="userAdddata.transientIndicators">
<el-checkbox v-for="(item, ind) in transientIndicatorsList" :key="ind" :label="item.code">
{{ item.name }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-form>
<div style="display: flex; justify-content: center; margin-top: 10px">
<el-button type="primary" class="ml20" @click="previouStep">上一步</el-button>
<el-button type="primary" class="ml20" @click="userAddProblem">生成问题</el-button>
<el-button type="primary" class="ml20" @click="handleClose">取消</el-button>
</div>
</el-dialog>
<!-- 新增第二步(运维异常问题新增) -->
<el-dialog
:close-on-click-modal="false"
title="运维异常问题新增"
:visible.sync="operationAdd"
width="70%"
:before-close="handleClose"
>
<el-divider content-position="left" style="font-size: 18px; font-weight: bolder">
第二步 选择普测计划及问题类型(请查找需要生成问题的普测计划并选择一条需要生成问题的测试线路)
</el-divider>
<el-form :model="operationAdddata" :inline="true" ref="operationAdd" :rules="rules" class="form">
<el-form-item label="异常设备名称:" prop="abnormalDevName">
<el-input
v-model="operationAdddata.abnormalDevName"
clearable
placeholder="请填写异常设备名称"
></el-input>
</el-form-item>
<el-form-item label="发现异常时间:" prop="abnormalDevTime">
<el-date-picker
v-model="operationAdddata.abnormalDevTime"
type="date"
placeholder="请选择发现异常时间"
value-format="yyyy-MM-dd"
></el-date-picker>
</el-form-item>
</el-form>
<el-form :inline="true" :model="operationAdddata" ref="operationAdd1" :rules="rules" class="box">
<el-form-item label="设备异常描述:" style="margin-top: 10px" prop="eventDescription">
<el-input
type="textarea"
:rows="1"
placeholder="请填写设备异常描述"
v-model="operationAdddata.eventDescription"
></el-input>
</el-form-item>
</el-form>
<el-divider content-position="left" style="font-size: 18px; font-weight: bolder">
第三步 选择问题指标
</el-divider>
<el-form :inline="true" :model="operationAdddata" ref="operationAdd2" :rules="rules" class="form">
<el-form-item label="稳态指标:" prop="steadyState">
<el-checkbox-group v-model="operationAdddata.steadyState">
<el-checkbox v-for="(item, ind) in steadyStateList" :key="ind" :label="item.code">
{{ item.name }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="暂态指标:" prop="transientIndicators">
<el-checkbox-group v-model="operationAdddata.transientIndicators">
<el-checkbox v-for="(item, ind) in transientIndicatorsList" :key="ind" :label="item.code">
{{ item.name }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-form>
<div style="display: flex; justify-content: center; margin-top: 10px">
<el-button type="primary" class="ml20" @click="previouStep">上一步</el-button>
<el-button type="primary" class="ml20" @click="generateAbnormal">生成问题</el-button>
<el-button type="primary" class="ml20" @click="handleClose">取消</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { dicData } from '@/assets/commjs/dictypeData'
import Month from './Month'
import Area from '@/views/components/Area/Area.vue'
import {
addAbnormalIssues,
getordinaryAddData,
getAllAlarmDetailList,
addExcessiveIssues,
getPowerUtilizationUserList,
getGenerateElectricityUserList,
addComplaintIssues,
addGeneralSurveyIssues,
querySurveyPlanOnQuestion,
querySurveyPlanName
} from '@/api/Process-supervision/electricitymanagement/electricitymanagement'
export default {
components: { Area, Month },
props: {},
data() {
return {
add: false,
addData: {
orgName: '',
problemSources: '',
problemName: '',
orgNo: ''
},
height1: null,
height2: null,
height3: null,
isLoading1: false,
isLoading2: false,
isLoading3: false,
userAddDataList: [],
userA: {
userType: 'Elec_User',
id: ''
},
ordinaryA: {
orgNo: '',
planName: '',
planStartTime: ''
},
UserList: [],
GeneralSurveyList: [],
rules: {
problemName: [{ required: true, message: '请输入问题名称', trigger: 'blur' }],
complaintContent: [{ required: true, message: '请输入投诉内容', trigger: 'blur' }],
complaintTime: [{ required: true, message: '请选择时间', trigger: 'change' }],
problemSources: [{ required: true, message: '情选择问题来源', trigger: 'change' }],
abnormalDevTime: [{ required: true, message: '请选择时间', trigger: 'change' }],
transientIndicators: [{ required: true, message: '请选择暂态指标', trigger: 'change' }],
steadyState: [{ required: true, message: '请选择稳态指标', trigger: 'change' }],
eventDescription: [{ required: true, message: '请输入设备异常描述', trigger: 'blur' }],
abnormalDevName: [{ required: true, message: '请输入问题名称', trigger: 'blur' }]
},
userAdd: false,
userAdddata: {
complaintContent: '',
complaintTime: '',
steadyState: [],
transientIndicators: []
},
showUserType: false,
userAddData: [],
//用户类型
userTypeData: [],
//问题来源
problemData: [],
onlineAddData: [],
onlineAdd: false,
ordinaryAdd: false,
onlineAdddata: {
alarmTime: ''
},
ordinaryAdddata: {
uploadTime: '',
name: '',
steadyState: [],
transientIndicators: []
},
ordinaryAddData: [],
//普测计划名称
planNameList: [],
operationAdd: false,
operationAdddata: {
abnormalDevName: '',
eventDescription: '',
abnormalDevTime: '',
steadyState: [],
transientIndicators: []
},
steadyStateList: [], // 稳态指标
transientIndicatorsList: [], //暂态指标
OnlineList: []
}
},
created() {},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.Dictionaries()
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.height1 = window.sessionStorage.getItem('appheight') - 440
this.height2 = window.sessionStorage.getItem('appheight') - 570
this.height3 = window.sessionStorage.getItem('appheight') - 760
},
// 字典表
Dictionaries() {
this.addData.orgNo = JSON.parse(window.sessionStorage.getItem('Info')).deptId
this.addData.orgName = JSON.parse(window.sessionStorage.getItem('Info')).deptName
// /问题来源
this.problemData = dicData('Problem_Sources', ['Load_Type'])
// 稳态指标:
this.steadyStateList = dicData('Steady_Indicator', ['Load_Type'])
// 暂态指标:
this.transientIndicatorsList = dicData('Transient_Indicators', ['Load_Type'])
// 用户类型::
this.userTypeData = dicData('User_Category', ['Load_Type'])
},
// 字典处理
formatter(row, column) {
let title = ''
dicData('alarm_Type', ['Load_Type']).forEach(item => {
if (item.id == row.alarmType) {
title = item.name
}
})
return title
},
formatter1(row, column) {
let title = ''
dicData('Ele_Class', ['Load_Type']).forEach(item => {
if (item.id == row.electricityType) {
title = item.name
}
})
return title
},
formatter2(row, column) {
let title = ''
dicData('Power_Category', ['Load_Type']).forEach(item => {
if (item.id == row.powerCategory) {
title = item.name
}
})
return title
},
//下一步
nextStep() {
this.$refs.ruleForm.validate(valid => {
if (valid) {
if (this.addData.problemSources == 'Online') {
this.add = false
this.onlineAdd = true
setTimeout(() => {
this.searchOnLine()
}, 0)
} else if (this.addData.problemSources == 'General') {
this.ordinaryA.orgNo = JSON.parse(window.sessionStorage.getItem('Info')).deptId
this.ordinaryA.planStartTime = this.getNowTime()
this.add = false
this.ordinaryAdd = true
this.queryPlanName()
setTimeout(() => {
this.searchFnExcessive()
}, 0)
} else if (this.addData.problemSources == 'User_Complaints') {
this.add = false
this.userAdd = true
this.searchFnComplain()
} else if (this.addData.problemSources == 'Dev_Exception') {
this.add = false
this.operationAdd = true
}
}
})
},
//获取当前时间
getNowTime() {
var date = new Date()
//年 getFullYear():四位数字返回年份
var year = date.getFullYear() //getFullYear()代替getYear()
//月 getMonth()0 ~ 11
var month = date.getMonth() + 1
var time = year + '-' + this.addZero(month) + '-01'
return time
},
//小于10的拼接上0字符串
addZero(s) {
return s < 10 ? '0' + s : s
},
queryPlanName() {
// this.ordinaryA.orgNo
// this.ordinaryA.planStartTime
querySurveyPlanName({
orgNo: this.ordinaryA.orgNo,
planStartTime: this.ordinaryA.planStartTime
}).then(res => {
this.planNameList = res.data
// if (res.data.length == 0) {
// this.ordinaryA.planName = "";
// this.ordinaryAddData = [];
// }else{
// this.ordinaryA.planName = this.planNameList[0].planName;
// this.searchFnExcessive();
// }
})
},
//上一步
previouStep() {
this.onlineAdd = false
this.ordinaryAdd = false
this.userAdd = false
this.operationAdd = false
this.add = true
},
//在线新增查询 在线监测告警
searchOnLine() {
this.isLoading1 = true
getAllAlarmDetailList({
startTime: this.$refs.interval.timeValue[0],
endTime: this.$refs.interval.timeValue[1]
}).then(res => {
this.isLoading1 = false
this.onlineAddData = res.data
})
},
//普测新增查询
searchFnExcessive() {
this.isLoading2 = true
querySurveyPlanOnQuestion(this.ordinaryA).then(res => {
this.isLoading2 = false
this.ordinaryAddData = res.data
})
},
// 用户投诉
searchFnComplain() {
this.isLoading3 = true
if (this.userA.userType == 'Elec_User') {
// 发电用户
this.showUserType = false
getGenerateElectricityUserList({ id: this.userA.id }).then(res => {
this.userAddDataList = res.data
})
} else {
this.showUserType = true
// 用电用户
getPowerUtilizationUserList({ id: this.userA.id }).then(res => {
this.userAddDataList = res.data
})
}
this.isLoading3 = false
},
// resetFn1() {
// this.onlineAdddata.alarmTime = "";
// },
//序号
rowClassName({ row, rowIndex }) {
row.number = rowIndex + 1
},
formFilter(row, column) {
if (column.property == 'voltageLevel') {
let title = ''
dicData('Dev_Voltage', []).forEach(item => {
if (item.value == row.voltageLevel) {
title = item.label
}
})
return title
} else {
return row[column.property]
}
},
//在线监测超标问题新增
ChangeOnline(val) {
this.OnlineList = val
},
handleSelectionChange(val) {
this.multipleSelection = val
},
// 普测计划及问题类型
handleSelectionChangeGeneral(val) {
this.GeneralSurveyList = val
},
// 用户投诉
handleSelectionChangeUser(val) {
this.UserList = val
},
handleNodeClick1(data) {
this.ordinaryA.orgNo = data.id
this.queryPlanName()
},
// 关闭对话框
handleClose() {
this.$emit('handleClose')
},
//在线监测超标问题新增
OnlineMonitoring() {
if (this.OnlineList.length == 1) {
let list = {
warnReason: this.OnlineList[0].alarmInfo,
warnLastTime: this.OnlineList[0].alarmLastTime,
warnTarget: this.OnlineList[0].alarmType,
measurementPointName: this.OnlineList[0].measurementPointName,
measurementPointId: this.OnlineList[0].measurementPointId
}
addExcessiveIssues({
...list,
...this.addData
}).then(res => {
if (res.code == 'A0000') {
this.$message({
message: '新增成功!',
type: 'success'
})
}
this.$emit('handleClose')
this.$emit('onSubmit')
})
} else {
this.$message({
message: '问题测点,请选择1条数据',
type: 'warning'
})
}
},
// 生成填报运维监控异常问题
generateAbnormal() {
this.$refs['operationAdd'].validate(valid => {
if (valid) {
this.$refs['operationAdd1'].validate(valid => {
if (valid) {
this.$refs['operationAdd2'].validate(valid => {
if (valid) {
// this.operationAdddata.abnormalTarget = [
// ...this.operationAdddata.steadyState,
// ...this.operationAdddata.transientIndicators,
// ];
addAbnormalIssues({
...this.operationAdddata,
...this.addData
}).then(res => {
if (res.code == 'A0000') {
this.$message({
message: '新增成功!',
type: 'success'
})
this.$emit('handleClose')
this.$emit('onSubmit')
}
})
}
})
}
})
}
})
},
// 普测计划及问题类型
GeneralSurvey() {
if (this.GeneralSurveyList.length == 1) {
this.$refs.GeneralSurvey.validate(valid => {
if (valid) {
this.ordinaryAdddata.substationId = this.GeneralSurveyList[0].subId
this.ordinaryAdddata.busbarId = this.GeneralSurveyList[0].busbarId
this.ordinaryAdddata.measurementPointId = this.GeneralSurveyList[0].measurementPointId
this.ordinaryAdddata.planName = this.GeneralSurveyList[0].planName
addGeneralSurveyIssues({
...this.addData,
...this.ordinaryAdddata
}).then(res => {
if (res.code == 'A0000') {
this.$message({
message: '新增成功!',
type: 'success'
})
this.$emit('handleClose')
this.$emit('onSubmit')
}
})
}
})
} else {
this.$message({
message: '普测计划及问题类型,请选择1条数据',
type: 'warning'
})
}
//
},
// 填报用户投诉问题
userAddProblem() {
if (this.UserList.length == 1) {
this.$refs.userAdddata.validate(valid => {
if (valid) {
this.userAdddata.userName = this.UserList[0].name
this.userAdddata.userNo = this.UserList[0].id
this.userAdddata.userType = this.userA.userType
this.userAdddata.electricityType =
this.userA.userType == 'Elec_User'
? this.UserList[0].powerCategory
: this.UserList[0].electricityType
addComplaintIssues({ ...this.addData, ...this.userAdddata }).then(res => {
if (res.code == 'A0000') {
this.$message({
message: '新增成功!',
type: 'success'
})
this.$emit('handleClose')
this.$emit('onSubmit')
}
})
}
})
} else {
this.$message({
message: '投诉用户,请选择1条数据',
type: 'warning'
})
}
//
}
},
computed: {},
watch: {}
}
</script>
<style lang="less" scoped>
@import url('../../../../../styles/comStyle.less');
</style>

View File

@@ -0,0 +1,275 @@
<template>
<div>
<!-- 计划整改 -->
<el-dialog
:close-on-click-modal="false"
title="填报"
:visible.sync="rectificationMeasures"
width="70%"
:before-close="handleClose"
>
<el-divider
content-position="left"
style="font-size: 18px; font-weight: bolder"
>问题基本信息</el-divider
>
<el-form :inline="true">
<el-form-item label="所属单位:">
<el-input
v-model="addData.orgName"
clearable
placeholder="请填写"
disabled
>
</el-input>
</el-form-item>
<el-form-item label="问题来源:">
<el-select
disabled
v-model="addData.problemSources"
placeholder="请选择"
>
<el-option
v-for="item in OnlineList"
:key="item.code"
:label="item.name"
:value="item.code"
>
</el-option>
</el-select>
<!-- <el-input
v-model="addData.problemSources"
clearable
placeholder="请填写"
disabled
>
</el-input> -->
</el-form-item>
<el-form-item label="问题名称:">
<el-input
v-model="addData.problemName"
clearable
placeholder="请填写"
disabled
>
</el-input>
</el-form-item>
<el-form-item label="问题编号:">
<el-input
v-model="addData.powerQualityProblemNo"
disabled
clearable
placeholder="请填写"
>
</el-input>
</el-form-item>
</el-form>
<el-divider
content-position="left"
style="font-size: 18px; font-weight: bolder"
>填报流程</el-divider
>
<el-row type="flex" justify="space-between">
<el-col :span="4">
<el-steps
style="height: 250px"
direction="vertical"
:active="1"
finish-status="success"
>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:gray"
>
<p style="color: white">原因分析</p>
</el-card>
</el-step>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:#037272bc"
>
<p style="color: white">计划整改措施</p>
</el-card>
</el-step>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:gray"
>
<p style="color: white">实际采取措施</p>
</el-card>
</el-step>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:gray"
>
<p style="color: white">成效分析</p>
</el-card>
</el-step>
</el-steps>
</el-col>
<el-col :span="20">
<el-form
:model="rectificationMeasuresData"
:rules="rules"
ref="form"
class="form"
>
<el-form-item
label="电网侧整改治理措施:"
prop="reportProcessContentJhzg"
>
<el-checkbox-group
v-model="rectificationMeasuresData.reportProcessContentJhzg"
>
<el-checkbox
v-for="(item, ind) in List"
:key="ind"
:label="item.code"
>{{ item.name }}</el-checkbox
>
</el-checkbox-group>
</el-form-item>
<el-divider></el-divider>
<el-form-item
label="用户侧整改治理措施:"
prop="userReportProcessContentJhzg"
>
<el-checkbox-group
v-model="rectificationMeasuresData.userReportProcessContentJhzg"
>
<el-checkbox
v-for="(item, ind) in List"
:key="ind"
:label="item.code"
>{{ item.name }}</el-checkbox
>
</el-checkbox-group>
</el-form-item>
<el-divider></el-divider>
<el-form-item
class="item"
label="计划整改措施报告:"
prop="fileNameJhzg"
>
<File ref="File" />
</el-form-item>
</el-form>
</el-col>
</el-row>
<div style="display: flex; justify-content: center; margin-top: 10px">
<el-button type="primary" class="ml20" @click="Submit"
>提交审核</el-button
>
<el-button type="primary" class="ml20" @click="handleClose"
>取消</el-button
>
</div>
</el-dialog>
</div>
</template>
<script>
import { dicData } from "@/assets/commjs/dictypeData";
import { correctiveAction } from "@/api/Process-supervision/electricitymanagement/electricitymanagement";
import File from "./File.vue";
export default {
components: { File },
props: {
addData: {
type: [Object, Array],
default: {
orgName: "",
problemSources: "",
problemName: "",
powerQualityProblemNo: "",
},
},
},
data() {
return {
rectificationMeasures: false,
rectificationMeasuresData: {
reportProcessContentJhzg: [],
userReportProcessContentJhzg: [],
fileNameJhzg: "", //计划整改文件名称
filePathJhzg: "", // 计划整改文件路径
},
OnlineList: [],
rules: {
reportProcessContentJhzg: [
{ required: true, message: "请选择", trigger: "change" },
],
userReportProcessContentJhzg: [
{ required: true, message: "请选择", trigger: "change" },
],
fileNameJhzg: [
{ required: true, message: "请上传文件", trigger: "blur" },
],
},
List: [],
};
},
created() {},
mounted() {
this.Dictionaries();
},
methods: {
// 字典表
Dictionaries() {
// 电网侧原因
this.List = dicData("Plan_Take", ["Load_Type"]);
this.OnlineList = dicData("Problem_Sources", []);
},
handleClose() {
this.$emit("handleClose");
},
//提交
Submit() {
this.rectificationMeasuresData.fileNameJhzg =
this.$refs.File.fileList.minFileName;
this.rectificationMeasuresData.filePathJhzg =
this.$refs.File.fileList.minFileUrl;
this.$refs["form"].validate((valid) => {
if (valid) {
this.rectificationMeasuresData.powerQualityProblemNo =
this.addData.powerQualityProblemNo;
correctiveAction(this.rectificationMeasuresData).then((res) => {
if (res.code == "A0000") {
this.$message({
message: "填报成功!",
type: "success",
});
this.$emit("handleClose");
this.$emit("onSubmit");
}
});
}
});
},
},
computed: {},
watch: {},
};
</script>
<style lang="less" scoped>
::v-deep .el-card__body,
.el-main {
padding: 10px;
}
</style>

View File

@@ -0,0 +1,629 @@
<template>
<div>
<el-divider
content-position="left"
style="font-size: 18px; font-weight: bolder"
>问题基本信息</el-divider
>
<el-form :inline="true" class="form">
<el-form-item label="所属单位:">
<el-input
v-model="addData.orgName"
clearable
placeholder="请填写"
disabled
>
</el-input>
</el-form-item>
<el-form-item label="问题来源:">
<el-select
disabled
v-model="addData.problemSources"
placeholder="请选择"
>
<el-option
v-for="item in OnlineList"
:key="item.code"
:label="item.name"
:value="item.code"
>
</el-option>
</el-select>
<!-- <el-input
v-model="addData.problemSources"
clearable
placeholder="请填写"
disabled
>
</el-input> -->
</el-form-item>
<el-form-item label="问题名称:">
<el-input
v-model="addData.problemName"
clearable
placeholder="请填写"
disabled
>
</el-input>
</el-form-item>
<el-form-item label="问题编号:">
<el-input
v-model="addData.powerQualityProblemNo"
disabled
clearable
placeholder="请填写"
>
</el-input>
</el-form-item>
</el-form>
<el-divider
content-position="left"
style="font-size: 18px; font-weight: bolder"
>填报流程</el-divider
>
<!--原因分析 -->
<el-row
v-if="addData.reportProcess == 'Cause_Analysis'"
type="flex"
justify="space-between"
>
<el-col :span="4">
<el-steps
style="height: 250px"
direction="vertical"
:active="0"
finish-status="success"
>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:#037272bc"
>
<p style="color: white">原因分析</p>
</el-card>
</el-step>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:gray"
>
<p style="color: white">计划整改措施</p>
</el-card>
</el-step>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:gray"
>
<p style="color: white">实际采取措施</p>
</el-card>
</el-step>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:gray"
>
<p style="color: white">成效分析</p>
</el-card>
</el-step>
</el-steps>
</el-col>
<el-col :span="20">
<el-form :model="onlineDetailsData" ref="form" class="form">
<el-form-item label="电网侧原因:">
<el-checkbox-group
disabled
v-model="onlineDetailsData.reportProcessContentYyfx"
>
<el-checkbox
v-for="item in reportProcessContentYyfxList"
:key="item.code"
:label="item.code"
>{{ item.name }}</el-checkbox
>
</el-checkbox-group>
</el-form-item>
<el-divider></el-divider>
<el-form-item label="用户侧原因:">
<el-checkbox-group
disabled
v-model="onlineDetailsData.userReportProcessContentYyfx"
>
<el-checkbox
v-for="item in userReportProcessContentYyfxList"
:key="item.code"
:label="item.code"
>{{ item.name }}</el-checkbox
>
</el-checkbox-group>
</el-form-item>
<el-row
v-if="
addData.problemSources == '用户投诉' ||
addData.problemSources == '设备异常'
"
>
<el-divider></el-divider>
<el-form-item label="电网侧受影响设备:">
<el-checkbox-group
disabled
v-model="onlineDetailsData.powerGridAffectDev"
>
<el-checkbox
v-for="(item, ind) in powerGridAffectDevList"
:key="ind"
:label="item.code"
>{{ item.name }}</el-checkbox
>
</el-checkbox-group>
</el-form-item>
<el-divider></el-divider>
<el-form-item label="用户侧受影响设备:">
<el-checkbox-group
disabled
v-model="onlineDetailsData.userAffectDev"
>
<el-checkbox
v-for="(item, ind) in userAffectDevList"
:key="ind"
:label="item.code"
>{{ item.name }}</el-checkbox
>
</el-checkbox-group>
</el-form-item>
</el-row>
<el-divider></el-divider>
<el-form-item label="事件描述:">
<el-input
disabled
style="width: 90%"
type="textarea"
:rows="1"
placeholder="请输入内容"
v-model="onlineDetailsData.eventDescriptionYyfx"
></el-input>
</el-form-item>
<el-form-item
class="item"
label="原因分析报告:"
style="margin-top: 10px"
>
<div style="display: flex">
<el-input
style="width: 240px"
v-model="onlineDetailsData.fileNameYyfx"
placeholder="文件名称"
disabled
></el-input>
<a :href="onlineDetailsData.filePathYyfx"
><el-button
size="mini"
style="margin-left: 10px"
type="primary"
icon="el-icon-download"
>下载</el-button
></a
>
</div>
</el-form-item>
</el-form>
</el-col>
</el-row>
<!--计划整改措施 -->
<el-row
v-if="addData.reportProcess == 'Plan_Measures'"
type="flex"
justify="space-between"
>
<el-col :span="4">
<el-steps
style="height: 250px"
direction="vertical"
:active="1"
finish-status="success"
>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:gray"
>
<p style="color: white">原因分析</p>
</el-card>
</el-step>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:#037272bc"
>
<p style="color: white">计划整改措施</p>
</el-card>
</el-step>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:gray"
>
<p style="color: white">实际采取措施</p>
</el-card>
</el-step>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:gray"
>
<p style="color: white">成效分析</p>
</el-card>
</el-step>
</el-steps>
</el-col>
<el-col :span="20">
<el-form :model="onlineDetailsData" ref="form" class="form">
<el-form-item label="电网侧整改治理措施:">
<el-checkbox-group
disabled
v-model="onlineDetailsData.reportProcessContentJhzg"
>
<el-checkbox
v-for="(item, ind) in List"
:key="ind"
:label="item.code"
>{{ item.name }}</el-checkbox
>
</el-checkbox-group>
</el-form-item>
<el-divider></el-divider>
<el-form-item label="用户侧整改治理措施:">
<el-checkbox-group
disabled
v-model="onlineDetailsData.userReportProcessContentJhzg"
>
<el-checkbox
v-for="(item, ind) in List"
:key="ind"
:label="item.code"
>{{ item.name }}</el-checkbox
>
</el-checkbox-group>
</el-form-item>
<el-divider></el-divider>
<el-form-item class="item" label="计划整改措施报告:">
<div style="display: flex">
<el-input
style="width: 240px"
v-model="onlineDetailsData.fileNameJhzg"
placeholder="文件名称"
disabled
></el-input>
<a :href="onlineDetailsData.filePathJhzg">
<el-button
size="mini"
style="margin-left: 10px"
type="primary"
icon="el-icon-download"
>下载</el-button
>
</a>
</div>
</el-form-item>
</el-form>
</el-col>
</el-row>
<!-- 实际采取措施 -->
<el-row
v-if="addData.reportProcess == 'Actual_Measures'"
type="flex"
justify="space-between"
>
<el-col :span="4">
<el-steps
style="height: 250px"
direction="vertical"
:active="2"
finish-status="success"
>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:gray"
>
<p style="color: white">原因分析</p>
</el-card>
</el-step>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:gray"
>
<p style="color: white">计划整改措施</p>
</el-card>
</el-step>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:#037272bc"
>
<p style="color: white">实际采取措施</p>
</el-card>
</el-step>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:gray"
>
<p style="color: white">成效分析</p>
</el-card>
</el-step>
</el-steps>
</el-col>
<el-col :span="20">
<el-form :model="onlineDetailsData" ref="form" class="form">
<el-form-item label="电网侧实际采取措施:">
<el-checkbox-group
disabled
v-model="onlineDetailsData.reportProcessContentSjcq"
>
<el-checkbox
v-for="(item, ind) in List"
:key="ind"
:label="item.code"
>{{ item.name }}</el-checkbox
>
</el-checkbox-group>
</el-form-item>
<el-divider></el-divider>
<el-form-item label="用户侧实际采取措施:">
<el-checkbox-group
disabled
v-model="onlineDetailsData.userReportProcessContentSjcq"
>
<el-checkbox
v-for="(item, ind) in List"
:key="ind"
:label="item.code"
>{{ item.name }}</el-checkbox
>
</el-checkbox-group>
</el-form-item>
<el-divider></el-divider>
<el-form-item class="item" label="实际采取措施报告:">
<div style="display: flex">
<el-input
style="width: 240px"
v-model="onlineDetailsData.fileNameSjcq"
placeholder="文件名称"
disabled
></el-input>
<a :href="onlineDetailsData.filePathSjcq">
<el-button
size="mini"
style="margin-left: 10px"
type="primary"
icon="el-icon-download"
>下载</el-button
>
</a>
</div>
</el-form-item>
</el-form>
</el-col>
</el-row>
<!-- 成效分析 -->
<el-row v-if="addData.reportProcess == 'Insights'" :gutter="20">
<el-col :span="4">
<el-steps
style="height: 250px"
direction="vertical"
:active="3"
finish-status="success"
>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:gray"
>
<p style="color: white">原因分析</p>
</el-card>
</el-step>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:gray"
>
<p style="color: white">计划整改措施</p>
</el-card>
</el-step>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:gray"
>
<p style="color: white">实际采取措施</p>
</el-card>
</el-step>
<el-step>
<el-card
slot="description"
style="width: 160px"
body-style="background:#037272bc"
>
<p style="color: white">成效分析</p>
</el-card>
</el-step>
</el-steps>
</el-col>
<el-col :span="20">
<el-form :model="onlineDetailsData" ref="form" class="box1">
<el-form-item label="成效分析概述:" style="margin-top: 10px">
<el-input
type="textarea"
disabled
:rows="1"
placeholder="请输入内容"
v-model="onlineDetailsData.descriptionZlxg"
></el-input>
</el-form-item>
<el-divider></el-divider>
<el-form-item class="item" label="成效分析报告:">
<div style="display: flex">
<el-input
style="width: 240px"
v-model="onlineDetailsData.fileNameZlxg"
placeholder="文件名称"
disabled
></el-input>
<a :href="onlineDetailsData.filePathZlxg">
<el-button
size="mini"
style="margin-left: 10px"
type="primary"
icon="el-icon-download"
>下载</el-button
>
</a>
</div>
</el-form-item>
</el-form>
</el-col>
</el-row>
</div>
</template>
<script>
import { dicData } from "@/assets/commjs/dictypeData";
import { getfile } from "@/api/Process-supervision/electricitymanagement/electricitymanagement";
export default {
components: {},
props: {
addData: {
type: [Object, Array],
},
onlineDetailsData: {
type: [Object, Array],
},
},
data() {
return {
OnlineList: [],
reportProcessContentYyfxList: [],
userReportProcessContentYyfxList: [],
powerGridAffectDevList: [],
userAffectDevList: [],
List: [],
};
},
created() {},
mounted() {
this.Dictionaries();
},
methods: {
// 字典表
Dictionaries() {
// 电网侧原因
this.reportProcessContentYyfxList = dicData("Grid-side_Reasons", [
"Load_Type",
]);
// 用户侧原因
this.userReportProcessContentYyfxList = dicData("User_Reasons", [
"Load_Type",
]);
// 电网侧受影响设备
this.powerGridAffectDevList = dicData("Grid_Unit", ["Load_Type"]);
// 用户侧受影响设备
this.userAffectDevList = dicData("Customer_Unit", ["Load_Type"]);
// 电网侧原因
this.List = dicData("Actual_Measures", ["Load_Type"]);
this.OnlineList = dicData("Problem_Sources", []);
},
//下载文件
download(url, filename) {
getBlob(url, function (blob) {
saveAs(blob, filename);
});
function getBlob(url, cb) {
var xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
xhr.responseType = "blob";
xhr.onload = function () {
if (xhr.status === 200) {
cb(xhr.response);
}
};
xhr.send();
}
function saveAs(blob, filename) {
if (window.navigator.msSaveOrOpenBlob) {
navigator.msSaveBlob(blob, filename);
} else {
var link = document.createElement("a");
var body = document.querySelector("body");
link.href = window.URL.createObjectURL(blob);
link.download = filename;
link.style.display = "none";
body.appendChild(link);
link.click();
body.removeChild(link);
window.URL.revokeObjectURL(link.href);
}
}
},
},
computed: {},
watch: {},
};
</script>
<style lang="less" scoped>
::v-deep .el-divider--horizontal {
display: block;
height: 1px;
width: 100%;
margin: 22px 0;
}
::v-deep .el-card__body,
.el-main {
padding: 10px;
}
::v-deep .el-card__body,
.el-main {
padding: 10px;
}
</style>

View File

@@ -0,0 +1,799 @@
<template>
<div>
<el-form :inline="true" class="demo-form-inline">
<el-form-item label="时间间隔:">
<el-select
style="width: 90px;"
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-form-item>
<el-form-item>
<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>
</el-form-item>
<el-form-item v-if="buttonShow">
<el-button
:disabled="backDisabled"
type="primary"
icon="el-icon-d-arrow-left"
@click="preClick"
></el-button>
<el-button @click="nowTime" type="primary" icon="el-icon-video-pause"
>当前</el-button
>
<el-button
:disabled="preDisabled"
type="primary"
icon="el-icon-d-arrow-right"
@click="back"
></el-button>
</el-form-item>
<el-form-item>
<el-button v-show="false" style="margin-bottom: 0.5%" type="primary"
>导出文件</el-button
>
</el-form-item>
</el-form>
<!-- <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];
this.$emit("time",[startTime,endTime,this.intervald] );
if (this.type == 2) {
this.huangbiyear();
} else if (!this.type) {
this.querfromdata();
}
},
methods: {
interchange(val) {
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.$emit("time",[startTime,endTime,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,440 @@
<template>
<div>
<el-form :inline="true" class="demo-form-inline form">
<el-form-item>
<Area @click="handleNodeClick" ref="area"></Area>
</el-form-item>
<el-form-item>
<Timeinterval :interval="3" ref="interval"></Timeinterval>
</el-form-item>
<el-form-item>
<el-button type="primary" class="ml10" icon="el-icon-search" @click="onsubmit">查询</el-button>
<el-button type="primary" icon="el-icon-refresh" @click="Reset">重置</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" style="margin-top: 10px" label-width="110px" class="">
<el-form-item label="监测点性质:">
<el-select v-model="formData.lineType" clearable>
<el-option label="电网侧" value="0" />
<el-option label="非电网侧" value="1" />
</el-select>
</el-form-item>
<el-form-item label="超标指标:">
<el-select v-model="formData.targetList" clearable multiple collapse-tags collapse-tags-tooltip
placeholder="请选择超标指标">
<el-option v-for="item in exceeded" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="预警阈值:">
<!-- <el-input v-model="formData.alertThreshold" placeholder="请输入预警阈值" clearable></el-input> -->
<el-input-number style="width: 197px;" v-model="formData.alertThreshold" :min="0" :step="1"
step-strictly @change="changeAlert" />
</el-form-item>
<el-form-item label="告警阈值:">
<el-input-number style="width: 197px;" v-model="formData.alarmThreshold" :min="0" :step="1"
step-strictly @change="changeAlarm" />
</el-form-item>
<!-- <el-form-item label="数据类型:">
<el-radio-group v-model="formData.dataType">
<el-radio-button label="1">超标数据</el-radio-button>
<el-radio-button label="0">无数据</el-radio-button>
</el-radio-group>
</el-form-item> -->
</el-form>
</div>
<!-- <div class="button mb10">
<el-button type="primary" icon="el-icon-plus" size="mini">发起预警单</el-button>
<el-button type="primary" icon="el-icon-plus" size="mini">
发起告警单
</el-button>
</div> -->
<el-table stripe :data="tabList" :height="height" border style="width: 100%" v-loading="isLoading"
header-cell-class-name="table_header">
<el-table-column type="selection" width="55"></el-table-column>
<el-table-column prop="number" label="序号" width="100" :show-overflow-tooltip="true">
<template scope="scope">
<span>{{ (formData.pageNum - 1) * formData.pageSize + scope.$index + 1 }}</span>
</template>
</el-table-column>
<el-table-column prop="dept" label="负责单位" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="substation" label="变电站名称" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="deviceName" label="终端名称" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="lineName" label="监测点名称" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="businessType" label="监测对象类型" :show-overflow-tooltip="true">
<!-- <template slot-scope="scope">
<span> {{ industry.find((item) => item.id == scope.row.businessType)?.name || '/' }} </span>
</template> -->
</el-table-column>
<el-table-column prop="objectName" label="监测对象名称" :show-overflow-tooltip="true">
<template slot-scope="scope">
<span> {{ scope.row.objectName || '/' }} </span>
</template>
</el-table-column>
<el-table-column prop="targetType" label="指标类型" :show-overflow-tooltip="true">
<template slot-scope="scope">
<span> {{ exceeded.find((item) => item.id == scope.row.targetType).name || '/' }} </span>
</template>
</el-table-column>
<el-table-column prop="overLimitDay" label="累计超标天数" :show-overflow-tooltip="true">
<!-- <template slot-scope="scope">
<span> {{ scope.row.overLimitDay }} </span>
</template> -->
</el-table-column>
<el-table-column prop="updateTime" label="最新数据时间" width="200"></el-table-column>
<el-table-column label="操作" :show-overflow-tooltip="true">
<template slot-scope="scope">
<el-button type="primary" icon="el-icon-view" size="mini" @click="detail(scope.row)">详情</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="[10, 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="70%">
<el-table stripe :data="detailedData" height="600" border style="width: 100%" v-loading="isLoading"
header-cell-class-name="table_header">
<el-table-column prop="time" label="日期" width="200"></el-table-column>
<el-table-column prop="overLimitInfo" label="越限详情" :show-overflow-tooltip="true"></el-table-column>
</el-table>
</el-dialog>
</div>
</template>
<script>
import Area from '@/views/components/Area/Area.vue'
import { dicData } from '@/assets/commjs/dictypeData'
import Timeinterval from './components/Timeinterval.vue'
import {
onlineMonitor,
overLimitDetail
} from '@/api/Process-supervision/electricitymanagement/electricitymanagement'
import SectionTwoPage from './components/SectionTwoPage.vue'
export default {
components: { Area, Timeinterval, SectionTwoPage },
data() {
return {
vh: '',
SectionTwoPage: false,
height: null,
view: false,
tabList: [],
dialogVisible: false,
isLoading: false,
isLoading1: false,
detailedData: [],
formData: {
deptId: '',
lineType: '',
dataType: 1,
targetList: [],
alertThreshold: '1',
alarmThreshold: '1',
pageNum: 1,
pageSize: 10
},
industry: [],
//问题来源
exceeded: [],
device: '',
total: 0, // 总条数
fvh: ''
}
},
created() { },
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.Dictionaries()
this.onsubmit()
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.device = window.devicePixelRatio
this.height = window.sessionStorage.getItem('appheight') - 173
},
closeHandle() {
if (this.view) {
this.view = false
} else {
this.view = true
}
//console.log('关闭和展开');
const dom = document.getElementById('container')
if (!dom.className.match(/(?:^|\s)expend(?!\S)/)) {
dom.className = 'container expend'
} else {
dom.className = 'container close-container'
}
},
// 字典表
Dictionaries() {
this.formData.deptId = JSON.parse(window.sessionStorage.getItem('Info')).deptId
// /问题来源
this.exceeded = dicData('Steady_Statis', [])
this.industry = dicData('Business_Type', [])
// this.formData.targetList = this.exceeded.filter(item => item.code == 'Total_Indicator')[0].id
// ? [exceeded.filter(item => item.code == 'Total_Indicator')[0].id]
// : []
},
changeAlert(e) {
if (e == null) {
this.formData.alertThreshold = '1'
} else {
if (e > this.formData.alarmThreshold) {
this.$message.warning('预警阈值不能大于报警阈值')
this.formData.alertThreshold = '1'
}
}
},
changeAlarm(e) {
if (e == null) {
this.formData.alarmThreshold = '1'
} else {
if (e < this.formData.alertThreshold) {
this.$message.warning('报警阈值不能小于预警阈值')
this.formData.alarmThreshold = '1'
}
}
},
// 详情
detail(row) {
this.detailedData = []
overLimitDetail({
lineId: row.lineId,
targetId: row.targetType,
searchBeginTime: this.$refs.interval.timeValue[0],
searchEndTime: this.$refs.interval.timeValue[1]
}).then(res => {
this.detailedData = res.data
this.dialogVisible = true
})
},
//查询
onsubmit() {
this.isLoading = true
this.formData.searchBeginTime = this.$refs.interval.timeValue[0]
this.formData.searchEndTime = this.$refs.interval.timeValue[1];
onlineMonitor(this.formData).then(res => {
this.isLoading = false
this.tabList = res.data.records
this.total = res.data.total
})
},
// 切换选项
handleNodeClick(data) {
this.formData.deptId = data.id
},
//勾选
//重置
Reset() {
this.formData = {
deptId: '',
lineType: '',
dataType: 1,
targetList: [],
alertThreshold: '1',
alarmThreshold: '1',
pageNum: 1,
pageSize: 10
}
this.$refs.area.form.valueTitle = JSON.parse(window.sessionStorage.getItem('Info')).deptName
this.formData.deptId = JSON.parse(window.sessionStorage.getItem('Info')).deptId
this.$refs.interval.intervald = 3
this.onsubmit()
},
//每页条数改变时触发 选择一页显示多少行
handleSizeChange(val) {
this.formData.pageSize = val
this.onsubmit()
},
//当前页改变时触发 跳转其他页
handleCurrentChange(val) {
this.formData.pageNum = val
this.onsubmit()
},
// 字典处理
formatterType(row, column) {
let title = ''
dicData('Audit_Status', ['Load_Type']).forEach(item => {
if (item.code == row.type) {
title = item.name
}
})
return title
}
}
}
</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 .form {
.el-form-item {
margin-bottom: 0;
}
}
::v-deep .box {
.el-input {
width: 140px;
}
}
::v-deep .box1 {
.el-input {
width: 100%;
}
}
::v-deep .box2 {
.el-textarea {
width: 1000px;
}
}
::v-deep .box3 {
.el-textarea {
width: 1200px;
}
}
::v-deep .el-card {
height: 40px;
}
.button {
float: right;
margin-right: 5px;
}
::v-deep .el-dialog .el-dialog__body {
max-height: 100%;
padding: 10px;
}
::v-deep .swiper {
.el-divider--horizontal {
margin: 10px 0;
}
}
.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;
}
</style>

View File

@@ -0,0 +1,247 @@
<template>
<div class="upload-file">
<el-upload
:action="uploadFileUrl"
:before-upload="handleBeforeUpload"
:multiple="true"
:limit="limit"
accept=".doc,.docx,.xls,.xlsx,.pdf,.txt"
:on-error="handleUploadError"
:on-exceed="handleExceed"
:on-success="handleUploadSuccess"
:on-change="handleChange"
:show-file-list="false"
:headers="headers"
class="upload-file-uploader"
ref="upload"
>
<!-- 上传按钮 -->
<div style="display: flex;">
<el-input
style="width: 240px;"
v-model="fileList.minFileName"
placeholder="文件名称"
disabled
></el-input>
<el-button
size="mini"
style="margin-left: 10px;"
type="primary"
icon="el-icon-upload2"
>上传本地报告</el-button
>
</div>
<!-- 上传提示 -->
</el-upload>
</div>
</template>
<script>
// import { getAccessToken } from "@/utils/auth";
// import { getfile } from "@/api/core/ProjectList";
import { MultipartFile } from "@/api/Process-supervision/tiaoHarmonicmanagement/harmonicmanagement";
export default {
name: "FileUpload",
props: {
// 值
value: [String, Object, Array],
// 数量限制
limit: {
type: Number,
default: 100,
},
// 大小限制(MB)
fileSize: {
type: Number,
default: 512,
},
// 文件类型, 例如['png', 'jpg', 'jpeg']
fileType: {
type: Array,
default: () => ["doc", "xls", "ppt", "txt", "pdf"],
},
// 是否显示提示
isShowTip: {
type: Boolean,
default: true,
},
},
data() {
return {
number: 0,
uploadList: [],
uploadFileUrl: "/apiH/rGeneralSurveyPlan/surveyResultUpload?planId=003", // 请求地址
headers: {
Authorization: window.sessionStorage.getItem("cntoken"),
}, // 设置上传的请求头部
fileList: [],
};
},
watch: {
// value: {
// handler(val) {
// if (val) {
// let temp = 1;
// // 首先将值转为数组
// const list = Array.isArray(val) ? val : this.value.split(",");
// // 然后将数组转为对象数组
// this.fileList = list.map((item) => {
// if (typeof item === "string") {
// item = { name: item, url: item };
// }
// item.uid = item.uid || new Date().getTime() + temp++;
// return item;
// });
// } else {
// this.fileList = [];
// return [];
// }
// },
// deep: true,
// immediate: true,
// },
},
computed: {
// 是否显示提示
showTip() {
return this.isShowTip && (this.fileType || this.fileSize);
},
},
methods: {
handleChange(file, fileList) {
//console.log(file, fileList)
this.fileList = fileList
},
submitUpload() {
const formData = new FormData()
this.fileList.forEach(item => {
formData.append('files', item.raw)
// console.log(item.raw, item)
})
MultipartFile(formData) //后端上传接口
.then(res => {
// console.log(res)
this.$emit('added')
this.dialogVisible = false
})
.catch(err => {
// console.log(err)
})
},
// 上传前校检格式和大小
handleBeforeUpload(files) {
// console.log(files);
// 校检文件类型
// if (this.fileType) {
// let fileExtension = "";
// if (file.name.lastIndexOf(".") > -1) {
// 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.$modal.msgError(`文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`);
// return false;
// }
// }
// // 校检文件大小
// if (this.fileSize) {
// const isLt = file.size / 1024 / 1024 < this.fileSize;
// if (!isLt) {
// this.$modal.msgError(`上传文件大小不能超过 ${this.fileSize} MB!`);
// return false;
// }
// }
// this.$modal.loading("正在上传文件,请稍候...");
this.number++;
return true;
},
// 文件个数超出
handleExceed() {
this.$modal.msgError(`上传文件数量不能超过 ${this.limit} 个!`);
},
// 上传失败
handleUploadError(err) {
this.$message.error("上传失败!");
// this.$modal.msgError("上传图片失败,请重试");
// this.$modal.closeLoading();
},
// 上传成功回调
handleUploadSuccess(res) {
this.$message({
message: "上传成功!",
type: "success",
});
this.fileList = res.data;
//console.log(`123`, res,);
},
// 删除文件
handleDelete(index) {
// this.fileList.splice(index, 1);
// this.$emit("input", this.fileList);
},
// 获取文件名称
getFileName(name) {
if (name.lastIndexOf("/") > -1) {
return name.slice(name.lastIndexOf("/") + 1);
} else {
return "";
}
},
// 对象转成指定字符串分隔
listToString(list, separator) {
let strs = "";
separator = separator || ",";
for (let i in list) {
strs += list[i].url + separator;
}
return strs !== "" ? strs.substr(0, strs.length - 1) : "";
},
// 下载
exportExcels(e) {
getfile(e.url.substring(32)).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 = e.url.substring(
e.url.lastIndexOf("/") + 1,
e.url.length
); // 设置下载的文件名
document.body.appendChild(link);
link.click(); //执行下载
document.body.removeChild(link);
});
},
},
};
</script>
<style scoped lang="scss">
.upload-file-uploader {
margin-bottom: 5px;
}
.upload-file-list .el-upload-list__item {
position: relative;
margin-bottom: 10px;
line-height: 2;
border: 1px solid #e4e7ed;
}
.upload-file-list .ele-upload-list__item-content {
display: flex;
align-items: center;
justify-content: space-between;
color: inherit;
}
.ele-upload-list__item-content-action .el-link {
margin-right: 10px;
}
</style>

View File

@@ -0,0 +1,373 @@
<template>
<div>
<el-form :inline="true" class="demo-form-inline form">
<el-form-item>
<Area @click="handleNodeClick" ref="area"></Area>
</el-form-item>
<el-form-item>
<Timeinterval :interval="3" ref="interval" :timeOptions="timeOptions"></Timeinterval>
</el-form-item>
<el-form-item>
<el-button type="primary" class="ml10" icon="el-icon-search" @click="onsubmit">查询</el-button>
<el-button type="primary" icon="el-icon-refresh" @click="Reset">重置</el-button>
</el-form-item>
</el-form>
<el-row>
<el-col :span="24">
<div class="button mb10">
<el-button type="primary" icon="el-icon-s-claim" @click="planReviewFn('')">审核</el-button>
</div>
<el-table
stripe
:data="planapprovalData"
:height="height"
border
style="width: 100%"
v-loading="isLoading"
header-cell-class-name="table_header"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55"></el-table-column>
<template v-for="(item, index) in tableHeaderPlanapproval">
<el-table-column
:prop="item.prop"
:label="item.label"
:key="index"
:min-width="item.width"
></el-table-column>
</template>
</el-table>
<el-pagination
background
align="right"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="ruleForm.pageNum"
:page-sizes="[20, 30, 40, 50, 100]"
:page-size="ruleForm.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="planapprovalData.length"
class="mt10"
></el-pagination>
</el-col>
</el-row>
<!-- 审核弹窗 -->
<el-dialog :close-on-click-modal="false" title="普测计划审核" :visible.sync="planReview" width="800px">
<el-row :gutter="20">
<el-col :span="10">
<el-divider content-position="left" style="font-size: 18px; font-weight: bolder">
基本信息
</el-divider>
<el-form :inline="true" :model="formdata" class="forms" :disabled="true" label-width="120px">
<el-form-item label="普测负责单位:">
<el-input v-model="formdata.orgName" disabled></el-input>
</el-form-item>
<el-form-item label="计划开始时间:">
<el-date-picker
v-model.trim="formdata.planStartTime"
type="date"
placeholder="选择计划开始时间"
></el-date-picker>
</el-form-item>
<el-form-item label="计划结束时间:">
<el-date-picker
v-model.trim="formdata.planEndTime"
type="date"
placeholder="选择计划结束时间"
></el-date-picker>
</el-form-item>
<el-form-item label="普测计划编号:">
<el-input v-model="formdata.planNo" placeholder="请输入普测计划编号"></el-input>
</el-form-item>
<el-form-item label="计划名称:">
<el-input v-model="formdata.planName" placeholder="请输入计划名称"></el-input>
</el-form-item>
<el-form-item label="测试负责人:">
<el-input v-model="formdata.leader" placeholder="请输入测试负责人"></el-input>
</el-form-item>
</el-form>
</el-col>
<el-col :span="14">
<el-divider content-position="left" style="font-size: 18px; font-weight: bolder">
添加电站
</el-divider>
<el-tree
:data="treeData"
show-checkbox
node-key="id"
style="overflow-y: auto; height: 480px"
default-expand-all
:props="defaultProps"
:check-strictly="true"
ref="tree"
></el-tree>
</el-col>
</el-row>
<el-divider content-position="left" style="font-size: 18px; font-weight: bolder">审核意见</el-divider>
<!-- <div style="width: 100%; display: flex; justify-content: center">
<div class="shyj">{{ textContent }}</div>
</div> -->
<el-input type="textarea" :rows="2" placeholder="请输入审核意见!" v-model="textarea"></el-input>
<div slot="footer" style="display: flex; justify-content: center">
<el-button type="primary" size="small" class="ml20" @click="passFn">通过</el-button>
<el-button type="primary" size="small" class="ml20" @click="failFn">不通过</el-button>
<el-button type="primary" size="small" class="ml20" @click="cancelFn">取消</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import Area from '@/views/components/Area/Area.vue'
import Timeinterval from '../../../components/Timeinterval.vue'
import {
queryPlanAudit,
initDetpStataionTree,
checkPlanAudit,
queryPlanOne
} from '@/api/Process-supervision/tiaoHarmonicmanagement/harmonicmanagement'
export default {
components: { Area, Timeinterval },
props: {
son:String
},
data() {
return {
vh: '',
height: null,
isLoading: false,
isLoading1: false,
planReview: false,
item: ['', ''],
// 查询数据
ruleForm: {
currentPage: 1,
pageSize: 20,
planStartTime: '',
planEndTime: '',
orgNo: ''
},
formdata: {
company: '杭州公司本部',
startTime: '',
endTime: '',
number: '',
name: '',
chargePerson: '',
substation: '',
Bus: ''
},
textarea: '',
tableHeaderPlanapproval: [
{ prop: 'orgName', label: '所属单位' },
{ prop: 'planNo', label: '普测计划编号' },
{ prop: 'planName', label: '普测计划名称' },
{ prop: 'planStartTime', label: '开始时间' },
{ prop: 'planEndTime', label: '结束时间' },
{ prop: 'subCount', label: '普测变电站数量' },
{ prop: "createPersonName", label: "创建用户" },
],
planapprovalData: [],
planReviewData: [],
multipleSelection: [],
device: '',
treeData: [],
defaultProps: {
children: 'children',
label: 'name',
disabled: 'flag'
},
timeOptions: [
{ label: '年份', value: 1 },
{ label: '季度', value: 2 },
{ label: '月份', value: 3 }
]
}
},
created() {},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.ruleForm.orgNo = JSON.parse(window.sessionStorage.getItem('Info')).deptId
this.onsubmit()
initDetpStataionTree({
orgId: JSON.parse(window.sessionStorage.getItem('Info')).deptId
}).then(res => {
this.treeData = res.data
})
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
//查询详情
queryPlanOneDetail(planId){
let data = {planId:planId}
queryPlanOne(data).then(res => {
if(res.code === 'A0000'){
this.planReview = true
this.isLoading1 = true
this.formdata = res.data
setTimeout(() => {
this.$refs.tree.setCheckedKeys(res.data.subIds)
}, 0)
}
})
},
setHeight() {
this.height = window.sessionStorage.getItem('appheight') - 215
},
//查询
onsubmit() {
this.isLoading = true
this.item = this.$refs.interval.timeValue
this.ruleForm.planStartTime = this.item[0]
this.ruleForm.planEndTime = this.item[1]
queryPlanAudit(this.ruleForm).then(res => {
this.isLoading = false
this.planapprovalData = res.data.records
})
},
//审核
planReviewFn(planId) {
console.log(planId)
if(planId && planId!==''){
//说明是从代办页面点击过来的
this.queryPlanOneDetail(planId)
}else {
if (this.multipleSelection.length == 1) {
this.planReview = true
this.isLoading1 = true
this.formdata = this.multipleSelection[0]
setTimeout(() => {
this.$refs.tree.setCheckedKeys(this.multipleSelection[0].subIds)
}, 0)
} else {
this.$message({
message: this.multipleSelection.length == 0 ? '请选择1条数据查看详情!' : '只能选择1条数据查看详情!',
type: 'warning'
})
}
}
},
//普测计划审核通过
passFn() {
checkPlanAudit({
checkResult: 1,
planNo: this.formdata.planNo,
checkComment: this.textarea,
checkPerson: JSON.parse(window.sessionStorage.getItem('Info')).loginName
}).then(res => {
if (res.code == 'A0000') {
this.$message({
message: '审核 通过成功!',
type: 'success'
})
this.onsubmit()
this.planReview = false
}
})
},
//普测计划不通过
failFn() {
checkPlanAudit({
checkResult: 0,
planNo: this.formdata.planNo,
checkComment: this.textarea,
checkPerson: JSON.parse(window.sessionStorage.getItem('Info')).loginName
}).then(res => {
if (res.code == 'A0000') {
this.$message({
message: '审核 不通过成功!',
type: 'success'
})
this.onsubmit()
this.planReview = false
}
})
},
// 取消
cancelFn() {
this.planReview = false
},
// 切换选项
handleNodeClick(data) {
//console.log(data);
this.ruleForm.orgNo = data.id
},
//勾选
handleSelectionChange(val) {
this.multipleSelection = val
},
//重置
Reset() {
this.$refs.area.form.valueTitle = JSON.parse(window.sessionStorage.getItem('Info')).deptName
this.ruleForm.orgNo = JSON.parse(window.sessionStorage.getItem('Info')).deptId
this.$refs.interval.intervald = 3
},
//序号
rowClassName({ row, rowIndex }) {
row.number = rowIndex + 1
},
//每页条数改变时触发 选择一页显示多少行
handleSizeChange(val) {
this.ruleForm.pageSize = val
this.onsubmit()
},
//当前页改变时触发 跳转其他页
handleCurrentChange(val) {
this.ruleForm.currentPage = val
this.onsubmit()
}
}
}
</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;
}
.button {
float: right;
margin-right: 5px;
}
::v-deep .forms {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
.el-form-item {
display: flex;
width: 100%;
.el-form-item__content {
flex: 1 !important;
.el-select {
width: 100%;
}
.el-date-editor {
width: 100%;
}
}
}
}
</style>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,217 @@
<template>
<div>
<el-button type="primary" size="small" icon="el-icon-check" @click="preserve">保存</el-button>
<el-button type="primary" size="small" icon="el-icon-date" @click="dialogVisible = true">
配置保存年限
</el-button>
<vxe-table
resizable
ref="xTable"
size="mini"
border
:height="height"
show-overflow
:tree-config="{ children: 'children' }"
:data="tableData1"
:edit-config="{ trigger: 'click', mode: 'cell' }"
header-cell-class-name="table_header"
class="mt10"
>
<vxe-table-column field="name" title="部门" tree-node></vxe-table-column>
<!-- <vxe-table-column
field="size"
align="center"
title="Size"
></vxe-table-column>
<vxe-table-column
field="type"
align="center"
title="Type"
></vxe-table-column> -->
<vxe-table-column
field="proportion"
align="center"
title="占比(%)"
:edit-render="{
name: '$input',
props: { type: 'float', digits: 2, max: 100, min: 0 }
}"
></vxe-table-column>
</vxe-table>
<el-dialog
:close-on-click-modal="false"
title="年限设置"
:visible.sync="dialogVisible"
width="300px"
:before-close="handleClose"
>
<el-input
v-model="value"
placeholder="请输入年限"
style="width: 240px"
@input="handleEdit"
class="mr10"
></el-input>
<span slot="footer" class="dialog-footer">
<el-button type="primary" size="small" @click="handleClose"> </el-button>
<el-button type="primary" size="small" @click="define"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { deptTree } from '@/api/admin/dept'
import {
queryPlanConfig,
addPlanConfig,
addPlanCycle
} from '@/api/Process-supervision/tiaoHarmonicmanagement/harmonicmanagement'
export default {
components: {},
props: {},
data() {
return {
dialogVisible: false,
value: '',
tableData1: [],
height: null,
list: [],
treeList: []
}
},
created() {},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.info()
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.height = window.sessionStorage.getItem('appheight') - 126
},
async info() {
await queryPlanConfig().then(res => {
this.list = res.data
})
await deptTree().then(res => {
this.tableData1 = this.circulationTreeData(res.data)
//console.log(`123`, this.circulationTreeData(this.tableData1));
setTimeout(() => {
this.$refs.xTable.setAllTreeExpand(true)
}, 0)
})
},
handleClose() {
this.dialogVisible = false
this.value = ''
},
define() {
if (this.value.length > 0) {
addPlanCycle({
cycleNum: this.value
}).then(res => {
if (res.data.flag == true) {
this.$message({
message: '年限设置成功!',
type: 'success'
})
this.handleClose()
} else {
this.$message({
message: `本次普测计划周期还未结束,请在 ${res.data.endYear} 后设置!`,
type: 'warning'
})
}
})
} else {
this.$message({
message: '请输入年限!',
type: 'warning'
})
}
},
//树递归
circulationTreeData(rows) {
let children = []
rows.forEach((item, index) => {
let proportion = 0
this.list.forEach(val => {
if (val.orgId == item.id) {
proportion = val.proportion
return
}
})
if (item.children && item.children.length > 0) {
children.push({
name: item.name,
id: item.id,
proportion: proportion,
children: this.circulationTreeData(item.children)
})
} else {
children.push({
name: item.name,
id: item.id,
proportion: proportion
})
}
})
return children
},
preserve() {
this.treeList = []
this.circulation(this.tableData1)
setTimeout(() => {
addPlanConfig(this.treeList).then(res => {
if (res.code == 'A0000') {
this.$message({
message: '保持成功!',
type: 'success'
})
this.info()
}
})
}, 0)
},
circulation(rows) {
let children = []
rows.forEach((item, index) => {
this.treeList.push({
orgName: item.name,
orgId: item.id,
proportion: item.proportion
})
if (item.children && item.children.length > 0) {
this.circulation(item.children)
}
})
return children
},
// 在 Input 值改变时触发
handleEdit(e) {
let value = e.replace(/^(0+)|[^\d]+/g, '') // 以0开头或者输入非数字会被替换成空
value = value.replace(/(\d{15})\d*/, '$1') // 最多保留15位整数
this.value = value
}
},
computed: {},
watch: {}
}
</script>
<style lang="less" scoped>
@import url('../../../../styles/comStyle.less');
</style>

View File

@@ -0,0 +1,443 @@
<template>
<div>
<el-form :inline="true" class="demo-form-inline form">
<el-form-item>
<Area @click="handleNodeClick" ref="area"></Area>
</el-form-item>
<el-form-item>
<Timeinterval :interval="3" ref="interval" :timeOptions="timeOptions"></Timeinterval>
</el-form-item>
<el-form-item label="是否上传:" class="box">
<el-select v-model="ruleForm.isFileUpload" clearable placeholder="请选择">
<el-option
v-for="item in uploadData"
:key="item.id"
:label="item.label"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" class="ml10" icon="el-icon-search" @click="onsubmit">查询</el-button>
<el-button type="primary" icon="el-icon-refresh" @click="Reset">重置</el-button>
</el-form-item>
</el-form>
<el-row>
<el-col :span="24">
<div class="button mb10">
<el-button type="primary" icon="el-icon-upload" @click="uploadFn">文件上传</el-button>
<!-- <File></File> -->
<el-button type="primary" icon="el-icon-share" @click="exportFn">文件导出</el-button>
</div>
<el-table
stripe
:data="resultsmanagementData"
:height="height"
border
style="width: 100%"
v-loading="isLoading"
header-cell-class-name="table_header"
@selection-change="handleSelectionChange"
:cell-style="cellStyle"
>
<el-table-column type="selection" width="55"></el-table-column>
<el-table-column prop="orgName" label="责任单位" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="planNo" label="普测计划编号" :show-overflow-tooltip="true"></el-table-column>
<el-table-column
prop="planName"
label="普测计划名称"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column
prop="planStartTime"
label="开始时间"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column
prop="planEndTime"
label="结束时间"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column
prop="subCount"
label="普测变电站数量"
:show-overflow-tooltip="true"
></el-table-column>
<!-- <el-table-column
prop="busCount"
label="普测母线数量"
:show-overflow-tooltip="true"
></el-table-column> -->
<el-table-column prop="isFileUpload" label="是否上传" :show-overflow-tooltip="true">
<template slot-scope="scope">
<span v-if="scope.row.isFileUpload == 1" type="primary" size="small" style="color: blue">
已上传
</span>
<span v-if="scope.row.isFileUpload == 0" type="primary" size="small" style="color: red">
未上传
</span>
</template>
</el-table-column>
<el-table-column
prop="fileCount"
label="上传文件数量"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column prop="uploadTime" label="上传时间" :show-overflow-tooltip="true"></el-table-column>
</el-table>
<el-pagination
background
align="right"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="ruleForm.pageNum"
:page-sizes="[20, 30, 40, 50, 100]"
:page-size="ruleForm.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="resultsmanagementData.length"
class="mt10"
></el-pagination>
</el-col>
</el-row>
<!-- 上传弹窗 -->
<el-dialog :close-on-click-modal="false" title="上传" :visible.sync="dialogVisible" width="25%">
<el-form
ref="dataForm"
v-loading="formLoading"
:model="temp"
style="height: 200px"
:inline="true"
size="mini"
label-position="right"
label-width="80px"
>
<!-- <el-form-item label="文件名称">
<el-input v-model="fileName"></el-input>
</el-form-item> -->
<el-form-item label="文件上传">
<el-upload
ref="upload"
class="upload-files"
action=""
:headers="headers"
name="file"
accept=".doc,.docx,.xls,.xlsx,.pdf,.txt"
multiple
:auto-upload="false"
:file-list="fileList"
:on-change="handleChange"
style="display: inline; float: right"
>
<el-button slot="trigger" size="mini" type="primary">选取文件</el-button>
</el-upload>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitUpload">保存</el-button>
<el-button style="margin-right: 50px" @click="dialogVisible = false">取消</el-button>
</div>
</el-dialog>
<!-- 导出弹窗 -->
<el-dialog :close-on-click-modal="false" title="文件导出" :visible.sync="downLoad" width="30%">
<el-table
stripe
:data="Downloaddata"
:height="300"
border
style="width: 100%"
v-loading="isLoading1"
header-cell-class-name="table_header"
:row-class-name="rowClassName"
>
<el-table-column label="序号" width="60" prop="number"></el-table-column>
<el-table-column label="文件名称" prop="minFileName" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="minFileUrl" label="文件" :show-overflow-tooltip="true">
<template>
<i class="el-icon-document"></i>
</template>
</el-table-column>
<el-table-column prop="achieveMonitoring" label="操作">
<template slot-scope="scope">
<el-button type="primary" @click="downLownFn(scope.row)">文件下载</el-button>
</template>
</el-table-column>
</el-table>
<!-- <div slot="footer" class="dialog-footer">
<el-button type="primary" >
确定
</el-button>
<el-button style="margin-right: 50px" @click="downLoad = false"> 取消</el-button>
</div> -->
</el-dialog>
</div>
</template>
<script>
import Area from '@/views/components/Area/Area.vue'
import Timeinterval from '../../../components/Timeinterval.vue'
import File from './File.vue'
import {
queryPlanResult,
MultipartFile,
surveyResultDownload
} from '@/api/Process-supervision/tiaoHarmonicmanagement/harmonicmanagement'
export default {
components: { Area, Timeinterval, File },
data() {
return {
vh: '',
height: null,
isLoading: false,
isLoading1: false,
dialogVisible: false,
downLoad: false,
item: ['', ''],
// 查询数据
ruleForm: {
currentPage: 1,
pageSize: 20,
isFileUpload: '',
planStartTime: '',
planEndTime: '',
orgNo: ''
},
//是否上传
uploadData: [
// {
// id:2,
// value:'选项1',
// label:'全部',
// },
{
id: 0,
label: '未上传'
},
{
id: 1,
label: '已上传'
}
],
resultsmanagementData: [],
Downloaddata: [],
multipleSelection: [],
headers: {
Authorization: window.sessionStorage.getItem('cntoken')
},
uploading: false,
formLoading: false,
dialogVisible: false,
fileList: [],
temp: {
id: void 0,
fileName: '',
fileType: void 0
},
fileName: '',
exportData: '',
planNo: '',
device: '',
Documentname: '',
timeOptions: [
{ label: '年份', value: 1 },
{ label: '季度', value: 2 },
{ label: '月份', value: 3 }
]
}
},
created() {},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.device = window.devicePixelRatio
this.ruleForm.orgNo = JSON.parse(window.sessionStorage.getItem('Info')).deptId
this.onsubmit()
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.height = window.sessionStorage.getItem('appheight') - 215
},
handleChange(file, fileList) {
// console.log(file, fileList);
this.fileList = fileList
},
submitUpload() {
const formData = new FormData()
formData.append('planId', this.planNo)
this.fileList.forEach(item => {
formData.append('file', item.raw)
// console.log(item.raw, item)
})
// console.log(this.fileList,'===============');
// console.log(formData,'111111111111');
MultipartFile(formData) //后端上传接口
.then(res => {
// console.log(res);
// this.$emit('added')
this.dialogVisible = false
this.onsubmit()
})
.catch(err => {
/// console.log(err);
})
},
//查询
onsubmit() {
this.isLoading = true
this.item = this.$refs.interval.timeValue
this.ruleForm.planStartTime = this.item[0]
this.ruleForm.planEndTime = this.item[1]
queryPlanResult(this.ruleForm).then(res => {
this.isLoading = false
this.resultsmanagementData = res.data.records
})
},
//上传
uploadFn() {
if (this.multipleSelection.length == 0 || this.multipleSelection.length > 1) {
this.$message({
showClose: true,
message: '请选择1条数据!!!',
type: 'warning'
})
return
} else {
this.dialogVisible = true
this.fileList = []
}
// this.$message({
// showClose: true,
// message: '上传成功!!!',
// type: 'success'
// });
},
// 切换选项
handleNodeClick(data) {
// console.log(data);
this.ruleForm.orgNo = data.id
},
//勾选
handleSelectionChange(val) {
this.multipleSelection = val
if (val != []) {
this.planNo = this.multipleSelection[0].planNo
}
// this.multipleSelection.forEach(item=>{
// this.exportData.push(item.planNo)
// })
},
//导出
exportFn() {
if (this.multipleSelection.length == 0 || this.multipleSelection.length > 1) {
this.$message({
showClose: true,
message: '请选择1条数据!!!',
type: 'warning'
})
return
} else {
this.downLoad = true
this.isLoading1 = true
let form = {
planNo: this.planNo
}
surveyResultDownload(form).then(res => {
// debugger
// console.log(res);
this.isLoading1 = false
this.Downloaddata = res.data
// 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 = "普测计划信息.xls"; // 设置下载的文件名
// document.body.appendChild(link);
// link.click(); //执行下载
// document.body.removeChild(link);
})
}
},
//下载
downLownFn(row) {
this.downLoad = false
const downloadRes = async () => {
let response = await fetch(row.minFileUrl)
let blob = await response.blob()
let objectUrl = window.URL.createObjectURL(blob)
let a = document.createElement('a')
a.href = objectUrl
a.download = ''
a.click()
a.remove()
}
downloadRes()
},
//重置
Reset() {
this.$refs.area.form.valueTitle = JSON.parse(window.sessionStorage.getItem('Info')).deptName
this.ruleForm.orgNo = JSON.parse(window.sessionStorage.getItem('Info')).deptId
this.$refs.interval.intervald = 3
this.ruleForm.isFileUpload = 0
},
//每页条数改变时触发 选择一页显示多少行
handleSizeChange(val) {
this.ruleForm.pageSize = val
this.onSubmit()
},
//当前页改变时触发 跳转其他页
handleCurrentChange(val) {
this.ruleForm.currentPage = val
this.onSubmit()
},
//序号
rowClassName({ row, rowIndex }) {
row.number = rowIndex + 1
},
//判断颜色
cellStyle(row) {
if (row.row.isFileUpload == 0) {
if (row.columnIndex == 9 || row.columnIndex == 10) {
return 'color:blue;'
}
}
if (row.row.isFileUpload == 1) {
if (row.columnIndex == 9 || row.columnIndex == 10) {
return 'color:red;'
}
}
}
}
}
</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 .form {
.el-form-item {
margin-bottom: 0;
}
}
.button {
float: right;
margin-right: 5px;
}
</style>

View File

@@ -0,0 +1,398 @@
<template>
<div>
<el-form :inline="true" class="demo-form-inline form">
<el-form-item>
<Area @click="handleNodeClick" ref="area"></Area>
</el-form-item>
<el-form-item label="干扰源类型:" class="box1">
<el-select v-model="formData.loadType" clearable placeholder="请选择">
<el-option
v-for="item in interferenceType"
:key="item.id"
:label="item.label"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="干扰源用户名称:">
<el-input v-model="formData.userName" clearable placeholder="请输入关键字"></el-input>
</el-form-item>
<el-form-item label="关联干扰源用户名称:">
<el-input v-model="formData.relationUserName" clearable placeholder="请输入关键字"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" class="ml10" icon="el-icon-search" @click="onsubmit">查询</el-button>
<el-button type="primary" icon="el-icon-refresh" @click="Reset">重置</el-button>
</el-form-item>
</el-form>
<el-row>
<el-col :span="24">
<div class="button mb10">
<el-button type="primary" icon="el-icon-s-claim" @click="planReviewFn">审核</el-button>
</div>
<el-table
stripe
:data="measurementreportData"
:height="height"
border
style="width: 100%"
v-loading="isLoading"
header-cell-class-name="table_header"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55"></el-table-column>
<template v-for="(item, index) in tableHeaderMeasurementreport">
<el-table-column
:prop="item.prop"
:label="item.label"
:key="index"
:formatter="formFilter"
:min-width="item.width"
></el-table-column>
</template>
</el-table>
<el-pagination
class="mt10"
align="right"
background
@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-col>
</el-row>
<!-- 审核弹窗 -->
<el-dialog :close-on-click-modal="false" title="实测报告审核" :visible.sync="reportreview" width="1600px">
<el-divider content-position="left" style="font-weight: bolder; font-size: 18px">基本信息</el-divider>
<el-form :inline="true" :model="formdata">
<el-form-item label="所属单位">
<el-input v-model="formdata.company" disabled></el-input>
</el-form-item>
<el-form-item label="干扰源类型:" class="box1">
<el-select v-model="formdata.loadType" clearable placeholder="请选择" disabled>
<el-option
v-for="item in interferenceType"
:key="item.id"
:label="item.label"
: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-input v-model="formdata.userName" clearable placeholder="请输入关键字" disabled></el-input>
</el-form-item>
<el-form-item label="建档时间">
<el-date-picker
v-model.trim="formdata.time"
type="date"
placeholder="选择日期"
disabled
></el-date-picker>
</el-form-item>
<el-form-item label="关联干扰源用户名称:">
<el-input
v-model="formdata.relationUserName"
clearable
placeholder="请输入关键字"
disabled
></el-input>
</el-form-item>
<el-divider content-position="left" style="font-weight: bolder; font-size: 18px">
报告在线查看
</el-divider>
<el-form-item class="item" label="报告名称:">
<el-input v-model="documentName" clearable placeholder="上传文件名称" disabled></el-input>
</el-form-item>
<el-form-item>
<el-button size="small" type="primary" icon="el-icon-download" @click="xz">下载</el-button>
</el-form-item>
</el-form>
<el-divider content-position="left" style="font-weight: bolder; font-size: 18px">审核意见</el-divider>
<!-- <div style="width: 100%; display: flex; justify-content: center">
<div class="shyj">{{ textContent }}</div>
</div> -->
<el-input type="textarea" :rows="5" placeholder="请输入内容" v-model="textarea"></el-input>
<div style="display: flex; justify-content: center; margin-top: 10px">
<el-button type="primary" class="ml20" @click="passFn">通过</el-button>
<el-button type="primary" class="ml20" @click="failFn">不通过</el-button>
<el-button type="primary" class="ml20" @click="cancelFn">取消</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import Area from '@/views/components/Area/Area.vue'
// import Timeinterval from "../../../components/Timeinterval.vue";
import { dicData } from '@/assets/commjs/dictypeData'
import {
getLoadTypeRelationList,
checkLoadTypeUserA
} from '@/api/Process-supervision/interferencemanagement/interferencemanagement'
export default {
components: { Area },
data() {
return {
vh: '',
height: null,
isLoading: false,
reportreview: false,
formData: {
loadType: '',
userName: '',
orgNo: JSON.parse(window.sessionStorage.getItem('Info')).deptId,
pageNum: 1,
pageSize: 20,
relationUserName: ''
},
formdata: {
company: '',
time: '',
loadType: [],
userName: '',
relationUserName: ''
},
//干扰源类型
interferenceType: [],
textarea: '',
total: null,
tableHeaderMeasurementreport: [
{ prop: 'orgName', label: '所属单位' },
{ prop: 'loadType', label: '干扰源类型' },
{ prop: 'userName', label: '干扰源用户名称' },
{ prop: 'relationUserName', label: '关联干扰源用户名称' },
{ prop: 'auploadTime', label: '报告提交评估时间' }
],
measurementreportData: [],
multipleSelection: [],
fileList: [],
device: '',
documentName: ''
}
},
created() {
this.getclassificationData()
},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
this.device = window.devicePixelRatio
this.onsubmit()
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.height = window.sessionStorage.getItem('appheight') - 215
},
//获取类型
getclassificationData() {
//电压等级
this.interferenceType = dicData('Interference_Source', [])
},
//预览
handleRemove(file, fileList) {
// console.log(file, fileList,'111111');
},
handleChange(file, fileList) {
// console.log(file.name.split(".").splice(0, 1).toString());
this.documentName = file.name.split('.').splice(0, 1).toString()
},
handleExceed(files, fileList) {
this.$message.warning(
`当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${
files.length + fileList.length
} 个文件`
)
},
beforeRemove(file, fileList) {
return this.$confirm(`确定移除 ${file.name}?`)
},
//查询
onsubmit() {
this.isLoading = true
getLoadTypeRelationList(this.formData).then(res => {
this.isLoading = false
this.measurementreportData = res.data.records
this.total = res.data.total
})
},
// 数据过滤
formFilter(row, column) {
if (column.property == 'loadType') {
let title = ''
this.interferenceType.forEach(item => {
if (item.value == row.loadType) {
title = item.label
}
})
return title
} else {
return row[column.property]
}
},
//审核
planReviewFn() {
if (this.multipleSelection.length == 1) {
this.formdata.company = this.multipleSelection[0].orgName
this.formdata.loadType = this.multipleSelection[0].loadType
this.formdata.userName = this.multipleSelection[0].userName
this.formdata.relationUserName = this.multipleSelection[0].relationUserName
this.formdata.time = this.multipleSelection[0].recordTime
this.interferenceType.forEach(item => {
if (item.id == this.formdata.loadType) {
this.formdata.loadType = item.name
}
})
this.reportreview = true
} else {
this.$message({
message: this.multipleSelection.length == 0 ? '请选择1条数据!' : '只能选择1条数据!',
type: 'warning'
})
}
},
xz() {
window.open(this.multipleSelection[0].ifile)
},
//普测计划审核通过
passFn() {
checkLoadTypeUserA({
checkComment: this.textarea,
checkPerson: JSON.parse(window.sessionStorage.getItem('Info')).id,
checkResult: 1,
id: this.multipleSelection[0].id
}).then(res => {
if (res.code === 'A0000') {
this.$message({
message: '审核完成',
type: 'success'
})
this.reportreview = false
} else {
this.$message({
message: res.message,
type: 'warning'
})
}
})
},
//普测计划不通过
failFn() {
checkLoadTypeUserA({
checkComment: this.textarea,
checkPerson: JSON.parse(window.sessionStorage.getItem('Info')).id,
checkResult: 0,
id: this.multipleSelection[0].id
}).then(res => {
if (res.code === 'A0000') {
this.$message({
message: '审核完成',
type: 'success'
})
this.reportreview = false
} else {
this.$message({
message: res.message,
type: 'warning'
})
}
})
},
//普测计划取消
cancelFn() {
this.reportreview = false
},
// 切换选项
handleNodeClick(data) {
// console.log(data);
this.formData.orgNo = data.id
},
//勾选
handleSelectionChange(val) {
this.multipleSelection = val
},
//重置
Reset() {
this.formData = {
loadType: '',
userName: '',
relationUserName: '',
pageNum: 1,
pageSize: 20
}
this.$refs.area.form.valueTitle = JSON.parse(window.sessionStorage.getItem('Info')).deptName
this.formData.orgNo = JSON.parse(window.sessionStorage.getItem('Info')).deptId
},
//当前页操作
handleCurrentChange(val) {
this.formData.pageNum = val
this.onsubmit()
},
//当前页码操作
handleSizeChange(val) {
this.formData.pageSize = val
this.onsubmit()
}
}
}
</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 .form {
.el-form-item {
margin-bottom: 0;
}
}
.button {
float: right;
margin-right: 5px;
}
::v-deep .el-dialog {
display: flex;
flex-direction: column;
margin: 0 !important;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
/*height:600px;*/
max-height: calc(100% - 200px);
max-width: calc(100% - 30px);
}
::v-deep .el-dialog .el-dialog__body {
flex: 1;
overflow: auto;
}
</style>

View File

@@ -0,0 +1,889 @@
<template>
<div>
<el-form :inline="true" class="demo-form-inline form">
<el-form-item>
<Area @click="handleNodeClick" ref="area"></Area>
</el-form-item>
<el-form-item label="干扰源类型:">
<el-select v-model="formData.loadType" clearable collapse-tags placeholder="请选择">
<el-option
v-for="item in interferenceType"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="干扰源用户名称:">
<el-input v-model="formData.userName" clearable placeholder="请输入关键字"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" class="ml10" icon="el-icon-search" @click="onsubmit">查询</el-button>
<el-button type="primary" icon="el-icon-refresh" @click="Reset">重置</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" style="margin-top: 10px" label-width="120px" class="">
<el-form-item label="关联干扰源用户:">
<el-input
v-model="formData.relationUserName"
clearable
placeholder="请输入联干扰源用户名称"
></el-input>
</el-form-item>
<el-form-item label="是否已上传实测报告:" class="box">
<el-select v-model="upload" clearable placeholder="请选择">
<el-option
v-for="item in uploadData"
:key="item.id"
:label="item.label"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
</el-form>
</div>
<el-row>
<el-col :span="24">
<div class="button mb10">
<el-button type="primary" icon="el-icon-upload" @click="sc">上传</el-button>
<el-button type="primary" icon="el-icon-share" @click="dc">导出</el-button>
</div>
<el-table
stripe
:data="undocumentednonlinearData"
:height="height"
border
style="width: 100%"
v-loading="isLoading"
header-cell-class-name="table_header"
@selection-change="handleSelectionChange"
:cell-style="cellStyle"
ref="multipleTable"
>
<el-table-column type="selection" width="55"></el-table-column>
<el-table-column prop="orgName" label="所属单位" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="loadType" label="干扰源类型" :show-overflow-tooltip="true"></el-table-column>
<el-table-column
prop="userName"
label="干扰源用户名称"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column
prop="relationUserName"
label="关联干扰源用户名称"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column prop="istatus" label="实测报告状态" :show-overflow-tooltip="true">
<template slot-scope="scope">
<span
v-if="scope.row.istatus == rwzt[1].id"
type="primary"
size="small"
style="color: #da70d6"
>
新建
</span>
<span
v-else-if="scope.row.istatus == rwzt[2].id"
type="primary"
size="small"
style="color: #48d1cc"
>
待审核
</span>
<span
v-else-if="scope.row.istatus == rwzt[3].id"
type="primary"
size="small"
style="color: #dc143c; text-decoration: underline"
@click="failed = true"
>
未通过
</span>
<span
v-else-if="scope.row.istatus == rwzt[4].id"
type="primary"
size="small"
style="color: #9acd32"
>
已发布
</span>
<span v-else type="primary" size="small">{{ scope.row.status }}</span>
</template>
</el-table-column>
<el-table-column prop="plandetails" label="详情">
<template slot-scope="scope">
<!-- <span type="primary" size="small" style="color:blue;text-decoration:underline" @click="userDetails=true">查看</span> -->
<el-button size="mini" @click="ck(scope.row)" type="primary">查看</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
align="right"
class="mt10"
background
@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-dialog :close-on-click-modal="false" title="未通过审批意见查看" :visible.sync="failed" width="50%">
<el-divider content-position="left" style="font-weight: bolder; font-size: 18px">审核意见</el-divider>
<el-input type="textarea" :rows="2" placeholder="请输入内容" v-model="textarea"></el-input>
</el-dialog>
<!-- 上传 -->
<el-dialog
:close-on-click-modal="false"
title="未建档干扰源用户入网报告结论填报"
:visible.sync="uploadConclusions"
width="1700px"
>
<el-divider content-position="left" style="font-weight: bolder; font-size: 18px">基本信息</el-divider>
<el-form>
<el-form-item label="所属单位:">
<el-input v-model="addData.orgNo" clearable placeholder="请输入" disabled></el-input>
</el-form-item>
<el-form-item label="干扰源类型:">
<el-select v-model="addData.loadType" clearable collapse-tags placeholder="请选择" disabled>
<el-option
v-for="item in interferenceType"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="干扰源用户名称:">
<el-input v-model="addData.userName" clearable placeholder="请输入关键字" disabled></el-input>
</el-form-item>
<el-form-item label="建档时间">
<!-- <el-date-picker
v-model.trim="addData.recordTime"
value-format="yyyy-MM-dd"
type="date"
placeholder="选择日期"
>
</el-date-picker> -->
<el-date-picker
value-format="yyyy-MM-dd HH:mm:ss"
v-model="addData.recordTime"
disabled
type="datetime"
placeholder="选择日期时间"
></el-date-picker>
</el-form-item>
<el-divider content-position="left" style="font-weight: bolder; font-size: 18px">
入网评估报告上传
</el-divider>
<el-form-item class="item" label="文件名称:">
<el-input v-model="documentName" clearable placeholder="请输入填报名称" disabled></el-input>
</el-form-item>
<el-form-item>
<!-- <upload/> -->
<el-upload
ref="upload"
class="upload-files"
action=""
accept=".doc,.docx,.xls,.xlsx,.pdf,.txt"
:headers="headers"
name="file"
multiple
:auto-upload="false"
:file-list="fileList"
:on-change="handleChange"
:limit="1"
:on-exceed="handleExceed"
>
<el-button slot="trigger" size="mini" icon="el-icon-upload" type="primary">上传本地评估报告</el-button>
</el-upload>
</el-form-item>
<el-divider content-position="left" style="font-weight: bolder; font-size: 18px">
入网评估结论填报
</el-divider>
<el-form-item label="是否超标:" style="margin-top: 20px">
<el-radio v-model="radio" label="0"></el-radio>
<el-radio v-model="radio" label="1"></el-radio>
</el-form-item>
<el-form-item label="超标指标:" style="margin-top: 20px">
<el-checkbox-group v-model="checkedCities" @change="handleCheckedCitiesChange">
<el-checkbox v-for="city in cities" :label="city.id" :key="city.id">
{{ city.name }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="计划采取措施:" style="margin-top: 20px">
<el-select v-model="measures" placeholder="请选择">
<el-option
v-for="item in takeMeasures"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<br/>
<el-form-item label="入网详情:" style="margin-top: 20px">
<el-input
v-model="rwxq"
placeholder="请输入入网详情"
type="textarea"
style="width: 500px"
></el-input>
</el-form-item>
</el-form>
<div style="display: flex; justify-content: center; margin-top: 30px">
<el-button type="primary" class="ml20" @click="tj">提交</el-button>
<el-button type="primary" class="ml20" @click="bc">保存</el-button>
<el-button type="primary" class="ml20" @click="uploadConclusions = false">取消</el-button>
</div>
</el-dialog>
<!-- 查看详情 -->
<el-dialog :close-on-click-modal="false" title="未建档干扰源用户详情" :visible.sync="userDetails" width="1700px">
<el-divider content-position="left" style="font-weight: bolder; font-size: 18px">基本信息</el-divider>
<el-form :inline="true">
<el-form-item label="所属单位:">
<el-input v-model="addData.orgNo" clearable placeholder="请输入" disabled></el-input>
</el-form-item>
<el-form-item label="干扰源类型:">
<el-select v-model="addData.loadType" clearable collapse-tags placeholder="请选择" disabled>
<el-option
v-for="item in interferenceType"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="干扰源用户名称:">
<el-input v-model="addData.userName" clearable placeholder="请输入关键字" disabled></el-input>
</el-form-item>
<el-form-item label="建档时间">
<!-- <el-date-picker
v-model.trim="addData.recordTime"
value-format="yyyy-MM-dd"
type="date"
placeholder="选择日期"
>
</el-date-picker> -->
<el-date-picker
value-format="yyyy-MM-dd HH:mm:ss"
v-model="addData.recordTime"
disabled
type="datetime"
placeholder="选择日期时间"
></el-date-picker>
</el-form-item>
<el-divider content-position="left" style="font-weight: bolder; font-size: 18px">
入网评估报告上传
</el-divider>
<el-form-item class="item" label="文件名称:">
<el-input v-model="documentName1" clearable placeholder="请输入填报名称" disabled></el-input>
</el-form-item>
<!-- <el-form-item>
<el-upload
:headers="headers"
class="upload-demo"
action=""
:on-remove="handleRemove1"
:before-remove="beforeRemove1"
multiple
:limit="6"
:on-exceed="handleExceed1"
:on-change="handleChange1"
:file-list="fileList1"
>
<el-button size="small" type="primary" icon="el-icon-view">预览</el-button>
</el-upload>
</el-form-item> -->
<el-form-item>
<el-button size="small" type="primary" icon="el-icon-download" @click="xz">下载</el-button>
</el-form-item>
<el-divider content-position="left" style="font-weight: bolder; font-size: 18px">
入网评估结论填报
</el-divider>
<el-form-item label="是否超标:" style="margin-top: 20px">
<el-radio v-model="radio" label="0" disabled></el-radio>
<el-radio v-model="radio" label="1" disabled></el-radio>
</el-form-item>
<el-form-item label="超标指标:" style="margin-top: 20px">
<el-checkbox-group v-model="checkedCities" @change="handleCheckedCitiesChange" disabled>
<el-checkbox v-for="city in cities" :label="city.id" :key="city.id">
{{ city.name }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="计划采取措施:" style="margin-top: 20px">
<el-select v-model="measures" placeholder="请选择" disabled>
<el-option
v-for="item in takeMeasures"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<br/>
<el-form-item label="入网详情:" style="margin-top: 20px">
<el-input
v-model="rwxq"
placeholder="请输入入网详情"
type="textarea"
style="width: 500px"
disabled
></el-input>
</el-form-item>
</el-form>
<div style="display: flex; justify-content: center; margin-top: 30px">
<el-button type="primary" class="ml20" @click="userDetails = false">关闭</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import Area from '@/views/components/Area/Area.vue'
import { dicData } from '@/assets/commjs/dictypeData'
import {
getLoadTypeRelationList,
uploadLoadTypeUserA,
exportLoadTypeRelationList,
getLoadTypeUserById,
exportLoadTypeUserList
} from '@/api/Process-supervision/interferencemanagement/interferencemanagement'
export default {
components: { Area },
data() {
return {
checkedCities: [],
cities: [],
rwxq: '',
headers: {
Authorization: window.sessionStorage.getItem('cntoken')
},
undocumentednonlinearData1: [],
op: '发电用户',
op1: [
{
value: '发电用户'
},
{
value: '用电用户'
}
],
url: '',
total: 0,
pageSize: 20,
pageNum: 1,
vh: '',
height: null,
isLoading: false,
failed: false,
userAdd: false,
uploadConclusions: false,
userDetails: false,
marketingUsers: false,
confirm: false,
checkList: ['0'],
radio: '0',
textarea: '评估入网报告缺少XX指标,请整改后提交。',
upload: '',
formData: {
loadType: '',
userName: '',
relationUserName: ''
},
addData: {
orgNo: JSON.parse(window.sessionStorage.getItem('Info')).deptId,
loadType: '',
userName: '',
recordTime: ''
},
measures: '',
documentName: '',
documentName1: '',
userNumber: '',
//是否上传
uploadData: [
{
id: 1,
label: '是'
},
{
id: 0,
label: '否'
}
],
//干扰源类型
interferenceType: [],
//计划采取措施
takeMeasures: [],
undocumentednonlinearData: [],
multipleSelection: [],
multipleSelection1: [],
fileList: [],
fileList1: [],
device: '',
rwzt: [],
view: false
}
},
created() {
this.rwzt = dicData('On-network_Status', [], 1)
this.cities = dicData('Steady_Statis', [], 1)
this.takeMeasures = dicData('Plan_Take', [], 1)
this.takeMeasures.shift()
// console.log(
// this.rwzt,
// " console.log(this.rwzt) console.log(this.rwzt)"
// );
this.cities.shift()
this.interferenceType = dicData('Interference_Source', [], 0)
},
mounted() {
this.onsubmit()
this.device = window.devicePixelRatio
this.setHeight()
window.addEventListener('resize', this.setHeight)
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.height = window.sessionStorage.getItem('appheight') - 215
},
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'
}
},
dc() {
if (this.multipleSelection.length == 0) {
this.$message({
message: '请选择一条数据',
type: 'warning'
})
} else {
let a = []
this.multipleSelection.forEach(res => {
a.push(res.id)
})
exportLoadTypeRelationList(a).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 = '干扰源用户长态化管理信息.xls' // 设置下载的文件名
document.body.appendChild(link)
link.click() //执行下载
document.body.removeChild(link)
})
}
},
bc() {
const formData = new FormData()
this.fileList.forEach(item => {
if (item.raw == '') {
} else {
formData.append('file', item.raw)
}
})
formData.append('status', '0')
formData.append('id', this.multipleSelection[0].id)
formData.append('ADescription', this.rwxq)
formData.append('AIsOverLimit', this.radio)
formData.append('APlanStep', this.measures)
formData.append('AOverLimitTarget', this.checkedCities.toString())
uploadLoadTypeUserA(formData) //后端上传接口
.then(res => {
this.uploadConclusions = false
// this.onsubmit()
})
.catch(err => {
// console.log(err);
})
},
xz() {
window.open(this.url)
},
handleExceed(files, fileList) {
this.$message.warning(
`当前限制选择 1个文件本次选择了 ${files.length} 个文件,共选择了 ${
files.length + fileList.length
} 个文件`
)
},
ck(val) {
getLoadTypeUserById({
id: val.id
}).then(res => {
this.url = res.data.ifile == null ? '' : res.data.ifile
// this.addData.orgNo = val.orgName == null ? '' : val.orgName
this.addData.loadType = res.data.loadType == null ? '' : res.data.loadType
this.addData.userName = res.data.userName == null ? '' : res.data.userName
this.addData.recordTime = res.data.recordTime == null ? '' : res.data.recordTime
this.documentName1 = res.data.afilePath == null ? '' : res.data.afilePath
this.radio = res.data.iisOverLimit == null ? '' : res.data.iisOverLimit.toString()
this.checkedCities = res.data.ioverLimitTarget == null ? '' : res.data.ioverLimitTarget.split(',')
this.measures = res.data.iplanStep == null ? '' : res.data.iplanStep
this.rwxq = res.data.idescription == null ? '' : res.data.idescription
this.userDetails = true
})
},
tj() {
const formData = new FormData()
this.fileList.forEach(item => {
if (item.raw == '') {
} else {
formData.append('file', item.raw)
}
})
formData.append('status', '1')
formData.append('id', this.multipleSelection[0].id)
formData.append('ADescription', this.rwxq)
formData.append('AIsOverLimit', this.radio)
formData.append('APlanStep', this.measures)
formData.append('AOverLimitTarget', this.checkedCities.toString())
uploadLoadTypeUserA(formData) //后端上传接口
.then(res => {
this.uploadConclusions = false
// this.onsubmit()
})
.catch(err => {
// console.log(err);
})
},
sc() {
if (this.multipleSelection.length == 0) {
this.$message({
message: '请选择一条数据',
type: 'warning'
})
}
if (this.multipleSelection.length > 1) {
this.$message({
message: '只能选择一条数据',
type: 'warning'
})
} else {
this.fileList=[]
getLoadTypeUserById({
id: this.multipleSelection[0].id
}).then(res => {
this.fileList.push({
name: res.data.afilePath,
url: res.data.ifile,
raw: ''
})
this.documentName = res.data.afilePath == null ? '' : res.data.afilePath
this.radio = res.data.iisOverLimit == null ? '' : res.data.iisOverLimit.toString()
this.checkedCities = res.data.ioverLimitTarget == null ? '' : res.data.ioverLimitTarget.split(',')
this.measures = res.data.iplanStep == null ? '' : res.data.iplanStep
this.rwxq = res.data.idescription == null ? '' : res.data.idescription
this.uploadConclusions = true
})
// this.addData.orgNo = this.multipleSelection[0].orgName == null ? '' : this.multipleSelection[0].orgName
// this.addData.loadType =
// this.multipleSelection[0].loadType == null ? '' : this.multipleSelection[0].loadType
// this.addData.userName =
// this.multipleSelection[0].userName == null ? '' : this.multipleSelection[0].userName
// this.addData.recordTime =
// this.multipleSelection[0].recordTime == null ? '' : this.multipleSelection[0].recordTime
}
},
handleSizeChange(val) {
this.pageSize = val
this.onsubmit()
},
handleCurrentChange(val) {
this.pageNum = val
this.onsubmit()
},
//上传本地评估报告
handleRemove(file, fileList) {
// console.log(file, fileList,'111111');
},
handleChange(file, fileList) {
// console.log(file, fileList);
this.fileList = fileList
this.documentName=fileList[0].name
},
beforeRemove(file, fileList) {
return this.$confirm(`确定移除 ${file.name}?`)
},
//预览
handleRemove1(file, fileList1) {
// console.log(file, fileList,'111111');
},
handleChange1(file, fileList) {
// console.log(file, fileList);
this.fileList = fileList
},
handleExceed1(files, fileList1) {
this.$message.warning(
`当前限制选择 1 个文件,本次选择了 ${files.length} 个文件,共选择了 ${
files.length + fileList1.length
} 个文件`
)
},
beforeRemove1(file, fileList1) {
return this.$confirm(`确定移除 ${file.name}?`)
},
//查询
onsubmit() {
this.isLoading = true
getLoadTypeRelationList({
loadType: this.formData.loadType,
orgNo: this.addData.orgNo,
pageNum: this.pageNum,
pageSize: this.pageSize,
relationUserName: this.formData.relationUserName,
userName: this.formData.userName,
aisFileUpload: this.upload
}).then(res => {
this.isLoading = false
res.data.records.forEach(i => {
this.interferenceType.forEach(o => {
if (i.loadType == o.id) {
i.loadType = o.name
}
})
})
this.undocumentednonlinearData = res.data.records
this.total = res.data.total
})
},
// 新增确定
// determineFn(){
// this.userAdd=false;
// },
// 新增取消
// cancelFn(){
// this.userAdd=false;
// },
//上传
// uploadFn(){
// this.uploadConclusions=true
// },
//关联
// 切换选项
handleNodeClick(data) {
this.addData.orgNo = data.id
},
toggleSelection(rows) {
if (rows) {
rows.forEach(row => {
this.$refs.multipleTable.toggleRowSelection(row)
})
} else {
this.$refs.multipleTable.clearSelection()
}
},
toggleSelection1(rows) {
if (rows) {
rows.forEach(row => {
this.$refs.multipleTable1.toggleRowSelection(row)
})
} else {
this.$refs.multipleTable1.clearSelection()
}
},
//勾选
handleSelectionChange(val) {
this.multipleSelection = val
// console.log(
// this.multipleSelection,
// "this.multipleSelectionthis.multipleSelection"
// );
},
selectAll() {
this.$refs.multipleTable.clearSelection()
},
handleSelectionChange1(val) {
// console.log(val, "valll");
if (val.length > 1) {
this.toggleSelection1([val[0]])
this.multipleSelection1 = val
} else {
this.multipleSelection1 = val
}
},
//重置
Reset() {
this.$refs.area.form.value = JSON.parse(window.sessionStorage.getItem('Info')).deptId
this.upload = ''
this.formData.loadType = this.interferenceType[0].id
this.formData.userName = ''
},
ResetFn() {
this.userNumber = ''
},
//判断颜色
cellStyle(row) {
// if(row.row.upload==1){
// // if(row.columnIndex==6 ){
// row.row.status='--'
// // }else if(row.columnIndex==7){
// row.row.plandetails='--'
// // }
// }
if (row.columnIndex == 6) {
if (row.row.upload == 1) {
row.row.status = '--'
}
}
if (row.columnIndex == 7) {
if (row.row.upload == 1) {
row.row.plandetails = '--'
}
}
},
handleCheckedCitiesChange(value) {
// console.log(value, "value");
// console.log(this.checkedCities, "this.checkedCities");
}
}
}
</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 .form {
.el-form-item {
margin-bottom: 5px;
}
}
::v-deep .el-form-item {
margin-bottom: 15px;
}
.button {
float: right;
margin-right: 5px;
}
::v-deep .el-dialog {
display: flex;
flex-direction: column;
margin: 0 !important;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
/*height:600px;*/
max-height: calc(100% - 200px);
max-width: calc(100% - 30px);
}
::v-deep .el-dialog .el-dialog__body {
flex: 1;
overflow: auto;
}
.container {
/* margin: auto; */
top: 0px;
right: 0;
width: 43%;
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;
}
</style>

View File

@@ -0,0 +1,546 @@
<template>
<div>
<el-form :inline="true" class="demo-form-inline form">
<el-form-item>
<Area @click="handleNodeClick" ref="area"></Area>
</el-form-item>
<el-form-item label="干扰源类型:" class="box1">
<el-select v-model="formData.loadType" clearable placeholder="请选择">
<el-option
v-for="item in interferenceType"
:key="item.id"
:label="item.label"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="干扰源用户名称:">
<el-input v-model="formData.userName" clearable placeholder="请输入关键字"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" class="ml10" icon="el-icon-search" @click="onsubmit">查询</el-button>
<el-button type="primary" icon="el-icon-refresh" @click="Reset">重置</el-button>
</el-form-item>
</el-form>
<el-row>
<el-col :span="24">
<div class="button mb10">
<el-button type="primary" icon="el-icon-s-claim" @click="planReviewFn('')">审核</el-button>
</div>
<el-table
stripe
:data="reportreviewData"
:height="height"
border
style="width: 100%"
v-loading="isLoading"
header-cell-class-name="table_header"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55"></el-table-column>
<el-table-column type="selection" width="65"></el-table-column>
<el-table-column prop="orgName" label="所属单位" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="loadType" label="干扰源类型" :show-overflow-tooltip="true"></el-table-column>
<el-table-column
prop="userName"
label="干扰源用户名称"
:show-overflow-tooltip="true"
></el-table-column>
<el-table-column prop="recordTime" label="建档时间" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="iisFileUpload" label="是否上传报告" :show-overflow-tooltip="true">
<template slot-scope="scope">
<span v-if="scope.row.iisFileUpload == 0" type="primary" size="small"></span>
<span v-if="scope.row.iisFileUpload == 1" type="primary" size="small"></span>
</template>
</el-table-column>
<el-table-column prop="createByName" label="创建人" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="icheckPersonName" label="审核人" :show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="istatus" label="状态" :show-overflow-tooltip="true">
<template slot-scope="scope">
<span
v-if="scope.row.istatus == 0"
type="primary"
size="small"
style="color: #da70d6"
>
新建
</span>
<span
v-else-if="scope.row.istatus == 1"
type="primary"
size="small"
style="color: #48d1cc"
>
待审核
</span>
<span
v-else-if="scope.row.istatus == 3"
type="primary"
size="small"
style="color: #dc143c; text-decoration: underline"
@click="failed = true"
>
未通过
</span>
<span
v-else-if="scope.row.istatus == 2"
type="primary"
size="small"
style="color: #9acd32"
>
通过
</span>
<span v-else type="primary" size="small">{{ scope.row.istatus }}</span>
</template>
</el-table-column>
<el-table-column prop="plandetails" label="详情">
<template slot-scope="scope">
<!-- <span type="primary" size="small" style="color:blue;text-decoration:underline" @click="userDetails=true">查看</span> -->
<el-button
v-if="scope.row.istatus != null"
@click="ck(scope.row)"
size="mini"
type="primary"
>
查看
</el-button>
<!-- <el-button
v-if="scope.row.istatus != null"
@click="ck(scope.row)"
size="mini"
type="primary"
>
编辑
</el-button>-->
<el-button
v-if="scope.row.istatus != null"
@click="deleteData(scope.row)"
size="mini"
type="primary"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
class="mt10"
align="right"
background
@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-col>
</el-row>
<!-- 审核弹窗 -->
<el-dialog :close-on-click-modal="false" title="入网评估报告审核" :visible.sync="reportreview" width="1400px">
<el-form :inline="true" :model="formdata">
<el-divider content-position="left" style="font-weight: bolder; font-size: 18px">基本信息</el-divider>
<el-form-item label="所属单位">
<el-input v-model="formdata.orgName" disabled></el-input>
</el-form-item>
<el-form-item label="干扰源类型:" class="box1">
<el-select v-model="formdata.loadType" placeholder="请选择" disabled>
<el-option
v-for="item in interferenceType"
:key="item.id"
:label="item.label"
: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-input v-model="formdata.userName" clearable placeholder="请输入关键字" disabled></el-input>
</el-form-item>
<el-form-item label="建档时间">
<el-date-picker
v-model.trim="formdata.recordTime"
type="date"
placeholder="选择日期"
disabled
></el-date-picker>
</el-form-item>
<el-divider content-position="left" style="font-weight: bolder; font-size: 18px">
报告在线查看
</el-divider>
<el-form-item class="item" label="文件名称:">
<el-input v-model="documentName1" clearable placeholder="请输入填报名称" disabled></el-input>
</el-form-item>
<el-form-item>
<el-button size="small" type="primary" icon="el-icon-download" @click="xz">下载</el-button>
</el-form-item>
<el-divider content-position="left" style="font-weight: bolder; font-size: 18px">
入网评估结论填报
</el-divider>
<el-row>
<el-form-item label="是否超标:">
<el-radio v-model="radio" label="0" disabled></el-radio>
<el-radio v-model="radio" label="1" disabled></el-radio>
</el-form-item>
</el-row>
<el-row>
<el-form-item label="超标指标:">
<el-checkbox-group v-model="checkedCities" disabled>
<el-checkbox disabled v-for="(city, ind) in cities" :label="city.id" :key="ind">
{{ city.name }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-row>
<el-row>
<el-form-item label="计划采取措施:" style="margin-top: 20px">
<el-select v-model="measures" placeholder="请选择" disabled>
<el-option
v-for="item in takeMeasures"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
</el-row>
<el-row>
<el-form-item label="入网详情:" style="margin-top: 20px">
<el-input
v-model="rwxq"
placeholder="请输入入网详情"
type="textarea"
style="width: 500px"
disabled
></el-input>
</el-form-item>
</el-row>
<el-row style="margin-top: 10px">
<el-divider content-position="left" style="font-weight: bolder; font-size: 18px">审核意见</el-divider>
<!-- <div style="width: 100%; display: flex; justify-content: center">
<div class="shyj">{{ textContent }}</div>
</div> -->
<el-input type="textarea" :rows="2" placeholder="请输入内容" v-model="textarea"></el-input>
<div style="display: flex; justify-content: center; margin-top: 10px">
<el-button type="primary" class="ml20" @click="passFn">通过</el-button>
<el-button type="primary" class="ml20" @click="failFn">不通过</el-button>
</div>
</el-row>
</el-form>
</el-dialog>
</div>
</template>
<script>
import Area from '@/views/components/Area/Area.vue'
// import Timeinterval from "../../../components/Timeinterval.vue";
import { dicData } from '@/assets/commjs/dictypeData'
import {
getLoadTypeUserList,
checkLoadTypeUserI,
getLoadTypeUserById
} from '@/api/Process-supervision/interferencemanagement/interferencemanagement'
export default {
components: { Area },
data() {
return {
vh: '',
height: null,
isLoading: false,
reportreview: false,
formData: {
loadType: '',
userName: '',
orgNo: '',
pageNum: 1,
pageSize: 20
// checkType: 1
},
formdata: {
id:'',
orgName: '',
recordTime: '',
loadType: '',
userName: ''
},
radio:'',
checkedCities: [],
cities: [],
takeMeasures: [],
documentName1: '',
measures: '',
rwxq:'',
//干扰源类型
interferenceType: [],
textarea: '',
total: null,
tableHeaderReportreview: [
{ prop: 'orgName', label: '所属单位' },
{ prop: 'loadType', label: '干扰源类型' },
{ prop: 'userName', label: '干扰源用户名称' },
{ prop: 'recordTime', label: '建档时间' },
{ prop: 'iuploadTime', label: '报告提交评估时间' }
],
reportreviewData: [],
multipleSelection: [],
fileList: [],
device: '',
documentName: ''
}
},
created() {
this.getclassificationData()
this.formData.orgNo = JSON.parse(window.sessionStorage.getItem('Info')).deptId
this.cities = dicData('Steady_Statis', [])
this.takeMeasures = dicData('Plan_Take', [], 1)
},
mounted() {
this.onsubmit()
this.setHeight()
window.addEventListener('resize', this.setHeight)
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.device = window.devicePixelRatio
this.height = window.sessionStorage.getItem('appheight') - 215
},
//获取类型
getclassificationData() {
//电压等级
this.interferenceType = dicData('Interference_Source', [])
},
//预览
handleRemove(file, fileList) {
// console.log(file, fileList,'111111');
},
xz() {
window.open(this.multipleSelection[0].ifile)
},
handleChange(file, fileList) {
// console.log(file.name.split(".").splice(0, 1).toString());
this.documentName = file.name.split('.').splice(0, 1).toString()
},
handleExceed(files, fileList) {
this.$message.warning(
`当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${
files.length + fileList.length
} 个文件`
)
},
beforeRemove(file, fileList) {
return this.$confirm(`确定移除 ${file.name}?`)
},
//查询
onsubmit() {
this.isLoading = true
this.formData.checkType = 1
getLoadTypeUserList(this.formData).then(res => {
this.isLoading = false
this.reportreviewData = res.data.records
this.total = res.data.total
})
},
// 数据过滤
formFilter(row, column) {
if (column.property == 'loadType') {
let title = ''
this.interferenceType.forEach(item => {
if (item.id == row.loadType) {
title = item.name
}
})
return title
} else {
return row[column.property]
}
},
//审核
planReviewFn(planId) {
if(planId && planId!==''){
//说明是从代办页面点击过来的
this.queryPlanOneDetail(planId)
}else {
if (this.multipleSelection.length == 1) {
this.queryPlanOneDetail(this.multipleSelection[0].id)
} else {
this.$message({
message: this.multipleSelection.length == 0 ? '请选择1条数据!' : '只能选择1条数据!',
type: 'warning'
})
}
}
},
//查询详情
queryPlanOneDetail(planId){
let data = {id:planId}
getLoadTypeUserById(data).then(res => {
if(res.code === 'A0000'){
this.formdata = res.data
this.documentName1 = res.data.ifilePath == null ? '' : res.data.ifilePath
this.radio = res.data.iisOverLimit == null ? '' : res.data.iisOverLimit.toString()
this.checkedCities = res.data.ioverLimitTarget == null ? '' : res.data.ioverLimitTarget.split(',')
this.measures = res.data.iplanStep == null ? '' : res.data.iplanStep
this.rwxq = res.data.idescription == null ? '' : res.data.idescription
this.reportreview = true
}
})
},
//分页
handleSizeChange(val) {
this.formData.pageSize = val
this.onsubmit()
},
handleCurrentChange(val) {
this.formData.pageNum = val
this.onsubmit()
},
//普测计划审核通过
passFn() {
checkLoadTypeUserI({
checkComment: this.textarea,
checkResult: 1,
id: this.formdata.id
}).then(res => {
if (res.code === 'A0000') {
this.$message({
message: '审核完成',
type: 'success'
})
this.reportreview = false
this.onsubmit()
} else {
this.$message({
message: res.message,
type: 'warning'
})
}
})
},
//普测计划不通过
failFn() {
checkLoadTypeUserI({
checkComment: this.textarea,
checkResult: 0,
id: this.formdata.id
}).then(res => {
if (res.code === 'A0000') {
this.$message({
message: '审核完成',
type: 'success'
})
this.reportreview = false
} else {
this.$message({
message: res.message,
type: 'warning'
})
}
})
},
//普测计划取消
cancelFn() {
this.reportreview = false
},
// 切换选项
handleNodeClick(data) {
// console.log(data);
this.formData.orgNo = data.id
},
//勾选
handleSelectionChange(val) {
this.multipleSelection = val
},
//重置
Reset() {
this.$refs.area.form.valueTitle = JSON.parse(window.sessionStorage.getItem('Info')).deptName
this.formData = {
orgNo: JSON.parse(window.sessionStorage.getItem('Info')).deptId,
loadType: '',
userName: '',
pageNum: 1,
pageSize: 20
}
},
//序号
rowClassName({ row, rowIndex }) {
row.number = rowIndex + 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 .form {
.el-form-item {
margin-bottom: 0;
}
}
.button {
float: right;
margin-right: 5px;
}
::v-deep .el-dialog {
display: flex;
flex-direction: column;
margin: 0 !important;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
/*height:600px;*/
max-height: calc(100% - 200px);
max-width: calc(100% - 30px);
}
::v-deep .el-dialog .el-dialog__body {
flex: 1;
overflow: auto;
}
</style>

View File

@@ -0,0 +1,69 @@
<template>
<div class="pd10">
<el-row>
<el-col>
<el-tabs v-model.trim="activeName" @tab-click="handleClick" type="border-card">
<el-tab-pane label="电能质量问题查询维护" name="1" :style="'height:' + vh + 'px;'">
<QueryMaintenance v-if="activeName == '1'"></QueryMaintenance>
</el-tab-pane>
<el-tab-pane label="电能质量问题审核" name="2" :style="'height:' + vh + 'px;'">
<Qualityproblems v-if="activeName == '2'"></Qualityproblems>
</el-tab-pane>
<el-tab-pane label="在线监测" name="3" :style="'height:' + vh + 'px;'">
<onlineMonitoring v-if="activeName == '3'"></onlineMonitoring>
</el-tab-pane>
</el-tabs>
</el-col>
</el-row>
</div>
</template>
<script>
import QueryMaintenance from './components/electricitymanagement/QueryMaintenance.vue'
import Qualityproblems from './components/electricitymanagement/Qualityproblems.vue'
import onlineMonitoring from './components/electricitymanagement/onlineMonitoring.vue'
export default {
name: 'dnzlwtgl',
components: { QueryMaintenance, Qualityproblems,onlineMonitoring },
data() {
return {
vh: undefined,
activeName: '1'
}
},
created() { },
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem('appheight') - 82
},
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 {
margin-top: 10px;
}
::v-deep .el-carousel__button {
background-color: #000;
}
</style>

View File

@@ -0,0 +1,9 @@
{
"extends": [
"bpmnlint:recommended",
"plugin:local/recommended"
],
"rules": {
"local/no-manual-task": "warn"
}
}

View File

@@ -0,0 +1,32 @@
import translations from '../lang/zh'
// export default function customTranslate(template, replacements) {
// replacements = replacements || {}
//
// // Translate
// template = translations[template] || template
//
// // Replace
// return template.replace(/{([^}]+)}/g, function(_, key) {
// var str = replacements[key]
// if (
// translations[replacements[key]] !== null &&
// translations[replacements[key]] !== 'undefined'
// ) {
// str = translations[replacements[key]]
// }
// return str || '{' + key + '}'
// })
// }
export default function customTranslate(template, replacements) {
replacements = replacements || {};
// Translate
template = translations[template] || template;
// Replace
return template.replace(/{([^}]+)}/g, function(_, key) {
return replacements[key] || '{' + key + '}';
});
}

View File

@@ -0,0 +1,24 @@
import executionListenerDialog from '../components/nodePanel/property/executionListener'
export default {
components: {
executionListenerDialog
},
data() {
return {
executionListenerLength: 0,
dialogName: null
}
},
methods: {
computedExecutionListenerLength() {
this.executionListenerLength = this.element.businessObject.extensionElements.values.length == 0
},
finishExecutionListener() {
if (this.dialogName === 'executionListenerDialog') {
this.computedExecutionListenerLength()
}
this.dialogName = ''
}
}
}

View File

@@ -0,0 +1,70 @@
import xcrud from 'xcrud'
import golbalConfig from 'xcrud/package/common/config'
import showConfig from '../flowable/showConfig'
golbalConfig.set({
input: {
// size: 'mini'
},
select: {
// size: 'mini'
},
colorPicker: {
showAlpha: true
},
xform: {
form: {
labelWidth: 'auto'
// size: 'mini'
}
}
})
export default {
components: { xForm: xcrud.xForm },
props: {
modeler: {
type: Object,
required: true
},
element: {
type: Object,
required: true
},
categorys: {
type: Array,
default: () => []
}
},
watch: {
'formData.id': function(val) {
this.updateProperties({ id: val })
},
'formData.name': function(val) {
this.updateProperties({ name: val })
},
'formData.documentation': function(val) {
if (!val) {
this.updateProperties({ documentation: [] })
return
}
const documentationElement = this.modeler.get('moddle').create('bpmn:Documentation', { text: val })
this.updateProperties({ documentation: [documentationElement] })
}
},
methods: {
updateProperties(properties) {
const modeling = this.modeler.get('modeling')
modeling.updateProperties(this.element, properties)
}
},
computed: {
elementType() {
const bizObj = this.element.businessObject
return bizObj.eventDefinitions
? bizObj.eventDefinitions[0].$type
: bizObj.$type
},
showConfig() {
return showConfig[this.elementType] || {}
}
}
}

View File

@@ -0,0 +1,22 @@
import xcrud from 'xcrud'
import golbalConfig from 'xcrud/package/common/config'
golbalConfig.set({
input: {
// size: 'mini'
},
select: {
// size: 'mini'
},
colorPicker: {
showAlpha: true
},
xform: {
form: {
labelWidth: 'auto'
// size: 'mini'
}
}
})
export default {
components: { xForm: xcrud.xForm }
}

View File

@@ -0,0 +1,55 @@
export function commonParse(element) {
const result = {
...element.businessObject,
...element.businessObject.$attrs
}
return formatJsonKeyValue(result)
}
export function formatJsonKeyValue(result) {
// 移除flowable前缀格式化数组
for (const key in result) {
if (key.indexOf('flowable:') === 0) {
const newKey = key.replace('flowable:', '')
result[newKey] = result[key]
delete result[key]
}
}
result = documentationParse(result)
return result
}
export function documentationParse(obj) {
if ('documentation' in obj) {
let str = ''
obj.documentation.forEach(item => {
str += item.text
})
obj.documentation = str
}
return obj
}
export function conditionExpressionParse(obj) {
if ('conditionExpression' in obj) {
if (obj.conditionExpression) {
obj.conditionExpression = obj.conditionExpression.body
}
}
return obj
}
export function userTaskParse(obj) {
for (const key in obj) {
if (key === 'candidateUsers') {
obj.userType = 'candidateUsers'
obj[key] = obj[key].split(',') || []
} else if (key === 'candidateGroups') {
obj.userType = 'candidateGroups'
obj[key] = obj[key].split(',') || []
} else if (key === 'assignee') {
obj.userType = 'assignee'
}
}
return obj
}

View File

@@ -0,0 +1,524 @@
import {
assign,
forEach,
isArray,
every
} from 'min-dash';
import {
is
} from 'bpmn-js/lib/util/ModelUtil';
import {
isExpanded,
isEventSubProcess
} from 'bpmn-js/lib/util/DiUtil';
import {
isAny
} from 'bpmn-js/lib/features/modeling/util/ModelingUtil';
import {
getChildLanes
} from 'bpmn-js/lib/features/modeling/util/LaneUtil';
import {
hasPrimaryModifier
} from 'diagram-js/lib/util/Mouse';
/**
* A provider for BPMN 2.0 elements context pad
*/
export default function ContextPadProvider(
config, injector, eventBus,
contextPad, modeling, elementFactory,
connect, create, popupMenu,
canvas, rules, translate) {
config = config || {};
contextPad.registerProvider(this);
this._contextPad = contextPad;
this._modeling = modeling;
this._elementFactory = elementFactory;
this._connect = connect;
this._create = create;
this._popupMenu = popupMenu;
this._canvas = canvas;
this._rules = rules;
this._translate = translate;
if (config.autoPlace !== false) {
this._autoPlace = injector.get('autoPlace', false);
}
eventBus.on('create.end', 250, function(event) {
var context = event.context,
shape = context.shape;
if (!hasPrimaryModifier(event) || !contextPad.isOpen(shape)) {
return;
}
var entries = contextPad.getEntries(shape);
if (entries.replace) {
entries.replace.action.click(event, shape);
}
});
}
ContextPadProvider.$inject = [
'config.contextPad',
'injector',
'eventBus',
'contextPad',
'modeling',
'elementFactory',
'connect',
'create',
'popupMenu',
'canvas',
'rules',
'translate'
];
ContextPadProvider.prototype.getMultiElementContextPadEntries = function(elements) {
var modeling = this._modeling;
var actions = {};
if (this._isDeleteAllowed(elements)) {
assign(actions, {
'delete': {
group: 'edit',
className: 'bpmn-icon-trash',
title: this._translate('Remove'),
action: {
click: function(event, elements) {
modeling.removeElements(elements.slice());
}
}
}
});
}
return actions;
};
/**
* @param {djs.model.Base[]} elements
* @return {boolean}
*/
ContextPadProvider.prototype._isDeleteAllowed = function(elements) {
var baseAllowed = this._rules.allowed('elements.delete', {
elements: elements
});
if (isArray(baseAllowed)) {
return every(baseAllowed, function(element) {
return includes(baseAllowed, element);
});
}
return baseAllowed;
};
ContextPadProvider.prototype.getContextPadEntries = function(element) {
var contextPad = this._contextPad,
modeling = this._modeling,
elementFactory = this._elementFactory,
connect = this._connect,
create = this._create,
popupMenu = this._popupMenu,
rules = this._rules,
autoPlace = this._autoPlace,
translate = this._translate;
var actions = {};
if (element.type === 'label') {
return actions;
}
var businessObject = element.businessObject;
function startConnect(event, element) {
connect.start(event, element);
}
function removeElement(e, element) {
modeling.removeElements([ element ]);
}
function getReplaceMenuPosition(element) {
var Y_OFFSET = 5;
var pad = contextPad.getPad(element).html;
var padRect = pad.getBoundingClientRect();
var pos = {
x: padRect.left,
y: padRect.bottom + Y_OFFSET
};
return pos;
}
/**
* Create an append action
*
* @param {string} type
* @param {string} className
* @param {string} [title]
* @param {Object} [options]
*
* @return {Object} descriptor
*/
function appendAction(type, className, title, options) {
if (typeof title !== 'string') {
options = title;
title = translate('Append {type}', { type: type.replace(/^bpmn:/, '') });
}
function appendStart(event, element) {
var shape = elementFactory.createShape(assign({ type: type }, options));
create.start(event, shape, {
source: element
});
}
var append = autoPlace ? function(event, element) {
var shape = elementFactory.createShape(assign({ type: type }, options));
autoPlace.append(element, shape);
} : appendStart;
return {
group: 'model',
className: className,
title: title,
action: {
dragstart: appendStart,
click: append
}
};
}
function splitLaneHandler(count) {
return function(event, element) {
// actual split
modeling.splitLane(element, count);
// refresh context pad after split to
// get rid of split icons
contextPad.open(element, true);
};
}
if (isAny(businessObject, [ 'bpmn:Lane', 'bpmn:Participant' ]) && isExpanded(element)) {
var childLanes = getChildLanes(element);
assign(actions, {
'lane-insert-above': {
group: 'lane-insert-above',
className: 'bpmn-icon-lane-insert-above',
title: translate('Add Lane above'),
action: {
click: function(event, element) {
modeling.addLane(element, 'top');
}
}
}
});
if (childLanes.length < 2) {
if (element.height >= 120) {
assign(actions, {
'lane-divide-two': {
group: 'lane-divide',
className: 'bpmn-icon-lane-divide-two',
title: translate('Divide into two Lanes'),
action: {
click: splitLaneHandler(2)
}
}
});
}
if (element.height >= 180) {
assign(actions, {
'lane-divide-three': {
group: 'lane-divide',
className: 'bpmn-icon-lane-divide-three',
title: translate('Divide into three Lanes'),
action: {
click: splitLaneHandler(3)
}
}
});
}
}
assign(actions, {
'lane-insert-below': {
group: 'lane-insert-below',
className: 'bpmn-icon-lane-insert-below',
title: translate('Add Lane below'),
action: {
click: function(event, element) {
modeling.addLane(element, 'bottom');
}
}
}
});
}
if (is(businessObject, 'bpmn:FlowNode')) {
if (is(businessObject, 'bpmn:EventBasedGateway')) {
assign(actions, {
'append.receive-task': appendAction(
'bpmn:ReceiveTask',
'bpmn-icon-receive-task',
translate('Append ReceiveTask')
),
'append.message-intermediate-event': appendAction(
'bpmn:IntermediateCatchEvent',
'bpmn-icon-intermediate-event-catch-message',
translate('Append MessageIntermediateCatchEvent'),
{ eventDefinitionType: 'bpmn:MessageEventDefinition' }
),
'append.timer-intermediate-event': appendAction(
'bpmn:IntermediateCatchEvent',
'bpmn-icon-intermediate-event-catch-timer',
translate('Append TimerIntermediateCatchEvent'),
{ eventDefinitionType: 'bpmn:TimerEventDefinition' }
),
'append.condition-intermediate-event': appendAction(
'bpmn:IntermediateCatchEvent',
'bpmn-icon-intermediate-event-catch-condition',
translate('Append ConditionIntermediateCatchEvent'),
{ eventDefinitionType: 'bpmn:ConditionalEventDefinition' }
),
'append.signal-intermediate-event': appendAction(
'bpmn:IntermediateCatchEvent',
'bpmn-icon-intermediate-event-catch-signal',
translate('Append SignalIntermediateCatchEvent'),
{ eventDefinitionType: 'bpmn:SignalEventDefinition' }
)
});
} else
if (isEventType(businessObject, 'bpmn:BoundaryEvent', 'bpmn:CompensateEventDefinition')) {
assign(actions, {
'append.compensation-activity':
appendAction(
'bpmn:Task',
'bpmn-icon-task',
translate('Append compensation activity'),
{
isForCompensation: true
}
)
});
} else
if (!is(businessObject, 'bpmn:EndEvent') &&
!businessObject.isForCompensation &&
!isEventType(businessObject, 'bpmn:IntermediateThrowEvent', 'bpmn:LinkEventDefinition') &&
!isEventSubProcess(businessObject)) {
assign(actions, {
'append.end-event': appendAction(
'bpmn:EndEvent',
'bpmn-icon-end-event-none',
translate('Append EndEvent')
),
'append.gateway': appendAction(
'bpmn:ExclusiveGateway',
'bpmn-icon-gateway-none',
translate('Append Gateway')
),
'append.append-user-task': appendAction(
'bpmn:UserTask',
'bpmn-icon-user-task',
'添加用户任务'
),
'append.intermediate-event': appendAction(
'bpmn:IntermediateThrowEvent',
'bpmn-icon-intermediate-event-none',
translate('Append Intermediate/Boundary Event')
)
});
}
}
if (!popupMenu.isEmpty(element, 'bpmn-replace')) {
// Replace menu entry
assign(actions, {
'replace': {
group: 'edit',
className: 'bpmn-icon-screw-wrench',
title: translate('Change type'),
action: {
click: function(event, element) {
var position = assign(getReplaceMenuPosition(element), {
cursor: { x: event.x, y: event.y }
});
popupMenu.open(element, 'bpmn-replace', position, {
title: translate('Change element'),
width: 300,
search: true
});
}
}
}
});
}
if (is(businessObject, 'bpmn:SequenceFlow')) {
assign(actions, {
'append.text-annotation': appendAction(
'bpmn:TextAnnotation',
'bpmn-icon-text-annotation'
)
});
}
if (
isAny(businessObject, [
'bpmn:FlowNode',
'bpmn:InteractionNode',
'bpmn:DataObjectReference',
'bpmn:DataStoreReference',
])
) {
assign(actions, {
'append.text-annotation': appendAction(
'bpmn:TextAnnotation',
'bpmn-icon-text-annotation'
),
'connect': {
group: 'connect',
className: 'bpmn-icon-connection-multi',
title: translate(
'Connect using ' +
(businessObject.isForCompensation
? ''
: 'Sequence/MessageFlow or ') +
'Association'
),
action: {
click: startConnect,
dragstart: startConnect,
},
},
});
}
if (is(businessObject, 'bpmn:TextAnnotation')) {
assign(actions, {
'connect': {
group: 'connect',
className: 'bpmn-icon-connection-multi',
title: translate('Connect using Association'),
action: {
click: startConnect,
dragstart: startConnect,
},
},
});
}
if (isAny(businessObject, [ 'bpmn:DataObjectReference', 'bpmn:DataStoreReference' ])) {
assign(actions, {
'connect': {
group: 'connect',
className: 'bpmn-icon-connection-multi',
title: translate('Connect using DataInputAssociation'),
action: {
click: startConnect,
dragstart: startConnect
}
}
});
}
if (is(businessObject, 'bpmn:Group')) {
assign(actions, {
'append.text-annotation': appendAction('bpmn:TextAnnotation', 'bpmn-icon-text-annotation')
});
}
// delete element entry, only show if allowed by rules
var deleteAllowed = rules.allowed('elements.delete', { elements: [ element ] });
if (isArray(deleteAllowed)) {
// was the element returned as a deletion candidate?
deleteAllowed = deleteAllowed[0] === element;
}
if (deleteAllowed) {
assign(actions, {
'delete': {
group: 'edit',
className: 'bpmn-icon-trash',
title: translate('Remove'),
action: {
click: removeElement
}
}
});
}
return actions;
};
// helpers /////////
function isEventType(eventBo, type, definition) {
var isType = eventBo.$instanceOf(type);
var isDefinition = false;
var definitions = eventBo.eventDefinitions || [];
forEach(definitions, function(def) {
if (def.$type === definition) {
isDefinition = true;
}
});
return isType && isDefinition;
}
function includes(array, item) {
return array.indexOf(item) !== -1;
}

View File

@@ -0,0 +1,142 @@
import { assign } from "min-dash";
export default function CustomPalette(
palette,
create,
elementFactory,
handTool,
lassoTool,
spaceTool,
globalConnect,
translate
) {
this.create = create;
this.elementFactory = elementFactory;
this.handTool = handTool;
this.lassoTool = lassoTool;
this.spaceTool = spaceTool;
this.globalConnect = globalConnect;
this.translate = translate;
palette.registerProvider(this);
}
CustomPalette.$inject = [
"palette",
"create",
"elementFactory",
"handTool",
"lassoTool",
"spaceTool",
"globalConnect",
"translate"
];
CustomPalette.prototype.getPaletteEntries = function (element) {
const {
create,
elementFactory,
handTool,
lassoTool,
spaceTool,
globalConnect,
translate
} = this;
function createAction(type, group, className, title, options) {
function createListener(event) {
var shape = elementFactory.createShape(assign({ type: type }, options));
if (options) {
shape.businessObject.di.isExpanded = options.isExpanded;
}
create.start(event, shape);
}
var shortType = type.replace(/^bpmn:/, "");
return {
group: group,
className: className,
title: title || translate("Create {type}", { type: shortType }),
action: {
dragstart: createListener,
click: createListener
}
};
}
return {
'hand-tool': {
group: 'tools',
className: 'bpmn-icon-hand-tool',
title: '激活抓手工具',
action: {
click: function(event) {
handTool.activateHand(event);
}
}
},
"lasso-tool": {
group: "tools",
className: "bpmn-icon-lasso-tool",
title: "激活套索工具",
action: {
click: function (event) {
lassoTool.activateSelection(event);
}
}
},
'space-tool': {
group: 'tools',
className: 'bpmn-icon-space-tool',
title: translate('Activate the create/remove space tool'),
action: {
click: function(event) {
spaceTool.activateSelection(event);
}
}
},
'global-connect-tool': {
group: 'tools',
className: 'bpmn-icon-connection-multi',
title: translate('Activate the global connect tool'),
action: {
click: function(event) {
globalConnect.start(event);
}
}
},
"tool-separator": {
group: "tools",
separator: true
},
"create.start-event": createAction(
"bpmn:StartEvent",
"event",
"bpmn-icon-start-event-none",
"创建开始节点"
),
"create.end-event": createAction(
"bpmn:EndEvent",
"event",
"bpmn-icon-end-event-none",
"创建结束节点"
),
"create.user-task": createAction(
"bpmn:UserTask",
"activity",
"bpmn-icon-user-task",
"创建用户任务"
),
"create.exclusive-gateway": createAction(
"bpmn:ExclusiveGateway",
"gateway",
"bpmn-icon-gateway-xor",
"创建排他网关"
)
};
};

View File

@@ -0,0 +1,8 @@
import CustomContextPad from './CustomContextPad';
import CustomPalette from "./CustomPalette";
export default {
__init__: [ 'paletteProvider','contextPadProvider'],
paletteProvider: [ 'type', CustomPalette ],
contextPadProvider: [ 'type', CustomContextPad ],
};

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,33 @@
function randomStr() {
return Math.random().toString(36).slice(-8)
}
export default function() {
return `<?xml version="1.0" encoding="UTF-8"?>
<definitions
xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC"
xmlns:bioc="http://bpmn.io/schema/bpmn/biocolor/1.0"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:flowable="http://flowable.org/bpmn"
targetNamespace="http://www.flowable.org/processdef"
>
<process id="flow_${randomStr()}" name="flow_${randomStr()}">
<startEvent id="start_event" name="开始" />
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_flow">
<bpmndi:BPMNPlane id="BPMNPlane_flow" bpmnElement="T-2d89e7a3-ba79-4abd-9f64-ea59621c258c">
<bpmndi:BPMNShape id="BPMNShape_start_event" bpmnElement="start_event" bioc:stroke="">
<omgdc:Bounds x="240" y="200" width="30" height="30" />
<bpmndi:BPMNLabel>
<omgdc:Bounds x="242" y="237" width="23" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
`
}

View File

@@ -0,0 +1,51 @@
export default {
'bpmn:EndEvent': {},
'bpmn:StartEvent': {
initiator: true,
formKey: true
},
'bpmn:UserTask': {
userType: true,
assignee: true,
candidateUsers: true,
candidateGroups: true,
async: true,
priority: true,
formKey: true,
skipExpression: true,
dueDate: true,
taskListener: true
},
'bpmn:ServiceTask': {
async: true,
skipExpression: true,
isForCompensation: true,
triggerable: true,
class: true
},
'bpmn:ScriptTask': {
async: true,
isForCompensation: true,
autoStoreVariables: true
},
'bpmn:ManualTask': {
async: true,
isForCompensation: true
},
'bpmn:ReceiveTask': {
async: true,
isForCompensation: true
},
'bpmn:SendTask': {
async: true,
isForCompensation: true
},
'bpmn:BusinessRuleTask': {
async: true,
isForCompensation: true,
ruleVariablesInput: true,
rules: true,
resultVariable: true,
exclude: true
}
}

View File

@@ -0,0 +1,232 @@
export default {
// Labels
'Activate the global connect tool': '激活全局连接工具',
'Append {type}': '添加 {type}',
'Append Task': '添加任务',
'Append Gateway': '添加网关',
'Append EndEvent': '添加结束事件',
'Append StartEvent': '添加开始事件',
"Append Intermediate/Boundary Event": '添加边界事件',
'Add Lane above': '在上面添加道',
'Divide into two Lanes': '分割成两个道',
'Divide into three Lanes': '分割成三个道',
'Add Lane below': '在下面添加道',
'Append compensation activity': '追加补偿活动',
'Change type': '修改类型',
'Connect using Association': '使用关联连接',
'Connect using Sequence/MessageFlow or Association': '使用顺序/消息流或者关联连接',
'Connect using DataInputAssociation': '使用数据输入关联连接',
'Remove': '移除',
'Activate the hand tool': '激活抓手工具',
'Activate the lasso tool': '激活套索工具',
'Activate the create/remove space tool': '激活创建/删除空间工具',
'Create expanded SubProcess': '创建扩展子过程',
'Create IntermediateThrowEvent/BoundaryEvent': '创建中间抛出事件/边界事件',
'Create Pool/Participant': '创建池/参与者',
'Parallel Multi Instance': '并行多重事件',
'Sequential Multi Instance': '时序多重事件',
'DataObjectReference': '数据对象参考',
'DataStoreReference': '数据存储参考',
'Loop': '循环',
'Ad-hoc': '即席',
'Create {type}': '创建 {type}',
'Task': '任务',
'Send Task': '发送任务',
'Receive Task': '接收任务',
'User Task': '用户任务',
'Manual Task': '手工任务',
'Business Rule Task': '业务规则任务',
'Service Task': '服务任务',
'Script Task': '脚本任务',
'Call Activity': '调用活动',
'Sub Process (collapsed)': '子流程(折叠的)',
'Sub Process (expanded)': '子流程(展开的)',
'Start Event': '开始事件',
'StartEvent': '开始事件',
'Intermediate Throw Event': '中间事件',
'End Event': '结束事件',
'EndEvent': '结束事件',
'Create Gateway': '创建网关',
'Create Intermediate/Boundary Event': '创建中间/边界事件',
'Message Start Event': '消息开始事件',
'Timer Start Event': '定时开始事件',
'Conditional Start Event': '条件开始事件',
'Signal Start Event': '信号开始事件',
'Error Start Event': '错误开始事件',
'Escalation Start Event': '升级开始事件',
'Compensation Start Event': '补偿开始事件',
'Message Start Event (non-interrupting)': '消息开始事件(非中断)',
'Timer Start Event (non-interrupting)': '定时开始事件(非中断)',
'Conditional Start Event (non-interrupting)': '条件开始事件(非中断)',
'Signal Start Event (non-interrupting)': '信号开始事件(非中断)',
'Escalation Start Event (non-interrupting)': '升级开始事件(非中断)',
'Message Intermediate Catch Event': '消息中间捕获事件',
'Message Intermediate Throw Event': '消息中间抛出事件',
'Timer Intermediate Catch Event': '定时中间捕获事件',
'Escalation Intermediate Throw Event': '升级中间抛出事件',
'Conditional Intermediate Catch Event': '条件中间捕获事件',
'Link Intermediate Catch Event': '链接中间捕获事件',
'Link Intermediate Throw Event': '链接中间抛出事件',
'Compensation Intermediate Throw Event': '补偿中间抛出事件',
'Signal Intermediate Catch Event': '信号中间捕获事件',
'Signal Intermediate Throw Event': '信号中间抛出事件',
'Message End Event': '消息结束事件',
'Escalation End Event': '定时结束事件',
'Error End Event': '错误结束事件',
'Cancel End Event': '取消结束事件',
'Compensation End Event': '补偿结束事件',
'Signal End Event': '信号结束事件',
'Terminate End Event': '终止结束事件',
'Message Boundary Event': '消息边界事件',
'Message Boundary Event (non-interrupting)': '消息边界事件(非中断)',
'Timer Boundary Event': '定时边界事件',
'Timer Boundary Event (non-interrupting)': '定时边界事件(非中断)',
'Escalation Boundary Event': '升级边界事件',
'Escalation Boundary Event (non-interrupting)': '升级边界事件(非中断)',
'Conditional Boundary Event': '条件边界事件',
'Conditional Boundary Event (non-interrupting)': '条件边界事件(非中断)',
'Error Boundary Event': '错误边界事件',
'Cancel Boundary Event': '取消边界事件',
'Signal Boundary Event': '信号边界事件',
'Signal Boundary Event (non-interrupting)': '信号边界事件(非中断)',
'Compensation Boundary Event': '补偿边界事件',
'Exclusive Gateway': '互斥网关',
'Parallel Gateway': '并行网关',
'Inclusive Gateway': '相容网关',
'Complex Gateway': '复杂网关',
'Event based Gateway': '事件网关',
'Transaction': '转运',
'Sub Process': '子流程',
'Event Sub Process': '事件子流程',
'Collapsed Pool': '折叠池',
'Expanded Pool': '展开池',
// Errors
'no parent for {element} in {parent}': '在{parent}里,{element}没有父类',
'no shape type specified': '没有指定的形状类型',
'flow elements must be children of pools/participants': '流元素必须是池/参与者的子类',
'out of bounds release': 'out of bounds release',
'more than {count} child lanes': '子道大于{count} ',
'element required': '元素不能为空',
'diagram not part of bpmn:Definitions': '流程图不符合bpmn规范',
'no diagram to display': '没有可展示的流程图',
'no process or collaboration to display': '没有可展示的流程/协作',
'element {element} referenced by {referenced}#{property} not yet drawn': '由{referenced}#{property}引用的{element}元素仍未绘制',
'already rendered {element}': '{element} 已被渲染',
'failed to import {element}': '导入{element}失败',
// 属性面板的参数
'Id': '标识',
'Name': '名称',
'General': '常规',
'Details': '详情',
'Message Name': '消息名称',
'Message': '消息',
'Initiator': '创建者',
'Asynchronous Continuations': '持续异步',
'Asynchronous Before': '异步前',
'Asynchronous After': '异步后',
'Job Configuration': '工作配置',
'Exclusive': '排除',
'Job Priority': '工作优先级',
'Retry Time Cycle': '重试时间周期',
'Documentation': '文档',
'Element Documentation': '元素文档',
'History Configuration': '历史配置',
'History Time To Live': '历史的生存时间',
'Forms': '表单',
'Form Key': '表单key',
'Form Fields': '表单字段',
'Business Key': '业务key',
'Form Field': '表单字段',
'ID': '编号',
'Type': '类型',
'Label': '名称',
'Default Value': '默认值',
'Validation': '校验',
'Add Constraint': '添加约束',
'Config': '配置',
'Properties': '属性',
'Add Property': '添加属性',
'Value': '值',
'Listeners': '监听器',
'Execution Listener': '执行监听',
'Event Type': '事件类型',
'Listener Type': '监听器类型',
'Java Class': 'Java类',
'Expression': '表达式',
'Must provide a value': '必须提供一个值',
'Delegate Expression': '代理表达式',
'Script': '脚本',
'Script Format': '脚本格式',
'Script Type': '脚本类型',
'Inline Script': '内联脚本',
'External Script': '外部脚本',
'Resource': '资源',
'Field Injection': '字段注入',
'Extensions': '扩展',
'Input/Output': '输入/输出',
'Input Parameters': '输入参数',
'Output Parameters': '输出参数',
'Parameters': '参数',
'Output Parameter': '输出参数',
'Timer Definition Type': '定时器定义类型',
'Timer Definition': '定时器定义',
'Date': '日期',
'Duration': '持续',
'Cycle': '循环',
'Signal': '信号',
'Signal Name': '信号名称',
'Escalation': '升级',
'Error': '错误',
'Link Name': '链接名称',
'Condition': '条件名称',
'Variable Name': '变量名称',
'Variable Event': '变量事件',
'Specify more than one variable change event as a comma separated list.': '多个变量事件以逗号隔开',
'Wait for Completion': '等待完成',
'Activity Ref': '活动参考',
'Version Tag': '版本标签',
'Executable': '可执行文件',
'External Task Configuration': '扩展任务配置',
'Task Priority': '任务优先级',
'External': '外部',
'Connector': '连接器',
'Must configure Connector': '必须配置连接器',
'Connector Id': '连接器编号',
'Implementation': '实现方式',
'Field Injections': '字段注入',
'Fields': '字段',
'Result Variable': '结果变量',
'Topic': '主题',
'Configure Connector': '配置连接器',
'Input Parameter': '输入参数',
'Assignee': '代理人',
'Candidate Users': '候选用户',
'Candidate Groups': '候选组',
'Due Date': '到期时间',
'Follow Up Date': '跟踪日期',
'Priority': '优先级',
'The follow up date as an EL expression (e.g. ${someDate} or an ISO date (e.g. 2015-06-26T09:54:00)': '跟踪日期必须符合EL表达式 ${someDate} ,或者一个ISO标准日期2015-06-26T09:54:00',
'The due date as an EL expression (e.g. ${someDate} or an ISO date (e.g. 2015-06-26T09:54:00)': '跟踪日期必须符合EL表达式 ${someDate} ,或者一个ISO标准日期2015-06-26T09:54:00',
'Variables': '变量'
}
export const NodeName = {
'bpmn:Process': '流程',
'bpmn:StartEvent': '开始事件',
'bpmn:IntermediateThrowEvent': '中间事件',
'bpmn:Task': '任务',
'bpmn:SendTask': '发送任务',
'bpmn:ReceiveTask': '接收任务',
'bpmn:UserTask': '用户任务',
'bpmn:ManualTask': '手工任务',
'bpmn:BusinessRuleTask': '业务规则任务',
'bpmn:ServiceTask': '服务任务',
'bpmn:ScriptTask': '脚本任务',
'bpmn:EndEvent': '结束事件',
'bpmn:SequenceFlow': '流程线',
'bpmn:ExclusiveGateway': '互斥网关',
'bpmn:ParallelGateway': '并行网关',
'bpmn:InclusiveGateway': '相容网关',
'bpmn:ComplexGateway': '复杂网关',
'bpmn:EventBasedGateway': '事件网关'
}

View File

@@ -0,0 +1,427 @@
<template>
<div
v-loading="isView"
class="flow-containers"
:class="{ 'view-mode': isView }"
>
<el-container style="height: 100%">
<el-header
style="
border-bottom: 1px solid rgb(218 218 218);
height: auto;
padding-left: 0px;
"
>
<div
style="
display: flex;
padding: 10px 0px;
justify-content: space-between;
"
>
<div>
<el-upload
action=""
:before-upload="openBpmn"
style="margin-right: 10px; display: inline-block"
>
<el-tooltip effect="dark" content="加载xml" placement="bottom">
<el-button size="mini" icon="el-icon-folder-opened" />
</el-tooltip>
</el-upload>
<el-tooltip effect="dark" content="新建" placement="bottom">
<el-button
size="mini"
icon="el-icon-circle-plus"
@click="newDiagram"
/>
</el-tooltip>
<el-tooltip effect="dark" content="自适应屏幕" placement="bottom">
<el-button size="mini" icon="el-icon-rank" @click="fitViewport" />
</el-tooltip>
<el-tooltip effect="dark" content="放大" placement="bottom">
<el-button
size="mini"
icon="el-icon-zoom-in"
@click="zoomViewport(true)"
/>
</el-tooltip>
<el-tooltip effect="dark" content="缩小" placement="bottom">
<el-button
size="mini"
icon="el-icon-zoom-out"
@click="zoomViewport(false)"
/>
</el-tooltip>
<el-tooltip effect="dark" content="后退" placement="bottom">
<el-button
size="mini"
icon="el-icon-back"
@click="modeler.get('commandStack').undo()"
/>
</el-tooltip>
<el-tooltip effect="dark" content="前进" placement="bottom">
<el-button
size="mini"
icon="el-icon-right"
@click="modeler.get('commandStack').redo()"
/>
</el-tooltip>
</div>
<div>
<el-button size="mini" icon="el-icon-s-check" @click="verifyXML"
>校验xml</el-button
>
<el-button size="mini" icon="el-icon-view" @click="showXML"
>查看xml</el-button
>
<el-button
size="mini"
icon="el-icon-download"
@click="saveXML(true)"
>下载xml</el-button
>
<el-button
size="mini"
icon="el-icon-picture"
@click="saveImg('svg', true)"
>下载svg</el-button
>
<el-button size="mini" type="primary" @click="save"
>保存模型</el-button
>
</div>
</div>
</el-header>
<el-container style="align-items: stretch">
<el-main style="padding: 0">
<div ref="canvas" class="canvas" />
</el-main>
<el-aside
style="width: 400px; min-height: 650px; background-color: #f0f2f5"
>
<!-- <panel
v-if="modeler"
:modeler="modeler"
:users="users"
:groups="groups"
:exps="exps"
:categorys="categorys"
/> -->
</el-aside>
</el-container>
</el-container>
</div>
</template>
<script>
// 汉化
import customTranslate from "./common/customTranslate";
// import lintModule from "bpmn-js-bpmnlint";
import Modeler from "bpmn-js/lib/Modeler";
import bpmnlintConfig from "./.bpmnlintrc.json";
// import panel from './PropertyPanel'
import getInitStr from "./flowable/init";
// 引入flowable的节点文件
import FlowableModule from "./flowable/flowable.json";
import customControlsModule from "./customPanel";
export default {
components: {},
props: {
xml: {
type: String,
default: "",
},
users: {
type: Array,
default: () => [],
},
groups: {
type: Array,
default: () => [],
},
categorys: {
type: Array,
default: () => [],
},
exps: {
type: Array,
default: () => [],
},
isView: {
type: Boolean,
default: false,
},
},
data() {
return {};
},
created() {},
mounted() {
// 生成实例
this.modeler = new Modeler({
container: this.$refs.canvas,
additionalModules: [
// lintModule,
customControlsModule,
{
//汉化
translate: ["value", customTranslate],
},
],
linting: {
bpmnlint: bpmnlintConfig,
},
moddleExtensions: {
flowable: FlowableModule,
},
});
// 新增流程定义
if (!this.xml) {
this.newDiagram();
} else {
this.createNewDiagram(this.xml);
}
},
methods: {
newDiagram() {
this.createNewDiagram(getInitStr());
},
// 让图能自适应屏幕
fitViewport() {
this.zoom = this.modeler.get("canvas").zoom("fit-viewport");
const bbox = document
.querySelector(".flow-containers .viewport")
.getBBox();
const currentViewbox = this.modeler.get("canvas").viewbox();
const elementMid = {
x: bbox.x + bbox.width / 2 - 65,
y: bbox.y + bbox.height / 2,
};
this.modeler.get("canvas").viewbox({
x: elementMid.x - currentViewbox.width / 2,
y: elementMid.y - currentViewbox.height / 2,
width: currentViewbox.width,
height: currentViewbox.height,
});
this.zoom = (bbox.width / currentViewbox.width) * 1.8;
},
// 放大缩小
zoomViewport(zoomIn = true) {
this.zoom = this.modeler.get("canvas").zoom();
this.zoom += zoomIn ? 0.1 : -0.1;
this.modeler.get("canvas").zoom(this.zoom);
},
async createNewDiagram(data) {
// 将字符串转换成图显示出来
// data = data.replace(/<!\[CDATA\[(.+?)]]>/g, '&lt;![CDATA[$1]]&gt;')
data = data.replace(/<!\[CDATA\[(.+?)]]>/g, function (match, str) {
return str.replace(/</g, "&lt;");
});
try {
await this.modeler.importXML(data);
// this.adjustPalette()
this.fitViewport();
} catch (err) {
// console.error(err.message, err.warnings);
}
},
// 对外 api
getProcess() {
const element = this.getProcessElement();
return {
id: element.id,
name: element.name,
category: element.$attrs["flowable:processCategory"],
};
},
getProcessElement() {
const rootElements = this.modeler.getDefinitions().rootElements;
for (let i = 0; i < rootElements.length; i++) {
if (rootElements[i].$type === "bpmn:Process") return rootElements[i];
}
},
async verifyXML() {
const linting = this.modeler.get("linting");
linting.toggle();
},
async saveXML(download = false) {
try {
const { xml } = await this.modeler.saveXML({ format: true });
if (download) {
this.downloadFile(
`${this.getProcessElement().name}.bpmn20.xml`,
xml,
"application/xml"
);
}
return xml;
} catch (err) {
// console.log(err);
}
},
async showXML() {
try {
const xml = await this.saveXML();
this.$emit("showXML", xml);
} catch (err) {
// console.log(err);
}
},
async saveImg(type = "svg", download = false) {
try {
const { svg } = await this.modeler.saveSVG({ format: true });
if (download) {
this.downloadFile(
this.getProcessElement().name,
svg,
"image/svg+xml"
);
}
return svg;
} catch (err) {
// console.log(err);
}
},
async save() {
const process = this.getProcess();
const xml = await this.saveXML();
const svg = await this.saveImg();
const result = { process, xml, svg };
this.$emit("save", result);
window.parent.postMessage(result, "*");
},
openBpmn(file) {
const reader = new FileReader();
reader.readAsText(file, "utf-8");
reader.onload = () => {
this.createNewDiagram(reader.result);
};
return false;
},
downloadFile(filename, data, type) {
const a = document.createElement("a");
const url = window.URL.createObjectURL(new Blob([data], { type: type }));
a.href = url;
a.download = filename;
a.click();
window.URL.revokeObjectURL(url);
},
},
computed: {},
watch: {},
};
</script>
<style lang="scss">
/*左边工具栏以及编辑节点的样式*/
@import "~bpmn-js/dist/assets/diagram-js.css";
@import "~bpmn-js/dist/assets/bpmn-font/css/bpmn.css";
@import "~bpmn-js/dist/assets/bpmn-font/css/bpmn-codes.css";
@import "~bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css";
@import "~bpmn-js-bpmnlint/dist/assets/css/bpmn-js-bpmnlint.css";
.view-mode {
.el-header,
.el-aside,
.djs-palette,
.bjs-powered-by {
display: none;
}
.el-loading-mask {
background-color: initial;
}
.el-loading-spinner {
display: none;
}
}
.flow-containers {
// background-color: #ffffff;
width: 100%;
height: 100%;
.canvas {
width: 100%;
height: 100%;
//flex: 1;
//position: relative;
//background: url("data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PHBhdHRlcm4gaWQ9ImEiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZD0iTTAgMTBoNDBNMTAgMHY0ME0wIDIwaDQwTTIwIDB2NDBNMCAzMGg0ME0zMCAwdjQwIiBmaWxsPSJub25lIiBzdHJva2U9IiNlMGUwZTAiIG9wYWNpdHk9Ii4yIi8+PHBhdGggZD0iTTQwIDBIMHY0MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZTBlMGUwIi8+PC9wYXR0ZXJuPjwvZGVmcz48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJ1cmwoI2EpIi8+PC9zdmc+")
//repeat !important;
//div.toggle-mode {
// display: none;
//}
}
.panel {
position: absolute;
right: 0;
top: 50px;
width: 300px;
}
.load {
margin-right: 10px;
}
.el-form-item__label {
font-size: 13px;
}
.djs-palette {
left: 0px !important;
top: 0px;
border-top: none;
}
.djs-container svg {
//min-height: 650px;
}
.highlight.djs-shape .djs-visual > :nth-child(1) {
fill: green !important;
stroke: green !important;
fill-opacity: 0.2 !important;
}
.highlight.djs-shape .djs-visual > :nth-child(2) {
fill: green !important;
}
.highlight.djs-shape .djs-visual > path {
fill: green !important;
fill-opacity: 0.2 !important;
stroke: green !important;
}
.highlight.djs-connection > .djs-visual > path {
stroke: green !important;
}
// .djs-connection > .djs-visual > path {
// stroke: orange !important;
// stroke-dasharray: 4px !important;
// fill-opacity: 0.2 !important;
// }
// .djs-shape .djs-visual > :nth-child(1) {
// fill: orange !important;
// stroke: orange !important;
// stroke-dasharray: 4px !important;
// fill-opacity: 0.2 !important;
// }
.highlight-todo.djs-connection > .djs-visual > path {
stroke: orange !important;
stroke-dasharray: 4px !important;
fill-opacity: 0.2 !important;
}
.highlight-todo.djs-shape .djs-visual > :nth-child(1) {
fill: orange !important;
stroke: orange !important;
stroke-dasharray: 4px !important;
fill-opacity: 0.2 !important;
}
.overlays-div {
font-size: 10px;
color: red;
width: 100px;
top: -20px !important;
}
}
</style>
<style lang="less" scoped>
@import url("../../../styles/comStyle.less");
</style>

View File

@@ -0,0 +1,80 @@
<template>
<div class="pd10">
<el-row>
<el-col>
<el-tabs v-model.trim="activeName" @tab-click="handleClick" type="border-card">
<el-tab-pane label="普测计划管理" name="1" :style="'height:' + vh + 'px;'">
<Planmanagement v-if="activeName == '1'"></Planmanagement>
</el-tab-pane>
<el-tab-pane label="普测计划审批" name="2" :style="'height:' + vh + 'px;'">
<Planapproval v-if="activeName == '2'" ref="planapprovalRef" :son="planId"></Planapproval>
</el-tab-pane>
<!-- <el-tab-pane label="普测结果管理" name="3" :style="'height:' + vh + 'px;'">
<Resultsmanagement v-if="activeName == '3'"></Resultsmanagement>
</el-tab-pane>
<el-tab-pane label="普测计划占比配置" name="4" :style="'height:' + vh + 'px;'">
<Proportion v-if="activeName == '4'" />
</el-tab-pane>-->
</el-tabs>
</el-col>
</el-row>
</div>
</template>
<script>
import Planmanagement from './components/harmonicmanagement/Planmanagement.vue'
import Planapproval from './components/harmonicmanagement/Planapproval.vue'
import Resultsmanagement from './components/harmonicmanagement/Resultsmanagement.vue'
import Proportion from './components/harmonicmanagement/Proportion.vue'
export default {
name: 'xbpbgl',
components: { Planmanagement, Planapproval, Resultsmanagement, Proportion },
data() {
return {
vh: undefined,
activeName: '1',
planId:''
}
},
created() {},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
let data = this.$route.query
console.log(data)
if(data && data!=null){
if(this.$route.query.flowType){
if(this.$route.query.flowType === 1){
//审核
this.activeName = '2'
this.planId = this.$route.query.formAssId
setTimeout(()=>{
this.$refs.planapprovalRef.planReviewFn(this.planId)
},10)
}
}
}
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.vh = window.sessionStorage.getItem('appheight') - 80
},
handleClick(tab, event) {
// console.log(tab, event);
}
}
}
</script>
<style lang="less" scoped>
@import url('../../styles/comStyle.less');
</style>

View File

@@ -0,0 +1,115 @@
<template>
<div class="pd10">
<el-row>
<el-col>
<el-tabs
v-model.trim="activeName"
@tab-click="handleClick"
type="border-card"
>
<el-tab-pane
label="未建档用户录入及查询"
name="first"
:style="'height:' + vh + ';'"
>
<Undocumentednonlinear v-if="activeName == 'first'"></Undocumentednonlinear>
</el-tab-pane>
<el-tab-pane
label="入网评估报告审核"
name="second"
:style="'height:' + vh + ';'"
>
<Reportreview v-if="activeName == 'second'" ref="reportreviewRef" ></Reportreview>
</el-tab-pane>
<el-tab-pane
label="干扰源用户常态化管理"
name="third"
:style="'height:' + vh + ';'"
>
<Normalizedmanagement v-if="activeName == 'third'"></Normalizedmanagement>
</el-tab-pane>
<el-tab-pane
label="实测报告审核"
name="fourth"
:style="'height:' + vh + ';'"
>
<Measurementreport v-if="activeName == 'fourth'"></Measurementreport>
</el-tab-pane>
</el-tabs>
</el-col>
</el-row>
</div>
</template>
<script>
import Undocumentednonlinear from './components/interferencemanagement/Undocumentednonlinear.vue';
import Reportreview from './components/interferencemanagement/Reportreview.vue';
import Normalizedmanagement from './components/interferencemanagement/Normalizedmanagement.vue';
import Measurementreport from './components/interferencemanagement/Measurementreport.vue';
export default {
name:'gryyhgl',
components: { Undocumentednonlinear, Reportreview, Normalizedmanagement, Measurementreport },
data() {
return {
vh: "",
activeName: "first",
device: "",
};
},
created() {
let data = this.$route.query
if(data && data!=null){
if(this.$route.query.flowType){
if(this.$route.query.flowType === 1){
//审核
this.activeName = 'second'
}
}
}
},
mounted() {
this.setHeight()
window.addEventListener('resize', this.setHeight)
let data = this.$route.query
if(data && data!=null){
if(this.$route.query.flowType){
if(this.$route.query.flowType === 1){
//审核
let planId = this.$route.query.formAssId
setTimeout(()=>{
this.$refs.reportreviewRef.planReviewFn(planId)
},10)
}
}
}
},
beforeDestroy() {
window.removeEventListener('resize', this.setHeight)
},
methods: {
setHeight() {
this.device = window.devicePixelRatio;
this.vh = window.sessionStorage.getItem('appheight') - 80;
},
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;
}
</style>