增加订单实时状态同步

This commit is contained in:
yml2213
2026-08-17 14:51:51 +08:00
parent 5330b55b75
commit 18dad9b0fe
13 changed files with 798 additions and 16 deletions
+45
View File
@@ -44,10 +44,12 @@ import {
import {
clearAdminSession,
getAdminRole,
getAdminToken,
getAdminTokenExpiresAt,
getAdminUsername,
} from '@/utils/admin-auth'
import { formatAdminDateTime } from '@/utils/admin-time'
import { useRealtimeEvents, type RealtimeEvent } from '@/hooks/useRealtimeEvents'
const SIDEBAR_COLLAPSED_KEY = 'react-admin-sidebar-collapsed'
const NOTIFICATION_SOUND_KEY = 'admin-notification-sound-enabled'
@@ -88,6 +90,15 @@ export default function AdminLayout() {
const notifications = notificationsQuery.data?.data.items || []
const pendingNotificationCount = Number(notificationsQuery.data?.data.pendingCount || 0)
useRealtimeEvents({
url: '/api/v1/admin/realtime',
token: getAdminToken(),
onEvent: (event) => handleAdminRealtimeEvent(event, queryClient),
onConnected: () => {
void invalidateAdminRealtimeQueries(queryClient)
},
})
useEffect(() => {
const currentVersions = new Map(
notifications.map((notification) => [notification.notificationId, notification.updatedAt]),
@@ -343,6 +354,40 @@ export default function AdminLayout() {
)
}
function handleAdminRealtimeEvent(
event: RealtimeEvent,
queryClient: ReturnType<typeof useQueryClient>,
) {
if (event.type === 'admin_notification.changed') {
void queryClient.invalidateQueries({ queryKey: ['admin-notifications'] })
}
if (event.type === 'order.changed') {
void queryClient.invalidateQueries({ queryKey: ['admin-orders'] })
void queryClient.invalidateQueries({ queryKey: ['admin-order-detail', String(event.entityId)] })
void queryClient.invalidateQueries({ queryKey: ['admin-tasks'] })
void queryClient.invalidateQueries({ queryKey: ['admin-dashboard-summary'] })
}
if (event.type === 'work_order.changed') {
void queryClient.invalidateQueries({ queryKey: ['admin-worker-platform-orders'] })
void queryClient.invalidateQueries({ queryKey: ['admin-worker-platform-summary'] })
}
if (event.type === 'worker_finance_request.changed') {
void queryClient.invalidateQueries({ queryKey: ['admin-worker-platform-finance-requests'] })
}
}
function invalidateAdminRealtimeQueries(queryClient: ReturnType<typeof useQueryClient>) {
return Promise.all([
queryClient.invalidateQueries({ queryKey: ['admin-notifications'] }),
queryClient.invalidateQueries({ queryKey: ['admin-orders'] }),
queryClient.invalidateQueries({ queryKey: ['admin-tasks'] }),
queryClient.invalidateQueries({ queryKey: ['admin-dashboard-summary'] }),
queryClient.invalidateQueries({ queryKey: ['admin-worker-platform-orders'] }),
queryClient.invalidateQueries({ queryKey: ['admin-worker-platform-finance-requests'] }),
queryClient.invalidateQueries({ queryKey: ['admin-worker-platform-summary'] }),
])
}
type NotificationAlertKind =
| 'withdraw'
| 'recharge'