fix(overseas): stabilize last-mile search tabs
This commit is contained in:
@@ -37,6 +37,7 @@ import InboundOrdersView from '@/modules/overseas-warehouse/pages/InboundOrdersV
|
|||||||
import InventoryView from '@/modules/overseas-warehouse/pages/InventoryView.vue'
|
import InventoryView from '@/modules/overseas-warehouse/pages/InventoryView.vue'
|
||||||
import DispatchesView from '@/modules/overseas-warehouse/pages/DispatchesView.vue'
|
import DispatchesView from '@/modules/overseas-warehouse/pages/DispatchesView.vue'
|
||||||
import RelabelOrdersView from '@/modules/overseas-warehouse/pages/RelabelOrdersView.vue'
|
import RelabelOrdersView from '@/modules/overseas-warehouse/pages/RelabelOrdersView.vue'
|
||||||
|
import QueryToolbar from '@/shared/components/QueryToolbar.vue'
|
||||||
|
|
||||||
type Region = 'domestic' | 'overseas'
|
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 }
|
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<typeof mount>[0], method: string,
|
|||||||
await waitForTrace(method, path, start)
|
await waitForTrace(method, path, start)
|
||||||
await nextTick()
|
await nextTick()
|
||||||
expect(wrapper.text()).not.toContain('服务暂时不可用')
|
expect(wrapper.text()).not.toContain('服务暂时不可用')
|
||||||
|
return wrapper
|
||||||
}
|
}
|
||||||
async function pageRequestCoverage() {
|
async function pageRequestCoverage() {
|
||||||
await mountPage(OverseasQuotesView, 'GET', '/platform/v1/last-leg/master-data/overseas-quotes')
|
await mountPage(OverseasQuotesView, 'GET', '/platform/v1/last-leg/master-data/overseas-quotes')
|
||||||
await mountPage(PurchaseOrdersView, 'GET', '/platform/v1/last-leg/overseas-procurements')
|
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/us-truck-orders', { domain: 'truck' })
|
||||||
await mountPage(TransportOrdersView, 'GET', '/platform/v1/last-leg/local-looseboard-orders', { domain: 'looseboard' })
|
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<string, unknown> | 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<string, unknown> | undefined)?.lxCode)).toBe(true)
|
||||||
await mountPage(InboundOrdersView, 'GET', '/platform/v1/last-leg/inbound-plans')
|
await mountPage(InboundOrdersView, 'GET', '/platform/v1/last-leg/inbound-plans')
|
||||||
await mountPage(InventoryView, 'GET', '/platform/v1/last-leg/inventory/balances')
|
await mountPage(InventoryView, 'GET', '/platform/v1/last-leg/inventory/balances')
|
||||||
await mountPage(DispatchesView, 'GET', '/platform/v1/last-leg/dispatches')
|
await mountPage(DispatchesView, 'GET', '/platform/v1/last-leg/dispatches')
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import { enableAutoUnmount, flushPromises, mount } from '@vue/test-utils'
|
|||||||
import { afterAll, afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
|
import { afterAll, afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
|
||||||
import { ApiResponseError } from '@/shared/api/http'
|
import { ApiResponseError } from '@/shared/api/http'
|
||||||
import DataTable from '@/shared/components/DataTable.vue'
|
import DataTable from '@/shared/components/DataTable.vue'
|
||||||
|
import QueryToolbar from '@/shared/components/QueryToolbar.vue'
|
||||||
import { listAllPlatformWarehouses } from '@/modules/warehouses'
|
import { listAllPlatformWarehouses } from '@/modules/warehouses'
|
||||||
import {
|
import {
|
||||||
convertLastMileContainerToInboundPlans,
|
convertLastMileContainerToInboundPlans,
|
||||||
@@ -124,6 +125,38 @@ describe('LastMileOrdersView pending order and container conversion', () => {
|
|||||||
expect(listContainerPlanProgress).not.toHaveBeenCalled()
|
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 () => {
|
it('keeps single-order conversion isolated with long order and customer ids', async () => {
|
||||||
const wrapper = await openPending()
|
const wrapper = await openPending()
|
||||||
await selectRows(wrapper, [selectedRow()])
|
await selectRows(wrapper, [selectedRow()])
|
||||||
|
|||||||
@@ -212,6 +212,7 @@ async function load(model: QueryModel = filters.value) {
|
|||||||
orderType: String(filters.value.orderType || '').trim() || undefined,
|
orderType: String(filters.value.orderType || '').trim() || undefined,
|
||||||
warehouse: String(filters.value.warehouse || '').trim() || undefined,
|
warehouse: String(filters.value.warehouse || '').trim() || undefined,
|
||||||
inboundCode: String(filters.value.inboundCode || '').trim() || undefined,
|
inboundCode: String(filters.value.inboundCode || '').trim() || undefined,
|
||||||
|
lxCode: String(filters.value.lxCode || '').trim() || undefined,
|
||||||
sourceOrderNo: String(filters.value.sourceOrderNo || '').trim() || undefined,
|
sourceOrderNo: String(filters.value.sourceOrderNo || '').trim() || undefined,
|
||||||
containerNo: String(filters.value.containerNo || '').trim() || undefined,
|
containerNo: String(filters.value.containerNo || '').trim() || undefined,
|
||||||
currentStatus: statusTab.value === '待分配' ? 'PENDING_ASSIGNMENT' : String(filters.value.status || '').trim() || undefined,
|
currentStatus: statusTab.value === '待分配' ? 'PENDING_ASSIGNMENT' : String(filters.value.status || '').trim() || undefined,
|
||||||
@@ -398,7 +399,7 @@ onMounted(() => { void load() })
|
|||||||
<el-radio-button value="待分配">待分配</el-radio-button>
|
<el-radio-button value="待分配">待分配</el-radio-button>
|
||||||
<el-radio-button value="柜子">柜子工作台({{ containerTotal }})</el-radio-button>
|
<el-radio-button value="柜子">柜子工作台({{ containerTotal }})</el-radio-button>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
<QueryToolbar v-model="filters" :fields="fields" :loading="loading" ariaLabel="尾程订单筛选" preference-key="overseas-last-mile-orders-query" @search="search" @reset="reset" />
|
<QueryToolbar v-model="filters" :fields="fields" :available-fields="allFields" :loading="loading" ariaLabel="尾程订单筛选" preference-key="overseas-last-mile-orders-query" @search="search" @reset="reset" />
|
||||||
</section>
|
</section>
|
||||||
</template>
|
</template>
|
||||||
<template v-if="loadError" #state>
|
<template v-if="loadError" #state>
|
||||||
|
|||||||
Reference in New Issue
Block a user