diff --git a/src/user/ticket/release/index.tsx b/src/user/ticket/release/index.tsx index bceb4fd..93e0b7f 100644 --- a/src/user/ticket/release/index.tsx +++ b/src/user/ticket/release/index.tsx @@ -9,6 +9,7 @@ import type { GltUserTicketRelease } from '@/api/glt/gltUserTicketRelease/model' import { ensureLoggedIn } from '@/utils/auth' const PAGE_SIZE = 10 +const MAX_FETCH_ROUNDS = 10 export default function TicketReleasePlanPage() { const [list, setList] = useState([]) @@ -74,34 +75,58 @@ export default function TicketReleasePlanPage() { setLoading(true) try { - const currentPage = isRefresh ? 1 : page - const res = await pageGltUserTicketRelease({ - page: currentPage, - limit: PAGE_SIZE, - userId: uid, - userTicketId: userTicketId as any - } as any) + const baseList = isRefresh ? [] : list + const seen = new Set(baseList.map(r => String(r.id ?? `${r.userTicketId ?? ''}:${r.periodNo ?? ''}:${r.releaseTime ?? ''}`))) - const incoming = Array.isArray(res?.list) ? res.list : [] - const safe = incoming - .filter(r => Number((r as any)?.deleted) !== 1) - .filter(r => !userTicketId || String(r.userTicketId || '') === userTicketId) - .sort((a, b) => { - const at = dayjs(a.releaseTime || a.createTime || 0).valueOf() - const bt = dayjs(b.releaseTime || b.createTime || 0).valueOf() - return bt - at - }) + let nextPage = isRefresh ? 1 : page + let serverHasMore = true + let added = 0 + let nextList = baseList.slice() + + for (let round = 0; round < MAX_FETCH_ROUNDS; round++) { + if (!serverHasMore) break + + // Only query by current logged-in userId; userTicketId is filtered on the client. + const res = await pageGltUserTicketRelease({ + page: nextPage, + limit: PAGE_SIZE, + userId: uid + } as any) + + const incoming = Array.isArray(res?.list) ? res.list : [] + const safe = incoming + .filter(r => Number((r as any)?.deleted) !== 1) + .filter(r => !userTicketId || String(r.userTicketId || '') === userTicketId) + .filter(r => { + const k = String(r.id ?? `${r.userTicketId ?? ''}:${r.periodNo ?? ''}:${r.releaseTime ?? ''}`) + if (seen.has(k)) return false + seen.add(k) + return true + }) + + if (safe.length) { + nextList = nextList.concat(safe) + added += safe.length + } + + serverHasMore = incoming.length >= PAGE_SIZE + if (!serverHasMore) break + nextPage += 1 + + // Stop early once we got something to render for this ticket. + if (added > 0) break + } + + nextList.sort((a, b) => { + const at = dayjs(a.releaseTime || a.createTime || 0).valueOf() + const bt = dayjs(b.releaseTime || b.createTime || 0).valueOf() + return bt - at + }) - const nextList = isRefresh ? safe : list.concat(safe) setList(nextList) - - const serverCount = typeof (res as any)?.count === 'number' ? Number((res as any).count) : undefined - const nextTotal = typeof serverCount === 'number' ? serverCount : nextList.length - setTotal(nextTotal) - setHasMore(typeof serverCount === 'number' ? nextList.length < serverCount : incoming.length >= PAGE_SIZE) - - if (incoming.length > 0) setPage(currentPage + 1) - else setHasMore(false) + setTotal(nextList.length) + setHasMore(serverHasMore) + setPage(nextPage) } catch (e) { console.error('加载释放计划失败:', e) Taro.showToast({ title: '加载失败', icon: 'none' }) @@ -163,7 +188,7 @@ export default function TicketReleasePlanPage() { ) : null} - {list.length === 0 && !loading ? ( + {list.length === 0 && !loading && !hasMore ? ( @@ -218,4 +243,3 @@ export default function TicketReleasePlanPage() { ) } -