Преглед на файлове

Merge branch 'master' of http://222.243.138.146:2000/ygtx/gxt_app

wuhb преди 4 месеца
родител
ревизия
e06f0a8418
променени са 1 файла, в които са добавени 104 реда и са изтрити 18 реда
  1. 104 18
      pages/score/index.uvue

+ 104 - 18
pages/score/index.uvue

@@ -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>