From 2812a2504ec3d0a98fa7e6204e6048584723adab Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期三, 08 四月 2026 14:08:34 +0800
Subject: [PATCH] #

---
 rsf-design/src/components/core/tables/art-table/index.vue                                 |    2 
 rsf-design/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue               |   22 ++
 rsf-design/src/config/modules/fastEnter.js                                                |    8 
 rsf-design/src/components/core/layouts/art-menus/art-sidebar-menu/style.scss              |   41 +++++
 rsf-design/src/hooks/core/useTable.js                                                     |  177 ++++++++++++----------
 rsf-design/src/views/basic-info/warehouse-areas/index.vue                                 |    2 
 rsf-design/src/components/core/layouts/art-settings-panel/composables/useSettingsState.js |    2 
 rsf-design/src/views/manager/stock-item/index.vue                                         |    5 
 rsf-design/src/views/orders/transfer/index.vue                                            |    2 
 rsf-design/src/plugins/iconify.js                                                         |   42 ++---
 rsf-design/src/utils/http/index.js                                                        |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WkOrderController.java |    1 
 rsf-design/src/main.js                                                                    |   22 +-
 rsf-design/src/views/basic-info/task-path-template-node/index.vue                         |    5 
 rsf-design/src/views/basic-info/loc-type/index.vue                                        |    5 
 rsf-design/src/views/orders/preparation-item/index.vue                                    |    1 
 rsf-design/src/views/basic-info/loc-area-mat-rela/index.vue                               |    1 
 rsf-server/src/main/resources/application-dev.yml                                         |    4 
 rsf-design/src/views/basic-info/device-bind/index.vue                                     |    1 
 rsf-design/src/views/auth/login/index.vue                                                 |   65 ++++++--
 rsf-design/src/views/orders/purchase-item/index.vue                                       |    1 
 rsf-design/src/views/basic-info/loc-area-mat/index.vue                                    |    2 
 rsf-design/src/views/orders/out-stock-item/index.vue                                      |    1 
 rsf-design/src/views/basic-info/task-path-template-merge/index.vue                        |    1 
 rsf-design/src/views/orders/transfer-item/index.vue                                       |    1 
 rsf-design/src/views/manager/loc-item/index.vue                                           |    1 
 rsf-design/src/views/basic-info/bas-station-area/index.vue                                |    1 
 rsf-design/src/views/orders/delivery-item/index.vue                                       |    1 
 rsf-design/src/views/basic-info/loc-area/index.vue                                        |    2 
 rsf-design/src/views/orders/asn-order-item/index.vue                                      |    1 
 rsf-design/src/views/basic-info/loc-area-rela/index.vue                                   |    5 
 31 files changed, 264 insertions(+), 163 deletions(-)

diff --git a/rsf-design/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue b/rsf-design/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue
index 4b5b501..44f5007 100644
--- a/rsf-design/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue
+++ b/rsf-design/src/components/core/layouts/art-menus/art-sidebar-menu/index.vue
@@ -69,12 +69,20 @@
       <!-- Logo -->
       <div
         class="header"
+        :class="{ 'header-dual-menu': isDualMenu }"
         @click="navigateToHome"
         :style="{
           background: getMenuTheme.background
         }"
       >
-        <ArtLogo v-if="!isDualMenu" class="logo" fill />
+        <ArtLogo v-if="!isDualMenu" class="logo" :fill="menuOpen" :size="30" />
+        <span
+          v-else-if="menuOpen"
+          class="dual-menu-system-name"
+          :style="{ color: getMenuTheme.systemNameColor }"
+        >
+          {{ systemName }}
+        </span>
       </div>
       <ElScrollbar :style="scrollbarStyle">
         <ElMenu
@@ -136,6 +144,7 @@
 
   import SidebarSubmenu from './widget/SidebarSubmenu.vue'
 
+  import AppConfig from '@/config'
   import { useSettingStore } from '@/store/modules/setting'
   import { MenuTypeEnum, MenuWidth } from '@/enums/appEnum'
   import { useMenuStore } from '@/store/modules/menu'
@@ -157,6 +166,7 @@
   const { width } = useWindowSize()
   const menuopenwidth = computed(() => getMenuOpenWidth.value)
   const menuclosewidth = computed(() => MENU_CLOSE_WIDTH)
