luohairen
2024-11-25 87e3d52c62233ad44bd7bac3f43e5348a2de4e94
src/views/components/tidingsTable.vue
New file
@@ -0,0 +1,283 @@
<template>
    <div>
        <div class="flex justify-between mb-[15px]">
            <div class="block mb-3 font-semibold fonts">消息中心</div>
            <div class="flex text-[12px]">
                <div
                    v-for="tab in tabs"
                    :key="tab.id"
                    :class="{ active: currentTabId === tab.id }"
                    class="tab relative"
                    @click="switchTab(tab.id)"
                >
                    {{ tab.label }}
                    <div v-if="tab.num" class="w-[15px] h-[15px] num">
                        {{ tab.num }}
                    </div>
                </div>
            </div>
        </div>
        <el-table
            :data="tableData"
            :header-cell-style="{
                background: '#F5F7FC',
                color: '#454B5E',
                fontSize: '12px'
            }"
            height="280"
            max-height="280"
        >
            <el-table-column
                v-for="column in currentTableHeaders"
                :key="column.prop"
                :align="column.align"
                :label="column.label"
                :min-width="column.minWidth"
                :prop="column.prop"
            >
                <template v-if="column.slot === 'sort'" #default="scope">
                    <div
                        :class="
                            getSortClass(
                                (queryParams.pageNum - 1) *
                                    queryParams.pageSize +
                                    scope.$index +
                                    1
                            )
                        "
                        class="sort"
                    >
                        <span>{{
                            (queryParams.pageNum - 1) * queryParams.pageSize +
                            scope.$index +
                            1
                        }}</span>
                    </div>
                </template>
            </el-table-column>
            <el-table-column
                align="center"
                class="relative"
                fixed="right"
                label="操作"
                min-width="72"
            >
                <template #default="scope">
                    <el-button
                        plain
                        size="small"
                        type="primary"
                        @click="handleDetail(scope.row)"
                    >
                        查看</el-button
                    >
                    <div v-if="scope.row.isRead === '0'" class="viewRead"></div>
                </template>
            </el-table-column>
        </el-table>
        <pagination
            v-show="total >= 0"
            :limit="queryParams.pageSize"
            :page="queryParams.pageNum"
            :total="total"
            @pagination="getList"
        />
    </div>
</template>
<script>
import { getMessage, getMessageCount, getRead } from '@/api/message';
export default {
    name: "Index",
    data() {
        return {
            total: 0,
            queryParams: {
                pageNum: 1,
                pageSize: 10
            },
            tableData: [],
            tabs: [
                // { id: 'process', label: '通知公告', num: '2' },
                { id: 'review', label: '审核消息', num: '6' }
                // { id: 'supervision', label: '督办消息', num: '9' },
                // { id: 'progress', label: '进度消息', num: '7' }
            ],
            currentTabId: 0,
            //配置表格表头数据
            currentTableHeaders: [
                { label: '排序', prop: 'index', minWidth: 50, align: 'center', slot: 'sort' },
                { label: '发布单位', prop: 'commitDept', minWidth: 150, align: 'left' },
                { label: '内容', prop: 'content', minWidth: 300, align: 'left' },
                { label: '时间', prop: 'createTime', minWidth: 143, align: 'left' }
            ]
        }
    },
    props: {
        calculation: Array,
        countExceptionProjectData:Object,
    },
    created() {
        this.currentTabId = this.tabs[0].id; // 默认选中的tab的id
        this.getList();
        this.getMessageCountFun();
    },
    methods: {
        async getList() {
            const resp = await getMessage(this.queryParams);
            if (resp.code === 200) {
                this.total = resp.total;
                this.tableData = resp.rows;
            }
        },
        async getMessageCountFun() {
            const resp = await getMessageCount();
            if (resp.code === 200) {
                this.tabs = this.tabs.map((tab) => {
                    if (tab.label === '审核消息') {
                        tab.num = resp.data.auditCount;
                    }
                    return tab;
                });
            }
        },
        switchTab(tabId) {
            currentTabId = tabId;
        },
        getSortClass(index) {
            if (index === 1) {
                return 'actives';
            } else if (index === 2) {
                return 'two';
            } else if (index === 3) {
                return 'three';
            } else {
                return '';
            }
        },
        async getReadFun(id) {
            const resp = await this.getRead(id);
            if (resp.code === 200) {
                await this.getMessageCountFun();
            }
        },
        handleDetail(row) {
            this.getReadFun(row.id);
            if (row.auditType === '2') {
                this.$router.push({
                    path: '/projectManage/nodeDetails',
                    query: { taskId: row.taskId, id: row.businessKey, auditType: row.auditType, disabled: 'true' }
                });
            } else {
                this.$router.push({
                    path: '/projectManage/nodeDetails',
                    query: { taskId: row.taskId, id: row.businessKey, disabled: 'true' }
                });
            }
        }
    }
}
</script>
<style lang="scss" scoped>
.tab {
    padding: 8px;
    border: 1px solid #dbdeea;
    cursor: pointer;
    width: 72px;
}
.active {
    border: 1px solid #3369ff;
    color: #3369ff;
}
.fonts {
    font-size: 16px;
    color: #212a40;
    display: flex;
    align-items: center;
}
.num {
    position: absolute;
    z-index: 999;
    top: -5px;
    right: -5px;
    border-radius: 50%;
    background: #f63f41;
    color: #fff;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 12px;
}
::v-deep .el-table__row {
    font-size: 12px;
}
.sort {
    width: 20px;
    height: 20px;
    border-radius: 50%;
    background-color: #eaf0ff;
    text-align: center;
    color: #3369ff;
}
.actives {
    background-color: #3369ff;
    color: #fff;
}
.two {
    background-color: #5c87ff;
    color: #fff;
}
.three {
    background-color: #85a5ff;
    color: #fff;
}
::v-deep .el-pagination {
    margin: -15px;
    text-align: end;
}
::v-deep .el-pagination .btn-prev .el-icon,
 ::v-deep .el-pagination .btn-next .el-icon
{
    display: inline;
}
.viewRead {
    width: 4px;
    height: 4px;
    position: absolute;
    z-index: 999;
    top: 10px;
    right: 20px;
    border-radius: 50%;
    background: #f63f41;
    color: #fff;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 12px;
}
.flex {
    display: flex;
    justify-content: space-between;
    font-size: 12px;
}
</style>