diff --git a/src/modules/overseas-warehouse/api/lastMileOrders.ts b/src/modules/overseas-warehouse/api/lastMileOrders.ts index eed2e084..6fce718c 100644 --- a/src/modules/overseas-warehouse/api/lastMileOrders.ts +++ b/src/modules/overseas-warehouse/api/lastMileOrders.ts @@ -344,6 +344,11 @@ export interface ChangeContainerReceivingWarehousePayload { } export interface LastMileOrderDetailDto { + returnReceipt?: { + order: { returnNo: string; receivedQuantity: number; expectedQuantity: number } + receipts: Array<{ receiptNo: string; unitType: string; unitCode?: string; palletCode?: string; receivedQuantity: number; boxCount: number; signedAt: string }> + cartons?: Array<{ receiptNo: string; palletCode?: string; cartonMark: string; countStatus: string; countedAt?: string; items: Array<{ skuCode: string; productNameZh?: string; quantity: number }> }> + } | null order: LastMileOrderDto manualNodes?: ManualNodesResponse['nodes'] cargo: LastMileCargoDto[] diff --git a/src/modules/overseas-warehouse/pages/LastMileOrderDetailView.test.ts b/src/modules/overseas-warehouse/pages/LastMileOrderDetailView.test.ts index 2c73f5cb..2cfbfb64 100644 --- a/src/modules/overseas-warehouse/pages/LastMileOrderDetailView.test.ts +++ b/src/modules/overseas-warehouse/pages/LastMileOrderDetailView.test.ts @@ -13,6 +13,19 @@ vi.mock('../api/warehouseTransfers', () => ({ getWarehouseTransfer: vi.fn() })) enableAutoUnmount(afterEach) describe('LastMileOrderDetailView domestic detail alignment', () => { + it('shows signed box contents and actual quantities on return orders', async () => { + vi.mocked(getLastMileOrder).mockResolvedValue({ order: { id: 'tail-return', customerId: 'customer-1', orderNo: 'RETU-1', orderType: 'RETURN_RELABEL', currentStatus: 'INBOUND_COMPLETED' }, cargo: [], fees: [], statusHistory: [], operationHistory: [], + returnReceipt: { order: { returnNo: 'RT-1', receivedQuantity: 10, expectedQuantity: 10 }, receipts: [{ receiptNo: 'RR-1', unitType: 'PALLET', unitCode: 'PLT-1', receivedQuantity: 10, boxCount: 2, signedAt: '' }], + cartons: [{ receiptNo: 'RR-1', cartonMark: 'RC#2-1', countStatus: 'CONFIRMED', items: [{ skuCode: 'SKU-A', quantity: 3 }, { skuCode: 'SKU-B', quantity: 7 }] }, { receiptNo: 'RR-2', cartonMark: 'RC-PENDING', countStatus: 'PENDING', items: [] }] } }) + const wrapper = mount(LastMileOrderDetailView, { global: { plugins: [ElementPlus] } }); await flushPromises() + await wrapper.findAll('[role="tab"]').find(tab => tab.text().includes('退货签收与箱内清点'))!.trigger('click'); await flushPromises() + const panel = wrapper.get('[aria-label="退货签收与箱内清点"]') + expect(panel.text()).toContain('实收 10 / 预报 10 件') + expect(panel.text()).toContain('RC#2-1') + expect(panel.text()).toContain('SKU-A') + expect(panel.text()).toContain('实际签收数量') + expect(panel.text()).toContain('待清点') + }) it('loads transfer fulfillment only on the plan tab using sourceOrderNo, never the tail order number', async () => { vi.mocked(getLastMileOrder).mockResolvedValue({ order: { id: 'internal-transfer-tail', customerId: 'customer-1', orderNo: 'WT-TAIL-1', sourceOrderNo: 'WT-SOURCE-1', orderType: 'WAREHOUSE_TRANSFER', currentStatus: 'INBOUND_COMPLETED' }, cargo: [], fees: [], statusHistory: [], operationHistory: [] }) vi.mocked(getWarehouseTransfer).mockResolvedValue({ id: 'internal-transfer', transferNo: 'WT-SOURCE-1', needRelabel: true, status: 'WAIT_RELABEL', relabelNo: 'RL-1', relabelStatus: 'CUSTOMER_CONFIRM_PENDING', packageCount: 2, items: [], cartons: [], pallets: [], relabelBindings: [] }) diff --git a/src/modules/overseas-warehouse/pages/LastMileOrderDetailView.vue b/src/modules/overseas-warehouse/pages/LastMileOrderDetailView.vue index 1c31a67d..9f9b3c56 100644 --- a/src/modules/overseas-warehouse/pages/LastMileOrderDetailView.vue +++ b/src/modules/overseas-warehouse/pages/LastMileOrderDetailView.vue @@ -216,6 +216,33 @@ onMounted(load)
+ +
+

{{ detail.returnReceipt.order.returnNo }} · 实收 {{ detail.returnReceipt.order.receivedQuantity }} / 预报 {{ detail.returnReceipt.order.expectedQuantity }} 件

+ + + + + + + +

签收箱号明细({{ detail.returnReceipt.cartons?.length || 0 }} 箱)

+ + + +

签收单 {{ box.receiptNo }}

+ + + + + +

{{ box.countStatus === 'PENDING' ? '箱内数量待仓库清点确认' : '未留存原始箱内明细,不以当前库存代替签收数量' }}

+
+
+ +
+ +
{{ field.label }}
{{ field.value }}
diff --git a/src/modules/overseas-warehouse/pages/ReturnInventoryManagementView.vue b/src/modules/overseas-warehouse/pages/ReturnInventoryManagementView.vue index 2b7d7d49..861b35a8 100644 --- a/src/modules/overseas-warehouse/pages/ReturnInventoryManagementView.vue +++ b/src/modules/overseas-warehouse/pages/ReturnInventoryManagementView.vue @@ -204,7 +204,7 @@ function warehouseName(warehouseId?: string) { ); } function statusLabel(status?: string) { - return status === "AVAILABLE" ? "可用" : status === "MERGED" ? "已合箱" : "—"; + return status === "PENDING_COUNT" ? "箱内待清点" : status === "AVAILABLE" ? "可用" : status === "MERGED" ? "已合箱" : "—"; } async function loadCustomerOptions() { const records: PlatformTenantResource[] = []; @@ -634,7 +634,7 @@ const tableColumns = computed(() => v-model="query.status" clearable placeholder="箱状态" - > { visit(node.children) } } visit(ast.children) - expect(panes).toBe(file === 'LastMileOrderDetailView' ? 5 : 4) + expect(panes).toBe(file === 'LastMileOrderDetailView' ? 6 : 4) } })