app-message-popover.vue 9.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
<template>
    <!-- 消息弹出框绘制开始 -->
    <el-badge :is-dot="showIsDot" class="app-message-popover">
        <el-popover
                placement="bottom"
                trigger="click"
                width="400"
                @show="initTabCnt"
                @hide="initTabCnt">
            <el-tabs :value="default_tab_pane" :stretch="true">
                <!-- 待办 -->
                <el-tab-pane :label="myTasks.length==0?myTasksLabel:(myTasksLabel+'('+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="Row" :key="index" :draggable="false">
                                <el-col :span="3" class="column1" :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="column2" :draggable="false">
                                    <el-row :draggable="false">
                                        <el-col :span="16" :draggable="false" style="width: 65%;">
                                            <div class="process-definition-name" :draggable="false"><strong>{{myTask.processDefinitionName}}</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="myTask.name.indexOf('驳回')!=-1?'danger':(myTask.name.indexOf('成功')!=-1?'success':(myTask.name.indexOf('取消')!=-1?'info':'-'))"
                                                size="small" @click="handleTag(myTask)"
                                                style="cursor: pointer;overflow: hidden;text-overflow: ellipsis;" :draggable="false">
                                                {{myTask.name}}
                                            </el-tag>
                                        </el-col>
                                    </el-row>
                                </el-col>
                            </el-row>
                        </template>
                    </template>
                    <template>
                        <div class='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-tab-pane :label="myMsgs.length==0?myMsgsLabel:(myMsgsLabel+'('+myMsgs.length+')')" name="second" :style="{height: '300px',overflow: 'auto'}" :draggable="false">
                    <template v-for="(myMsg,index) in myMsgs">
                        <template v-if="index < msgShowCnt">
                            <el-row  class="Row" :key="index" :draggable="false">
                                <el-col :span="3" class="column1" :draggable="false">
                                    <el-avatar icon="el-icon-chat-dot-square" size="small" :draggable="false" style="color: white;background-color: orange;"></el-avatar>
                                </el-col>
                                <el-col :span="21" class="column2" :draggable="false">
                                    <el-row :draggable="false">
                                        <el-col :span="16" :draggable="false" style="width: 65%;">
                                            <div class="process-definition-name" :draggable="false"><strong>{{myMsg.processDefinitionName}}</strong></div>
                                            <div class="description" :draggable="false">{{myMsg.description}}</div>
                                            <div class="createtime" :draggable="false">{{ formatDate(myMsg.createTime, 'MM-DD hh:mm') }}</div>
                                        </el-col>
                                        <el-col :span="5" :draggable="false" style='display: flex; align-items: center'>
                                            <el-tag :type="myMsg.name.indexOf('驳回')!=-1?'danger':(myMsg.name.indexOf('成功')!=-1?'success':(myMsg.name.indexOf('取消')!=-1?'info':'-'))"
                                                size="small" @click="handleTag(myMsg)"
                                                style="cursor: pointer;overflow: hidden;text-overflow: ellipsis;" :draggable="false">
                                                {{myMsg.name}}
                                            </el-tag>
                                        </el-col>
                                    </el-row>
                                </el-col>
                            </el-row>
                        </template>
                    </template>
                    <template>
                        <div class='show-more' @click="showMore('msgShowCnt')">
                            <label v-if="msgShowCnt < 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">
87 88 89
import {Vue, Component, Prop, Model, Emit} from "vue-property-decorator";
import {Environment} from '@/environments/environment';
import moment from 'moment';
90

91 92
@Component({})
export default class AppMessagePopover extends Vue {
93

94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
    // 是否显示小圆点
    public showIsDot: any = false;
    // 默认显示的tab页
    public default_tab_pane: any = "first";
    // 待办列表
    public myTasks: any = [];
    // 待办面板标签
    public myTasksLabel: any = "待办";
    //  待办面板显示条数
    public taskShowCnt:number = 0;
    // 消息列表
    public myMsgs: any = [];
    // 消息面板标签
    public myMsgsLabel: any = "消息";
    //  信息面板显示条数
    public msgShowCnt:number = 0;
110

111 112 113 114
    /**
     * vue创建
     */
    created(): void {}
115

116 117 118 119 120 121
    /**
     * vue挂载
     */
    mounted(): void {
        if(!Environment.workflow){
            return;
122
        }
123 124 125 126 127 128 129 130 131 132 133 134
        // 首次获取待办列表
        this.getMyTasks();
        // 定时器:每隔1分钟重新获取待办列表
        const timer = setInterval(()=>{
            this.getMyTasks();
        },60000);
        // 监听定时器,在vue销毁前清除定时器
        this.$once('hook:beforeDestroy',()=>{
            // 清除定时器
            clearInterval(timer);
        });
    }
135

136 137 138 139 140 141 142 143 144 145 146 147 148
    /**
     * 获取待办列表
     */
    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 = [];
149
                }
150 151
                // 获取消息列表
                this.getMyMsgs();
152
            }
153 154 155 156
        }).catch((error: any) => {
            console.warn("加载数据错误");
        })
    }
157

158 159 160 161 162 163 164 165 166
    /**
     * 获取消息列表
     */
    public getMyMsgs(){
        // TODO:接口获取消息列表,这里用的待办数据
        this.myMsgs = this.myTasks;
        if (this.myMsgs.length > 0 && this.myTasks.length == 0) {
            // 显示小圆点
            this.showIsDot = true;
167
        }
168
    }
169

170 171 172 173 174 175 176 177 178 179 180
    /**
     * 点击标签事件
     */
    public handleTag(data: any) {
        if (!data)  return this.$message.error("未获取到标签内容");
        // 拼接要打开的窗口地址
        const baseUrl:any = Environment.BaseUrl;
        const openUrl:any = baseUrl + `/wfcore/mytasks/${data.processDefinitionKey}/web/${data.processInstanceBusinessKey}/usertasks/${data.taskDefinitionKey}`;
        // 打开新窗口
        window.open(openUrl,'_blank');
    }
181

182 183 184 185 186 187 188 189 190
    /**
     * 销毁之前
     */
    beforeDestroy(): void {
        // 清空数据
        this.showIsDot = false;
        this.myTasks = [];
        this.myMsgs = [];
    }
191

192 193 194 195 196 197
    /**
     * 时间格式转换
     */
    public formatDate(date: string, format: string) {
        if(date && format) {
            return moment(date).format(format);
198
        }
199 200
        return date;
    }
201

202 203 204 205 206 207 208 209 210
    /**
     * 加载更多
     */
    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;
211
        }
212
    }
213

214 215 216 217 218 219
    /**
     * 弹出框 显示/隐藏 时显示条数初始化
     */
    public initTabCnt() {
        this.taskShowCnt = this.myTasks.length >= 10 ? 10 : this.myTasks.length;
        this.msgShowCnt = this.myMsgs.length >= 10 ? 10 : this.myMsgs.length;
220
    }
221 222

}
223 224 225 226 227
</script>

<style lang='less'>
    @import "app-message-popover.less";
</style>