| | |
| | | <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> |
| | | |
| | |
| | | </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' |
| | |
| | | fetchGetWaveMany, |
| | | fetchPauseWave, |
| | | fetchPublicWaveTask, |
| | | fetchSelectWaveTask, |
| | | fetchStopWave, |
| | | fetchUpdateWaveAutoExceFlag, |
| | | fetchWaveAutoExceFlag, |
| | | fetchWavePage, |
| | | fetchWavePreviewPage |
| | | } from '@/api/wave' |
| | |
| | | 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, |
| | |
| | | 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(() => [ |
| | |
| | | } |
| | | }, |
| | | { |
| | | 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', |
| | |
| | | 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) { |
| | |
| | | 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() |
| | |
| | | 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)) : [] |
| | | } |
| | | }) |
| | | |
| | |
| | | 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 |
| | | } |
| | |
| | | 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 |
| | | } |
| | |
| | | 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 |
| | | } |
| | | } |
| | | |
| | |
| | | t |
| | | }) |
| | | ) |
| | | |
| | | onMounted(() => { |
| | | loadAutoExceFlag() |
| | | }) |
| | | </script> |