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

372 lines
11 KiB

4 months ago
<template>
<div>
<div class="ns-table-title">消息中心</div>
<a-tabs v-model:activeKey="loginType" :destroyInactiveTabPane="true" class="tabs-list">
<a-tab-pane v-for="(item, index) in typeName" :key="typeCode[index]" :tab="item">
<ns-view-list-table ref="nsTableRef" v-bind="tableConfig">
<template #bodyCell="data">
<template v-if="data.column.dataIndex == 'status'">
<div v-if="data.record.status == 1"> <div class="no-read"></div>未读 </div>
<div v-if="data.record.status == 2"> <div class="readed"></div>已读 </div>
</template>
<template v-if="data.column.dataIndex == 'index'">{{ data.index + 1 }}</template>
</template>
</ns-view-list-table>
</a-tab-pane>
</a-tabs>
</div>
</template>
<script setup lang="ts" name="MessageCenterIndex">
import { Modal } from 'ant-design-vue';
import { ref, watch } from 'vue';
import { dateUtil } from '/nerv-lib/util/date-util';
import { http } from '/nerv-lib/util/http';
import { useRouter } from 'vue-router';
import { message } from 'ant-design-vue';
const props = defineProps({
listTableApi: String,
actionApi: Object,
});
let typeName = ['任务', '通知', '预警', '其他'];
let typeCode = [13, 16, 18, 99];
const nsTableRef = ref();
const router = useRouter();
const loginType = ref(typeCode[0]);
const detailUrl = (record) => {
// 服务通知 智慧社区
if (record.tpCode == 'userSubmitVisitor') {
router.push({ name: 'DoorwayAuditIndex' });
}
if (record.tpCode == 'accountBindRoom') {
router.push({ name: 'CertificationAuditIndex' });
}
if (record.tpCode == 'workOrderCommit') {
switch (record.messageBizUuid2) {
case '1':
router.push({ name: 'RepairOrderIndex' });
case '2':
router.push({ name: 'CleanOrderIndex' });
case '3':
router.push({ name: 'WashCleanWorkOrderIndex' });
case '4':
router.push({ name: 'WaterDeliveryOrderIndex' });
case '5':
router.push({ name: 'ProblemReportIndex' });
case '6':
router.push({ name: 'DecorateRegistrationIndex' });
case '7':
router.push({ name: 'CourierServiceIndex' });
default:
break;
}
}
if (record.tpCode == 'feedbackCommit') {
router.push({ name: 'ProblemReportIndex' });
}
if (record.tpCode == 'accountBindRoom') {
router.push({ name: 'CertificationAuditIndex' });
}
if (record.tpCode == 'submitFurnishLog') {
router.push({ name: 'DecorateRegistrationIndex' });
}
if (record.tpCode == 'workOrderCentCommit') {
switch (record.messageBizUuid2) {
case '1':
router.push({ name: 'RepairOrderIndex' });
case '2':
router.push({ name: 'CleanOrderIndex' });
case '3':
router.push({ name: 'WashCleanWorkOrderIndex' });
case '4':
router.push({ name: 'WaterDeliveryOrderIndex' });
case '5':
router.push({ name: 'ProblemReportIndex' });
case '6':
router.push({ name: 'DecorateRegistrationIndex' });
case '7':
router.push({ name: 'CourierServiceIndex' });
default:
break;
}
}
if (record.tpCode == 'accountPackInit') {
router.push({ name: 'CourierServiceIndex' });
}
if (record.tpCode == 'entrustLeaseWebInit') {
router.push({ name: 'LeaseApplicationIndex' });
}
if (record.tpCode == 'entrustLeaseRoomWebInit') {
router.push({ name: 'RentalApplicationIndex' });
}
// 系统通知 智慧社区
if (record.tpCode == 'patrolTaskTime') {
router.push({ name: 'PatrolTaskIndex' });
}
if (record.tpCode == 'leaveCommit') {
router.push({ name: '' }); // 缺失待补充
}
if (record.tpCode == 'leaveCommit') {
router.push({ name: '' }); // 缺失待补充
}
if (record.tpCode == 'alarmReport') {
router.push({ name: 'IncidentRecordIndex' });
}
if (record.tpCode == 'costStandardInit') {
router.push({ name: 'CostCheckIndex' });
}
if (record.tpCode == 'roomCallBill') {
router.push({ name: 'CostCallIndex' });
}
if (record.tpCode == 'attendanceRecord') {
router.push({ name: '' }); // 缺失待补充
}
// 会议通知 会议中心
let params = JSON.parse(record.params);
if (record.tpCode == 'canHuiTongZhi') {
router.push({ name: 'MyConferenceIndex', query: { meetingName: params.meetingName } });
}
if (record.tpCode == 'huiYiTiXing') {
router.push({ name: 'MyConferenceIndex', query: { meetingName: params.meetingName } });
}
if (record.tpCode == 'huiYiQuXiao') {
router.push({ name: 'MyReserveIndex', query: { meetingName: params.meetingName } });
}
if (record.tpCode == 'riChengQuXiao') {
router.push({ name: 'MyConferenceIndex', query: { meetingName: params.meetingName } });
}
if (record.tpCode == 'qianDaoChengGong') {
router.push({ name: 'MyConferenceIndex', query: { meetingName: params.meetingName } });
}
if (record.tpCode == 'huiYiYuQi') {
router.push({ name: 'MyConferenceIndex', query: { meetingName: params.meetingName } });
}
if (record.tpCode == 'shenPiTongGuo') {
router.push({ name: 'MyReserveIndex', query: { meetingName: params.meetingName } });
}
if (record.tpCode == 'shenPiJuJue') {
router.push({ name: 'MyReserveIndex', query: { meetingName: params.meetingName } });
}
if (record.tpCode == 'shenPiGuoQi') {
router.push({ name: 'MyReserveIndex', query: { meetingName: params.meetingName } });
}
if (record.tpCode == 'huiYiShenPi') {
router.push({ name: 'MeetingApprovalIndex', query: { meetingName: params.meetingName } });
}
if (record.tpCode == 'jiYaoFenXiang') {
router.push({ name: 'MeetingListDetail', query: { id: params.summaryId } });
}
if (record.tpCode == 'huiYiCheXiao') {
router.push({ name: 'MyReserveIndex', query: { meetingName: params.meetingName } });
}
// 设备通知 社区/养老
if (record.tpCode == 'DeviceRuleAlarm') {
router.push({ name: 'AlarmCenterIndex' });
}
if (record.tpCode == 'DeviceRuleAlarmTimeOut') {
router.push({ name: 'AlarmCenterIndex' });
}
};
watch(
() => loginType.value,
(val) => {
tableConfig.value.params.type = val;
},
{ deep: true },
);
const tableConfig = ref({
api: props.listTableApi,
// title: '消息中心',
params: {
type: loginType.value,
},
headerActions: [
{
label: '全部标记已读',
name: 'MessageCenterReaded',
type: 'primary',
handle: () => {
http
.get(props.actionApi['MessageCenterUnRead'], { type: loginType.value })
.then((res) => {
if (res.data) {
Modal.confirm({
title: '警告',
content: '确定设置全部消息已读吗?',
cancelText: '取消',
onOk: () => {
http
.post(props.actionApi['MessageCenterReaded'], { type: loginType.value })
.then((res) => {
nsTableRef.value.nsTableRef.reload();
});
},
});
} else {
message.warn('暂无未读消息!', 3);
}
});
},
},
],
rowSelection: null,
resultField: 'data',
scroll: { x: '100%' },
columns: [
{
title: '序号',
dataIndex: 'index',
textNumber: 2,
},
{
title: '消息内容',
dataIndex: 'content',
textEllipsis: true,
},
{
title: '通知时间',
dataIndex: 'messageTime',
textNumber: 8,
customRender: ({ value }) => {
return dateUtil(value).format('YYYY-MM-DD HH:mm:ss');
},
},
{
title: '模块来源',
dataIndex: 'title',
textNumber: 8,
},
{
title: '消息状态',
dataIndex: 'status',
textNumber: 4,
customRender: ({ value }) => {
if (value == 1) {
return '未读';
}
if (value == 2) {
return '已读';
}
},
},
],
columnActions: {
title: '操作',
actions: [
{
label: '查看',
name: 'MessageCenterDetail',
handle: (record) => {
http.post(props.actionApi['MessageCenterDetail'], { messageId: record.id }).then(() => {
detailUrl(record);
});
},
},
{
label: '删除',
name: 'MessageCenterDelete',
dynamicParams: {
messageId: 'id',
},
confirm: {
title: '提示',
content: `确定删除该条消息吗?`,
},
isReload: true,
api: props.actionApi['MessageCenterDelete'],
},
],
},
formConfig: {
schemas: [
{
label: '消息状态',
field: 'status',
component: 'NsSelect',
defaultValue: '',
componentProps: {
options: [
{
label: '全部',
value: '',
},
{
label: '已读',
value: 2,
},
{
label: '未读',
value: 1,
},
],
},
},
],
},
});
</script>
<style lang="less" scoped>
:deep(.ant-tabs-top > .ant-tabs-nav) {
margin-bottom: 0;
.ant-tabs-nav-wrap {
padding-left: 24px;
}
}
.no-read {
width: 8px;
height: 8px;
background-color: #ff1744;
border-radius: 50%;
display: inline-block;
margin-right: 8px;
margin-bottom: 1px;
}
.readed {
width: 8px;
height: 8px;
background-color: #17be6b;
border-radius: 50%;
display: inline-block;
margin-right: 8px;
margin-bottom: 1px;
}
.ns-table-title {
text-align: left;
height: 46px;
line-height: 46px;
//font-size: 16px;
font-size: 18px;
font-weight: bold;
user-select: text;
padding-left: 16px;
background: #fff;
width: calc(100% + 32px);
margin-left: -16px;
cursor: pointer;
}
.tabs-list {
overflow: visible !important;
}
:deep(.ant-tabs-nav) {
width: calc(100% + 32px);
margin-left: -16px !important;
background: #fff;
}
:deep(.ant-tabs-nav-wrap) {
padding: 0 16px;
}
</style>