export const ADMIN_NAVIGATION = Object.freeze([ { menuKey: 'overview', path: '/overview', stage: 'M08-D', title: '平台运营总览', label: '运营总览', icon: 'LayoutDashboard', capabilities: ['store.operation.read', 'tenant.manage', 'platform.manage'], roles: ['PLATFORM_ADMIN'] }, { menuKey: 'stores', path: '/stores', stage: 'M08-D', title: '门店与房间管理', label: '门店房间', icon: 'Store', capabilities: ['store.operation.read', 'tenant.manage', 'platform.manage'], roles: ['PLATFORM_ADMIN'] }, { menuKey: 'orders', path: '/orders', stage: 'M08-D', title: '订单筛选与运营处置', label: '订单运营', icon: 'ClipboardList', capabilities: ['store.operation.read', 'tenant.manage', 'platform.manage'], roles: ['PLATFORM_ADMIN'] }, { menuKey: 'products', path: '/products', stage: 'M09-D4', title: '商品、库存、订单与寄存', label: '商品运营', icon: 'ShoppingBasket', capabilities: ['product.catalog.read', 'product.catalog.write', 'inventory.read', 'inventory.adjust', 'goods.order.read', 'goods.order.manage', 'goods.storage.read', 'goods.storage.manage', 'tenant.manage', 'platform.manage'], roles: ['PLATFORM_ADMIN'] }, { menuKey: 'notifications', path: '/notifications', stage: 'M10-A', title: '通知模板、路由与投递追踪', label: '通知中心', icon: 'BellRing', capabilities: ['notification.read', 'notification.manage', 'tenant.manage', 'platform.manage'], roles: ['PLATFORM_ADMIN'] }, { menuKey: 'payments', path: '/payments', stage: 'M08-D', title: '支付、退款与分账', label: '支付分账', icon: 'WalletCards', capabilities: ['tenant.manage', 'platform.manage'], roles: ['PLATFORM_ADMIN'] }, { menuKey: 'thirdParty', path: '/third-party', stage: 'M08-D', title: '团购与第三方平台运营', label: '团购平台', icon: 'TicketCheck', capabilities: ['store.operation.read', 'tenant.manage', 'platform.manage'], roles: ['PLATFORM_ADMIN'] }, { menuKey: 'people', path: '/people', stage: 'M08-D', title: '会员与员工用户管理', label: '会员员工', icon: 'UsersRound', capabilities: ['tenant.manage', 'platform.manage'], roles: ['PLATFORM_ADMIN'] }, { menuKey: 'cleaning', path: '/cleaning', stage: 'M08-B/M09', title: '保洁任务与结算', label: '保洁运营', icon: 'Sparkles', capabilities: ['cleaning.task.read', 'tenant.manage', 'platform.manage'], roles: ['PLATFORM_ADMIN'] }, { menuKey: 'devices', path: '/devices', stage: 'M08-D', title: '设备资产、拓扑与控制', label: '设备', icon: 'RadioTower', capabilities: ['device.read', 'tenant.manage', 'platform.manage'], roles: ['PLATFORM_ADMIN'] }, { menuKey: 'platformApps', path: '/apps', stage: 'M08-D', title: '多小程序与租户品牌配置', label: '小程序租户', icon: 'PanelsTopLeft', capabilities: ['tenant.manage', 'platform.manage'], roles: ['PLATFORM_ADMIN'] }, { menuKey: 'content', path: '/content', stage: 'M08-D', title: '广告投放与门店装修', label: '广告装修', icon: 'Images', capabilities: ['tenant.manage', 'platform.manage'], roles: ['PLATFORM_ADMIN'] }, { menuKey: 'franchise', path: '/franchise', stage: 'M08-D', title: '加盟申请与跟进运营', label: '加盟跟进', icon: 'Handshake', capabilities: ['tenant.manage', 'platform.manage'], roles: ['PLATFORM_ADMIN'] }, { menuKey: 'system', path: '/system', stage: 'M08-D', title: '安全审计与系统配置', label: '日志配置', icon: 'ScrollText', capabilities: ['tenant.manage', 'platform.manage'], roles: ['PLATFORM_ADMIN'] } ]); export function isMenuAllowed(menus, menuKey) { return menus.includes(menuKey); } export function pathForMenu(menuKey) { return ADMIN_NAVIGATION.find((item) => item.menuKey === menuKey)?.path ?? null; } export function firstAllowedPath(menus) { return ADMIN_NAVIGATION.find((item) => menus.includes(item.menuKey))?.path ?? null; } export function resolveProtectedPath(menus, requestedMenu) { return isMenuAllowed(menus, requestedMenu) ? pathForMenu(requestedMenu) : firstAllowedPath(menus); } export function isNavigationAllowed(access, item) { if (!isMenuAllowed(access.menus, item.menuKey)) return false; return item.capabilities.some((capability) => access.capabilities.includes(capability)) || item.roles.some((role) => access.roles.includes(role)); } export function firstAuthorizedPath(access) { return ADMIN_NAVIGATION.find((item) => isNavigationAllowed(access, item))?.path ?? null; } export function resolveAuthorizedPath(access, requestedMenu) { const requested = ADMIN_NAVIGATION.find((item) => item.menuKey === requestedMenu); return requested && isNavigationAllowed(access, requested) ? requested.path : firstAuthorizedPath(access); }