<template> <div class="notification"> <el-dropdown> <span @click="handleNotification"> <el-badge class="item el-dropdown-link" :value="calAllMsgCount" :max="99" :hidden="calAllMsgCount == 0"> <span class="has-unread"> <i class="el-icon-bell" style="font-size: 16px; color: #ffffff"></i> </span> </el-badge> </span> <el-dropdown-menu slot="dropdown" v-if="calAllMsgCount == 0"> <el-dropdown-item> 当前无消息 </el-dropdown-item> </el-dropdown-menu> </el-dropdown> <!-- 列表弹框 --> <el-dialog width="80%" title="消息列表" :visible.sync="dialogTableVisible" @close="closeList"> <div class="content"> <div class="notice-item" v-for="(item, idx) in diaData" :key="idx" @change="getDiaData"> <div class="notice-title"> <div class="notice-sndusr"> 备忘录:<span style="color:#FF0000">[{{ item.nam }}]</span> </div> <div class="notice-sndtim"> 柜员:<span style="color:#FF0000">[{{ item.ownusr }}]</span> </div> <div class="notice-ntftxt"> 发送内容:<span style="color:#000000">[{{ item.inftxt }}]</span> </div> </div> <el-badge is-dot> <el-button class="notice-button" size="small" type="primary" @click="handleDiaDetail(idx,$event)"> 详情 </el-button> </el-badge> </div> <div class="notice-item" v-for="(item, idx) in noticeData" :key="idx + 'noticeData'" @change="getData"> <div class="notice-title"> <div class="notice-sndusr"> 发送人:<span style="color:#FF0000">[{{ item.sndusr }}]</span> </div> <div class="notice-sndtim"> 发送时间:<span style="color:#FF0000">[{{ item.sndtim }}]</span> </div> <div class="notice-ntftxt"> 发送内容:<span style="color:#000000">[{{ item.ntftxt.slice(0,5) + "......"}}]</span> </div> </div> <el-badge is-dot> <el-button class="notice-button" size="small" type="primary" @click="handleDetail(idx,$event)"> 详情 </el-button> </el-badge> </div> </div> <div slot="footer" class="dialog-footer"> <el-button size="small" type="primary" @click="clearNotice">一键已读</el-button> </div> </el-dialog> <!-- 详情弹框 --> <el-dialog width="80%" title="消息详情" :visible.sync="dialogDetailVisible" append-to-body @close="closeDetail"> <div> {{curTitle}} </div> </el-dialog> <el-dialog title="交易备忘录详情" :visible.sync="showDiaFlg" @close="closeDetail" center> <el-form :model="form" ref="diaInfo" label-suffix=":" :disabled=true> <c-col :span="24"> <c-col :span="12"> <el-form-item label="业务类型" :label-width="formLabelWidth"> <c-select style="width: 100%" v-model="form.frmtyp" placeholder="" :isShowKeyAndLabel="true" dbCode="BUSTXT" :isCache="false"> </c-select> </el-form-item> </c-col> <c-col :span="12"> <el-form-item label="业务编号" :label-width="formLabelWidth" prop="objref"> <c-input style="width: 100%" v-model="form.objref" placeholder=""> </c-input> </el-form-item> </c-col> </c-col> <c-col :span="24"> <c-col :span="12"> <el-form-item label="交易码" :label-width="formLabelWidth" prop="frm"> <c-select style="width: 100%" v-model="form.frm" placeholder="" dbCode="ATPTXT" :isCache="false" :isShowKeyAndLabel="true"> </c-select> </el-form-item> </c-col> <c-col :span="12"> <el-form-item label="业务摘要" :label-width="formLabelWidth" prop="ownrefDesc"> <c-input style="width: 100%" v-model="form.ownrefDesc" placeholder=""> </c-input> </el-form-item> </c-col> </c-col> <c-col :span="24"> <c-col :span="12"> <el-form-item label="提示日期" :label-width="formLabelWidth" prop="dat"> <el-date-picker type="date" style="width: 100%" v-model="form.dat" value-format="yyyy-MM-dd" placeholder=""> </el-date-picker> </el-form-item> </c-col> <c-col :span="12"> <el-form-item label="备忘录原因" :label-width="formLabelWidth" prop="cod"> <c-select style="width: 100%" v-model="form.cod" placeholder="" dbCode="DIATXT" :isShowKeyAndLabel="true" :isCache="false"> </c-select> </el-form-item> </c-col> </c-col> <c-col :span="24"> <c-col :span="12"> <el-form-item label="描述" :label-width="formLabelWidth" prop="nam"> <c-input style="width: 100%" v-model="form.nam" placeholder=""> </c-input> </el-form-item> </c-col> <c-col :span="12"> <el-form-item label="是否已处理" :label-width="formLabelWidth" prop="donflg"> <el-radio v-model="form.donflg" label="X">已处理</el-radio> <el-radio v-model="form.donflg" label="">未处理</el-radio> </el-form-item> </c-col> </c-col> <c-col :span="24"> <c-col :span="24"> <el-form-item label="详细信息" :label-width="formLabelWidth" prop="inftxt"> <el-input type="textarea" :rows="5" placeholder="请输入内容" v-model="form.inftxt"> </el-input> </el-form-item> </c-col> </c-col> <c-col :span="24"> <c-col :span="12"> <el-form-item label="客户编号" :label-width="formLabelWidth" prop="ptyextkey" v-if="form.cod == 'RAM'"> <c-input style="width: 100%" v-model="form.ptyextkey" placeholder=""> </c-input> </el-form-item> </c-col> <c-col :span="12"> <el-form-item label="客户名称" :label-width="formLabelWidth" prop="ptynam" v-if="form.cod == 'RAM'"> <c-input style="width: 100%" v-model="form.ptynam" placeholder=""> </c-input> </el-form-item> </c-col> </c-col> <c-col :span="24"> <c-col :span="12"> <el-form-item label="付款币种" :label-width="formLabelWidth" prop="paycur" v-if="form.cod == 'RAM'"> <c-select style="width: 100%" v-model="form.paycur" placeholder="" dbCode="CURTXT" :isShowKeyAndLabel="true" :isCache="false"> </c-select> </el-form-item> </c-col> <c-col :span="12"> <el-form-item label="付款金额" :label-width="formLabelWidth" prop="payamt" v-if="form.cod == 'RAM'"> <c-input type="number" style="width: 100%" v-model="form.payamt" placeholder=""> </c-input> </el-form-item> </c-col> </c-col> <c-col :span="24"> <c-col :span="12"> <el-form-item label="预计核验日期" :label-width="formLabelWidth" prop="prechkdat" v-if="form.cod == 'RAM'"> <el-date-picker type="date" style="width: 100%" v-model="form.prechkdat" value-format="yyyy-MM-dd" placeholder=""> </el-date-picker> </el-form-item> </c-col> <c-col :span="12"> <el-form-item label="经办柜员" :label-width="formLabelWidth"> <c-input style="width: 100%" v-model="form.ownusr"> </c-input> </el-form-item> </c-col> <c-col :span="12" v-if="form.cod != 'RAM'"> <el-form-item label="修改柜员" :label-width="formLabelWidth" prop="usr"> <c-input style="width: 100%" v-model="form.usr"> </c-input> </el-form-item> </c-col> </c-col> <c-col :span="24" v-if="form.cod == 'RAM'"> <c-col :span="12"> <el-form-item label="修改柜员" :label-width="formLabelWidth" prop="usr"> <c-input style="width: 100%" v-model="form.usr"> </c-input> </el-form-item> </c-col> </c-col> </el-form> <div slot="footer" class="dialog-footer"> <c-button @click="closeDetail">返 回</c-button> </div> </el-dialog> </div> </template> <script> import commonFunctions from "~/mixin/commonFunctions.js"; import { queryUnRcvMsg, queryReadMsg, updateReadTim, batchUpdateReadTim } from "~/service/manage/ntf"; import { queryUndealMsg, queryById } from "~/service/manage/dia"; import Dia from "~/page/Statics/Dia/Dbidia/Dia.js"; export default { name: "Notification", mixins: [commonFunctions], data() { return { dialogTableVisible: false, dialogDetailVisible: false, curTitle: "", notifications: 0, diacount: 0, noticeData: [], allData: [], diaData: [], // 只获取一次dia数据 diaflg: false, objtyp: '', nam: '', inftxt: '', dat: '', form: new Dia().data, formLabelWidth: "130px", showDiaFlg: false, }; }, destroyed() { clearInterval(this.timer); }, computed: { calAllMsgCount() { return this.notifications + this.diacount; } }, mounted() { this.noticeList(); if(!this.diaflg) { this.getDiaData(); } // 实现轮询 this.timer = setInterval(() => { this.getData(); }, 120000); }, methods: { // 通过请求获取消息列表 noticeList() { const loading = this.loading(); this.getData(); queryReadMsg({}).then(res => { if (res.respCode == SUCCESS) { this.noticeData = res.data.list; } }); loading.close(); }, // 请求实时消息 getData() { queryUnRcvMsg().then(async res => { if (res.respCode == SUCCESS) { this.notifications = res.data; if (res.data > 0) { let lastNoticeData = this.noticeData; let response = await queryReadMsg({}); if (response.respCode == SUCCESS) { this.noticeData = response.data.list; } if (this.noticeData.length > lastNoticeData.length) { this.dialogTableVisible = true; } //比较两次通知的结果 inr let lastInrList = []; lastNoticeData.forEach(item => { lastInrList.push(item.inr); }); this.noticeData.forEach(item => { if (!lastInrList.includes(item.inr)) { this.dialogTableVisible = true; } }); } } }); }, // 通过请求获取dia数据 getDiaData() { queryUndealMsg().then((res) => { if(res.respCode == SUCCESS) { this.diaflg = true this.diaData = res.data if(this.diaData) { this.diacount = this.diaData.length } } }) }, // 点击按钮后弹出消息列表 handleNotification() { this.noticeList(); this.getDiaData(); if (this.calAllMsgCount !== 0) { this.dialogTableVisible = true; } else { this.dialogTableVisible = false; } }, // 点击详情后消息列表更新 handleDetail(val, e) { let params = { inr: this.noticeData[val].inr }; const loading = this.loading(); updateReadTim(params).then(res => { if (res.respCode == SUCCESS) { this.curTitle = res.data.ntftxt; } }); loading.close(); if (e.target.tagName === "SPAN") { this.noticeData.splice(val, 1); this.getData(); } this.dialogTableVisible = false; this.dialogDetailVisible = true; }, handleDiaDetail(val, e) { let params = { inr: this.diaData[val].inr }; const loading = this.loading(); queryById(params).then(res => { if (res.respCode == SUCCESS) { this.form = res.data this.showDiaFlg = true; } else { this.$message.error(res.respMsg) } }); loading.close(); // this.dialogTableVisible = false; }, // 关闭消息列表 closeList() { this.dialogTableVisible = false; }, // 关闭消息详情 closeDetail() { this.showDiaFlg = false; this.dialogDetailVisible = false; if (this.calAllMsgCount !== 0) { this.dialogTableVisible = true; } else { this.dialogTableVisible = false; } }, // 一键已读 clearNotice() { this.$confirm("备忘录信息不会被清除", "提示", { confirmButtonText: "确定", cancelButtonText: "取消", type: "warning", }).then(() => { // 清除操作 // this.noticeData = []; this.dialogTableVisible = false; batchUpdateReadTim(this.noticeData).then((res) => { if (res.data) { this.getData(); this.$notify.success("成功!"); } else { this.$notify.info(res.respMsg); } }) }) } } }; </script> <style scoped lang="less"> .item { margin-right: 30px; } .has-unread { position: relative; cursor: pointer; } .content { padding: 12px 12px 0; .notice-item { width: 100%; display: flex; align-items: center; justify-content: space-between; padding: 5px 20px; font-size: 12px; .notice-title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: flex; align-items: center; justify-content: center; .notice-sndusr { margin-right: 5px; } .notice-ntftxt { margin-right: 5px; } a { color: #4e4e4e; text-decoration: none; font-size: 12px; line-height: 40px; } } .notice-title::before { content: ""; background: rgb(87, 95, 200); display: inline-block; width: 8px; height: 8px; position: relative; margin-right: 5px; } .notice-button { border: none; height: 32px; padding: 0px 15px; border-radius: 0px; color: #fff; font-size: 12px; cursor: pointer; } } .notice-item:hover { background: rgba(198, 154, 218, 0.3); } } .notification /deep/ .el-dialog__body { height: calc(100% - 110px); } </style>