fix(notifications): refine bell notification center
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user