From 80947cd9ce580f2efcb98b206e23ee866288cb3e Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Thu, 20 Aug 2026 18:02:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/router/index.test.ts | 2 - src/core/navigation/adminNavigation.test.ts | 8 +- src/core/navigation/adminNavigation.ts | 2 - .../api/platformContainerLoading.test.ts | 4 +- .../api/platformContainerLoading.ts | 1 + .../pages/ContainerDetailView.test.ts | 9 ++ .../pages/ContainerDetailView.vue | 2 +- src/modules/container-loading/types.ts | 5 + .../overseas-business/CONTRACT_GAPS.md | 25 +-- .../overseas-business/PROTOTYPE_MATRIX.md | 10 +- .../api/platformOverseasBusiness.test.ts | 82 +++++++--- .../api/platformOverseasBusiness.ts | 57 ++++++- .../components/ContractPendingNotice.vue | 14 -- .../overseas-business/contract.test.ts | 70 ++++----- .../pages/OverseasBusinessViews.test.ts | 73 +++++++++ .../pages/PurchaseOrderDetailView.vue | 21 +-- .../pages/PurchaseOrderEditView.vue | 27 ++-- .../pages/PurchaseOrdersView.vue | 20 +-- .../pages/TransportOrderFormView.vue | 105 ++++++++++--- .../pages/TransportOrdersView.vue | 55 ++++--- src/modules/overseas-business/permissions.ts | 3 + src/modules/overseas-business/types.ts | 64 +++++--- .../overseas-master-data/CONTRACT_GAPS.md | 49 ++---- .../overseas-master-data/PROTOTYPE_MATRIX.md | 14 +- .../api/overseasMasterData.test.ts | 57 +++++++ .../api/overseasMasterData.ts | 42 +++++ src/modules/overseas-master-data/apiError.ts | 7 + .../overseas-master-data/downloadCsv.ts | 6 + .../pages/ExchangeRatesView.vue | 100 ++++++------ .../pages/OverseasMasterDataMount.test.ts | 30 ++++ .../pages/OverseasMasterDataViews.test.ts | 41 +++-- .../pages/OverseasQuotesView.vue | 108 +++++++------ .../pages/VehicleDetailView.vue | 64 +------- .../pages/VehiclesView.vue | 148 +++--------------- .../overseas-master-data/permissions.ts | 12 ++ src/modules/overseas-master-data/types.ts | 28 ++-- .../API_INTEGRATION_MATRIX.md | 14 +- .../overseas-warehouse/CONTRACT_GAPS.md | 19 +-- .../overseas-warehouse/PROTOTYPE_MATRIX.md | 30 ++-- .../api/inboundPlans.test.ts | 18 +++ .../overseas-warehouse/api/inboundPlans.ts | 66 ++++++++ .../overseas-warehouse/api/inventory.test.ts | 10 ++ .../overseas-warehouse/api/inventory.ts | 33 ++++ .../overseas-warehouse/api/pallets.test.ts | 9 ++ src/modules/overseas-warehouse/api/pallets.ts | 12 ++ .../pages/InboundOrderDetailView.vue | 75 ++++----- .../pages/InboundOrdersView.vue | 99 +++++++----- .../pages/InventoryDetailView.vue | 106 +++---------- .../pages/InventoryTransactionsView.vue | 83 ++++------ .../pages/InventoryView.vue | 102 +++++------- .../pages/PalletDetailView.vue | 24 ++- .../overseas-warehouse/pages/PalletsView.vue | 81 +++------- .../pages/RelabelOrdersView.vue | 2 +- .../pages/prototypeContract.test.ts | 28 +++- .../pages/realApiMount.test.ts | 28 ++++ src/modules/overseas-warehouse/permissions.ts | 16 +- src/modules/overseas-warehouse/routes.test.ts | 16 +- src/modules/overseas-warehouse/routes.ts | 24 --- src/modules/overseas-warehouse/types.ts | 14 +- .../platformCarrierScheduleQueries.test.ts | 25 ++- .../api/platformCarrierScheduleQueries.ts | 13 +- ...CarrierScheduleQueryPanel.behavior.test.ts | 38 ++++- .../CarrierScheduleQueryPanel.test.ts | 18 ++- .../components/CarrierScheduleQueryPanel.vue | 54 ++++--- src/modules/port-schedules/types.ts | 47 +++--- 65 files changed, 1386 insertions(+), 1083 deletions(-) delete mode 100644 src/modules/overseas-business/components/ContractPendingNotice.vue create mode 100644 src/modules/overseas-business/pages/OverseasBusinessViews.test.ts create mode 100644 src/modules/overseas-master-data/api/overseasMasterData.test.ts create mode 100644 src/modules/overseas-master-data/api/overseasMasterData.ts create mode 100644 src/modules/overseas-master-data/apiError.ts create mode 100644 src/modules/overseas-master-data/downloadCsv.ts create mode 100644 src/modules/overseas-master-data/pages/OverseasMasterDataMount.test.ts create mode 100644 src/modules/overseas-warehouse/api/inboundPlans.test.ts create mode 100644 src/modules/overseas-warehouse/api/inboundPlans.ts create mode 100644 src/modules/overseas-warehouse/api/inventory.test.ts create mode 100644 src/modules/overseas-warehouse/api/inventory.ts create mode 100644 src/modules/overseas-warehouse/api/pallets.test.ts create mode 100644 src/modules/overseas-warehouse/api/pallets.ts create mode 100644 src/modules/overseas-warehouse/pages/realApiMount.test.ts diff --git a/src/app/router/index.test.ts b/src/app/router/index.test.ts index 40a612f5..83cf417c 100644 --- a/src/app/router/index.test.ts +++ b/src/app/router/index.test.ts @@ -85,8 +85,6 @@ describe('admin router access metadata', () => { ['overseas-inbound-orders', '/overseas-warehouse/inbound-orders', 'platform:overseas-warehouse:inbound-order:list'], ['overseas-relabel-orders', '/overseas-warehouse/relabel-orders', 'platform:overseas-warehouse:relabel-order:list'], ['overseas-pallets', '/overseas-warehouse/pallets', 'platform:overseas-warehouse:pallet:list'], - ['overseas-cartons', '/overseas-warehouse/cartons', 'platform:overseas-warehouse:carton:list'], - ['overseas-products', '/overseas-warehouse/products', 'platform:overseas-warehouse:product:list'], ['overseas-inventory', '/overseas-warehouse/inventory', 'platform:overseas-warehouse:inventory:list'], ['overseas-business-purchases', '/overseas-business/purchases', 'platform:overseas-business:purchase:list'], ['overseas-business-trucks', '/overseas-business/trucks', 'platform:overseas-business:truck:list'], diff --git a/src/core/navigation/adminNavigation.test.ts b/src/core/navigation/adminNavigation.test.ts index 9424586b..fe4c447f 100644 --- a/src/core/navigation/adminNavigation.test.ts +++ b/src/core/navigation/adminNavigation.test.ts @@ -53,8 +53,6 @@ describe('adminNavigation', () => { '入库单', '换标单', '托盘管理', - '箱号管理', - '产品库', '库存管理', ]) expect(adminNavigation.find((item) => item.key === 'general')?.children?.map((item) => item.title)).toEqual([ @@ -144,8 +142,6 @@ describe('adminNavigation', () => { 'platform:overseas-warehouse:inbound-order:list', 'platform:overseas-warehouse:relabel-order:list', 'platform:overseas-warehouse:pallet:list', - 'platform:overseas-warehouse:carton:list', - 'platform:overseas-warehouse:product:list', 'platform:overseas-warehouse:inventory:list', 'platform:overseas-business:purchase:list', 'platform:overseas-business:truck:list', @@ -161,8 +157,6 @@ describe('adminNavigation', () => { '/overseas-warehouse/inbound-orders', '/overseas-warehouse/relabel-orders', '/overseas-warehouse/pallets', - '/overseas-warehouse/cartons', - '/overseas-warehouse/products', '/overseas-warehouse/inventory', '/overseas-business/purchases', '/overseas-business/trucks', @@ -171,6 +165,8 @@ describe('adminNavigation', () => { '/overseas-master-data/quotes', '/overseas-master-data/vehicles', ])) + expect(paths).not.toContain('/overseas-warehouse/cartons') + expect(paths).not.toContain('/overseas-warehouse/products') expect(paths.some((path) => path.includes('outbound') || path.includes('delivery'))).toBe(false) }) diff --git a/src/core/navigation/adminNavigation.ts b/src/core/navigation/adminNavigation.ts index f9d3056f..b96ce996 100644 --- a/src/core/navigation/adminNavigation.ts +++ b/src/core/navigation/adminNavigation.ts @@ -125,8 +125,6 @@ export const adminNavigation: AdminNavigationNode[] = [ { key: 'fba-inbound-order', title: '入库单', icon: ClipboardList, path: '/overseas-warehouse/inbound-orders', permission: 'platform:overseas-warehouse:inbound-order:list' }, { key: 'fba-relabel-order', title: '换标单', icon: ClipboardList, path: '/overseas-warehouse/relabel-orders', permission: 'platform:overseas-warehouse:relabel-order:list' }, { key: 'fba-pallet', title: '托盘管理', icon: WarehouseIcon, path: '/overseas-warehouse/pallets', permission: 'platform:overseas-warehouse:pallet:list' }, - { key: 'fba-carton', title: '箱号管理', icon: ClipboardList, path: '/overseas-warehouse/cartons', permission: 'platform:overseas-warehouse:carton:list' }, - { key: 'fba-product', title: '产品库', icon: Database, path: '/overseas-warehouse/products', permission: 'platform:overseas-warehouse:product:list' }, { key: 'overseas-inventory-list', title: '库存管理', icon: WarehouseIcon, path: '/overseas-warehouse/inventory', permission: 'platform:overseas-warehouse:inventory:list' }, ], }, diff --git a/src/modules/container-loading/api/platformContainerLoading.test.ts b/src/modules/container-loading/api/platformContainerLoading.test.ts index 64597b7c..0bab530f 100644 --- a/src/modules/container-loading/api/platformContainerLoading.test.ts +++ b/src/modules/container-loading/api/platformContainerLoading.test.ts @@ -15,7 +15,7 @@ vi.mock('@/shared/api/http', () => ({ unwrapApiResponse: (response: { data: T }) => response.data, })) -const container = { id: 9007199254740993, planId: 9007199254740994, planNo: 'LP-001', warehouseId: 9007199254740995, shippingCompanyId: 9007199254740996, sourceType: 'SIMULATION', recordStatus: 'ACTIVE', mergedIntoContainerBookingId: null, channelCode: 'NY_EXX', channelName: '纽约EXX海铁', exceptionActive: true, destinationClearanceDocumentStatus: 'COMPLETED', customsDeclarationDocumentStatus: 'UPLOADED', deliveryOrderDocumentStatus: 'UPLOADED', pickupOrderDocumentStatus: 'MISSING', version: '2', capacityCbm: '76', maxWeightKg: '28000' } +const container = { id: 9007199254740993, planId: 9007199254740994, planNo: 'LP-001', warehouseId: 9007199254740995, shippingCompanyId: 9007199254740996, sourceType: 'SIMULATION', recordStatus: 'ACTIVE', mergedIntoContainerBookingId: null, channelCode: 'NY_EXX', channelName: '纽约EXX海铁', exceptionActive: true, destinationClearanceDocumentStatus: 'COMPLETED', customsDeclarationDocumentStatus: 'UPLOADED', deliveryOrderDocumentStatus: 'UPLOADED', pickupOrderDocumentStatus: 'MISSING', unloadingCompletedAt: '2026-08-20T10:00:00', unloadingPhotoUploadedAt: '2026-08-20T10:15:00', estimatedEmptyReportedAt: '2026-08-21T09:00:00', actualEmptyReportedAt: null, emptyReportSourceVersion: '9007199254740997', version: '2', capacityCbm: '76', maxWeightKg: '28000' } const plan = { id: 9007199254740993, bookingId: 9007199254740994, version: '3', status: 'LOADING', canAssign: true, canEdit: true, blockedReason: null, finalCompletionStatus: 'NOT_STARTED', @@ -38,7 +38,7 @@ describe('platform container loading API', () => { it('normalizes paged container ids and numeric metadata', async () => { vi.mocked(http.get).mockResolvedValueOnce({ code: '200', data: { records: [container], page: '1', size: '20', total: '1', pages: '1' } }) const result = await listContainers({ page: 1, size: 20 }) - expect(result.records[0]).toMatchObject({ id: String(container.id), planId: String(container.planId), planNo: 'LP-001', warehouseId: String(container.warehouseId), channelCode: 'NY_EXX', channelName: '纽约EXX海铁', exceptionActive: true, destinationClearanceDocumentStatus: 'COMPLETED', customsDeclarationDocumentStatus: 'UPLOADED', deliveryOrderDocumentStatus: 'UPLOADED', pickupOrderDocumentStatus: 'MISSING', version: 2, capacityCbm: 76 }) + expect(result.records[0]).toMatchObject({ id: String(container.id), planId: String(container.planId), planNo: 'LP-001', warehouseId: String(container.warehouseId), channelCode: 'NY_EXX', channelName: '纽约EXX海铁', exceptionActive: true, destinationClearanceDocumentStatus: 'COMPLETED', customsDeclarationDocumentStatus: 'UPLOADED', deliveryOrderDocumentStatus: 'UPLOADED', pickupOrderDocumentStatus: 'MISSING', unloadingCompletedAt: '2026-08-20T10:00:00', unloadingPhotoUploadedAt: '2026-08-20T10:15:00', estimatedEmptyReportedAt: '2026-08-21T09:00:00', actualEmptyReportedAt: null, emptyReportSourceVersion: '9007199254740997', version: 2, capacityCbm: 76 }) expect(http.get).toHaveBeenCalledWith('/platform/v1/containers', { params: { page: 1, size: 20 } }) }) diff --git a/src/modules/container-loading/api/platformContainerLoading.ts b/src/modules/container-loading/api/platformContainerLoading.ts index c9f08f86..06e7fa10 100644 --- a/src/modules/container-loading/api/platformContainerLoading.ts +++ b/src/modules/container-loading/api/platformContainerLoading.ts @@ -76,6 +76,7 @@ function container(raw: ContainerBookingResource): ContainerBookingResource { oceanBookingRequirementId: optionalId(raw.oceanBookingRequirementId), customerId: optionalId(raw.customerId), shippingCompanyId: optionalId(raw.shippingCompanyId), + emptyReportSourceVersion: optionalId(raw.emptyReportSourceVersion), version: numberValue(raw.version), capacityCbm: raw.capacityCbm == null ? null : numberValue(raw.capacityCbm), maxWeightKg: raw.maxWeightKg == null ? null : numberValue(raw.maxWeightKg), diff --git a/src/modules/container-loading/pages/ContainerDetailView.test.ts b/src/modules/container-loading/pages/ContainerDetailView.test.ts index b98ac56b..9172914b 100644 --- a/src/modules/container-loading/pages/ContainerDetailView.test.ts +++ b/src/modules/container-loading/pages/ContainerDetailView.test.ts @@ -28,4 +28,13 @@ describe('ContainerDetailView', () => { expect(source).toContain(':ocean-booking-id="detail.oceanBookingId"') expect(source).toContain(':container-booking-id="detail.id"') }) + + it('shows overseas unloading and empty-report facts without adding upload or PDA actions', () => { + expect(source).toContain('detail.unloadingCompletedAt') + expect(source).toContain('detail.unloadingPhotoUploadedAt') + expect(source).toContain('detail.estimatedEmptyReportedAt') + expect(source).toContain('detail.actualEmptyReportedAt') + expect(source).not.toContain('uploadUnloadingPhoto') + expect(source).not.toContain('submitEmptyReport') + }) }) diff --git a/src/modules/container-loading/pages/ContainerDetailView.vue b/src/modules/container-loading/pages/ContainerDetailView.vue index 8a2f600d..16af6b11 100644 --- a/src/modules/container-loading/pages/ContainerDetailView.vue +++ b/src/modules/container-loading/pages/ContainerDetailView.vue @@ -153,7 +153,7 @@ onMounted(async () => { await load(); if (route.query.action === 'documents') op