From 33bd4dd1f0e41131cd8e5bbf87204a1f0b72bb08 Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期六, 11 四月 2026 07:45:59 +0800
Subject: [PATCH] #页面优化

---
 rsf-design/src/views/orders/wave/index.vue |  241 +++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 208 insertions(+), 33 deletions(-)

diff --git a/rsf-design/src/views/orders/wave/index.vue b/rsf-design/src/views/orders/wave/index.vue
index 7b2a419..5c36af9 100644
--- a/rsf-design/src/views/orders/wave/index.vue
+++ b/rsf-design/src/views/orders/wave/index.vue
@@ -11,20 +11,44 @@
     <ElCard class="art-table-card">
       <ArtTableHeader v-model:columns="columnChecks" :loading="loading" @refresh="refreshData">
         <template #left>
-          <ListExportPrint
-            :preview-visible="previewVisible"
-            @update:previewVisible="handlePreviewVisibleChange"
-            :report-title="reportTitle"
-            :selected-rows="selectedRows"
-            :query-params="reportQueryParams"
-            :columns="columns"
-            :preview-rows="previewRows"
-            :preview-meta="resolvedPreviewMeta"
-            :total="pagination.total"
-            :disabled="loading"
-            @export="handleExport"
-            @print="handlePrint"
-          />
+          <ElSpace wrap>
+            <ElButton
+              type="primary"
+              :loading="batchTaskSubmitting"
+              :disabled="loading || batchTaskSubmitting || !selectedRows.length"
+              @click="handleBatchPublicTask"
+            >
+              {{ t('pages.orders.wave.buttons.batchPublicTask') }}
+            </ElButton>
+            <ElButton
+              :loading="autoExceSubmitting"
+              :disabled="loading || autoExceSubmitting || autoExce"
+              @click="toggleAutoExce(true)"
+            >
+              {{ t('pages.orders.wave.buttons.autoStart') }}
+            </ElButton>
+            <ElButton
+              :loading="autoExceSubmitting"
+              :disabled="loading || autoExceSubmitting || !autoExce"
+              @click="toggleAutoExce(false)"
+            >
+              {{ t('pages.orders.wave.buttons.autoPause') }}
+            </ElButton>
+            <ListExportPrint
+              :preview-visible="previewVisible"
+              @update:previewVisible="handlePreviewVisibleChange"
+              :report-title="reportTitle"
+              :selected-rows="selectedRows"
+              :query-params="reportQueryParams"
+              :columns="columns"
+              :preview-rows="previewRows"
+              :preview-meta="resolvedPreviewMeta"
+              :total="pagination.total"
+              :disabled="loading"
+              @export="handleExport"
+              @print="handlePrint"
+            />
+          </ElSpace>
         </template>
       </ArtTableHeader>
 
@@ -68,8 +92,8 @@
 </template>
 
 <script setup>
-  import { computed, reactive, ref } from 'vue'
-  import { ElMessage, ElMessageBox } from 'element-plus'
+  import { computed, onMounted, reactive, ref } from 'vue'
+  import { ElButton, ElMessage, ElMessageBox, ElSpace } from 'element-plus'
   import { useI18n } from 'vue-i18n'
   import { useUserStore } from '@/store/modules/user'
   import { useTable } from '@/hooks/core/useTable'
@@ -101,7 +125,10 @@
     fetchGetWaveMany,
     fetchPauseWave,
     fetchPublicWaveTask,
+    fetchSelectWaveTask,
     fetchStopWave,
+    fetchUpdateWaveAutoExceFlag,
+    fetchWaveAutoExceFlag,
     fetchWavePage,
     fetchWavePreviewPage
   } from '@/api/wave'
@@ -125,6 +152,9 @@
   const publicTaskSubmitting = ref(false)
   const publicTaskWave = ref({})
   const publicTaskRows = ref([])
