From c0d00d28ce8f84c61fc26e1775aca3734ed42323 Mon Sep 17 00:00:00 2001 From: yml2213 Date: Sat, 19 Sep 2026 11:49:48 +0800 Subject: [PATCH] =?UTF-8?q?fix(admin-orders):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=AE=9E=E6=97=B6=20SSE=20=E8=AE=A2=E5=8D=95=E6=8E=A8=E9=80=81?= =?UTF-8?q?=E6=9C=AA=E6=8C=89=E6=97=B6=E9=97=B4=E5=80=92=E5=BA=8F=E6=8E=92?= =?UTF-8?q?=E5=88=97=E5=AF=BC=E8=87=B4=E5=8E=86=E5=8F=B2=E5=8D=95=E8=B7=B3?= =?UTF-8?q?=E5=88=B0=E7=AC=AC=201=20=E8=A1=8C=E7=9A=84=E9=97=AA=E7=83=81?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 在 AdminLayout 的 patchAdminOrderListEnvelope 中接入 sortAdminOrdersDesc 排序引擎,严格按 paidAt / createdAt 倒序及 orderId 倒序排列; 2. 修复后台同步历史订单(如 15/16 号)时,SSE 事件盲目将其插入第一页顶部并在手动刷新后消失的跳跃与闪烁现象; 3. 新订单按时间自然沉降到正确的页码位置,只有属于当前页时间范围的新订单才会展示在第一页顶部。 --- apps/frontend/src/layouts/AdminLayout.tsx | 25 +++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/apps/frontend/src/layouts/AdminLayout.tsx b/apps/frontend/src/layouts/AdminLayout.tsx index 4c929c16..d202203f 100644 --- a/apps/frontend/src/layouts/AdminLayout.tsx +++ b/apps/frontend/src/layouts/AdminLayout.tsx @@ -527,6 +527,28 @@ function patchAdminOrderCaches( } } +function getOrderSortTimestamp(item: unknown): number { + if (!item || typeof item !== 'object') return 0 + const record = item as Record + const timeStr = String(record.paidAt || record.createdAt || '').trim() + if (!timeStr) return 0 + const t = dayjs(timeStr).valueOf() + return Number.isFinite(t) ? t : 0 +} + +function sortAdminOrdersDesc(items: unknown[]): unknown[] { + return [...items].sort((a, b) => { + const timeA = getOrderSortTimestamp(a) + const timeB = getOrderSortTimestamp(b) + if (timeB !== timeA) { + return timeB - timeA + } + const idA = Number((a as Record)?.orderId || 0) + const idB = Number((b as Record)?.orderId || 0) + return idB - idA + }) +} + function patchAdminOrderListEnvelope( current: unknown, event: RealtimeEvent, @@ -544,6 +566,9 @@ function patchAdminOrderListEnvelope( ? items.filter((entry) => Number((entry as { orderId?: unknown })?.orderId) !== id) : upsertById(items, event.data, 'orderId', insert) + // 严格保持按支付/创建时间倒序排列,避免后台同步历史单(如 15/16 号)时盲目插在第 1 行 + nextItems = sortAdminOrdersDesc(nextItems) + if (insert && nextItems.length > pageSize) { nextItems = nextItems.slice(0, pageSize) }