ソースを参照

修复配送预警区域Tab筛选与侧栏刷新展开不稳定问题。

为保证页面交互一致性,补齐后端 regionId 过滤并统一前端区域ID处理,同时在侧栏菜单数据变更后主动同步展开状态。

Made-with: Cursor
zlwu 6 ヶ月 前
親
コミット
3eb9e14ed4

+ 10 - 0
backend/app/api/delivery_warning.py

@@ -151,6 +151,7 @@ def get_warning_list(
     page: int = Query(1, ge=1, description="页码"),
     pageSize: int = Query(20, ge=1, le=100, description="每页条数", alias="pageSize"),
     warningType: Optional[str] = Query(None, description="预警类型", alias="warningType"),
+    regionId: Optional[str] = Query(None, description="区域ID", alias="regionId"),
     status: Optional[str] = Query(None, description="状态(pending/handled)"),
     isResolved: Optional[bool] = Query(None, description="是否已解决", alias="isResolved"),
     db: Session = Depends(get_db),
@@ -165,6 +166,15 @@ def get_warning_list(
         if warningType:
             query = query.filter(delivery_warning_crud.model.warning_type == warningType)
 
+        if regionId:
+            query = query.join(
+                BizDeliveryTask,
+                and_(
+                    BizDeliveryTask.id == delivery_warning_crud.model.task_id,
+                    BizDeliveryTask.is_del == 0
+                )
+            ).filter(BizDeliveryTask.region_id == regionId)
+
         # 兼容前端传入的 isResolved 参数
         if isResolved is not None:
             query = query.filter(delivery_warning_crud.model.is_resolved == (1 if isResolved else 0))

+ 23 - 0
web-admin/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue

@@ -94,6 +94,7 @@
       </div>
       <ElScrollbar :style="scrollbarStyle">
         <ElMenu
+          ref="menuRef"
           :class="'el-menu-' + getMenuTheme.theme"
           :collapse="!menuOpen"
           :default-active="routerPath"
@@ -161,6 +162,7 @@
 
   // 组件内部状态
   const defaultOpenedMenus = ref<string[]>([])
+  const menuRef = ref<any>(null)
   const isMobileMode = ref(false)
   const showMobileModal = ref(false)
 
@@ -230,6 +232,22 @@
     return openIndexes
   }
 
+  /**
+   * Element Plus 的 default-openeds 仅在初始化时生效,
+   * 这里在菜单数据变更后主动展开,避免刷新后展开状态不一致。
+   */
+  const syncExpandedMenus = async (): Promise<void> => {
+    if (isMobileScreen.value || !menuOpen.value) return
+
+    await nextTick()
+    const menuInstance = menuRef.value
+    if (!menuInstance?.open) return
+
+    defaultOpenedMenus.value.forEach((index) => {
+      menuInstance.open(index)
+    })
+  }
+
   // 双列菜单收起时的滚动条样式
   const scrollbarStyle = computed(() => {
     const isCollapsed = isDualMenu.value && !menuOpen.value
@@ -358,9 +376,14 @@
     menuList,
     (list) => {
       defaultOpenedMenus.value = collectOpenMenuIndexes(list || [])
+      syncExpandedMenus()
     },
     { immediate: true, deep: true }
   )
+
+  watch([menuOpen, isMobileScreen], () => {
+    syncExpandedMenus()
+  })
 </script>
 
 <style lang="scss" scoped>

+ 8 - 6
web-admin/src/views/system/delivery-warning/index.vue

@@ -689,19 +689,21 @@
       const res = await fetchNotDeletedRegions()
       regionList.value = res
       if (!activeRegionId.value && allowedRegionList.value.length > 0) {
-        activeRegionId.value = allowedRegionList.value[0].id
+        activeRegionId.value = String(allowedRegionList.value[0].id)
       }
       if (activeRegionId.value) {
-        searchForm.regionId = activeRegionId.value
+        searchForm.regionId = String(activeRegionId.value)
       }
     } catch (error) {
       console.error('加载区域失败:', error)
     }
   }
-  const selectRegionTab = (regionId: string) => {
-    if (!regionId || activeRegionId.value === regionId) return
-    activeRegionId.value = regionId
-    searchForm.regionId = regionId
+  const selectRegionTab = (regionId: string | number) => {
+    const nextRegionId = String(regionId || '')
+    if (!nextRegionId) return
+    if (activeRegionId.value === nextRegionId) return
+    activeRegionId.value = nextRegionId
+    searchForm.regionId = nextRegionId
     pagination.page = 1
     loadData()
   }