+  const autoExce = ref(false)
+  const batchTaskSubmitting = ref(false)
+  const autoExceSubmitting = ref(false)
 
   const detailPagination = reactive({
     current: 1,
@@ -142,7 +172,9 @@
   const detailColumns = computed(() => createWaveDetailItemColumns(t))
   const publicTaskColumns = computed(() => createWavePreviewItemColumns(t))
   const publicTaskCanSubmit = computed(
-    () => publicTaskRows.value.length > 0 && publicTaskRows.value.every((row) => row.stockLocsText && row.stockLocsText !== '[]')
+    () =>
+      publicTaskRows.value.length > 0 &&
+      publicTaskRows.value.every((row) => row.stockLocsText && row.stockLocsText !== '[]')
   )
   const publicTaskWarningText = computed(() => t('pages.orders.wave.messages.publicTaskWarning'))
   const searchItems = computed(() => [
@@ -185,6 +217,36 @@
       }
     },
     {
+      label: t('pages.orders.wave.search.anfme'),
+      key: 'anfme',
+      type: 'inputNumber',
+      props: {
+        clearable: true,
+        controlsPosition: 'right',
+        placeholder: t('pages.orders.wave.search.anfmePlaceholder')
+      }
+    },
+    {
+      label: t('pages.orders.wave.search.qty'),
+      key: 'qty',
+      type: 'inputNumber',
+      props: {
+        clearable: true,
+        controlsPosition: 'right',
+        placeholder: t('pages.orders.wave.search.qtyPlaceholder')
+      }
+    },
+    {
+      label: t('pages.orders.wave.search.orderNum'),
+      key: 'orderNum',
+      type: 'inputNumber',
+      props: {
+        clearable: true,
+        controlsPosition: 'right',
+        placeholder: t('pages.orders.wave.search.orderNumPlaceholder')
+      }
+    },
+    {
       label: t('pages.orders.wave.search.status'),
       key: 'status',
       type: 'select',
@@ -202,8 +264,18 @@
       type: 'input',
       props: { clearable: true, placeholder: t('pages.orders.wave.search.memoPlaceholder') }
     },
-    { label: t('pages.orders.wave.search.timeStart'), key: 'timeStart', type: 'date', props: { clearable: true, type: 'date', valueFormat: 'YYYY-MM-DD' } },
-    { label: t('pages.orders.wave.search.timeEnd'), key: 'timeEnd', type: 'date', props: { clearable: true, type: 'date', valueFormat: 'YYYY-MM-DD' } }
+    {
+      label: t('pages.orders.wave.search.timeStart'),
+      key: 'timeStart',
+      type: 'date',
+      props: { clearable: true, type: 'date', valueFormat: 'YYYY-MM-DD' }
+    },
+    {
+      label: t('pages.orders.wave.search.timeEnd'),
+      key: 'timeEnd',
+      type: 'date',
+      props: { clearable: true, type: 'date', valueFormat: 'YYYY-MM-DD' }
+    }
   ])
 
   function updatePaginationState(target, response, fallbackCurrent, fallbackSize) {
@@ -254,11 +326,15 @@
         return
       }
       if (action.key === 'stop') {
-        await ElMessageBox.confirm(t('pages.orders.wave.messages.stopConfirm', { code: row.code || '' }), t('pages.orders.wave.messages.stopTitle'), {
-          confirmButtonText: t('common.confirm'),
-          cancelButtonText: t('common.cancel'),
-          type: 'warning'
-        })
+        await ElMessageBox.confirm(
+          t('pages.orders.wave.messages.stopConfirm', { code: row.code || '' }),
+          t('pages.orders.wave.messages.stopTitle'),
+          {
+            confirmButtonText: t('common.confirm'),
+            cancelButtonText: t('common.cancel'),
+            type: 'warning'
+          }
+        )
         await fetchStopWave(row.id)
         ElMessage.success(t('pages.orders.wave.messages.stopSuccess'))
         await refreshData()
@@ -288,7 +364,8 @@
       columnsFactory: () => createWaveTableColumns({ handleActionClick, t })
     },
     transform: {
-      dataTransformer: (records) => (Array.isArray(records) ? records.map((item) => normalizeWaveRow(item, t)) : [])
+      dataTransformer: (records) =>
+        Array.isArray(records) ? records.map((item) => normalizeWaveRow(item, t)) : []
     }
   })
 
@@ -300,16 +377,33 @@
     detailLoading.value = true
     try {
       const [detailResponse, previewResponse] = await Promise.all([
-        guardRequestWithMessage(fetchGetWaveDetail(activeWaveId.value), {}, { timeoutMessage: t('pages.orders.wave.messages.detailTimeout') }),
         guardRequestWithMessage(
-          fetchWavePreviewPage(buildWaveDetailQueryParams({ waveId: activeWaveId.value, current: detailPagination.current, pageSize: detailPagination.size })),
+          fetchGetWaveDetail(activeWaveId.value),
+          {},
+          { timeoutMessage: t('pages.orders.wave.messages.detailTimeout') }
+        ),
+        guardRequestWithMessage(
+          fetchWavePreviewPage(
+            buildWaveDetailQueryParams({
+              waveId: activeWaveId.value,
+              current: detailPagination.current,
+              pageSize: detailPagination.size
+            })
+          ),
           { records: [], total: 0, current: detailPagination.current, size: detailPagination.size },
           { timeoutMessage: t('pages.orders.wave.messages.previewTimeout') }
         )
       ])
       detailData.value = normalizeWaveRow(detailResponse, t)
-      detailTableData.value = Array.isArray(previewResponse?.records) ? previewResponse.records.map((item) => normalizeWaveItemRow(item, t)) : []
-      updatePaginationState(detailPagination, previewResponse, detailPagination.current, detailPagination.size)
+      detailTableData.value = Array.isArray(previewResponse?.records)
+        ? previewResponse.records.map((item) => normalizeWaveItemRow(item, t))
+        : []
+      updatePaginationState(
+        detailPagination,
+        previewResponse,
+        detailPagination.current,
+        detailPagination.size
+      )
     } finally {
       detailLoading.value = false
     }
