From 2705fdbc4983e65f226972e4670efd4f9490edca Mon Sep 17 00:00:00 2001 From: liuyihe <2513762445@qq.com> Date: Fri, 16 Oct 2026 17:43:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/RelabelOrderDetailView.vue | 21 +++++++++++++--- .../pages/RelabelOrdersView.test.ts | 25 ++++++++++++++++++- .../pages/RelabelOrdersView.vue | 25 ++++++++++++++++--- 3 files changed, 63 insertions(+), 8 deletions(-) diff --git a/src/modules/overseas-warehouse/pages/RelabelOrderDetailView.vue b/src/modules/overseas-warehouse/pages/RelabelOrderDetailView.vue index a73a2d47..b013cbb0 100644 --- a/src/modules/overseas-warehouse/pages/RelabelOrderDetailView.vue +++ b/src/modules/overseas-warehouse/pages/RelabelOrderDetailView.vue @@ -5,7 +5,7 @@ import { CheckCircle2, Eye, FileUp, Undo2 } from '@lucide/vue' import { ElMessage, ElMessageBox } from 'element-plus' import { useAccessPreviewStore } from '@/core/access/accessPreview' import { overseasWarehousePermissions as permission } from '../permissions' -import { confirmRelabelCompletion, getRelabelReviewTask, returnRelabelForRework } from '../api/relabelOrders' +import { changeRelabelOrderStatus, confirmRelabelCompletion, getRelabelReviewTask, returnRelabelForRework } from '../api/relabelOrders' import { useRoute, useRouter } from 'vue-router' import { getApiErrorDetails, type ApiErrorDetails } from '@/shared/api/http' import ApiErrorMeta from '@/shared/components/ApiErrorMeta.vue' @@ -25,8 +25,20 @@ const loading = ref(false) const access = useAccessPreviewStore() const returning = ref(false) const confirming = ref(false) +const voiding = ref(false) +const canVoid = computed(() => !!detail.value && !['READY_FOR_OUTBOUND', 'COMPLETED', 'CANCELLED'].includes(detail.value.application.status || '')) +async function voidOrder() { + if (voiding.value || confirming.value || returning.value || !canVoid.value || !access.can(permission.relabelOrderStatus)) return + voiding.value = true + try { + await ElMessageBox.confirm('确认作废当前换标单?作废后停止换标作业,保留原单和操作记录。', '作废换标单', { customClass: 'admin-density-confirm', type: 'warning', confirmButtonText: '确认作废', cancelButtonText: '取消' }) + await changeRelabelOrderStatus(orderId.value, 'CANCELLED', '平台作废换标单') + ElMessage.success('换标单已作废'); await load() + } catch (error) { if (error !== 'cancel' && error !== 'close') ElMessage.error(getApiErrorDetails(error, '换标单作废失败,请重试').message) } + finally { voiding.value = false } +} async function confirmCompletion() { - if (confirming.value) return + if (confirming.value || voiding.value) return confirming.value = true try { await ElMessageBox.confirm('确认仓库上传的换标结果无误并继续后续流程吗?', '换标完成确认', { customClass: 'admin-density-confirm', confirmButtonText: '确认并继续', cancelButtonText: '取消' }) @@ -36,7 +48,7 @@ async function confirmCompletion() { finally { confirming.value = false } } async function returnForRework() { - if (returning.value) return + if (returning.value || voiding.value) return returning.value = true try { const task = await getRelabelReviewTask(orderId.value) @@ -67,7 +79,7 @@ function status(value: unknown) { READY_FOR_OUTBOUND: '换标完成', COMPLETED: '换标完成', REJECTED: '已驳回', - CANCELLED: '已取消', + CANCELLED: '已作废', } as Record)[String(value || '')] || text(value) } function walletStatus(value: unknown) { return ({ FREEZE_PENDING: '冻结中', FROZEN: '已冻结', SETTLE_PENDING: '结算中', SETTLED: '已结算', RELEASE_PENDING: '释放中', RELEASED: '已释放', FREEZE_FAILED: '冻结失败', SETTLE_FAILED: '结算失败', RELEASE_FAILED: '释放失败' } as Record)[String(value || '')] || text(value) } @@ -129,6 +141,7 @@ async function previewCompletionPhoto(fileId: string) {