fix(notifications): refine bell notification center

This commit is contained in:
caoxiaozhu
2026-06-03 17:16:09 +08:00
parent c73178b65d
commit 95956afbc6
5 changed files with 363 additions and 62 deletions

View File

@@ -4,6 +4,9 @@ import { fetchApprovalExpenseClaims, fetchArchivedExpenseClaims, fetchExpenseCla
import {
DOCUMENT_VIEWED_KEYS_CHANGE_EVENT,
countNewDocuments,
isNewDocument,
markDocumentViewed,
markDocumentsViewed,
readViewedDocumentKeys,
resolveDocumentNewKey
} from '../utils/documentCenterNewState.js'
@@ -24,6 +27,12 @@ let refreshPromise = null
let lastRefreshAt = 0
let viewedKeysListenerAttached = false
const SOURCE_LABELS = {
owned: '我的单据',
approval: '待我处理',
archive: '归档单据'
}
function normalizeClaimText(...values) {
for (const value of values) {
const normalized = String(value || '').trim()
@@ -35,18 +44,41 @@ function normalizeClaimText(...values) {
return ''
}
function resolveSortTime(...values) {
for (const value of values) {
const time = Date.parse(String(value || '').trim())
if (Number.isFinite(time)) {
return time
}
}
return 0
}
function buildDocumentInboxRow(claim, source) {
const request = mapExpenseClaimToRequest(claim)
const claimId = normalizeClaimText(request.claimId, request.id, claim?.id, claim?.claim_id)
const documentNo = normalizeClaimText(request.documentNo, request.claimNo, request.id, claim?.claim_no)
const documentKey = normalizeClaimText(claimId, documentNo)
const createdAt = normalizeClaimText(request.createdAt, request.submittedAt, claim?.created_at, claim?.submitted_at)
const updatedAt = normalizeClaimText(request.updatedAt, request.approvedAt, claim?.updated_at, claim?.approved_at)
const documentTypeLabel = normalizeClaimText(request.documentTypeLabel, claim?.document_type_label) || '报销单'
return documentKey
? {
source,
claimId: claimId || documentKey,
documentNo,
documentKey: `${source}:${documentKey}`
documentKey: `${source}:${documentKey}`,
documentTypeLabel,
sourceLabel: SOURCE_LABELS[source] || '单据中心',
title: normalizeClaimText(claim?.title, request.title, request.sceneLabel, request.note) || documentTypeLabel,
initiatorName: normalizeClaimText(request.initiatorName, request.person, claim?.employee_name, claim?.applicant_name),
statusLabel: normalizeClaimText(request.approvalStatus, request.status, claim?.approval_status, claim?.status),
createdAt,
updatedAt,
sortTime: resolveSortTime(updatedAt, createdAt),
rawRequest: request
}
: null
}
@@ -127,6 +159,25 @@ export function useDocumentCenterInbox() {
const unreadCount = computed(() => countNewDocuments(documentRows.value, viewedDocumentKeys.value))
const hasUnread = computed(() => unreadCount.value > 0)
const notificationRows = computed(() =>
documentRows.value
.filter((row) => String(row?.source || '').trim() !== 'archive')
.map((row) => ({
...row,
isUnread: isNewDocument(row, viewedDocumentKeys.value)
}))
.sort((left, right) => Number(right.sortTime || 0) - Number(left.sortTime || 0))
)
function markDocumentInboxRowRead(row) {
viewedDocumentKeys.value = markDocumentViewed(row, viewedDocumentKeys.value)
return viewedDocumentKeys.value
}
function markDocumentInboxRowsRead(rows = documentRows.value) {
viewedDocumentKeys.value = markDocumentsViewed(rows, viewedDocumentKeys.value)
return viewedDocumentKeys.value
}
async function refreshDocumentInbox(options = {}) {
const force = Boolean(options.force)
@@ -191,6 +242,9 @@ export function useDocumentCenterInbox() {
return {
hasUnread,
loading,
markDocumentInboxRowRead,
markDocumentInboxRowsRead,
notificationRows,
refreshDocumentInbox,
startDocumentInboxPolling,
stopDocumentInboxPolling,