From 8bf7b20b89d393417c7a091153707752d7f8e170 Mon Sep 17 00:00:00 2001 From: liuyihe <2513762445@qq.com> Date: Tue, 13 Oct 2026 13:46:56 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../overseas-warehouse/api/lastMileOrders.ts | 2 +- .../overseas-warehouse/api/relabelOrders.ts | 4 +++ .../pages/LastMileOrderDetailView.vue | 2 +- .../RelabelOrderDetailView.refresh.test.ts | 27 +++++++++++++++++++ .../pages/RelabelOrderDetailView.test.ts | 3 +++ .../pages/RelabelOrderDetailView.vue | 8 +++--- .../pages/RelabelOrdersView.test.ts | 19 +++++++++++++ .../pages/RelabelOrdersView.vue | 23 ++++++++-------- .../utils/relabelSkuDisplay.test.ts | 7 +++++ .../utils/relabelSkuDisplay.ts | 9 +++++++ 10 files changed, 88 insertions(+), 16 deletions(-) create mode 100644 src/modules/overseas-warehouse/pages/RelabelOrderDetailView.refresh.test.ts create mode 100644 src/modules/overseas-warehouse/utils/relabelSkuDisplay.test.ts create mode 100644 src/modules/overseas-warehouse/utils/relabelSkuDisplay.ts diff --git a/src/modules/overseas-warehouse/api/lastMileOrders.ts b/src/modules/overseas-warehouse/api/lastMileOrders.ts index cd9a2afa..6fb6a3f2 100644 --- a/src/modules/overseas-warehouse/api/lastMileOrders.ts +++ b/src/modules/overseas-warehouse/api/lastMileOrders.ts @@ -99,7 +99,7 @@ export interface LastMileOrderSummaryDto { deliveryOrderNo?: string | null outboundOrderNo?: string | null relabelOrderNo?: string | null - relabelApplications?: Array<{ relabelNo: string; status: string; quantity: number; createdAt: string }> + relabelApplications?: Array<{ relabelNo: string; status: string; quantity: number; quantityUnit?: string; createdAt: string }> relabelStatus?: string | null palletMergeFlag?: string | null /** Optional grouping facts returned by newer last-leg services. */ diff --git a/src/modules/overseas-warehouse/api/relabelOrders.ts b/src/modules/overseas-warehouse/api/relabelOrders.ts index fa450867..6a68a983 100644 --- a/src/modules/overseas-warehouse/api/relabelOrders.ts +++ b/src/modules/overseas-warehouse/api/relabelOrders.ts @@ -66,6 +66,8 @@ export interface RelabelSummaryDto { totalPackageCount?: number | null notifiedPackageCount?: number | null skuCodes?: string | null + productNameZh?: string | null + labelRequirement?: string | null totalFileId?: string | null totalFileName?: string | null totalFileUrl?: string | null @@ -87,6 +89,8 @@ export interface RelabelSummaryDto { export interface RelabelItemDto { id: string + operationType?: 'CARTON_LABEL' | 'SKU_LABEL' | 'CARTON_AND_SKU' + skuItems?: Array<{ skuCode: string; newSkuCode: string; quantity: number; remark?: string }> skuCode?: string | null productNameZh?: string | null totalPackageCount?: number | null diff --git a/src/modules/overseas-warehouse/pages/LastMileOrderDetailView.vue b/src/modules/overseas-warehouse/pages/LastMileOrderDetailView.vue index 3d4d34ee..35598035 100644 --- a/src/modules/overseas-warehouse/pages/LastMileOrderDetailView.vue +++ b/src/modules/overseas-warehouse/pages/LastMileOrderDetailView.vue @@ -168,7 +168,7 @@ const cargoColumns = computed(() => isReturnOrder.value ? [ { key: 'volume', prop: 'volume', label: '体积(m³)', width: 120, align: 'right' }, ]) const documentColumns: DataTableColumn[] = [ - { key: 'status', prop: 'status', label: '状态', minWidth: 130 }, { key: 'quantity', prop: 'quantity', label: '换标数量(件)', minWidth: 130 }, + { key: 'status', prop: 'status', label: '状态', minWidth: 130 }, { key: 'quantity', prop: 'quantity', label: '换标数量(箱/件)', minWidth: 150, formatter: (row: { quantity?: number; quantityUnit?: string }) => `${row.quantity ?? '—'}${row.quantityUnit || '件'}` }, { key: 'type', prop: 'type', label: '单据类型', minWidth: 150 }, { key: 'number', prop: 'number', label: '单据编号', minWidth: 200 }, { key: 'createdAt', prop: 'createdAt', label: '生成时间', minWidth: 170 }, { key: 'quote', prop: 'quote', label: '报价', minWidth: 150 }, ] diff --git a/src/modules/overseas-warehouse/pages/RelabelOrderDetailView.refresh.test.ts b/src/modules/overseas-warehouse/pages/RelabelOrderDetailView.refresh.test.ts new file mode 100644 index 00000000..5c5be51e --- /dev/null +++ b/src/modules/overseas-warehouse/pages/RelabelOrderDetailView.refresh.test.ts @@ -0,0 +1,27 @@ +import { KeepAlive, defineComponent, h, ref } from 'vue' +import { flushPromises, mount } from '@vue/test-utils' +import { expect, it, vi } from 'vitest' +import { getRelabelOrder } from '../api/relabelOrders' +import RelabelOrderDetailView from './RelabelOrderDetailView.vue' + +vi.mock('vue-router', () => ({ useRoute: () => ({ params: { orderId: 'RL-1' } }), useRouter: () => ({ push: vi.fn() }) })) +vi.mock('@/core/access/accessPreview', () => ({ useAccessPreviewStore: () => ({ can: () => false }) })) +vi.mock('../api/relabelOrders', () => ({ getRelabelOrder: vi.fn(), confirmRelabelCompletion: vi.fn(), getRelabelReviewTask: vi.fn(), returnRelabelForRework: vi.fn(), downloadRelabelCompletionPhoto: vi.fn(), downloadRelabelPdf: vi.fn(), uploadRelabelPdf: vi.fn() })) + +it('reloads authoritative status when a cached detail tab is reopened without double loading initially', async () => { + vi.mocked(getRelabelOrder).mockResolvedValueOnce({ application: { id: '1', relabelNo: 'RL-1', status: 'PENDING_REVIEW' }, items: [], history: [] }) + .mockResolvedValueOnce({ application: { id: '1', relabelNo: 'RL-1', status: 'PENDING_PROCESSING' }, items: [], history: [] }) + const active = ref(true) + const Host = defineComponent({ setup: () => () => h(KeepAlive, null, { default: () => active.value ? h(RelabelOrderDetailView) : h('div') }) }) + const wrapper = mount(Host, { global: { stubs: { OverseasReadOnlyDetail: true, AppDialog: true } } }) + await flushPromises() + expect(getRelabelOrder).toHaveBeenCalledTimes(1) + expect(wrapper.findComponent({ name: 'OverseasReadOnlyDetail' }).props('statusText')).toBe('待审核') + active.value = false + await flushPromises() + active.value = true + await flushPromises() + expect(getRelabelOrder).toHaveBeenCalledTimes(2) + expect(wrapper.findComponent({ name: 'OverseasReadOnlyDetail' }).props('statusText')).toBe('待处理') + wrapper.unmount() +}) diff --git a/src/modules/overseas-warehouse/pages/RelabelOrderDetailView.test.ts b/src/modules/overseas-warehouse/pages/RelabelOrderDetailView.test.ts index b4d8dd92..e85e7e64 100644 --- a/src/modules/overseas-warehouse/pages/RelabelOrderDetailView.test.ts +++ b/src/modules/overseas-warehouse/pages/RelabelOrderDetailView.test.ts @@ -18,6 +18,9 @@ describe('RelabelOrderDetailView', () => { expect(source).toContain("PENDING_REVIEW: '待审核'") expect(source).toContain('value?.application.customerOrderNo || value?.application.lastlegOrderNo') expect(source).toContain('item.destinationFbaWarehouseCode || item.destinationWarehouseId') + expect(source).toContain('items.flatMap(relabelSkuCodes)') + expect(source).toContain('v-for="(sku, index) in item.skuItems"') + expect(source).toContain('{{ sku.skuCode }} → {{ sku.newSkuCode }} × {{ sku.quantity }} 件') }) it('lets platform operators confirm completion or return PDA work for rework', () => { diff --git a/src/modules/overseas-warehouse/pages/RelabelOrderDetailView.vue b/src/modules/overseas-warehouse/pages/RelabelOrderDetailView.vue index 1cbd6500..32437077 100644 --- a/src/modules/overseas-warehouse/pages/RelabelOrderDetailView.vue +++ b/src/modules/overseas-warehouse/pages/RelabelOrderDetailView.vue @@ -1,6 +1,6 @@ @@ -241,7 +242,7 @@ watch(dialogOpen, (open) => { if (!open) createIdempotencyKey.value = '' }) - + @@ -251,7 +252,7 @@ watch(dialogOpen, (open) => { if (!open) createIdempotencyKey.value = '' })

作业要求

- + diff --git a/src/modules/overseas-warehouse/utils/relabelSkuDisplay.test.ts b/src/modules/overseas-warehouse/utils/relabelSkuDisplay.test.ts new file mode 100644 index 00000000..cd7fa462 --- /dev/null +++ b/src/modules/overseas-warehouse/utils/relabelSkuDisplay.test.ts @@ -0,0 +1,7 @@ +import { expect, it } from 'vitest' +import { relabelSkuCodes } from './relabelSkuDisplay' + +it('uses every nested SKU, deduplicates and preserves carton-only SKU lists', () => { + expect(relabelSkuCodes({ skuCode: 'FIRST', skuItems: [{ skuCode: 'FIRST' }, { skuCode: 'SECOND' }, { skuCode: 'FIRST' }] })).toEqual(['FIRST', 'SECOND']) + expect(relabelSkuCodes({ skuCode: 'FIRST,SECOND', skuItems: [] })).toEqual(['FIRST', 'SECOND']) +}) diff --git a/src/modules/overseas-warehouse/utils/relabelSkuDisplay.ts b/src/modules/overseas-warehouse/utils/relabelSkuDisplay.ts new file mode 100644 index 00000000..6f54df9d --- /dev/null +++ b/src/modules/overseas-warehouse/utils/relabelSkuDisplay.ts @@ -0,0 +1,9 @@ +interface RelabelSkuSource { + skuCode?: string | null + skuItems?: Array<{ skuCode: string }> | null +} + +export function relabelSkuCodes(item: RelabelSkuSource): string[] { + const codes = item.skuItems?.length ? item.skuItems.map(line => line.skuCode) : (item.skuCode || '').split(',') + return [...new Set(codes.map(code => code.trim()).filter(Boolean))] +} From c61ae525e194371f51dc72730a2b3ae7f80d57b8 Mon Sep 17 00:00:00 2001 From: liuyihe <2513762445@qq.com> Date: Tue, 13 Oct 2026 14:47:06 +0800 Subject: [PATCH 2/3] =?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/ReturnInventoryManagementView.vue | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/modules/overseas-warehouse/pages/ReturnInventoryManagementView.vue b/src/modules/overseas-warehouse/pages/ReturnInventoryManagementView.vue index cf15f872..89476278 100644 --- a/src/modules/overseas-warehouse/pages/ReturnInventoryManagementView.vue +++ b/src/modules/overseas-warehouse/pages/ReturnInventoryManagementView.vue @@ -668,11 +668,10 @@ const tableColumns = computed(() => warehouseName(row.overseasWarehouseId) }}