From a67ca759e4eb5612d0b00e1ebc9e541394074ad7 Mon Sep 17 00:00:00 2001 From: Timi Date: Thu, 20 Aug 2026 16:22:58 +0800 Subject: [PATCH] fix event list sort --- src/api/EventAPI.ts | 47 ++++++++++++++++++++++++++++++----- src/pages/event/EventList.vue | 6 ++++- src/pages/event/EventSort.vue | 6 ++++- 3 files changed, 51 insertions(+), 8 deletions(-) diff --git a/src/api/EventAPI.ts b/src/api/EventAPI.ts index 7650f00..0e817a0 100644 --- a/src/api/EventAPI.ts +++ b/src/api/EventAPI.ts @@ -4,33 +4,68 @@ import { getCurrentStoreId, withCurrentStoreId, withCurrentStorePage } from "@/u const BASE_URI = "/gao/event"; +const eventOrderMap: NonNullable["orderMap"]> = { + sort: "ASC", + createdAt: "ASC" +}; + type ListOptions = { allStores?: boolean; storeId?: string; }; +/** + * 为所有事件分页查询补充统一排序,避免后端未传排序参数时按数据库默认顺序返回。 + */ +function withEventOrder(page: Page): Page { + return { + ...page, + orderMap: { + ...eventOrderMap, + ...(page.orderMap || {}) + } + }; +} + +/** + * 按事件排序值升序排列,缺少排序值的历史数据放到列表末尾。 + */ +function sortEventList(list: EventItem[]): EventItem[] { + return [...list].sort((left, right) => { + const leftSort = left.sort ?? Number.MAX_SAFE_INTEGER; + const rightSort = right.sort ?? Number.MAX_SAFE_INTEGER; + if (leftSort !== rightSort) { + return leftSort - rightSort; + } + + return (left.createdAt ?? Number.MAX_SAFE_INTEGER) - (right.createdAt ?? Number.MAX_SAFE_INTEGER); + }); +} + async function list(req: Page, options?: ListOptions): Promise> { + const orderedPage = withEventOrder(req); if (options?.allStores) { - return await axios.post(`${BASE_URI}/list`, req); + return await axios.post(`${BASE_URI}/list`, orderedPage); } if (options?.storeId) { return await axios.post(`${BASE_URI}/list`, { - ...req, + ...orderedPage, equalsExample: { - ...(req.equalsExample || {}), + ...(orderedPage.equalsExample || {}), storeId: options.storeId } }); } - return await axios.post(`${BASE_URI}/list`, withCurrentStorePage(req)); + return await axios.post(`${BASE_URI}/list`, withCurrentStorePage(orderedPage)); } async function listValid(): Promise { - return await axios.post(`${BASE_URI}/list/valid`, undefined, { + const list = await axios.post(`${BASE_URI}/list/valid`, undefined, { params: { storeId: getCurrentStoreId() } - }); + }) as unknown as EventItem[]; + return sortEventList(list); } async function detail(id: string): Promise { diff --git a/src/pages/event/EventList.vue b/src/pages/event/EventList.vue index c9ac2a9..6064a4a 100644 --- a/src/pages/event/EventList.vue +++ b/src/pages/event/EventList.vue @@ -130,7 +130,11 @@ const isLoading = ref(false); const isNoMore = ref(false); const page = reactive>({ index: 0, - size: 15 + size: 15, + orderMap: { + sort: "ASC", + createdAt: "ASC" + } }); const pageResult = reactive>({ total: 0, diff --git a/src/pages/event/EventSort.vue b/src/pages/event/EventSort.vue index 935e5b5..8fb9808 100644 --- a/src/pages/event/EventSort.vue +++ b/src/pages/event/EventSort.vue @@ -131,7 +131,11 @@ async function loadData(): Promise { try { const result = await EventAPI.list({ index: 0, - size: 100 + size: 100, + orderMap: { + sort: "ASC", + createdAt: "ASC" + } }); eventList.value = result.list || []; sortDirty.value = false;