+  const systemName = AppConfig.systemInfo.name
   const isTopLeftMenu = computed(() => menuType.value === MenuTypeEnum.TOP_LEFT)
   const showLeftMenu = computed(
     () => menuType.value === MenuTypeEnum.LEFT || menuType.value === MenuTypeEnum.TOP_LEFT
@@ -307,6 +317,16 @@
   @use './theme';
 
   .layout-sidebar {
+    .menu-left-open {
+      width: v-bind(menuopenwidth);
+      min-width: v-bind(menuopenwidth);
+    }
+
+    .menu-left-close {
+      width: v-bind(menuclosewidth);
+      min-width: v-bind(menuclosewidth);
+    }
+
     // 灞曞紑鐨勫搴�
     .el-menu:not(.el-menu--collapse) {
       width: v-bind(menuopenwidth);
diff --git a/rsf-design/src/components/core/layouts/art-menus/art-sidebar-menu/style.scss b/rsf-design/src/components/core/layouts/art-menus/art-sidebar-menu/style.scss
index 12b9ded..83d777b 100644
--- a/rsf-design/src/components/core/layouts/art-menus/art-sidebar-menu/style.scss
+++ b/rsf-design/src/components/core/layouts/art-menus/art-sidebar-menu/style.scss
@@ -105,6 +105,10 @@
     display: flex;
     flex-direction: column;
     height: 100vh;
+    overflow: hidden;
+    transition:
+      width 0.25s ease,
+      min-width 0.25s ease;
 
     @media only screen and (width <= 640px) {
       height: 100dvh;
@@ -188,6 +192,26 @@
       height: 100%;
       max-width: 126px;
       max-height: 40px;
+      transition:
+        width 0.25s ease,
+        height 0.25s ease,
+        max-width 0.25s ease,
+        max-height 0.25s ease;
+    }
+  }
+
+  .header-dual-menu {
+    justify-content: flex-start;
+
+    .dual-menu-system-name {
+      display: block;
+      width: 100%;
+      overflow: hidden;
+      font-size: 20px;
+      font-weight: 600;
+      line-height: 1.2;
+      text-overflow: ellipsis;
+      white-space: nowrap;
     }
   }
 
@@ -249,6 +273,23 @@
   }
 }
 
+@media only screen and (width > 800px) {
+  .layout-sidebar {
+    .menu-left-close {
+      .header {
+        padding: 10px;
+
+        .logo {
+          width: 30px;
+          height: 30px;
+          max-width: 30px;
+          max-height: 30px;
+        }
+      }
+    }
+  }
+}
+
 @media only screen and (width <= 640px) {
   .layout-sidebar {
     border-right: 0 !important;
diff --git a/rsf-design/src/components/core/layouts/art-settings-panel/composables/useSettingsState.js b/rsf-design/src/components/core/layouts/art-settings-panel/composables/useSettingsState.js
index ed9a46b..83756c0 100644
--- a/rsf-design/src/components/core/layouts/art-settings-panel/composables/useSettingsState.js
+++ b/rsf-design/src/components/core/layouts/art-settings-panel/composables/useSettingsState.js
@@ -24,7 +24,7 @@
       settingStore.setMenuOpen(true)
     }
     nextTick(() => {
-      settingStore.reload()
+      window.dispatchEvent(new Event('resize'))
     })
   }
   return {
diff --git a/rsf-design/src/components/core/tables/art-table/index.vue b/rsf-design/src/components/core/tables/art-table/index.vue
index 92374b1..b005e27 100644
--- a/rsf-design/src/components/core/tables/art-table/index.vue
+++ b/rsf-design/src/components/core/tables/art-table/index.vue
@@ -118,7 +118,7 @@
     }
   })
   const DEFAULT_PAGINATION_OPTIONS = {
-    pageSizes: [10, 20, 30, 50, 100],
+    pageSizes: [20, 30, 50, 100],
     align: 'center',
     background: true,
     layout: layout.value,
diff --git a/rsf-design/src/config/modules/fastEnter.js b/rsf-design/src/config/modules/fastEnter.js
index 0e85625..929d585 100644
--- a/rsf-design/src/config/modules/fastEnter.js
+++ b/rsf-design/src/config/modules/fastEnter.js
@@ -54,15 +54,9 @@
       routeName: 'Register'
     },
     {
-      name: '蹇樿瀵嗙爜',
-      enabled: true,
-      order: 3,
-      routeName: 'ForgetPassword'
-    },
-    {
       name: '涓汉涓績',
       enabled: true,
-      order: 4,
+      order: 3,
       routeName: 'UserCenter'
     }
   ]
diff --git a/rsf-design/src/hooks/core/useTable.js b/rsf-design/src/hooks/core/useTable.js
index 7525702..e9a5c83 100644
--- a/rsf-design/src/hooks/core/useTable.js
+++ b/rsf-design/src/hooks/core/useTable.js
@@ -1,5 +1,6 @@
 import { ref, reactive, computed, onMounted, onUnmounted, nextTick, readonly } from 'vue'
 import { useWindowSize } from '@vueuse/core'
