From e0726444cc49612f75f26ad85b7404e8ca565b94 Mon Sep 17 00:00:00 2001 From: liuyihe <2513762445@qq.com> Date: Fri, 16 Oct 2026 18:25:56 +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 --- .../components/RelabelDocumentsPanel.vue | 54 +++++++++---------- .../components/ReviewRejectionNotice.test.mjs | 29 ++++++++++ .../components/ReviewRejectionNotice.vue | 16 ++++++ .../views/ReturnOrdersView.vue | 4 +- .../views/WarehouseServiceView.vue | 24 +++++---- .../views/relabelAttachments.test.mjs | 2 +- .../views/warehouseTransferForm.test.mjs | 2 +- 7 files changed, 90 insertions(+), 41 deletions(-) create mode 100644 src/modules/overseas-warehouse/components/ReviewRejectionNotice.test.mjs create mode 100644 src/modules/overseas-warehouse/components/ReviewRejectionNotice.vue diff --git a/src/modules/overseas-warehouse/components/RelabelDocumentsPanel.vue b/src/modules/overseas-warehouse/components/RelabelDocumentsPanel.vue index 353aad1..11b88b2 100644 --- a/src/modules/overseas-warehouse/components/RelabelDocumentsPanel.vue +++ b/src/modules/overseas-warehouse/components/RelabelDocumentsPanel.vue @@ -2,14 +2,11 @@ import { computed, ref, watch, onBeforeUnmount } from 'vue' import { ElMessage } from 'element-plus' import { getRelabel, downloadRelabelDocument, type RelabelDetail } from '../api/warehouseServices' -const props = defineProps<{ relabelNo: string; detail?: RelabelDetail | null }>() +const props = defineProps<{ relabelNo: string; detail?: RelabelDetail | null; inline?: boolean }>() const loaded = ref(null) const loading = ref(false) const error = ref('') const busy = ref(false) -const previewUrl = ref('') -const previewOpen = ref(false) -const previewTitle = ref('') let generation = 0 const current = computed(() => props.detail || loaded.value) /** 各申请分别加载,失败只影响资料区,不阻断订单详情。 */ @@ -22,28 +19,26 @@ async function load() { catch (cause) { if (ticket === generation) error.value = cause instanceof Error ? cause.message : '贴标资料加载失败' } finally { if (ticket === generation) loading.value = false } } -watch(() => [props.relabelNo, props.detail], () => { clearPreview(); void load() }, { immediate: true }) -interface DocumentRow { key: string; kind: string; fileId: string; fileName: string; scope: string; itemId?: string; context?: string } +watch(() => [props.relabelNo, props.detail], () => { void load() }, { immediate: true }) +interface DocumentRow { key: string; kind: string; fileId: string; fileName: string; scope: string; itemId?: string } const documents = computed(() => { const result: DocumentRow[] = [] const application = current.value?.application if (!application) return result // 旧总文件仅作为兼容回显,避免与已分类型的总文件重复展示。 - const add = (kind: string, id: string | null | undefined, name: string | null | undefined, scope: string, itemId?: string, context?: string) => { - if (id) result.push({ key: scope + ':' + (itemId || '') + ':' + id, kind, fileId: id, fileName: name || '未命名文件', scope, itemId, context }) + const add = (kind: string, id: string | null | undefined, name: string | null | undefined, scope: string, itemId?: string) => { + if (id) result.push({ key: scope + ':' + (itemId || '') + ':' + id, kind, fileId: id, fileName: name || '未命名文件', scope, itemId }) } - add('箱唛总文件', application.cartonTotalFileId, application.cartonTotalFileName, 'CARTON_TOTAL') - add('SKU 标签总文件', application.skuTotalFileId, application.skuTotalFileName, 'SKU_TOTAL') + add('箱唛贴标文件', application.cartonTotalFileId, application.cartonTotalFileName, 'CARTON_TOTAL') + add('SKU 贴标文件', application.skuTotalFileId, application.skuTotalFileName, 'SKU_TOTAL') if (application.totalFileId !== application.cartonTotalFileId && application.totalFileId !== application.skuTotalFileId) add('贴标总文件', application.totalFileId, application.totalFileName, 'TOTAL') add('面单文件', application.shippingLabelFileId, application.shippingLabelFileName, 'SHIPPING') - for (const item of current.value?.items || []) add('明细文件', item.relabelFileId, item.relabelFileName, 'ITEM', String(item.id), [item.cartonMark, item.skuCode].filter(Boolean).join(' / ')) + for (const item of current.value?.items || []) add('明细文件', item.relabelFileId, item.relabelFileName, 'ITEM', String(item.id)) return result }) -/** 切换申请及关闭预览时释放文件对象。 */ -function clearPreview() { if (previewUrl.value) URL.revokeObjectURL(previewUrl.value); previewUrl.value = ''; previewOpen.value = false } -/** 使用带身份认证的下载接口,预览和保存共享同一归属校验。 */ -async function openFile(key: string, download = false) { +/** 使用带身份认证的下载接口,保留文件归属校验和原始文件名。 */ +async function downloadFile(key: string) { const row = documents.value.find(document => document.key === key) if (!row || busy.value) return busy.value = true @@ -51,32 +46,33 @@ async function openFile(key: string, download = false) { try { const blob = await downloadRelabelDocument(props.relabelNo, row.fileId, row.scope, row.itemId) if (ticket !== generation) return - if (download) { - const url = URL.createObjectURL(blob); const link = document.createElement('a') - link.href = url; link.download = row.fileName; link.click(); window.setTimeout(() => URL.revokeObjectURL(url), 1000) - } else { clearPreview(); previewUrl.value = URL.createObjectURL(blob); previewTitle.value = row.fileName; previewOpen.value = true } + const url = URL.createObjectURL(blob); const link = document.createElement('a') + link.href = url; link.download = row.fileName; link.click(); window.setTimeout(() => URL.revokeObjectURL(url), 1000) } catch (cause) { ElMessage.error(cause instanceof Error ? cause.message : '文件读取失败,请重试') } finally { busy.value = false } } -onBeforeUnmount(() => { ++generation; clearPreview() }) +onBeforeUnmount(() => { ++generation })