From 17d483bf21fc5aaeac77ea7a4d9f05350c447874 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Tue, 11 Aug 2026 11:30:30 +0800 Subject: [PATCH] feat(admin): register phase3 service center routes --- src/app/router/index.test.ts | 14 ++++++++++ src/app/router/index.ts | 6 +++++ src/core/navigation/adminNavigation.test.ts | 29 +++++++++++++++++++++ src/core/navigation/adminNavigation.ts | 3 +++ 4 files changed, 52 insertions(+) diff --git a/src/app/router/index.test.ts b/src/app/router/index.test.ts index 41862693..d9012210 100644 --- a/src/app/router/index.test.ts +++ b/src/app/router/index.test.ts @@ -63,6 +63,20 @@ describe('admin router access metadata', () => { expect(detailIndex).toBeGreaterThan(globalIndex) }) + it('registers phase-three service center routes with their stable permissions', () => { + const expected = [ + ['port-schedules', '/port-schedules', 'platform:firstleg:port-schedule:list'], + ['customs-cases', '/customs', 'platform:firstleg:customs:list'], + ['outbound-dispatches', '/outbound-dispatches', 'platform:firstleg:outbound-dispatch:list'], + ] + + for (const [name, path, permission] of expected) { + const route = router.getRoutes().find((item) => item.name === name) + expect(route?.path).toBe(path) + expect(route?.meta.permission).toBe(permission) + } + }) + it('protects counterparty records with a stable master-data permission', () => { const route = router.getRoutes().find((item) => item.name === 'counterparties') expect(route?.path).toBe('/master-data/counterparties') diff --git a/src/app/router/index.ts b/src/app/router/index.ts index da61bb89..8bfb0e66 100644 --- a/src/app/router/index.ts +++ b/src/app/router/index.ts @@ -21,6 +21,9 @@ import { warehouseRoutes } from '@/modules/warehouses/routes' import { prototypeModuleRoutes } from '@/prototype/routes' import { oceanBookingRoutes } from '@/modules/ocean-bookings/routes' import { truckingRoutes } from '@/modules/trucking/routes' +import { portScheduleRoutes } from '@/modules/port-schedules/routes' +import { customsRoutes } from '@/modules/customs/routes' +import { outboundDispatchRoutes } from '@/modules/outbound-dispatch/routes' import { feeItemRoutes } from '@/modules/fee-items/routes' import { containerLoadingRoutes } from '@/modules/container-loading/routes' import { loadingListRoutes } from '@/modules/loading-lists/routes' @@ -49,7 +52,10 @@ const router = createRouter({ ...dashboardRoutes, ...prototypeModuleRoutes, ...oceanBookingRoutes, + ...portScheduleRoutes, ...truckingRoutes, + ...customsRoutes, + ...outboundDispatchRoutes, ...containerLoadingRoutes, ...loadingListRoutes, ...financeRoutes, diff --git a/src/core/navigation/adminNavigation.test.ts b/src/core/navigation/adminNavigation.test.ts index b91e8660..a6e7cb0f 100644 --- a/src/core/navigation/adminNavigation.test.ts +++ b/src/core/navigation/adminNavigation.test.ts @@ -35,6 +35,13 @@ describe('adminNavigation', () => { '库位管理', '托盘管理', ]) + expect(adminNavigation.find((item) => item.key === 'service-center')?.children?.map((item) => item.title)).toEqual([ + '订舱列表', + '船期信息', + '拖车列表', + '报关协同', + '国内出仓', + ]) expect(adminNavigation.find((item) => item.key === 'supplier-center')?.children?.map((item) => item.title)).toEqual([ '供应商列表', '快递公司', @@ -89,6 +96,9 @@ describe('adminNavigation', () => { expect(paths).toContain('/container-loading/smart-loading') expect(paths).toContain('/loading-plans') expect(paths).toContain('/loading-lists') + expect(paths).toContain('/port-schedules') + expect(paths).toContain('/customs') + expect(paths).toContain('/outbound-dispatches') expect(paths).not.toContain('/prototype/container-management/container-list') expect(paths).not.toContain('/prototype/container-management/preload-list') expect(paths).not.toContain('/prototype/container-management/manifest') @@ -166,6 +176,25 @@ describe('adminNavigation', () => { ]) }) + it('shows each phase-three service center entry only with its matching permission', () => { + const filtered = filterAdminNavigation(adminNavigation, new Set([ + 'platform:firstleg:ocean-booking:list', + 'platform:firstleg:port-schedule:list', + 'platform:firstleg:truck-appointment:list', + 'platform:firstleg:customs:list', + 'platform:firstleg:outbound-dispatch:list', + ])) + + expect(getNavigationLeaves(filtered).map((item) => item.path)).toEqual([ + '/dashboard', + '/ocean-bookings', + '/port-schedules', + '/trucking', + '/customs', + '/outbound-dispatches', + ]) + }) + it('supports manually hiding a module without removing its route definition', () => { const filtered = filterAdminNavigation([{ key: 'hidden', title: '隐藏模块', icon: adminNavigation[0].icon, path: '/hidden', hidden: true }], new Set()) diff --git a/src/core/navigation/adminNavigation.ts b/src/core/navigation/adminNavigation.ts index 1892c6fb..80d05523 100644 --- a/src/core/navigation/adminNavigation.ts +++ b/src/core/navigation/adminNavigation.ts @@ -78,7 +78,10 @@ export const adminNavigation: AdminNavigationNode[] = [ icon: ClipboardList, children: [ { key: 'booking-list', title: '订舱列表', icon: ClipboardList, path: '/ocean-bookings', permission: 'platform:firstleg:ocean-booking:list' }, + { key: 'port-schedules', title: '船期信息', icon: ClipboardList, path: '/port-schedules', permission: 'platform:firstleg:port-schedule:list' }, { key: 'truck-list', title: '拖车列表', icon: Truck, path: '/trucking', permission: 'platform:firstleg:truck-appointment:list' }, + { key: 'customs-cases', title: '报关协同', icon: FileCheck2, path: '/customs', permission: 'platform:firstleg:customs:list' }, + { key: 'outbound-dispatches', title: '国内出仓', icon: Truck, path: '/outbound-dispatches', permission: 'platform:firstleg:outbound-dispatch:list' }, ], }, {