+import { hash } from 'ohash'
 import { useTableColumns } from './useTableColumns'
 import { TableCache, CacheInvalidationStrategy } from '../../utils/table/tableCache'
 import {
@@ -59,12 +60,14 @@
   const error = ref(null)
   const data = ref([])
   let abortController = null
+  let inflightRequest = null
+  let inflightRequestKey = ''
   let cacheCleanupTimer = null
   const searchParams = reactive(
     Object.assign(
       {
         [pageKey]: 1,
-        [sizeKey]: 10
+        [sizeKey]: 20
       },
       apiParams || {}
     )
@@ -113,6 +116,27 @@
     cacheUpdateTrigger.value++
   }
   const fetchData = async (params, useCache = enableCache) => {
+    let requestParams = Object.assign(
+      {},
+      searchParams,
+      {
+        [pageKey]: pagination.current,
+        [sizeKey]: pagination.size
+      },
+      params || {}
+    )
+    if (excludeParams.length > 0) {
+      const filteredParams = { ...requestParams }
+      excludeParams.forEach((key) => {
+        delete filteredParams[key]
+      })
+      requestParams = filteredParams
+    }
+    const requestKey = hash(requestParams)
+    if (inflightRequest && inflightRequestKey === requestKey) {
+      logger.log('澶嶇敤杩涜涓殑璇锋眰')
+      return inflightRequest
+    }
     if (abortController) {
       abortController.abort()
     }
@@ -120,88 +144,81 @@
     abortController = currentController
     loadingState.value = 'loading'
     error.value = null
-    try {
-      let requestParams = Object.assign(
-        {},
-        searchParams,
-        {
-          [pageKey]: pagination.current,
-          [sizeKey]: pagination.size
-        },
-        params || {}
-      )
-      if (excludeParams.length > 0) {
-        const filteredParams = { ...requestParams }
-        excludeParams.forEach((key) => {
-          delete filteredParams[key]
-        })
-        requestParams = filteredParams
-      }
-      if (useCache && cache) {
-        const cachedItem = cache.get(requestParams)
-        if (cachedItem) {
-          data.value = cachedItem.data
-          updatePaginationFromResponse(pagination, cachedItem.response)
-          const paramsRecord2 = searchParams
-          if (paramsRecord2[pageKey] !== pagination.current) {
-            paramsRecord2[pageKey] = pagination.current
+    const currentRequest = (async () => {
+      try {
+        if (useCache && cache) {
+          const cachedItem = cache.get(requestParams)
+          if (cachedItem) {
+            data.value = cachedItem.data
+            updatePaginationFromResponse(pagination, cachedItem.response)
+            const paramsRecord2 = searchParams
+            if (paramsRecord2[pageKey] !== pagination.current) {
+              paramsRecord2[pageKey] = pagination.current
+            }
+            if (paramsRecord2[sizeKey] !== pagination.size) {
+              paramsRecord2[sizeKey] = pagination.size
+            }
+            loadingState.value = 'success'
+            if (onCacheHit) {
+              onCacheHit(cachedItem.data, cachedItem.response)
+            }
+            logger.log(`缂撳瓨鍛戒腑`)
+            return cachedItem.response
           }
-          if (paramsRecord2[sizeKey] !== pagination.size) {
-            paramsRecord2[sizeKey] = pagination.size
-          }
-          loadingState.value = 'success'
-          if (onCacheHit) {
-            onCacheHit(cachedItem.data, cachedItem.response)
-          }
-          logger.log(`缂撳瓨鍛戒腑`)
-          return cachedItem.response
+        }
+        const response = await apiFn(requestParams)
+        if (currentController.signal.aborted) {
+          throw new Error('璇锋眰宸插彇娑�')
+        }
+        const standardResponse = responseAdapter(response)
+        let tableData = extractTableData(standardResponse)
+        if (dataTransformer) {
+          tableData = dataTransformer(tableData)
+        }
+        data.value = tableData
+        updatePaginationFromResponse(pagination, standardResponse)
+        const paramsRecord = searchParams
+        if (paramsRecord[pageKey] !== pagination.current) {
+          paramsRecord[pageKey] = pagination.current
+        }
+        if (paramsRecord[sizeKey] !== pagination.size) {
+          paramsRecord[sizeKey] = pagination.size
+        }
+        if (useCache && cache) {
+          cache.set(requestParams, tableData, standardResponse)
+          cacheUpdateTrigger.value++
+          logger.log(`鏁版嵁宸茬紦瀛榒)
+        }
+        loadingState.value = 'success'
+        if (onSuccess) {
+          onSuccess(tableData, standardResponse)
+        }
+        return standardResponse
+      } catch (err) {
+        if (
+          err instanceof Error &&
+          (err.message === '璇锋眰宸插彇娑�' || err.code === 'REQUEST_CANCELLED')
+        ) {
+          loadingState.value = 'idle'
+          return { records: [], total: 0, current: 1, size: 10 }
+        }
+        loadingState.value = 'error'
+        data.value = []
+        const tableError = handleError(err, '鑾峰彇琛ㄦ牸鏁版嵁澶辫触')
+        throw tableError
+      } finally {
+        if (abortController === currentController) {
+          abortController = null
+        }
+        if (inflightRequest === currentRequest) {
+          inflightRequest = null
+          inflightRequestKey = ''
         }
       }
-      const response = await apiFn(requestParams)
-      if (currentController.signal.aborted) {
-        throw new Error('璇锋眰宸插彇娑�')
-      }
-      const standardResponse = responseAdapter(response)
-      let tableData = extractTableData(standardResponse)
-      if (dataTransformer) {
-        tableData = dataTransformer(tableData)
-      }
-      data.value = tableData
-      updatePaginationFromResponse(pagination, standardResponse)
-      const paramsRecord = searchParams
-      if (paramsRecord[pageKey] !== pagination.current) {
-        paramsRecord[pageKey] = pagination.current
-      }
-      if (paramsRecord[sizeKey] !== pagination.size) {
-        paramsRecord[sizeKey] = pagination.size
-      }
-      if (useCache && cache) {
-        cache.set(requestParams, tableData, standardResponse)
-        cacheUpdateTrigger.value++
-        logger.log(`鏁版嵁宸茬紦瀛榒)
-      }
-      loadingState.value = 'success'
-      if (onSuccess) {
-        onSuccess(tableData, standardResponse)
-      }
-      return standardResponse
-    } catch (err) {
-      if (
-        err instanceof Error &&
-        (err.message === '璇锋眰宸插彇娑�' || err.code === 'REQUEST_CANCELLED')
-      ) {
-        loadingState.value = 'idle'
-        return { records: [], total: 0, current: 1, size: 10 }
-      }
-      loadingState.value = 'error'
-      data.value = []
-      const tableError = handleError(err, '鑾峰彇琛ㄦ牸鏁版嵁澶辫触')
-      throw tableError
-    } finally {
-      if (abortController === currentController) {
-        abortController = null
-      }
-    }
+    })()
+    inflightRequest = currentRequest
+    inflightRequestKey = requestKey
+    return currentRequest
   }
   const getData = async (params) => {
     try {
diff --git a/rsf-design/src/main.js b/rsf-design/src/main.js
index 2876cc7..a3cf17b 100644
--- a/rsf-design/src/main.js
+++ b/rsf-design/src/main.js
@@ -10,12 +10,18 @@
 import { registerLocalIconCollections } from './plugins/iconify'
 import { setupErrorHandle } from './utils/sys/error-handle'
 document.addEventListener('touchstart', function () {}, { passive: false })
-registerLocalIconCollections()
-const app = createApp(App)
 
-initStore(app)
-initRouter(app)
-setupGlobDirectives(app)
-setupErrorHandle(app)
-app.use(language)
-app.mount('#app')
+async function bootstrap() {
+  await registerLocalIconCollections()
+
+  const app = createApp(App)
+
+  initStore(app)
+  initRouter(app)
+  setupGlobDirectives(app)
+  setupErrorHandle(app)
+  app.use(language)
+  app.mount('#app')
+}
+
+void bootstrap()
diff --git a/rsf-design/src/plugins/iconify.js b/rsf-design/src/plugins/iconify.js
index 1895fc7..1bbd4a0 100644
--- a/rsf-design/src/plugins/iconify.js
+++ b/rsf-design/src/plugins/iconify.js
@@ -1,36 +1,26 @@
 import { addCollection } from '@iconify/vue/offline'
-import { icons as fluentIcons } from '@iconify-json/fluent'
-import { icons as iconParkOutlineIcons } from '@iconify-json/icon-park-outline'
-import { icons as iconamoonIcons } from '@iconify-json/iconamoon'
-import { icons as ixIcons } from '@iconify-json/ix'
-import { icons as lineMdIcons } from '@iconify-json/line-md'
-import { icons as remixIcons } from '@iconify-json/ri'
-import { icons as svgSpinnersIcons } from '@iconify-json/svg-spinners'
-import { icons as systemUiconsIcons } from '@iconify-json/system-uicons'
-import { icons as vaadinIcons } from '@iconify-json/vaadin'
 
 let iconCollectionsRegistered = false
+let iconCollectionsPromise = null
 
-export const LOCAL_ICON_COLLECTIONS = Object.freeze({
-  fluent: fluentIcons,
-  'icon-park-outline': iconParkOutlineIcons,
-  iconamoon: iconamoonIcons,
-  ix: ixIcons,
-  'line-md': lineMdIcons,
-  ri: remixIcons,
-  'svg-spinners': svgSpinnersIcons,
-  'system-uicons': systemUiconsIcons,
-  vaadin: vaadinIcons
-})
-
-export function registerLocalIconCollections() {
+export async function registerLocalIconCollections() {
   if (iconCollectionsRegistered) {
     return
   }
 
-  Object.values(LOCAL_ICON_COLLECTIONS).forEach((collection) => {
-    addCollection(collection)
-  })
+  if (!iconCollectionsPromise) {
+    iconCollectionsPromise = import('./iconify.collections.js')
+      .then(({ LOCAL_ICON_COLLECTIONS }) => {
+        Object.values(LOCAL_ICON_COLLECTIONS).forEach((collection) => {
+          addCollection(collection)
+        })
+        iconCollectionsRegistered = true
+      })
+      .catch((error) => {
+        iconCollectionsPromise = null
+        throw error
+      })
+  }
 
-  iconCollectionsRegistered = true
+  await iconCollectionsPromise
 }
diff --git a/rsf-design/src/utils/http/index.js b/rsf-design/src/utils/http/index.js
index b9205e5..64720ae 100644
--- a/rsf-design/src/utils/http/index.js
+++ b/rsf-design/src/utils/http/index.js
@@ -3,7 +3,7 @@
 import { ApiStatus } from './status'
 import { HttpError, handleError, showError, showSuccess } from './error'
 import { $t } from '@/locales'
-const REQUEST_TIMEOUT = 15e3
+const REQUEST_TIMEOUT = 30e3
 const LOGOUT_DELAY = 500
 const MAX_RETRIES = 0
 const RETRY_DELAY = 1e3
diff --git a/rsf-design/src/views/auth/login/index.vue b/rsf-design/src/views/auth/login/index.vue
index 57fe948..1933d53 100644
--- a/rsf-design/src/views/auth/login/index.vue
+++ b/rsf-design/src/views/auth/login/index.vue
@@ -10,7 +10,26 @@
         <div class="form">
           <h3 class="title">{{ $t('login.title') }}</h3>
           <p class="sub-title">{{ $t('login.subTitle') }}</p>
+          <div v-if="initLoading" class="mt-6">
+            <ElSkeleton :rows="6" animated />
+          </div>
+
+          <ElResult
+            v-else-if="initErrorMessage"
+            class="mt-6"
+            icon="error"
+            :title="$t('crud.messages.loadFailed')"
+            :sub-title="initErrorMessage"
+          >
+            <template #extra>
+              <ElButton type="primary" @click="handleRetryInit" v-ripple>
+                {{ $t('common.actions.reload') }}
+              </ElButton>
+            </template>
+          </ElResult>
+
           <ElForm
+            v-else
             ref="formRef"
             :model="formData"
             :rules="rules"
@@ -24,6 +43,7 @@
                 class="custom-height"
                 :placeholder="$t('login.placeholder.username')"
                 v-model.trim="formData.username"
+                :disabled="loading"
               />
             </ElFormItem>
             <ElFormItem prop="password">
@@ -34,6 +54,7 @@
                 type="password"
                 autocomplete="off"
                 show-password
+                :disabled="loading"
               />
             </ElFormItem>
             <ElFormItem v-if="requiresTenantSelection" prop="tenantId">
@@ -44,6 +65,7 @@
                 filterable
                 :loading="tenantLoading"
                 :placeholder="$t('login.placeholder.tenant')"
+                :disabled="loading || tenantLoading"
               >
                 <ElOption
                   v-for="tenant in tenantOptions"
@@ -54,13 +76,10 @@
               </ElSelect>
             </ElFormItem>
 
-            <div class="flex-cb mt-2 text-sm">
-              <ElCheckbox v-model="formData.rememberPassword">{{
+            <div class="mt-2 text-sm">
+              <ElCheckbox v-model="formData.rememberPassword" :disabled="loading">{{
                 $t('login.rememberPwd')
               }}</ElCheckbox>
-              <RouterLink class="text-theme" :to="{ name: 'ForgetPassword' }">{{
-                $t('login.forgetPwd')
-              }}</RouterLink>
             </div>
 
             <div style="margin-top: 30px">
@@ -69,18 +88,12 @@
                 type="primary"
                 @click="handleSubmit"
                 :loading="loading"
+                :disabled="loading"
                 v-ripple
               >
                 {{ $t('login.btnText') }}
               </ElButton>
             </div>
-
-<!--            <div class="mt-5 text-sm text-gray-600">-->
-<!--              <span>{{ $t('login.noAccount') }}</span>-->
-<!--              <RouterLink class="text-theme" :to="{ name: 'Register' }">{{-->
-<!--                $t('login.register')-->
-<!--              }}</RouterLink>-->
-<!--            </div>-->
           </ElForm>
         </div>
       </div>
@@ -130,6 +143,8 @@
       : []
   }))
   const loading = ref(false)
+  const initLoading = ref(true)
+  const initErrorMessage = ref('')
 
   const hydrateRememberedLogin = () => {
     const rememberEnabled =
@@ -184,6 +199,22 @@
     }
   }
 
+  const initializeLoginPage = async () => {
+    initLoading.value = true
+    initErrorMessage.value = ''
+    try {
+      await loadLoginSupports()
+      await nextTick()
+      formRef.value?.clearValidate()
+    } catch (error) {
+      tenantOptions.value = []
+      formData.tenantId = ''
+      initErrorMessage.value = error?.message || t('httpMsg.requestFailed')
+    } finally {
+      initLoading.value = false
+    }
+  }
+
   const persistRememberedLogin = () => {
     localStorage.setItem(
       StorageConfig.LOGIN_REMEMBER_ENABLED_KEY,
@@ -202,7 +233,7 @@
   }
 
   const handleSubmit = async () => {
-    if (!formRef.value) return
+    if (!formRef.value || initLoading.value || initErrorMessage.value) return
     try {
       const valid = await formRef.value.validate()
       if (!valid) return
@@ -225,6 +256,10 @@
     }
   }
 
+  const handleRetryInit = () => {
+    void initializeLoginPage()
+  }
+
   watch(
     () => formData.tenantId,
     (value) => {
@@ -236,9 +271,7 @@
 
   onMounted(async () => {
     hydrateRememberedLogin()
-    await loadLoginSupports()
-    await nextTick()
-    formRef.value?.clearValidate()
+    await initializeLoginPage()
   })
 
   const showLoginSuccessNotice = () => {
diff --git a/rsf-design/src/views/basic-info/bas-station-area/index.vue b/rsf-design/src/views/basic-info/bas-station-area/index.vue
index 95f6f39..2d450d5 100644
--- a/rsf-design/src/views/basic-info/bas-station-area/index.vue
+++ b/rsf-design/src/views/basic-info/bas-station-area/index.vue
@@ -492,6 +492,7 @@
     core: {
       apiFn: fetchBasStationAreaPage,
       apiParams: buildBasStationAreaPageQueryParams(searchForm.value),
+      immediate: false,
       paginationKey: getBasStationAreaPaginationKey(),
       columnsFactory: () =>
         createBasStationAreaTableColumns({
diff --git a/rsf-design/src/views/basic-info/device-bind/index.vue b/rsf-design/src/views/basic-info/device-bind/index.vue
index 091c9b4..0857025 100644
--- a/rsf-design/src/views/basic-info/device-bind/index.vue
+++ b/rsf-design/src/views/basic-info/device-bind/index.vue
@@ -319,6 +319,7 @@
       core: {
         apiFn: fetchDeviceBindPage,
         apiParams: buildDeviceBindPageQueryParams(searchForm.value),
+        immediate: false,
         paginationKey: getDeviceBindPaginationKey(),
         columnsFactory: () =>
           createDeviceBindTableColumns({
diff --git a/rsf-design/src/views/basic-info/loc-area-mat-rela/index.vue b/rsf-design/src/views/basic-info/loc-area-mat-rela/index.vue
index 7194e06..6f29db9 100644
--- a/rsf-design/src/views/basic-info/loc-area-mat-rela/index.vue
+++ b/rsf-design/src/views/basic-info/loc-area-mat-rela/index.vue
@@ -306,6 +306,7 @@
     core: {
       apiFn: fetchLocAreaMatRelaPage,
       apiParams: buildLocAreaMatRelaPageQueryParams(searchForm.value),
+      immediate: false,
       paginationKey: getLocAreaMatRelaPaginationKey(),
       columnsFactory: () =>
         createLocAreaMatRelaTableColumns({
diff --git a/rsf-design/src/views/basic-info/loc-area-mat/index.vue b/rsf-design/src/views/basic-info/loc-area-mat/index.vue
index d81b1d6..39ae6d3 100644
--- a/rsf-design/src/views/basic-info/loc-area-mat/index.vue
+++ b/rsf-design/src/views/basic-info/loc-area-mat/index.vue
@@ -360,6 +360,6 @@
   }
 
   onMounted(async () => {
-    await Promise.all([loadWarehouseOptions(), loadAreaOptions(), getData()])
+    await Promise.all([loadWarehouseOptions(), loadAreaOptions()])
   })
 </script>
diff --git a/rsf-design/src/views/basic-info/loc-area-rela/index.vue b/rsf-design/src/views/basic-info/loc-area-rela/index.vue
index 34c5be8..8d78dd6 100644
--- a/rsf-design/src/views/basic-info/loc-area-rela/index.vue
+++ b/rsf-design/src/views/basic-info/loc-area-rela/index.vue
@@ -68,7 +68,7 @@
 </template>
 
 <script setup>
-  import { computed, onMounted, ref } from 'vue'
+  import { computed, ref } from 'vue'
   import { ElMessage } from 'element-plus'
   import { useUserStore } from '@/store/modules/user'
   import { useAuth } from '@/hooks/core/useAuth'
@@ -355,7 +355,4 @@
     resetSearchParams()
   }
 
-  onMounted(async () => {
-    await getData()
-  })
 </script>
diff --git a/rsf-design/src/views/basic-info/loc-area/index.vue b/rsf-design/src/views/basic-info/loc-area/index.vue
index 8d3032c..05b37c7 100644
--- a/rsf-design/src/views/basic-info/loc-area/index.vue
+++ b/rsf-design/src/views/basic-info/loc-area/index.vue
@@ -340,6 +340,6 @@
   }
 
   onMounted(async () => {
-    await Promise.all([loadAreaOptions(), getData()])
+    await Promise.all([loadAreaOptions()])
   })
 </script>
diff --git a/rsf-design/src/views/basic-info/loc-type/index.vue b/rsf-design/src/views/basic-info/loc-type/index.vue
index b686593..a4d751c 100644
--- a/rsf-design/src/views/basic-info/loc-type/index.vue
+++ b/rsf-design/src/views/basic-info/loc-type/index.vue
@@ -68,7 +68,7 @@
 </template>
 
 <script setup>
-  import { computed, onMounted, ref } from 'vue'
+  import { computed, ref } from 'vue'
   import { ElMessage } from 'element-plus'
   import { useUserStore } from '@/store/modules/user'
   import { useAuth } from '@/hooks/core/useAuth'
@@ -336,7 +336,4 @@
     resetSearchParams()
   }
 
-  onMounted(async () => {
-    await getData()
-  })
 </script>
diff --git a/rsf-design/src/views/basic-info/task-path-template-merge/index.vue b/rsf-design/src/views/basic-info/task-path-template-merge/index.vue
index 7203b7f..61fa1ca 100644
--- a/rsf-design/src/views/basic-info/task-path-template-merge/index.vue
+++ b/rsf-design/src/views/basic-info/task-path-template-merge/index.vue
@@ -198,6 +198,7 @@
       core: {
         apiFn: fetchTaskPathTemplateMergePage,
         apiParams: buildTaskPathTemplateMergePageQueryParams(searchForm.value),
+        immediate: false,
         paginationKey: getTaskPathTemplateMergePaginationKey(),
         columnsFactory: () =>
           createTaskPathTemplateMergeTableColumns({
diff --git a/rsf-design/src/views/basic-info/task-path-template-node/index.vue b/rsf-design/src/views/basic-info/task-path-template-node/index.vue
index be5aefa..7bd171a 100644
--- a/rsf-design/src/views/basic-info/task-path-template-node/index.vue
+++ b/rsf-design/src/views/basic-info/task-path-template-node/index.vue
@@ -53,7 +53,7 @@
 </template>
 
 <script setup>
-  import { computed, onMounted, ref } from 'vue'
+  import { computed, ref } from 'vue'
   import { ElMessage } from 'element-plus'
   import { useAuth } from '@/hooks/core/useAuth'
   import { useTable } from '@/hooks/core/useTable'
@@ -356,7 +356,4 @@
     resetSearchParams()
   }
 
-  onMounted(() => {
-    getData()
-  })
 </script>
diff --git a/rsf-design/src/views/basic-info/warehouse-areas/index.vue b/rsf-design/src/views/basic-info/warehouse-areas/index.vue
index c6fd0de..ece184e 100644
--- a/rsf-design/src/views/basic-info/warehouse-areas/index.vue
+++ b/rsf-design/src/views/basic-info/warehouse-areas/index.vue
@@ -411,6 +411,6 @@
   }
 
   onMounted(async () => {
-    await Promise.all([loadWarehouseOptions(), loadTypeOptions(), getData()])
+    await Promise.all([loadWarehouseOptions(), loadTypeOptions()])
   })
 </script>
diff --git a/rsf-design/src/views/manager/loc-item/index.vue b/rsf-design/src/views/manager/loc-item/index.vue
index 7762814..aec3c65 100644
--- a/rsf-design/src/views/manager/loc-item/index.vue
+++ b/rsf-design/src/views/manager/loc-item/index.vue
@@ -184,6 +184,7 @@
           { timeoutMessage: t('pages.manager.locItem.messages.pageTimeout') }
         ),
       apiParams: buildLocItemPageQueryParams(searchForm.value),
+      immediate: false,
       paginationKey: getLocItemPaginationKey()
     },
     transform: {
diff --git a/rsf-design/src/views/manager/stock-item/index.vue b/rsf-design/src/views/manager/stock-item/index.vue
index 163acd7..4856e85 100644
--- a/rsf-design/src/views/manager/stock-item/index.vue
+++ b/rsf-design/src/views/manager/stock-item/index.vue
@@ -75,7 +75,7 @@
 </template>
 
 <script setup>
-  import { computed, onMounted, reactive, ref } from 'vue'
+  import { computed, reactive, ref } from 'vue'
   import { ElMessage } from 'element-plus'
   import { useUserStore } from '@/store/modules/user'
   import { useTable } from '@/hooks/core/useTable'
@@ -486,7 +486,4 @@
     })
   )
 
-  onMounted(() => {
-    getData()
-  })
 </script>
diff --git a/rsf-design/src/views/orders/asn-order-item/index.vue b/rsf-design/src/views/orders/asn-order-item/index.vue
index 91fe80f..7b3cb5b 100644
--- a/rsf-design/src/views/orders/asn-order-item/index.vue
+++ b/rsf-design/src/views/orders/asn-order-item/index.vue
@@ -268,6 +268,7 @@
         pageSize: DEFAULT_PAGE_SIZE,
         orderBy: 'id desc'
       }),
+      immediate: false,
       columnsFactory: () =>
         createAsnOrderItemTableColumns({
           handleView: openDetail,
diff --git a/rsf-design/src/views/orders/delivery-item/index.vue b/rsf-design/src/views/orders/delivery-item/index.vue
index 609f5c1..0c0f089 100644
--- a/rsf-design/src/views/orders/delivery-item/index.vue
+++ b/rsf-design/src/views/orders/delivery-item/index.vue
@@ -178,6 +178,7 @@
         ...searchForm.value,
         pageSize: 20
       }),
+      immediate: false,
       columnsFactory: () => createDeliveryItemTableColumns({ handleActionClick: openDetail, t })
     },
     transform: {
diff --git a/rsf-design/src/views/orders/out-stock-item/index.vue b/rsf-design/src/views/orders/out-stock-item/index.vue
index 555e0ae..9fc2e00 100644
--- a/rsf-design/src/views/orders/out-stock-item/index.vue
+++ b/rsf-design/src/views/orders/out-stock-item/index.vue
@@ -221,6 +221,7 @@
         ...searchForm.value,
         pageSize: 20
       }),
+      immediate: false,
       columnsFactory: () => createOutStockItemTableColumns({ handleActionClick: openDetail, t })
     },
     transform: {
diff --git a/rsf-design/src/views/orders/preparation-item/index.vue b/rsf-design/src/views/orders/preparation-item/index.vue
index 60cb842..2631793 100644
--- a/rsf-design/src/views/orders/preparation-item/index.vue
+++ b/rsf-design/src/views/orders/preparation-item/index.vue
@@ -241,6 +241,7 @@
     core: {
       apiFn: fetchPreparationItemPage,
       apiParams: buildPreparationItemPageQueryParams(searchForm.value),
+      immediate: false,
       paginationKey: getPreparationItemPaginationKey(),
       columnsFactory: () => createOutStockItemTableColumns({ handleActionClick: openDetail })
     },
diff --git a/rsf-design/src/views/orders/purchase-item/index.vue b/rsf-design/src/views/orders/purchase-item/index.vue
index f120beb..75e2d99 100644
--- a/rsf-design/src/views/orders/purchase-item/index.vue
+++ b/rsf-design/src/views/orders/purchase-item/index.vue
@@ -278,6 +278,7 @@
       core: {
         apiFn: fetchPurchaseItemPage,
         apiParams: buildPurchaseItemPageQueryParams(searchForm.value),
+        immediate: false,
         paginationKey: getPurchaseItemPaginationKey(),
         columnsFactory: () =>
           createPurchaseItemTableColumns({
diff --git a/rsf-design/src/views/orders/transfer-item/index.vue b/rsf-design/src/views/orders/transfer-item/index.vue
index 3dc2aee..f0f001c 100644
--- a/rsf-design/src/views/orders/transfer-item/index.vue
+++ b/rsf-design/src/views/orders/transfer-item/index.vue
@@ -353,6 +353,7 @@
     core: {
       apiFn: fetchTransferItemPage,
       apiParams: buildTransferItemPageQueryParams(searchForm.value),
+      immediate: false,
       paginationKey: getTransferItemPaginationKey(),
       columnsFactory: () =>
         createTransferItemTableColumns({
diff --git a/rsf-design/src/views/orders/transfer/index.vue b/rsf-design/src/views/orders/transfer/index.vue
index 2088f25..3de4a1d 100644
--- a/rsf-design/src/views/orders/transfer/index.vue
+++ b/rsf-design/src/views/orders/transfer/index.vue
@@ -484,6 +484,6 @@
   )
 
   onMounted(async () => {
-    await Promise.allSettled([loadTypeOptions(), loadAreaOptions(), getData()])
+    await Promise.allSettled([loadTypeOptions(), loadAreaOptions()])
   })
 </script>
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WkOrderController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WkOrderController.java
index d22eb63..c7c5377 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WkOrderController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WkOrderController.java
@@ -63,6 +63,7 @@
         QueryWrapper<WkOrder> queryWrapper = pageParam.buildWrapper(true);
         List<String> asList = Arrays.asList(OrderType.ORDER_IN.type);
         queryWrapper.in("type", asList);
+        pageParam.setSearchCount(false);
         return R.ok().add(asnOrderService.page(pageParam, queryWrapper));
     }
 
diff --git a/rsf-server/src/main/resources/application-dev.yml b/rsf-server/src/main/resources/application-dev.yml
index c0b446f..5e7940f 100644
--- a/rsf-server/src/main/resources/application-dev.yml
+++ b/rsf-server/src/main/resources/application-dev.yml
@@ -114,8 +114,8 @@
 
 pressure:
   asn-order:
-    enabled: true
+    enabled: false
     cron: "0/10 * * * * ?"
     order-count-per-run: 2000
-    item-count-per-order: 10
+    item-count-per-order: 1
     item-qty: 10.0

--
Gitblit v1.9.1