diff --git a/src/modules/container-loading/pages/ContainersView.test.ts b/src/modules/container-loading/pages/ContainersView.test.ts index a5a37e5a..b8734de7 100644 --- a/src/modules/container-loading/pages/ContainersView.test.ts +++ b/src/modules/container-loading/pages/ContainersView.test.ts @@ -8,8 +8,18 @@ import { listAllPlatformWarehouses } from '@/modules/warehouses' import { listContainers } from '../api/platformContainerLoading' vi.mock('@/modules/warehouses', () => ({ listAllPlatformWarehouses: vi.fn() })) +vi.mock('@/core/access/accessPreview', () => ({ useAccessPreviewStore: () => ({ can: () => true }) })) vi.mock('../api/platformContainerLoading', () => ({ listContainers: vi.fn(), getContainer: vi.fn(), createContainer: vi.fn(), updateContainer: vi.fn(), updateContainerTransport: vi.fn() })) +function createTestRouter() { + return createRouter({ history: createMemoryHistory(), routes: [ + { path: '/', component: ContainersView }, + { path: '/container-loading/:containerId/smart-loading', name: 'smart-loading-workbench', component: { template: '
' } }, + { path: '/loading-plans', name: 'loading-plans', component: { template: '' } }, + { path: '/loading-lists', name: 'loading-lists', component: { template: '' } }, + ] }) +} + describe('ContainersView', () => { beforeEach(() => { setActivePinia(createPinia()) @@ -18,7 +28,7 @@ describe('ContainersView', () => { }) it('loads the real paged contract and renders core container fields', async () => { - const router = createRouter({ history: createMemoryHistory(), routes: [{ path: '/', component: ContainersView }] }) + const router = createTestRouter() await router.push('/'); await router.isReady() const wrapper = mount(ContainersView, { global: { plugins: [ElementPlus, router] } }) await flushPromises() @@ -29,6 +39,18 @@ describe('ContainersView', () => { expect(wrapper.find('button[aria-label="查看 CB-1"]').exists()).toBe(true) }) + it('keeps the cross-warehouse list usable when warehouse form options fail', async () => { + vi.mocked(listAllPlatformWarehouses).mockRejectedValueOnce(new Error('warehouse unavailable')) + const router = createTestRouter() + await router.push('/'); await router.isReady() + const wrapper = mount(ContainersView, { global: { plugins: [ElementPlus, router] } }) + await flushPromises() + + expect(wrapper.text()).toContain('CB-1') + expect(wrapper.text()).not.toContain('装柜仓库加载失败') + expect(wrapper.find('button[aria-label="查看 CB-1"]').exists()).toBe(true) + }) + it('uses stable view labels when cabinetNo is missing', async () => { const base = { id: '9001', planId: null, bookingNo: 'BK-1', cabinetNo: 'CB-1', containerNo: 'MSCU-1', warehouseId: '8', warehouseName: '义乌仓', containerType: '40HQ', planStatus: 'EDITING' as const, version: 0, @@ -46,7 +68,7 @@ describe('ContainersView', () => { ], page: 1, size: 20, total: 3, pages: 1, } as never) - const router = createRouter({ history: createMemoryHistory(), routes: [{ path: '/', component: ContainersView }] }) + const router = createTestRouter() await router.push('/'); await router.isReady() const wrapper = mount(ContainersView, { global: { plugins: [ElementPlus, router] } }) await flushPromises() @@ -57,4 +79,39 @@ describe('ContainersView', () => { expect(labels).toEqual(expect.arrayContaining(['查看 MSCU-2', '查看 BK-3', '查看货柜详情'])) expect(labels.every((label) => !/undefined|null/.test(label))).toBe(true) }) + + it('routes each plan status to its owning workflow without reopening pushed drafts', async () => { + const base = { + id: '9001', planId: '9101', bookingNo: 'BK-1', cabinetNo: 'CB-1', containerNo: 'MSCU-1', warehouseId: '8', warehouseName: '义乌仓', containerType: '40HQ', version: 0, + billOfLadingNo: null, vesselName: null, voyageNo: null, shippingCompanyId: null, shippingCompanyName: null, + departurePortCode: null, departurePortName: '宁波', destinationPortCode: null, destinationPortName: '长滩', + destinationWarehouseCode: null, destinationWarehouseName: null, capacityCbm: 68, maxWeightKg: 28000, + terminalTruckingCompany: null, loadingAt: null, estimatedSailingAt: null, actualSailingAt: null, + estimatedPortArrivalAt: null, actualPortArrivalAt: null, estimatedWarehouseArrivalAt: null, actualWarehouseArrivalAt: null, + } + vi.mocked(listContainers).mockResolvedValueOnce({ + records: [ + { ...base, planStatus: 'EDITING' as const }, + { ...base, id: '9002', planId: '9102', cabinetNo: 'CB-2', planStatus: 'LOADING' as const }, + { ...base, id: '9003', planId: '9103', cabinetNo: 'CB-3', planStatus: 'COMPLETED' as const }, + ], + page: 1, size: 20, total: 3, pages: 1, + }) + const router = createTestRouter() + await router.push('/'); await router.isReady() + const push = vi.spyOn(router, 'push').mockResolvedValue(undefined as never) + const wrapper = mount(ContainersView, { global: { plugins: [ElementPlus, router] } }) + await flushPromises() + + expect(wrapper.text()).toContain('排柜') + expect(wrapper.text()).toContain('查看预装清单') + expect(wrapper.text()).toContain('查看装柜清单') + + await wrapper.findAll('button').find((button) => button.text().trim() === '排柜')!.trigger('click') + await wrapper.findAll('button').find((button) => button.text().includes('查看预装清单'))!.trigger('click') + await wrapper.findAll('button').find((button) => button.text().includes('查看装柜清单'))!.trigger('click') + expect(push).toHaveBeenNthCalledWith(1, { name: 'smart-loading-workbench', params: { containerId: '9001' } }) + expect(push).toHaveBeenNthCalledWith(2, { name: 'loading-plans', query: { planId: '9102', warehouseId: '8' } }) + expect(push).toHaveBeenNthCalledWith(3, { name: 'loading-lists', query: { planId: '9103', warehouseId: '8' } }) + }) }) diff --git a/src/modules/container-loading/pages/ContainersView.vue b/src/modules/container-loading/pages/ContainersView.vue index 71bcf161..28a25478 100644 --- a/src/modules/container-loading/pages/ContainersView.vue +++ b/src/modules/container-loading/pages/ContainersView.vue @@ -1,7 +1,7 @@ @@ -404,7 +404,7 @@ onMounted(() => { void refresh() })五类证据各至少一张有效照片;锁码文本与带锁码照同时必填。错误照片只能作废并保留审计记录。
-