You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

541 lines
14 KiB
Vue

2 years ago
<template>
<div class="navbar">
<hamburger
id="hamburger-container"
:is-active="sidebar.opened"
class="hamburger-container"
@toggleClick="toggleSideBar"
/>
2 years ago
<breadcrumb
id="breadcrumb-container"
class="breadcrumb-container"
v-if="!topNav"
/>
<top-nav id="topmenu-container" class="topmenu-container" v-if="topNav" />
2 years ago
<div class="right-menu">
<template v-if="device !== 'mobile'">
<el-select
v-model="poolName"
2 years ago
placeholder="请选择工厂数据源"
@change="handleChange"
:disabled="poolNameList.length <= 1"
class="right-menu-item hover-effect"
>
<el-option
v-for="item in poolNameList"
:key="item.poolName"
:label="item.parkName"
:value="item.poolName"
></el-option>
</el-select>
<el-tooltip content="异常处理">
<span
class="exceptionHandling"
:class="{ warnTxt: (typeList && typeList.length) || 0 }"
@click="getAlarmData(true)"
><i class="el-icon-message"></i
>{{ (typeList && typeList.length > 0 && typeList.length) || "" }}
</span>
2 years ago
</el-tooltip>
<el-tooltip :content="unReadComments" effect="dark" v-if="showPrise">
<el-badge :value="commentNum" class="item" style="margin-right: 10px">
<i
class="el-icon-bell right-menu-item hover-effect"
style="
line-height: 50px;
color: #ff4d4f;
font-size: 25px;
padding-right: 0px;
margin-top: -9px;
"
@click="gotoComment"
></i>
</el-badge>
</el-tooltip>
<el-tooltip :content="unReadComments" effect="dark" v-else>
<i
class="el-icon-bell right-menu-item hover-effect"
style="line-height: 50px; color: grey; font-size: 25px"
@click="gotoComment"
></i>
</el-tooltip>
2 years ago
<screenfull id="screenfull" class="right-menu-item hover-effect" />
<el-tooltip content="布局大小" effect="dark" placement="bottom">
<size-select id="size-select" class="right-menu-item hover-effect" />
</el-tooltip>
</template>
<el-dropdown
class="avatar-container right-menu-item hover-effect"
trigger="click"
>
2 years ago
<div class="avatar-wrapper">
<!-- <img :src="avatar" class="user-avatar" /> -->
<!-- admin -->
{{ nickName }}
2 years ago
<i class="el-icon-caret-bottom" />
</div>
<el-dropdown-menu slot="dropdown">
<router-link to="/user/profile">
<el-dropdown-item>个人中心</el-dropdown-item>
</router-link>
<el-dropdown-item @click.native="setting = true">
<span>布局设置</span>
</el-dropdown-item>
<el-dropdown-item divided @click.native="logout">
<span>退出登录</span>
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
<!-- 警告对话框 -->
<el-dialog
:title="title1"
:visible.sync="open1"
width="800px"
append-to-body
>
<el-table
v-loading="deviceloading"
:data="typeList"
@selection-change="handleSelectionChange1"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column
label="计量设备名称"
align="center"
prop="monitorName"
/>
<el-table-column
label="采集设备编号"
align="center"
prop="collectDeviceId"
/>
<el-table-column label="记录时间" align="center" prop="collectTime" />
<el-table-column label="异常类型" align="center" prop="alarmType">
<template slot-scope="scope">
<dict-tag
:options="dict.type.alarmType"
:value="scope.row.alarmType"
/>
</template>
</el-table-column>
<el-table-column label="异常状态" align="center" prop="alarmStatus">
<template slot-scope="scope">
<dict-tag
:options="dict.type.alarmStatus"
:value="scope.row.alarmStatus"
/>
</template>
</el-table-column>
<el-table-column label="异常数据" align="center" prop="alarmData" />
<el-table-column label="备注" align="center" prop="cause" />
</el-table>
<!-- <pagination
v-show="devicetotal > 0"
:total="devicetotal"
:page.sync="queryParams1.pageNum"
:limit.sync="queryParams1.pageSize"
@pagination="getDeviceList"
/> -->
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="editAlarmStatus"> </el-button>
<el-button @click="open1 = false"> </el-button>
</div>
</el-dialog>
<!-- 消息弹窗 -->
<el-dialog
title="消息提示"
:visible.sync="dialogVisible"
width="40%"
:before-close="handleClose"
class="messagedialog"
>
<div class="message">
<div class="messagelist">
<div class="itemlist" v-for="(item,index) in commentNum" :key="index" >
<!-- <div class="timetip">2024-04-24 08:00:00</div> -->
<div class="item">
<div class="titilebox">
<div class="title">工单未开始超时提醒</div>
<div class="subtitle">上位机未及时执行工单的开始动作</div>
</div>
<div class="elcollapse">
<el-collapse accordion>
<el-collapse-item>
<template slot="title">
间读详情
</template>
<div>
与现实生活一致与现实生活的流程逻辑保持一致遵循用户习惯的语言和概念
</div>
<div>
在界面中一致所有的元素和结构需保持一致比如设计样式图标和文本元素的位置等
</div>
</el-collapse-item>
</el-collapse>
</div>
</div>
</div>
</div>
</div>
</el-dialog>
2 years ago
</div>
</template>
<script>
import { mapGetters } from "vuex";
import Breadcrumb from "@/components/Breadcrumb";
import TopNav from "@/components/TopNav";
import Hamburger from "@/components/Hamburger";
import Screenfull from "@/components/Screenfull";
import SizeSelect from "@/components/SizeSelect";
import Search from "@/components/HeaderSearch";
import RuoYiGit from "@/components/RuoYi/Git";
import RuoYiDoc from "@/components/RuoYi/Doc";
import { getUnReadComment } from "@/api/plan/workorder";
import {
listNotice,
getNotice,
delNotice,
addNotice,
updateNotice,
} from "@/api/system/notice";
//import { listData, editAlarmStatus } from "@/api/energy/exception/data.js";
import { changePoolName } from "@/api/system/user";
import Index from "./TagsView/index.vue";
2 years ago
export default {
dicts: ["alarmType", "alarmStatus"],
data() {
return {
poolNameList: [],
poolName: "",
title1: "异常处理",
open1: false,
deviceloading: false,
typeList: null,
devicetotal: null,
// 选中数组
ids1: [],
// 非单个禁用
single1: true,
// 非多个禁用
multiple1: true,
showPrise: false,
unReadComments: "您有0新的未读消息请点击查看",
commentNum: 0,
queryParams: {},
dialogVisible: false,
messagedata:[],
};
},
created() {
localStorage.setItem("this.devicetotal", 0);
},
mounted() {
this.getAlarmData();
setInterval(() => this.getAlarmData(), 1000 * 60);
this.poolNameList = JSON.parse(localStorage.getItem("POOL_NAME_LIST"));
this.poolName = localStorage.getItem("USER_POOL_NAME_CURRENT");
//先执行一次
this.getUnReadList();
// 实现轮询
this.timer = setInterval(() => {
setTimeout(this.getUnReadList(), 30000);
}, 30000);
},
2 years ago
components: {
Breadcrumb,
TopNav,
Hamburger,
Screenfull,
SizeSelect,
Search,
RuoYiGit,
RuoYiDoc,
2 years ago
},
computed: {
...mapGetters(["sidebar", "avatar", "device", "nickName"]),
2 years ago
setting: {
get() {
return this.$store.state.settings.showSettings;
2 years ago
},
set(val) {
this.$store.dispatch("settings/changeSetting", {
key: "showSettings",
value: val,
});
},
2 years ago
},
topNav: {
get() {
return this.$store.state.settings.topNav;
},
},
2 years ago
},
methods: {
// 打开右下角异常
openAlarm() {
this.$notify({
title: "异常数据提示",
position: "bottom-right",
message: this.$createElement(
"div",
{
on: {
click: () => {
this.getAlarmData(true);
},
},
},
[this.$createElement("el-button", {}, ["点击查看"])]
),
});
},
handleClose(){
},
// 处理报警
editAlarmStatus() {
/**editAlarmStatus({ objIds: this.ids1 }).then((res) => {
this.$message({
type: "success",
message: "异常数据已处理!",
duration: 1500,
});
this.getAlarmData();
});
**/
},
/** 报警列表 */
getAlarmData(open) {
/**this.open1 = open;
this.deviceloading = true;
listData({ alarmStatus: 1 }).then((response) => {
this.typeList = response.rows;
this.devicetotal = response.total;
this.deviceloading = false;
if (localStorage.getItem("this.devicetotal") != this.devicetotal) {
localStorage.setItem("this.devicetotal", this.devicetotal);
this.openAlarm();
}
});
**/
},
// 多选框选中数据
handleSelectionChange1(selection) {
this.ids1 = selection.map((item) => item.objId);
this.single1 = selection.length !== 1;
this.multiple1 = !selection.length;
},
2 years ago
toggleSideBar() {
this.$store.dispatch("app/toggleSideBar");
2 years ago
},
async logout() {
this.$confirm("确定注销并退出系统吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
this.$store.dispatch("LogOut").then(() => {
location.href = "/index";
});
2 years ago
})
.catch(() => {});
},
// 选中数据源
handleChange(value) {
//修改后台数据源
changePoolName(value).then((res) => {
localStorage.setItem("USER_POOL_NAME_CURRENT", value);
this.poolName = value;
window.location.reload();
});
},
/** 获取未读消息数 */
getUnReadList() {
console.log("++未读消息查询++");
getUnReadComment(this.queryParams).then(response => {
1 year ago
if(response.length>0){
this.unReadComments='您有'+response.length+'新的未读消息,请点击查看';
this.commentNum = response.length;
this.showPrise = true;
} else {
this.showPrise = false;
}
});
},
/** 跳转到【消息】 */
gotoComment() {
// alert("301");
this.showPrise = false;
this.dialogVisible = true;
},
},
};
2 years ago
</script>
<style lang="scss" scoped>
@keyframes color-cycle {
0% {
color: red;
}
50% {
color: rgb(186, 186, 16);
}
100% {
color: red;
}
}
2 years ago
.navbar {
.warnTxt {
animation-name: color-cycle;
animation-duration: 0.5s;
animation-iteration-count: infinite;
}
2 years ago
height: 50px;
overflow: hidden;
position: relative;
background: #fff;
box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
.exceptionHandling {
/* line-height: 50px;
2 years ago
display: inline-block;
color: black;*/
vertical-align: text-bottom;
cursor: pointer;
padding: 0.8px;
}
2 years ago
.hamburger-container {
line-height: 46px;
height: 100%;
float: left;
cursor: pointer;
transition: background 0.3s;
-webkit-tap-highlight-color: transparent;
2 years ago
&:hover {
background: rgba(0, 0, 0, 0.025);
2 years ago
}
}
.breadcrumb-container {
float: left;
}
.topmenu-container {
position: absolute;
left: 50px;
}
.errLog-container {
display: inline-block;
vertical-align: top;
}
.right-menu {
float: right;
height: 100%;
line-height: 50px;
&:focus {
outline: none;
}
.right-menu-item {
display: inline-block;
padding: 0 8px;
height: 100%;
font-size: 18px;
color: #5a5e66;
vertical-align: text-bottom;
&.hover-effect {
cursor: pointer;
transition: background 0.3s;
2 years ago
&:hover {
background: rgba(0, 0, 0, 0.025);
2 years ago
}
}
}
.avatar-container {
margin-right: 30px;
.avatar-wrapper {
margin-top: 5px;
position: relative;
.user-avatar {
cursor: pointer;
width: 40px;
height: 40px;
border-radius: 10px;
}
.el-icon-caret-bottom {
cursor: pointer;
position: absolute;
right: -20px;
top: 25px;
font-size: 12px;
}
}
}
}
}
.messagedialog {
.message {
height: 400px;
background-color: #f9f9f9;
.messagelist {
padding-top: 10px;
.itemlist {
width: 85%;
margin: auto;
.timetip {
text-align: center;
margin-bottom: 10px;
}
.item {
border: 1px solid #eeeeee;
width: 100%;
padding: 10px;
background-color: #ffffff;
border-radius: 2px;
box-shadow: 0px 0px 0px 2px #f1f1f1;
.titilebox {
margin-bottom: 30px;
.title {
font-size: 18px;
margin-bottom: 5px;
}
.subtitle {
font-size: 16px;
margin-bottom: 5px;
}
}
}
}
}
}
}
::v-deep .messagedialog .el-dialog__body {
padding: 0;
}
::v-deep .messagedialog .el-dialog__header {
border-bottom: 1px solid #eeeeee;
}
::v-deep .messagedialog .el-collapse-item__header {
border-bottom: none;
line-height: 32px;
}
2 years ago
</style>