zhou zhou
昨天 33bd4dd1f0e41131cd8e5bbf87204a1f0b72bb08
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>