<template> <!-- 消息弹出框绘制开始 --> <el-badge :is-dot="showIsDot" class="app-message-popover" @click="OpenPopover"> <el-popover placement="bottom" v-model="showPopover" trigger="click" width="400" @show="initTabCnt" @hide="initTabCnt" > <el-tabs :value="default_tab_pane" :stretch="true"> <!-- 待办 --> <el-tab-pane :label=" this.$t('components.appmessagepopover.myTasksLabel') + (myTasks.length == 0 ? '' : '(' + myTasks.length + ')') " name="first" style="height: 300px; overflow: auto" :draggable="false" > <template v-for="(myTask, index) in myTasks"> <template v-if="index < taskShowCnt"> <el-row class="popover__content" :key="index" :draggable="false"> <el-col :span="3" class="popover__content__avatar" :draggable="false"> <el-avatar icon="el-icon-s-check" size="small" :draggable="false" style="color: white; background-color: #409eff" ></el-avatar> </el-col> <el-col :span="21" class="popover__content__caption" :draggable="false"> <el-row :draggable="false"> <el-col :span="16" :draggable="false" style="width: 65%"> <div class="process-definition-name" :draggable="false" @click="handleTag(myTask)" > <strong>{{ myTask.usertaskname }}</strong> </div> <!-- <div class="description" :draggable="false">{{myTask.description}}</div> <div class="createtime" :draggable="false">{{ formatDate(myTask.createTime, 'MM-DD hh:mm') }}</div> --> </el-col> <!-- <el-col :span="5" :draggable="false" style="display: flex; align-items: center"> <el-tag :type="'success'" size="small" style="overflow: hidden; text-overflow: ellipsis" :draggable="false" > 成功 </el-tag> </el-col> --> </el-row> </el-col> </el-row> </template> </template> <template> <div class="popover__show-more" @click="showMore('taskShowCnt')"> <label v-if="taskShowCnt < myTasks.length">{{ this.$t('components.appmessagepopover.loadmore') }}</label> <label v-else>{{ this.$t('components.appmessagepopover.nomore') }}</label> </div> </template> </el-tab-pane> </el-tabs> <i id="bellBtn" size="20" slot="reference" class="el-icon-bell"></i> </el-popover> </el-badge> <!-- 消息弹出框绘制结束 --> </template> <script lang="ts"> import { Vue, Component } from 'vue-property-decorator'; import { Subscription } from 'rxjs'; import { AppServiceBase, LogUtil } from 'ibiz-core'; import { AppCenterService } from 'ibiz-vue'; import moment from 'moment'; @Component({}) export default class AppMessagePopover extends Vue { // 是否显示Popover public showPopover: boolean = false; // 是否显示小圆点 public showIsDot: any = false; // 默认显示的tab页 public default_tab_pane: any = 'first'; // 待办列表 public myTasks: any = []; // 待办面板显示条数 public taskShowCnt: number = 0; // 消息列表 public myMsgs: any = []; // 信息面板显示条数 public msgShowCnt: number = 0; // 环境配置对象 public environment: any = AppServiceBase.getInstance().getAppEnvironment(); // 应用状态事件 public appStateEvent: Subscription | undefined; /** * vue创建 */ created(): void { // 全局刷新通知 if (AppCenterService.getMessageCenter()) { this.appStateEvent = AppCenterService.getMessageCenter().subscribe( ({ name, action, data }: { name: string; action: string; data: any }) => { if (!Object.is(name, 'SysTodo')) { return; } if (Object.is(action, 'appRefresh')) { if (!this.environment.workflow) { return; } this.getMyTasks(); } }, ); } } /** * vue挂载 */ mounted(): void { if (!this.environment.workflow) { return; } // 首次获取待办列表 this.getMyTasks(); // 定时器:每隔1分钟重新获取待办列表 const timer = setInterval(() => { this.getMyTasks(); }, 60000); // 监听定时器,在vue销毁前清除定时器 this.$once('hook:beforeDestroy', () => { // 清除定时器 clearInterval(timer); }); } /** * 获取待办列表 */ public getMyTasks() { let url: any = '/wfcore/mytasks'; this.$http .get(url) .then((response: any) => { if (response && response.status == 200) { const data: any = response.data; if (data && data.length > 0) { this.myTasks = data; this.showIsDot = true; } else { this.myTasks = []; this.showIsDot = false; } // 获取消息列表 // this.getMyMsgs(); } }) .catch((error: any) => { LogUtil.warn(this.$t('components.appmessagepopover.error')); }); } /** * 获取消息列表 */ public getMyMsgs() { // TODO:接口获取消息列表,这里用的待办数据 this.myMsgs = this.myTasks; if (this.myMsgs.length > 0 && this.myTasks.length == 0) { // 显示小圆点 this.showIsDot = true; } } /** * 点击标签事件 */ public handleTag(data: any) { if (!data) return this.$throw(this.$t('components.appmessagepopover.geterror'), 'handleTag'); this.$http .post(`/systodos/${data.usertaskid}/getlinkurl`, { todourltype: 'RouterUrl', todosubtype: 'Todo', srfapptype: 'pc', srfapp: AppServiceBase.getInstance().getAppModelDataObject().codeName }) .then((response: any) => { if (response && response.status == 200 && response.data && response.data.linkurl) { this.showPopover = false; let targetUrl: string = response.data.linkurl; if (targetUrl.indexOf('/') != 0) { targetUrl = '/' + targetUrl; } targetUrl = `${targetUrl.slice(0, targetUrl.indexOf(';srffullscreen=true'))}`; targetUrl += `;srfwf=Todo`; this.$router.push('/index' + targetUrl); } else { if (response) { this.$throw(response); } } }) .catch((response: any) => { this.$throw(response); }); } /** * 销毁之前 */ beforeDestroy(): void { // 清空数据 this.showIsDot = false; this.myTasks = []; this.myMsgs = []; } /** * 组件销毁 */ destroyed() { if (this.appStateEvent) { this.appStateEvent.unsubscribe(); } } /** * 时间格式转换 */ public formatDate(date: string, format: string) { if (date && format) { return moment(date).format(format); } return date; } /** * 加载更多 */ public showMore(cnt: string) { if (Object.is('taskShowCnt', cnt)) { this.taskShowCnt + 10 < this.myTasks.length ? (this.taskShowCnt += 10) : (this.taskShowCnt += this.myTasks.length - this.taskShowCnt); } if (Object.is('msgShowCnt', cnt)) { this.msgShowCnt + 10 < this.myMsgs.length ? (this.msgShowCnt += 10) : (this.msgShowCnt += this.myMsgs.length - this.msgShowCnt); } } /** * 弹出框 显示/隐藏 时显示条数初始化 */ public initTabCnt() { this.taskShowCnt = this.myTasks.length >= 10 ? 10 : this.myTasks.length; this.msgShowCnt = this.myMsgs.length >= 10 ? 10 : this.myMsgs.length; } /** * 弹出框显示处理 */ public OpenPopover() { this.showPopover = !this.showPopover; } } </script>