| | |
| | | </view> |
| | | </view> |
| | | |
| | | <scroll-view class="record-scroll" scroll-y="true" show-scrollbar="false" lower-threshold="80" @scrolltolower="loadMoreRecords"> |
| | | <scroll-view class="record-scroll" scroll-y="true" show-scrollbar="false" lower-threshold="80" |
| | | refresher-enabled="true" :refresher-triggered="refreshing" refresher-background="#F4F6F9" |
| | | @refresherrefresh="handlePullDownRefresh" @refresherabort="finishPullRefresh" @scrolltolower="loadMoreRecords"> |
| | | <view v-if="initialLoading" class="empty-state"><view class="loading-spinner"></view><text class="empty-title">正在加载使用记录</text></view> |
| | | <view v-else-if="initialError" class="empty-state"><text class="empty-title">使用记录加载失败</text><text class="retry-text" @tap="retryInitialLoad">重新加载</text></view> |
| | | <view v-else-if="hasLoaded && visibleRecords.length == 0" class="empty-state"><text class="empty-title">暂无相关使用记录</text><text class="empty-desc">切换其他状态查看记录</text></view> |
| | |
| | | ] |
| | | const activeStatus = ref('') |
| | | const pageSize = 8 |
| | | const autoRefreshInterval = 15000 |
| | | const currentPage = ref(1) |
| | | const talentId = ref('') |
| | | const isPreviewMember = ref(false) |
| | |
| | | const hasMore = ref(true) |
| | | const initialError = ref(false) |
| | | const loadMoreError = ref(false) |
| | | const refreshing = ref(false) |
| | | const failInitialOnce = ref(false) |
| | | const failLoadMoreOnce = ref(false) |
| | | const listRequestVersion = ref(0) |
| | | const visibleRecords = ref([]) |
| | | let cancelRecordsRequest: (() => void) | null = null |
| | | let autoRefreshTimer = 0 |
| | | let hasShown = false |
| | | let pageVisible = false |
| | | let refreshInProgress = false |
| | | |
| | | const getMerchantIcon = (merchantType: string) => { |
| | | if (merchantType == 'food') return '/static/order-assets/utensils.svg' |
| | |
| | | } |
| | | resetRecords() |
| | | }) |
| | | onShow(() => { |
| | | pageVisible = true |
| | | if (hasShown) refreshRecords(false) |
| | | else hasShown = true |
| | | startAutoRefresh() |
| | | }) |
| | | onHide(() => { |
| | | pageVisible = false |
| | | stopAutoRefresh() |
| | | }) |
| | | onUnload(() => { |
| | | pageVisible = false |
| | | refreshInProgress = false |
| | | stopAutoRefresh() |
| | | listRequestVersion.value = listRequestVersion.value + 1 |
| | | cancelActiveRequest() |
| | | }) |
| | | |
| | | const cancelActiveRequest = () => { |
| | | if (cancelRecordsRequest == null) return |
| | | cancelRecordsRequest() |
| | | cancelRecordsRequest = null |
| | | } |
| | | const stopAutoRefresh = () => { |
| | | if (autoRefreshTimer == 0) return |
| | | clearInterval(autoRefreshTimer) |
| | | autoRefreshTimer = 0 |
| | | } |
| | | const startAutoRefresh = () => { |
| | | stopAutoRefresh() |
| | | if (talentId.value == '') return |
| | | autoRefreshTimer = setInterval(() => { |
| | | if (pageVisible) refreshRecords(false) |
| | | }, autoRefreshInterval) |
| | | } |
| | | |
| | | const resetRecords = () => { |
| | | const requestVersion = listRequestVersion.value + 1 |
| | | listRequestVersion.value = requestVersion |
| | | cancelActiveRequest() |
| | | currentPage.value = 1 |
| | | initialLoading.value = true |
| | | initialError.value = false |
| | | loadMoreError.value = false |
| | | hasLoaded.value = false |
| | | loadingMore.value = false |
| | | refreshing.value = false |
| | | refreshInProgress = false |
| | | visibleRecords.value = [] |
| | | hasMore.value = true |
| | | if (failInitialOnce.value) { |
| | |
| | | initialError.value = true |
| | | return |
| | | } |
| | | requestRecords(requestVersion, 1, true) |
| | | requestRecords(requestVersion, 1, pageSize, true) |
| | | } |
| | | const requestRecords = (requestVersion: number, page: number, initial: boolean) => { |
| | | getUsageRecords(talentId.value, activeStatus.value, page, pageSize, (data: any) => { |
| | | const requestRecords = (requestVersion: number, page: number, size: number, initial: boolean) => { |
| | | cancelRecordsRequest = getUsageRecords(talentId.value, activeStatus.value, page, size, (data: any) => { |
| | | if (requestVersion != listRequestVersion.value) return |
| | | cancelRecordsRequest = null |
| | | const sourceRecords: any[] = data != null && data.records instanceof Array ? data.records as any[] : [] |
| | | const records: any[] = [] |
| | | for (let index = 0; index < sourceRecords.length; index++) records.push(mapRecord(sourceRecords[index])) |
| | |
| | | hasLoaded.value = true |
| | | }, (error: any) => { |
| | | if (requestVersion != listRequestVersion.value) return |
| | | cancelRecordsRequest = null |
| | | initialLoading.value = false |
| | | loadingMore.value = false |
| | | if (error != null && error.statusCode == 401) { |
| | |
| | | else loadMoreError.value = true |
| | | }) |
| | | } |
| | | const refreshRecords = (fromPullDown: boolean) => { |
| | | if (talentId.value == '' || initialLoading.value || loadingMore.value || refreshInProgress) { |
| | | if (fromPullDown) refreshing.value = false |
| | | return |
| | | } |
| | | const requestVersion = listRequestVersion.value + 1 |
| | | listRequestVersion.value = requestVersion |
| | | cancelActiveRequest() |
| | | refreshInProgress = true |
| | | refreshing.value = fromPullDown |
| | | loadMoreError.value = false |
| | | const refreshSize = Math.min(48, Math.max(pageSize, currentPage.value * pageSize)) |
| | | cancelRecordsRequest = getUsageRecords(talentId.value, activeStatus.value, 1, refreshSize, (data: any) => { |
| | | if (requestVersion != listRequestVersion.value) return |
| | | cancelRecordsRequest = null |
| | | refreshInProgress = false |
| | | const sourceRecords: any[] = data != null && data.records instanceof Array ? data.records as any[] : [] |
| | | const records: any[] = [] |
| | | for (let index = 0; index < sourceRecords.length; index++) records.push(mapRecord(sourceRecords[index])) |
| | | visibleRecords.value = records |
| | | const total = data != null && data.total != null ? Number(data.total) : records.length |
| | | currentPage.value = Math.max(1, Math.ceil(records.length / pageSize)) |
| | | hasMore.value = records.length < total |
| | | initialError.value = false |
| | | hasLoaded.value = true |
| | | refreshing.value = false |
| | | }, (error: any) => { |
| | | if (requestVersion != listRequestVersion.value) return |
| | | cancelRecordsRequest = null |
| | | refreshInProgress = false |
| | | refreshing.value = false |
| | | if (error != null && error.statusCode == 401) { |
| | | clearSession() |
| | | uni.reLaunch({ url: '/pages/login/login' }) |
| | | return |
| | | } |
| | | if (fromPullDown) uni.showToast({ title: '刷新失败,请稍后重试', icon: 'none' }) |
| | | }) |
| | | } |
| | | const handlePullDownRefresh = () => refreshRecords(true) |
| | | const finishPullRefresh = () => { refreshing.value = false } |
| | | const retryInitialLoad = () => resetRecords() |
| | | const retryLoadMore = () => loadMoreRecords() |
| | | const changeTab = (name: string) => { |
| | |
| | | resetRecords() |
| | | } |
| | | const loadMoreRecords = () => { |
| | | if (initialLoading.value || loadingMore.value || !hasMore.value) return |
| | | if (initialLoading.value || loadingMore.value || refreshInProgress || !hasMore.value) return |
| | | const requestVersion = listRequestVersion.value |
| | | loadMoreError.value = false |
| | | loadingMore.value = true |
| | |
| | | loadMoreError.value = true |
| | | return |
| | | } |
| | | requestRecords(requestVersion, currentPage.value + 1, false) |
| | | requestRecords(requestVersion, currentPage.value + 1, pageSize, false) |
| | | } |
| | | const goBack = () => { |
| | | const previewQuery = isPreviewMember.value ? '?preview=member&talentId=' + encodeURIComponent(talentId.value) : '' |