@@ -323,12 +417,30 @@
     publicTaskLoading.value = true
     try {
       const previewResponse = await guardRequestWithMessage(
-        fetchWavePreviewPage(buildWaveDetailQueryParams({ waveId: publicTaskWave.value.id, current: publicTaskPagination.current, pageSize: publicTaskPagination.size })),
-        { records: [], total: 0, current: publicTaskPagination.current, size: publicTaskPagination.size },
+        fetchWavePreviewPage(
+          buildWaveDetailQueryParams({
+            waveId: publicTaskWave.value.id,
+            current: publicTaskPagination.current,
+            pageSize: publicTaskPagination.size
+          })
+        ),
+        {
+          records: [],
+          total: 0,
+          current: publicTaskPagination.current,
+          size: publicTaskPagination.size
+        },
         { timeoutMessage: t('pages.orders.wave.messages.publicTaskTimeout') }
       )
-      publicTaskRows.value = Array.isArray(previewResponse?.records) ? previewResponse.records.map((item) => normalizeWaveItemRow(item, t)) : []
-      updatePaginationState(publicTaskPagination, previewResponse, publicTaskPagination.current, publicTaskPagination.size)
+      publicTaskRows.value = Array.isArray(previewResponse?.records)
+        ? previewResponse.records.map((item) => normalizeWaveItemRow(item, t))
+        : []
+      updatePaginationState(
+        publicTaskPagination,
+        previewResponse,
+        publicTaskPagination.current,
+        publicTaskPagination.size
+      )
     } finally {
       publicTaskLoading.value = false
     }
@@ -355,6 +467,65 @@
       ElMessage.error(error?.message || t('pages.orders.wave.messages.publicTaskFailed'))
     } finally {
       publicTaskSubmitting.value = false
+    }
+  }
+
+  async function handleBatchPublicTask() {
+    if (!selectedRows.value.length) {
+      ElMessage.warning(t('pages.orders.wave.messages.batchPublicTaskSelect'))
+      return
+    }
+    try {
+      await ElMessageBox.confirm(
+        t('pages.orders.wave.messages.batchPublicTaskConfirm', {
+          count: selectedRows.value.length
+        }),
+        t('pages.orders.wave.messages.batchPublicTaskTitle'),
+        {
+          confirmButtonText: t('common.confirm'),
+          cancelButtonText: t('common.cancel'),
+          type: 'warning'
+        }
+      )
+      batchTaskSubmitting.value = true
+      await fetchSelectWaveTask({
+        ids: selectedRows.value.map((item) => item.id)
+      })
+      ElMessage.success(t('pages.orders.wave.messages.batchPublicTaskSuccess'))
+      selectedRows.value = []
+      await refreshData()
+    } catch (error) {
+      if (error === 'cancel' || error?.message === 'cancel') return
+      ElMessage.error(error?.message || t('pages.orders.wave.messages.batchPublicTaskFailed'))
+    } finally {
+      batchTaskSubmitting.value = false
+    }
+  }
+
+  async function toggleAutoExce(enabled) {
+    try {
+      autoExceSubmitting.value = true
+      await fetchUpdateWaveAutoExceFlag(enabled)
+      autoExce.value = !!enabled
+      ElMessage.success(
+        enabled
+          ? t('pages.orders.wave.messages.autoStartSuccess')
+          : t('pages.orders.wave.messages.autoPauseSuccess')
+      )
+    } catch (error) {
+      ElMessage.error(error?.message || t('pages.orders.wave.messages.autoUpdateFailed'))
+    } finally {
+      autoExceSubmitting.value = false
+    }
+  }
+
+  async function loadAutoExceFlag() {
+    try {
+      const response = await fetchWaveAutoExceFlag()
+      const rawVal = response?.val ?? response?.value ?? false
+      autoExce.value = rawVal === true || rawVal === 'true'
+    } catch {
+      autoExce.value = false
     }
   }
 
@@ -446,4 +617,8 @@
       t
     })
   )
+
+  onMounted(() => {
+    loadAutoExceFlag()
+  })
 </script>

--
Gitblit v1.9.1