From 33e72927f9cace0594d0423e4cb435206b9cefda Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Mon, 7 Sep 2026 11:01:00 +0800 Subject: [PATCH] fix(overseas): stabilize last-mile search tabs --- .../phase4-development-frontend.acceptance.ts | 22 ++++++++++++- .../pages/LastMileOrdersView.behavior.test.ts | 33 +++++++++++++++++++ .../pages/LastMileOrdersView.vue | 3 +- 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/scripts/phase4-development-frontend.acceptance.ts b/scripts/phase4-development-frontend.acceptance.ts index dc3360be..4ef5ee68 100644 --- a/scripts/phase4-development-frontend.acceptance.ts +++ b/scripts/phase4-development-frontend.acceptance.ts @@ -37,6 +37,7 @@ import InboundOrdersView from '@/modules/overseas-warehouse/pages/InboundOrdersV import InventoryView from '@/modules/overseas-warehouse/pages/InventoryView.vue' import DispatchesView from '@/modules/overseas-warehouse/pages/DispatchesView.vue' import RelabelOrdersView from '@/modules/overseas-warehouse/pages/RelabelOrdersView.vue' +import QueryToolbar from '@/shared/components/QueryToolbar.vue' type Region = 'domestic' | 'overseas' interface TraceStep { region: Region; method: string; path: string; params: unknown; body: unknown; httpStatus: number; code?: string; requestId?: string; traceId?: string; authorization: boolean } @@ -238,13 +239,32 @@ async function mountPage(component: Parameters[0], method: string, await waitForTrace(method, path, start) await nextTick() expect(wrapper.text()).not.toContain('服务暂时不可用') + return wrapper } async function pageRequestCoverage() { await mountPage(OverseasQuotesView, 'GET', '/platform/v1/last-leg/master-data/overseas-quotes') await mountPage(PurchaseOrdersView, 'GET', '/platform/v1/last-leg/overseas-procurements') await mountPage(TransportOrdersView, 'GET', '/platform/v1/last-leg/us-truck-orders', { domain: 'truck' }) await mountPage(TransportOrdersView, 'GET', '/platform/v1/last-leg/local-looseboard-orders', { domain: 'looseboard' }) - await mountPage(LastMileOrdersView, 'GET', '/platform/v1/last-leg/orders') + const lastMile = await mountPage(LastMileOrdersView, 'GET', '/platform/v1/last-leg/orders') + const lastMileToolbar = lastMile.findComponent(QueryToolbar) + let start = traces.length + lastMileToolbar.vm.$emit('search', { orderNo: '', inboundCode: '', lxCode: `${marker}-NO-MATCH`, orderType: '', warehouse: '', sourceOrderNo: '', containerNo: '', transferWarehouseCode: '', status: '', abnormal: '', detained: '', createdAt: [] }) + await waitForTrace('GET', '/platform/v1/last-leg/orders', start) + expect(traces.slice(start).some(item => item.path.startsWith('/platform/v1/last-leg/orders') && (item.params as Record | undefined)?.lxCode === `${marker}-NO-MATCH`)).toBe(true) + start = traces.length + await lastMile.findAll('.el-radio-button').find(item => item.text() === '待分配')!.trigger('click') + await waitForTrace('GET', '/platform/v1/last-leg/orders', start) + start = traces.length + await lastMile.findAll('.el-radio-button').find(item => item.text().startsWith('柜子'))!.trigger('click') + await waitForTrace('GET', '/platform/v1/last-leg/orders/container-summaries', start) + start = traces.length + await lastMile.findAll('.el-radio-button').find(item => item.text() === '全部')!.trigger('click') + await waitForTrace('GET', '/platform/v1/last-leg/orders', start) + start = traces.length + lastMileToolbar.vm.$emit('reset', { orderNo: '', inboundCode: '', lxCode: '', orderType: '', warehouse: '', sourceOrderNo: '', containerNo: '', transferWarehouseCode: '', status: '', abnormal: '', detained: '', createdAt: [] }) + await waitForTrace('GET', '/platform/v1/last-leg/orders', start) + expect(traces.slice(start).some(item => item.path.startsWith('/platform/v1/last-leg/orders') && !(item.params as Record | undefined)?.lxCode)).toBe(true) await mountPage(InboundOrdersView, 'GET', '/platform/v1/last-leg/inbound-plans') await mountPage(InventoryView, 'GET', '/platform/v1/last-leg/inventory/balances') await mountPage(DispatchesView, 'GET', '/platform/v1/last-leg/dispatches') diff --git a/src/modules/overseas-warehouse/pages/LastMileOrdersView.behavior.test.ts b/src/modules/overseas-warehouse/pages/LastMileOrdersView.behavior.test.ts index a41a9a2f..0c209841 100644 --- a/src/modules/overseas-warehouse/pages/LastMileOrdersView.behavior.test.ts +++ b/src/modules/overseas-warehouse/pages/LastMileOrdersView.behavior.test.ts @@ -4,6 +4,7 @@ import { enableAutoUnmount, flushPromises, mount } from '@vue/test-utils' import { afterAll, afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { ApiResponseError } from '@/shared/api/http' import DataTable from '@/shared/components/DataTable.vue' +import QueryToolbar from '@/shared/components/QueryToolbar.vue' import { listAllPlatformWarehouses } from '@/modules/warehouses' import { convertLastMileContainerToInboundPlans, @@ -124,6 +125,38 @@ describe('LastMileOrdersView pending order and container conversion', () => { expect(listContainerPlanProgress).not.toHaveBeenCalled() }) + it('forwards complete searches and switches every status tab without stale filter failures', async () => { + const wrapper = await mountView() + const toolbar = wrapper.findComponent(QueryToolbar) + const model = { + orderNo: 'LMO-SEARCH', inboundCode: 'IN-SEARCH', lxCode: 'LX-SEARCH', orderType: 'FIRST_LEG', + warehouse: 'LAX', sourceOrderNo: 'SOURCE-SEARCH', containerNo: 'CONT-SEARCH', transferWarehouseCode: 'ONT8', + status: 'DELIVERED', abnormal: 'true', detained: 'false', createdAt: ['2026-09-01', '2026-09-07'], + } + toolbar.vm.$emit('search', model) + await flushPromises() + expect(listLastMileOrders).toHaveBeenLastCalledWith(expect.objectContaining({ + page: 1, orderNo: 'LMO-SEARCH', inboundCode: 'IN-SEARCH', lxCode: 'LX-SEARCH', orderType: 'FIRST_LEG', + warehouse: 'LAX', sourceOrderNo: 'SOURCE-SEARCH', containerNo: 'CONT-SEARCH', transferWarehouseCode: 'ONT8', + currentStatus: 'DELIVERED', abnormal: true, detained: false, + createdFrom: '2026-09-01T00:00:00', createdTo: '2026-09-07T23:59:59', + })) + expect((toolbar.props('availableFields') as Array<{ key: string }>).map((field) => field.key)).toContain('lxCode') + + await wrapper.findAll('.el-radio-button').find((item) => item.text() === '待分配')!.trigger('click') + await flushPromises() + expect(listLastMileOrders).toHaveBeenLastCalledWith(expect.objectContaining({ currentStatus: 'PENDING_ASSIGNMENT', lxCode: 'LX-SEARCH' })) + + await wrapper.findAll('.el-radio-button').find((item) => item.text().startsWith('柜子'))!.trigger('click') + await flushPromises() + expect(listContainerPlanProgress).toHaveBeenLastCalledWith(expect.objectContaining({ containerNo: 'CONT-SEARCH', createdFrom: '2026-09-01T00:00:00', createdTo: '2026-09-07T23:59:59' })) + + await wrapper.findAll('.el-radio-button').find((item) => item.text() === '全部')!.trigger('click') + await flushPromises() + expect(listLastMileOrders).toHaveBeenLastCalledWith(expect.objectContaining({ currentStatus: 'DELIVERED', lxCode: 'LX-SEARCH' })) + expect(wrapper.text()).not.toContain('尾程订单加载失败') + }) + it('keeps single-order conversion isolated with long order and customer ids', async () => { const wrapper = await openPending() await selectRows(wrapper, [selectedRow()]) diff --git a/src/modules/overseas-warehouse/pages/LastMileOrdersView.vue b/src/modules/overseas-warehouse/pages/LastMileOrdersView.vue index ed223910..7b1934e4 100644 --- a/src/modules/overseas-warehouse/pages/LastMileOrdersView.vue +++ b/src/modules/overseas-warehouse/pages/LastMileOrdersView.vue @@ -212,6 +212,7 @@ async function load(model: QueryModel = filters.value) { orderType: String(filters.value.orderType || '').trim() || undefined, warehouse: String(filters.value.warehouse || '').trim() || undefined, inboundCode: String(filters.value.inboundCode || '').trim() || undefined, + lxCode: String(filters.value.lxCode || '').trim() || undefined, sourceOrderNo: String(filters.value.sourceOrderNo || '').trim() || undefined, containerNo: String(filters.value.containerNo || '').trim() || undefined, currentStatus: statusTab.value === '待分配' ? 'PENDING_ASSIGNMENT' : String(filters.value.status || '').trim() || undefined, @@ -398,7 +399,7 @@ onMounted(() => { void load() }) 待分配 柜子工作台({{ containerTotal }}) - +