154 lines
5.2 KiB
TypeScript
154 lines
5.2 KiB
TypeScript
import type { AppRouteRecord } from '@/types/router'
|
|
|
|
/** 目录型菜单缺省图标 */
|
|
export const DEFAULT_SUBMENU_ICON = 'ri:folder-2-line'
|
|
|
|
/** 叶子菜单缺省图标 */
|
|
export const DEFAULT_MENU_ITEM_ICON = 'ri:file-list-2-line'
|
|
|
|
/**
|
|
* 侧栏菜单图标映射(按路由 name;未在 meta 配置 icon 时使用)
|
|
* 键与 router/modules 中 name 一致,便于前后端菜单对齐。
|
|
*/
|
|
export const SIDEBAR_MENU_ICON_MAP: Record<string, string> = {
|
|
// ── 报销管理 ──
|
|
BxManagement: 'ri:wallet-3-line',
|
|
BxExpenseItem: 'ri:price-tag-3-line',
|
|
BxWorkflowAdvance: 'ri:git-branch-line',
|
|
BxWorkflowReimburse: 'ri:git-merge-line',
|
|
BxAdvanceApply: 'ri:money-cny-circle-line',
|
|
BxAdvanceApprove: 'ri:check-double-line',
|
|
BxAdvanceIssue: 'ri:hand-coin-line',
|
|
BxReimburseApply: 'ri:file-edit-line',
|
|
BxReimburseApprove: 'ri:checkbox-circle-line',
|
|
BxPayment: 'ri:bank-card-line',
|
|
BxViewMine: 'ri:user-line',
|
|
BxViewTodo: 'ri:time-line',
|
|
BxViewAll: 'ri:file-list-3-line',
|
|
|
|
// ── CRM ──
|
|
CrmManagement: 'goods',
|
|
CrmProductCategory: 'ri:folder-3-line',
|
|
CrmProduct: 'ri:box-3-line',
|
|
CrmClue: 'ri:seedling-line',
|
|
CrmOpportunity: 'ri:trophy-line',
|
|
CrmQuote: 'ri:file-text-line',
|
|
CrmContract: 'ri:file-paper-2-line',
|
|
CrmCustomer: 'ri:team-line',
|
|
CrmCustomerPool: 'ri:global-line',
|
|
|
|
// ── 地磅 ──
|
|
DbManagement: 'ri:scales-3-line',
|
|
DbDashboard: 'ri:dashboard-line',
|
|
DbPlans: 'ri:calendar-schedule-line',
|
|
DbInventory: 'ri:archive-line',
|
|
DbWeighing: 'ri:scales-line',
|
|
|
|
// ── 工作流 ──
|
|
Workflow: 'workflow',
|
|
WorkflowProcess: 'workflow',
|
|
WorkflowPending: 'ri:inbox-line',
|
|
WorkflowCompleted: 'ri:checkbox-circle-line',
|
|
WorkflowMyApplications: 'ri:file-user-line',
|
|
LeaveRequest: 'ri:calendar-event-line',
|
|
|
|
// ── 系统 ──
|
|
SystemManage: 'ri:settings-3-line',
|
|
Tenant: 'ri:building-line',
|
|
Dict: 'ri:book-2-line',
|
|
Menu: 'ri:menu-line',
|
|
Dept: 'ri:organization-chart',
|
|
Role: 'ri:shield-user-line',
|
|
User: 'user',
|
|
Post: 'ri:briefcase-line',
|
|
|
|
// ── 运输 ──
|
|
TransportPlan: 'ri:truck-line',
|
|
PlCarrier: 'ri:building-2-line',
|
|
PlVehicle: 'ri:truck-line',
|
|
PlSelfVehicle: 'ri:car-line',
|
|
PlPersonnel: 'ri:user-settings-line',
|
|
PlPlan: 'ri:route-line',
|
|
PlPlanCert: 'ri:shield-check-line',
|
|
PlFreight: 'ri:money-cny-box-line',
|
|
PlDocumentReminder: 'ri:alarm-warning-line'
|
|
}
|
|
|
|
/** 按 menuCode 补充映射(后端菜单可能仅有 code) */
|
|
export const SIDEBAR_MENU_ICON_BY_CODE: Record<string, string> = {
|
|
'bx:expenseItem:list': 'ri:price-tag-3-line',
|
|
'bx:workflowAdvance:list': 'ri:git-branch-line',
|
|
'bx:workflowReimburse:list': 'ri:git-merge-line',
|
|
'bx:advanceApply:list': 'ri:money-cny-circle-line',
|
|
'bx:advanceApprove:list': 'ri:check-double-line',
|
|
'bx:advanceIssue:list': 'ri:hand-coin-line',
|
|
'bx:reimburseApply:list': 'ri:file-edit-line',
|
|
'bx:reimburseApprove:list': 'ri:checkbox-circle-line',
|
|
'bx:payment:list': 'ri:bank-card-line',
|
|
'bx:viewMine:list': 'ri:user-line',
|
|
'bx:viewTodo:list': 'ri:time-line',
|
|
'bx:viewAll:list': 'ri:file-list-3-line',
|
|
'crm:productCategory:list': 'ri:folder-3-line',
|
|
'crm:product:list': 'ri:box-3-line',
|
|
'crm:clue:list': 'ri:seedling-line',
|
|
'crm:opportunity:list': 'ri:trophy-line',
|
|
'crm:quote:list': 'ri:file-text-line',
|
|
'crm:contract:list': 'ri:file-paper-2-line',
|
|
'crm:customer:list': 'ri:team-line',
|
|
'crm:customerPool:list': 'ri:global-line',
|
|
'db:dashboard:list': 'ri:dashboard-line',
|
|
'db:plan:list': 'ri:calendar-schedule-line',
|
|
'db:inventory:list': 'ri:archive-line',
|
|
'db:weighing:list': 'ri:scales-line',
|
|
'workflow:process': 'workflow',
|
|
'workflow:pending': 'ri:inbox-line',
|
|
'workflow:completed': 'ri:checkbox-circle-line',
|
|
'workflow:myApplications': 'ri:file-user-line',
|
|
'workflow:leave': 'ri:calendar-event-line',
|
|
'system:tenant:list': 'ri:building-line',
|
|
'system:dict:list': 'ri:book-2-line',
|
|
'system:menu:list': 'ri:menu-line',
|
|
'system:dept:list': 'ri:organization-chart',
|
|
'system:role:list': 'ri:shield-user-line',
|
|
'system:user:list': 'user',
|
|
'system:post:list': 'ri:briefcase-line',
|
|
'pl:carrier:list': 'ri:building-2-line',
|
|
'pl:vehicle:list': 'ri:truck-line',
|
|
'pl:self-vehicle:list': 'ri:car-line',
|
|
'pl:driver:list': 'ri:user-settings-line',
|
|
'pl:plan:list': 'ri:route-line',
|
|
'pl:plan-archive:list': 'ri:folder-check-line',
|
|
'pl:plan-cert:list': 'ri:shield-check-line',
|
|
'pl:freight:list': 'ri:money-cny-box-line',
|
|
'pl:document:list': 'ri:alarm-warning-line'
|
|
}
|
|
|
|
function lookupMappedIcon(item: AppRouteRecord): string {
|
|
const metaIcon = String(item.meta?.icon ?? '').trim()
|
|
if (metaIcon) return metaIcon
|
|
|
|
const name = String(item.name ?? '').trim()
|
|
if (name && SIDEBAR_MENU_ICON_MAP[name]) {
|
|
return SIDEBAR_MENU_ICON_MAP[name]
|
|
}
|
|
|
|
const menuCode = String((item.meta as { menuCode?: string })?.menuCode ?? '').trim()
|
|
if (menuCode && SIDEBAR_MENU_ICON_BY_CODE[menuCode]) {
|
|
return SIDEBAR_MENU_ICON_BY_CODE[menuCode]
|
|
}
|
|
|
|
return ''
|
|
}
|
|
|
|
/**
|
|
* 解析侧栏菜单图标:meta.icon → 路由 name / menuCode 映射 → 缺省图标。
|
|
*/
|
|
export function resolveSidebarMenuIcon(
|
|
item: AppRouteRecord,
|
|
hasChildren = false
|
|
): string {
|
|
const mapped = lookupMappedIcon(item)
|
|
if (mapped) return mapped
|
|
return hasChildren ? DEFAULT_SUBMENU_ICON : DEFAULT_MENU_ITEM_ICON
|
|
}
|