/** * 顶部大模块定义 * 与路由 meta.module、菜单 module 字段、useAppStore.activeModule 联动 */ export enum ModuleKey { HOME = 'home', OTR = 'otr', SALES = 'sales', PROJECT = 'project', SALARY = 'salary', WEBSITE = 'website', } export interface ModuleDefinition { key: ModuleKey /** 顶部 tab 显示文案 */ title: string /** 用于路径反查的根前缀(如 /home /otr /salary) */ path: string /** 点击 tab 时实际跳转的入口路径(默认为 path,可被 entry 覆盖) */ entry?: string /** 是否本期已实现,false 走占位页 */ implemented: boolean /** 顶部 tab 图标(element plus icon name 或 svg name),可选 */ icon?: string /** 该模块名下的所有路径前缀(用于路径反查 module,仅 sales 需要因为它没有统一前缀)*/ pathPrefixes?: string[] } export const MODULE_LIST: ModuleDefinition[] = [ { key: ModuleKey.HOME, title: '首页', path: '/home', entry: '/home/dashboard', implemented: true }, { key: ModuleKey.OTR, title: 'OTR', path: '/otr', entry: '/otr/target/mine', implemented: true }, // sales 模块迁自 sp-sales-management,保留原始路径(/index, /clue/*, /customer/* 等), // 因此用 pathPrefixes 显式列出销售业务下所有顶级路径,用于反查 module。 { key: ModuleKey.SALES, title: '销售', path: '/index', entry: '/index', implemented: true, pathPrefixes: [ '/index', '/clue', '/customer', '/business', '/order', '/orderForm', '/email', '/finance', '/refundRecord', '/statistics', '/bulletin', '/task', '/target', '/layout/notice', '/system/updatePwd', '/user', ], }, { key: ModuleKey.PROJECT, title: '项目', path: '/project', implemented: false }, { key: ModuleKey.SALARY, title: '工资', path: '/salary', implemented: false }, { key: ModuleKey.WEBSITE, title: '官网', path: '/website', implemented: false }, ] /** 通过路径匹配模块(用于路由切换时反查所属模块;仅作 fallback,优先用 route.meta.module) */ export function resolveModuleByPath(path: string): ModuleKey { if (!path) return ModuleKey.HOME // 优先精确/前缀匹配(包含 pathPrefixes,按长度倒序避免短前缀误匹配) const candidates: Array<{ key: ModuleKey; prefix: string }> = [] for (const m of MODULE_LIST) { candidates.push({ key: m.key, prefix: m.path }) if (m.pathPrefixes) { for (const p of m.pathPrefixes) candidates.push({ key: m.key, prefix: p }) } } candidates.sort((a, b) => b.prefix.length - a.prefix.length) const hit = candidates.find(c => path === c.prefix || path.startsWith(c.prefix + '/')) return hit?.key ?? ModuleKey.HOME } /** 通过 key 取定义 */ export function getModuleDefinition(key: ModuleKey): ModuleDefinition | undefined { return MODULE_LIST.find(m => m.key === key) }