diff --git a/src/modules/warehouses/api/platformWarehouses.ts b/src/modules/warehouses/api/platformWarehouses.ts index 90a6a7a1..bfbe7d51 100644 --- a/src/modules/warehouses/api/platformWarehouses.ts +++ b/src/modules/warehouses/api/platformWarehouses.ts @@ -2,12 +2,14 @@ import { http, unwrapApiResponse, type ApiEnvelope } from '@/shared/api/http' export type PlatformWarehouseStatus = 'ACTIVE' | 'INACTIVE' +export type WarehouseType = 'DOMESTIC' | 'FBA' | 'OVERSEAS' + export interface PlatformWarehouseResource { id: number | string tenantId: number | string warehouseCode: string warehouseName: string - warehouseType: string + warehouseType: WarehouseType countryCode: string timezone: string contactName: string | null @@ -85,7 +87,7 @@ export interface SavePlatformWarehouseRequest { tenantId: number | string warehouseCode: string warehouseName: string - warehouseType: string + warehouseType: WarehouseType countryCode: string timezone: string contactName: string | null diff --git a/src/modules/warehouses/pages/WarehousesView.test.ts b/src/modules/warehouses/pages/WarehousesView.test.ts index 5c00d8c1..1eea5445 100644 --- a/src/modules/warehouses/pages/WarehousesView.test.ts +++ b/src/modules/warehouses/pages/WarehousesView.test.ts @@ -12,8 +12,7 @@ import { } from '@/modules/warehouses/api/platformWarehouses' import { useAccessPreviewStore } from '@/core/access/accessPreview' import { useAuthStore } from '@/core/auth/auth' -import { listPlatformTenants, type PlatformTenantResource } from '../../iam/api/platformIam' -import PlatformTenantSelector from '../../iam/components/PlatformTenantSelector.vue' +import QueryToolbar from '@/shared/components/QueryToolbar.vue' import WarehousesView from './WarehousesView.vue' vi.mock('@/modules/warehouses/api/platformWarehouses', () => ({ @@ -24,8 +23,6 @@ vi.mock('@/modules/warehouses/api/platformWarehouses', () => ({ changePlatformWarehouseStatus: vi.fn(), })) -vi.mock('../../iam/api/platformIam', () => ({ listPlatformTenants: vi.fn() })) - class ResizeObserverStub implements ResizeObserver { observe() {} unobserve() {} @@ -60,16 +57,6 @@ const warehouse: PlatformWarehouseResource = { updatedAt: '2026-07-31T10:20:00', } -const tenant = (id: number | string, tenantName: string): PlatformTenantResource => ({ - id, tenantCode: String(id), tenantName, status: 'ACTIVE', legalName: tenantName, - legalRepresentative: null, unifiedSocialCreditCode: null, contactName: null, - contactPhone: null, contactEmail: null, servicePackage: null, contactWechat: null, - salesOwnerName: null, paymentTermDays: null, enterpriseType: null, establishedDate: null, - registeredCapital: null, registeredCapitalCurrency: null, registeredAddress: null, - internalRemark: null, createdAt: null, approvedAt: null, -}) -const snowflakeTenantId = '9223372036854775806' - const detail: PlatformWarehouseDetailResource = { warehouse, addresses: [{ @@ -108,9 +95,6 @@ describe('WarehousesView real API integration', () => { vi.stubGlobal('ResizeObserver', ResizeObserverStub) document.body.innerHTML = '' vi.mocked(listPlatformWarehouses).mockReset().mockResolvedValue({ records: [warehouse], page: 1, size: 200, total: 1, pages: 1 }) - vi.mocked(listPlatformTenants).mockReset().mockResolvedValue({ - records: [tenant(10001, '默认企业'), tenant(snowflakeTenantId, '雪花企业')], page: 1, size: 200, total: 2, pages: 1, - }) vi.mocked(getPlatformWarehouse).mockReset().mockResolvedValue(detail) vi.mocked(createPlatformWarehouse).mockReset().mockResolvedValue('19005') vi.mocked(updatePlatformWarehouse).mockReset().mockResolvedValue(null) @@ -124,6 +108,8 @@ describe('WarehousesView real API integration', () => { expect(wrapper.text()).toContain('测试环境收货仓') expect(wrapper.text()).toContain('北苑街道 真实物流园 1 号库 A 栋') expect(wrapper.text()).toContain('周一至周六 08:30-18:00') + expect(wrapper.text()).toContain('国内收货仓') + expect(wrapper.text()).toContain('Asia/Shanghai') expect(wrapper.text()).not.toContain('全部收货仓') expect(wrapper.find('.query-toolbar').exists()).toBe(true) expect(wrapper.find('.data-table').exists()).toBe(true) @@ -146,21 +132,24 @@ describe('WarehousesView real API integration', () => { expect(wrapper.text()).toContain('测试环境收货仓') }) - it('renders an explicit tenant selector and defaults to tenant 10001', async () => { + it('uses the fixed public tenant without rendering a tenant selector', async () => { const wrapper = await mountView() - expect(wrapper.find('[aria-label="目标企业"]').exists()).toBe(true) - expect(wrapper.text()).not.toContain('查询仓库') - expect(wrapper.text()).toContain('租户 10001') + expect(wrapper.find('[aria-label="目标企业"]').exists()).toBe(false) + expect(listPlatformWarehouses).toHaveBeenCalledWith(10001, 1, 200) + expect(wrapper.text()).toContain('公共仓库') }) - it('preserves a snowflake tenant id as a string when switching enterprises', async () => { + it('filters the public warehouse table by warehouse type', async () => { const wrapper = await mountView() - wrapper.findComponent(PlatformTenantSelector).vm.$emit('update:modelValue', snowflakeTenantId) + wrapper.findComponent(QueryToolbar).vm.$emit('search', { + keyword: '', warehouseType: 'FBA', status: '', + }) await flushPromises() - expect(listPlatformWarehouses).toHaveBeenLastCalledWith(snowflakeTenantId, 1, 200) + expect(wrapper.text()).not.toContain('测试环境收货仓') + expect(wrapper.text()).toContain('暂无符合筛选条件的仓库') }) it('shows a recoverable real API error without falling back to demo warehouses', async () => { @@ -180,6 +169,12 @@ describe('WarehousesView real API integration', () => { await editButton?.trigger('click') await flushPromises() + const typeFormItem = wrapper.findAll('.el-form-item').find((item) => item.text().includes('仓库类型')) + expect(typeFormItem).toBeDefined() + typeFormItem?.findComponent({ name: 'ElSelect' }).vm.$emit('update:modelValue', 'FBA') + await wrapper.find('input[placeholder="例如 CN、US"]').setValue('US') + await wrapper.find('input[placeholder="例如 Asia/Shanghai"]').setValue('America/Los_Angeles') + const saveButton = wrapper.findAll('button').find((button) => button.text().trim() === '保存仓库') expect(saveButton).toBeDefined() await saveButton?.trigger('click') @@ -188,8 +183,11 @@ describe('WarehousesView real API integration', () => { expect(updatePlatformWarehouse).toHaveBeenCalledOnce() const [, , payload] = vi.mocked(updatePlatformWarehouse).mock.calls[0] expect(payload.contactEmail).toBe('warehouse@example.com') + expect(payload).toMatchObject({ + tenantId: 10001, warehouseType: 'FBA', countryCode: 'US', timezone: 'America/Los_Angeles', + }) expect(payload.address).toMatchObject({ - district: '北苑街道', postalCode: '322000', addressLine1: '真实物流园 1 号库', addressLine2: 'A 栋', + countryCode: 'US', district: '北苑街道', postalCode: '322000', addressLine1: '真实物流园 1 号库', addressLine2: 'A 栋', latitude: '29.3', longitude: '120.0', }) expect(payload.capabilities).toContainEqual(expect.objectContaining({ @@ -206,6 +204,8 @@ describe('WarehousesView real API integration', () => { await flushPromises() expect(document.querySelector('input[placeholder="例如 广东省"]')).not.toBeNull() + expect(document.querySelector('input[placeholder="例如 CN、US"]')).not.toBeNull() + expect(document.querySelector('input[placeholder="例如 Asia/Shanghai"]')).not.toBeNull() expect(document.querySelector('input[placeholder="请输入仓库联系人姓名"]')).not.toBeNull() expect(document.querySelector('textarea[placeholder="请输入街道、园区、楼栋及库位信息"]')).not.toBeNull() diff --git a/src/modules/warehouses/pages/WarehousesView.vue b/src/modules/warehouses/pages/WarehousesView.vue index 6dba0bd0..6cffcf89 100644 --- a/src/modules/warehouses/pages/WarehousesView.vue +++ b/src/modules/warehouses/pages/WarehousesView.vue @@ -1,5 +1,5 @@