|
|
@@ -211,6 +211,10 @@
|
|
|
|
|
|
// 防止重复请求的标志位
|
|
|
const isSearching = ref<boolean>(false)
|
|
|
+ // 添加防重复刷新的标志
|
|
|
+ const isRefreshing = ref<boolean>(false)
|
|
|
+ // 添加刷新时间戳,用于防抖
|
|
|
+ const lastRefreshTime = ref<number>(0)
|
|
|
|
|
|
// 添加防抖定时器
|
|
|
let searchTimer: number | null = null
|
|
|
@@ -510,26 +514,40 @@
|
|
|
showDatePicker.value = false
|
|
|
showDatePickerPopup.value = false
|
|
|
selectedMonth.value = 'custom'
|
|
|
+
|
|
|
+ // 添加防重复调用检查
|
|
|
+ if (loading.value) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
getStatistics()
|
|
|
}
|
|
|
|
|
|
// 方法
|
|
|
- function loadData(isRefresh: boolean) {
|
|
|
- // 防止重复请求
|
|
|
- if (loading.value && !isRefresh) {
|
|
|
+ function loadData(isRefresh: boolean, disablePullDown = false) {
|
|
|
+ // 防止重复请求的核心机制 - 参考工单页面的简单有效方式
|
|
|
+ if (loading.value) {
|
|
|
+ // 确保刷新状态最终被重置,防止卡死
|
|
|
+ if (!isRefresh) {
|
|
|
+ refreshing.value = false;
|
|
|
+ }
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- const shouldRefresh = isRefresh
|
|
|
-
|
|
|
- if (loading.value && !shouldRefresh) {
|
|
|
- return
|
|
|
- }
|
|
|
+ const shouldRefresh = isRefresh !== false
|
|
|
|
|
|
loading.value = true
|
|
|
- if (shouldRefresh) {
|
|
|
+ if (shouldRefresh && !disablePullDown) {
|
|
|
currentPage.value = 1
|
|
|
refreshing.value = true
|
|
|
+ } else if (shouldRefresh && disablePullDown) {
|
|
|
+ // 筛选条件变化时,重置页码但不触发下拉刷新
|
|
|
+ currentPage.value = 1
|
|
|
+ // 即使禁用下拉刷新,也要确保刷新状态最终被重置
|
|
|
+ refreshing.value = false
|
|
|
+ } else {
|
|
|
+ // 对于加载更多操作,不需要显示下拉刷新状态
|
|
|
+ refreshing.value = false;
|
|
|
}
|
|
|
|
|
|
// Convert 'current' and 'prev' values to actual date strings
|
|
|
@@ -578,15 +596,33 @@
|
|
|
}
|
|
|
|
|
|
hasMore.value = orderList.value.length < responseTotal
|
|
|
- loading.value = false
|
|
|
- refreshing.value = false
|
|
|
- }).catch(() => {
|
|
|
- loading.value = false
|
|
|
- refreshing.value = false
|
|
|
+ }).catch((error) => {
|
|
|
+ console.error('获取工单列表失败:', error);
|
|
|
+ // 出错时也需要重置刷新状态
|
|
|
+ if (shouldRefresh) {
|
|
|
+ refreshing.value = false;
|
|
|
+ isRefreshing.value = false;
|
|
|
+ }
|
|
|
+ }).finally(() => {
|
|
|
+ // 无论成功还是失败,都重置所有加载状态
|
|
|
+ loading.value = false;
|
|
|
+ // 确保刷新状态最终被重置
|
|
|
+ if (shouldRefresh) {
|
|
|
+ refreshing.value = false;
|
|
|
+ // 使用setTimeout确保状态彻底重置
|
|
|
+ setTimeout(() => {
|
|
|
+ isRefreshing.value = false;
|
|
|
+ }, 50);
|
|
|
+ }
|
|
|
})
|
|
|
}
|
|
|
|
|
|
function handleSearch() {
|
|
|
+ // 添加防重复调用检查
|
|
|
+ if (loading.value) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
// 添加防抖和防止重复请求
|
|
|
if (isSearching.value) {
|
|
|
return
|
|
|
@@ -600,7 +636,7 @@
|
|
|
|
|
|
searchTimer = setTimeout(() => {
|
|
|
isSearching.value = true
|
|
|
- loadData(true)
|
|
|
+ loadData(true, true); // 添加true参数表示这是筛选条件变化触发的加载,应禁用下拉刷新
|
|
|
// 延迟重置标志位,确保请求发送后才允许下一次搜索
|
|
|
setTimeout(() => {
|
|
|
isSearching.value = false
|
|
|
@@ -609,6 +645,11 @@
|
|
|
}
|
|
|
|
|
|
function clearSearch() {
|
|
|
+ // 添加防重复调用检查
|
|
|
+ if (loading.value) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
// 添加防抖和防止重复请求
|
|
|
if (isSearching.value) {
|
|
|
return
|
|
|
@@ -623,7 +664,7 @@
|
|
|
searchKeyword.value = ""
|
|
|
searchTimer = setTimeout(() => {
|
|
|
isSearching.value = true
|
|
|
- loadData(true)
|
|
|
+ loadData(true, true); // 添加true参数表示这是筛选条件变化触发的加载,应禁用下拉刷新
|
|
|
// 延迟重置标志位,确保请求发送后才允许下一次搜索
|
|
|
setTimeout(() => {
|
|
|
isSearching.value = false
|
|
|
@@ -632,6 +673,11 @@
|
|
|
}
|
|
|
|
|
|
function filterByStatus(status: string) {
|
|
|
+ // 添加防重复调用检查
|
|
|
+ if (loading.value) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
// 添加防止重复请求
|
|
|
if (isSearching.value) {
|
|
|
return
|
|
|
@@ -646,7 +692,7 @@
|
|
|
statusFilter.value = status
|
|
|
searchTimer = setTimeout(() => {
|
|
|
isSearching.value = true
|
|
|
- loadData(true)
|
|
|
+ loadData(true, true); // 添加true参数表示这是筛选条件变化触发的加载,应禁用下拉刷新
|
|
|
getStatistics()
|
|
|
// 延迟重置标志位,确保请求发送后才允许下一次搜索
|
|
|
setTimeout(() => {
|
|
|
@@ -656,6 +702,11 @@
|
|
|
}
|
|
|
|
|
|
function changeMonth(month: string) {
|
|
|
+ // 添加防重复调用检查
|
|
|
+ if (loading.value) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
// 添加防止重复请求
|
|
|
if (isSearching.value) {
|
|
|
return
|
|
|
@@ -674,6 +725,7 @@
|
|
|
}
|
|
|
|
|
|
function loadMore() {
|
|
|
+ console.log("loadMore被触发")
|
|
|
if (!hasMore.value || loading.value) return
|
|
|
|
|
|
currentPage.value++
|
|
|
@@ -681,7 +733,36 @@
|
|
|
}
|
|
|
|
|
|
function handleRefresh() {
|
|
|
- loadData(true)
|
|
|
+ console.log("handleRefresh被触发")
|
|
|
+ console.log("loading.value===",loading.value)
|
|
|
+ console.log("isRefreshing.value===",isRefreshing.value)
|
|
|
+
|
|
|
+ // 防抖处理,避免频繁触发
|
|
|
+ const now = Date.now();
|
|
|
+ if (now - lastRefreshTime.value < 1000) {
|
|
|
+ console.log("刷新操作过于频繁,忽略本次触发");
|
|
|
+ refreshing.value = false;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ lastRefreshTime.value = now;
|
|
|
+
|
|
|
+ // 添加防重复调用检查
|
|
|
+ if (loading.value || isRefreshing.value) {
|
|
|
+ // 如果已经在加载或正在刷新,直接重置刷新状态
|
|
|
+ refreshing.value = false;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ console.log("loading.value1===",loading.value)
|
|
|
+ console.log("isRefreshing.value1===",isRefreshing.value)
|
|
|
+ // 设置刷新标志
|
|
|
+ isRefreshing.value = true;
|
|
|
+
|
|
|
+ loadData(true); // 使用默认的下拉刷新行为
|
|
|
+
|
|
|
+ // 确保在一定时间后重置刷新标志,防止意外情况
|
|
|
+ setTimeout(() => {
|
|
|
+ isRefreshing.value = false
|
|
|
+ }, 100) // 延迟重置,确保状态完全更新
|
|
|
}
|
|
|
|
|
|
// 点击列表项
|
|
|
@@ -741,6 +822,11 @@
|
|
|
clearTimeout(timer)
|
|
|
searchTimer = null
|
|
|
}
|
|
|
+
|
|
|
+ // 如果组件销毁前还有未完成的刷新操作,确保状态被重置
|
|
|
+ loading.value = false;
|
|
|
+ refreshing.value = false;
|
|
|
+ isRefreshing.value = false;
|
|
|
})
|
|
|
</script>
|
|
|
|