diff --git a/src/modules/overseas-warehouse/components/OrderReferenceText.test.ts b/src/modules/overseas-warehouse/components/OrderReferenceText.test.ts index 81855ab4..81512bdc 100644 --- a/src/modules/overseas-warehouse/components/OrderReferenceText.test.ts +++ b/src/modules/overseas-warehouse/components/OrderReferenceText.test.ts @@ -1,5 +1,5 @@ -import { mount } from '@vue/test-utils' -import { describe, expect, it } from 'vitest' +import { flushPromises, mount } from '@vue/test-utils' +import { describe, expect, it, vi } from 'vitest' import OrderReferenceText from './OrderReferenceText.vue' describe('OrderReferenceText', () => { @@ -23,4 +23,15 @@ describe('OrderReferenceText', () => { expect(wrapper.text()).toBe('LMO-260827-0001') expect(wrapper.attributes('title')).toBe('LMO-260827-0001') }) + + it('copies the exact server short number without frontend formatting', async () => { + const writeText = vi.fn().mockResolvedValue(undefined) + vi.stubGlobal('navigator', { clipboard: { writeText } }) + const wrapper = mount(OrderReferenceText, { props: { value: 'LMO-9A7', copyable: true } }) + await wrapper.get('el-button').trigger('click') + await flushPromises() + expect(writeText).toHaveBeenCalledWith('LMO-9A7') + expect(wrapper.attributes('title')).toBe('LMO-9A7') + vi.unstubAllGlobals() + }) }) diff --git a/src/modules/overseas-warehouse/components/OrderReferenceText.vue b/src/modules/overseas-warehouse/components/OrderReferenceText.vue index 3f4576dc..fbf99f24 100644 --- a/src/modules/overseas-warehouse/components/OrderReferenceText.vue +++ b/src/modules/overseas-warehouse/components/OrderReferenceText.vue @@ -1,10 +1,13 @@ diff --git a/src/modules/overseas-warehouse/lastMilePresentation.test.ts b/src/modules/overseas-warehouse/lastMilePresentation.test.ts index 2e8bffbf..a2e437a4 100644 --- a/src/modules/overseas-warehouse/lastMilePresentation.test.ts +++ b/src/modules/overseas-warehouse/lastMilePresentation.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest' -import { formatOverseasDateTime, toLastMileOrderListItem } from './lastMilePresentation' +import { formatOverseasDateTime, lastMileOrderReference, toLastMileOrderListItem } from './lastMilePresentation' describe('last-mile order presentation adapter', () => { it('maps backend codes, associations and long ids without inventing data', () => { @@ -23,6 +23,14 @@ describe('last-mile order presentation adapter', () => { }).owner).toBe('—') }) + it('preserves the exact server LMO short number without padding, prefixing or deriving it from id', () => { + const serverOrderNo = 'LMO-9A7' + const row = toLastMileOrderListItem({ id: '2092873463568596994', customerId: '100', orderNo: serverOrderNo }) + expect(row.orderNo).toBe(serverOrderNo) + expect(lastMileOrderReference(serverOrderNo)).toBe(serverOrderNo) + expect(row.orderNo).not.toContain(row.id) + }) + it('preserves real metrics and distinguishes zero from unknown fields and times', () => { const estimatedArrivalAt = '2026-08-27T12:30:00Z' const row = toLastMileOrderListItem({ diff --git a/src/modules/overseas-warehouse/lastMilePresentation.ts b/src/modules/overseas-warehouse/lastMilePresentation.ts index dafe7d12..b8dd0768 100644 --- a/src/modules/overseas-warehouse/lastMilePresentation.ts +++ b/src/modules/overseas-warehouse/lastMilePresentation.ts @@ -45,6 +45,11 @@ export function lastMileOrderTypeLabel(value: unknown) { return orderTypeLabels[code] || text(code) } +export function lastMileOrderReference(value: unknown, emptyLabel = '—') { + const serverValue = value == null ? '' : String(value) + return serverValue || emptyLabel +} + export function formatOverseasDateTime(value: unknown) { const raw = String(value ?? '').trim() if (!raw) return '—' @@ -57,7 +62,7 @@ export function toLastMileOrderListItem(dto: LastMileOrderSummaryDto): LastMileO id: String(dto.id), customerId: String(dto.customerId), sourceContainerBookingId: String(dto.sourceContainerBookingId ?? '').trim(), - orderNo: text(dto.orderNo), + orderNo: lastMileOrderReference(dto.orderNo), warning: dto.abnormal ? '异常' : '—', orderType: text(dto.orderTypeName || lastMileOrderTypeLabel(dto.orderType)), rejectedAt: '—', diff --git a/src/modules/overseas-warehouse/pages/LastMileOrderDetailView.vue b/src/modules/overseas-warehouse/pages/LastMileOrderDetailView.vue index 4dbdca51..6057758d 100644 --- a/src/modules/overseas-warehouse/pages/LastMileOrderDetailView.vue +++ b/src/modules/overseas-warehouse/pages/LastMileOrderDetailView.vue @@ -11,7 +11,7 @@ import DataTable, { type DataTableColumn } from '@/shared/components/DataTable.v import LoadErrorState from '@/shared/components/LoadErrorState.vue' import OperationErrorToast from '@/shared/components/OperationErrorToast.vue' import { createLastMileOrderFee, getLastMileOrder, type LastMileOrderDetailDto } from '../api/lastMileOrders' -import { formatOverseasDateTime, lastMileOrderTypeLabel, lastMileStatusLabel } from '../lastMilePresentation' +import { formatOverseasDateTime, lastMileOrderReference, lastMileOrderTypeLabel, lastMileStatusLabel } from '../lastMilePresentation' import { overseasWarehousePermissions as permission } from '../permissions' import OverseasDetailShell from '../components/OverseasDetailShell.vue' import OrderReferenceText from '../components/OrderReferenceText.vue' @@ -39,7 +39,7 @@ function text(value: unknown) { return String(value ?? '').trim() || '—' } function yesNo(value: boolean | null | undefined) { return value == null ? '—' : value ? '是' : '否' } function feeStatusLabel(value: string) { return ({ PENDING_REVIEW: '待审核', APPROVED: '审核通过', REJECTED: '已驳回' } as Record)[value] || value } -const referenceValue = computed(() => text(detail.value?.order.orderNo || '订单编码待补充')) +const referenceValue = computed(() => lastMileOrderReference(detail.value?.order.orderNo, '订单编码待补充')) const orderFields = computed(() => { const order = detail.value?.order return [ @@ -151,7 +151,7 @@ onMounted(load)