menu-icon.ts 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. import type { AppRouteRecord } from '@/types/router'
  2. /** 目录型菜单缺省图标 */
  3. export const DEFAULT_SUBMENU_ICON = 'ri:folder-2-line'
  4. /** 叶子菜单缺省图标 */
  5. export const DEFAULT_MENU_ITEM_ICON = 'ri:file-list-2-line'
  6. /**
  7. * 侧栏菜单图标映射(按路由 name;未在 meta 配置 icon 时使用)
  8. * 键与 router/modules 中 name 一致,便于前后端菜单对齐。
  9. */
  10. export const SIDEBAR_MENU_ICON_MAP: Record<string, string> = {
  11. // ── 报销管理 ──
  12. BxManagement: 'ri:wallet-3-line',
  13. BxConfig: 'ri:settings-4-line',
  14. BxAdvance: 'ri:money-cny-box-line',
  15. BxReimburse: 'ri:file-list-3-line',
  16. BxViewCenter: 'ri:layout-grid-line',
  17. BxExpenseItem: 'ri:price-tag-3-line',
  18. BxWorkflowAdvance: 'ri:git-branch-line',
  19. BxWorkflowReimburse: 'ri:git-merge-line',
  20. BxAdvanceApply: 'ri:money-cny-circle-line',
  21. BxAdvanceApprove: 'ri:check-double-line',
  22. BxAdvanceIssue: 'ri:hand-coin-line',
  23. BxReimburseApply: 'ri:file-edit-line',
  24. BxReimburseApprove: 'ri:checkbox-circle-line',
  25. BxPayment: 'ri:bank-card-line',
  26. BxViewMine: 'ri:user-line',
  27. BxViewTodo: 'ri:time-line',
  28. BxViewAll: 'ri:file-list-3-line',
  29. // ── CRM ──
  30. CrmManagement: 'goods',
  31. CrmProductCategory: 'ri:folder-3-line',
  32. CrmProduct: 'ri:box-3-line',
  33. CrmClue: 'ri:seedling-line',
  34. CrmOpportunity: 'ri:trophy-line',
  35. CrmQuote: 'ri:file-text-line',
  36. CrmContract: 'ri:file-paper-2-line',
  37. CrmCustomer: 'ri:team-line',
  38. CrmCustomerPool: 'ri:global-line',
  39. // ── 地磅 ──
  40. DbManagement: 'ri:scales-3-line',
  41. DbDashboard: 'ri:dashboard-line',
  42. DbPlans: 'ri:calendar-schedule-line',
  43. DbInventory: 'ri:archive-line',
  44. DbWeighing: 'ri:scales-line',
  45. // ── 工作流 ──
  46. Workflow: 'workflow',
  47. WorkflowProcess: 'workflow',
  48. WorkflowPending: 'ri:inbox-line',
  49. WorkflowCompleted: 'ri:checkbox-circle-line',
  50. WorkflowMyApplications: 'ri:file-user-line',
  51. LeaveRequest: 'ri:calendar-event-line',
  52. Duty: 'ri:calendar-schedule-line',
  53. DutySchedule: 'ri:calendar-check-line',
  54. // ── 系统 ──
  55. SystemManage: 'ri:settings-3-line',
  56. SystemInfo: 'ri:information-line',
  57. SystemTemp: 'ri:inbox-archive-line',
  58. Tenant: 'ri:building-line',
  59. Dict: 'ri:book-2-line',
  60. Menu: 'ri:menu-line',
  61. Dept: 'ri:organization-chart',
  62. Role: 'ri:shield-user-line',
  63. User: 'user',
  64. Post: 'ri:briefcase-line',
  65. // ── 运输 ──
  66. TransportPlan: 'ri:truck-line',
  67. PlPlanModule: 'ri:route-line',
  68. PlCertUpload: 'ri:shield-check-line',
  69. PlFreightModule: 'ri:money-cny-box-line',
  70. PlVehicleModule: 'ri:car-line',
  71. PlDocumentReminderModule: 'ri:alarm-warning-line',
  72. PlBaseInfo: 'ri:database-2-line',
  73. PlCarrier: 'ri:building-2-line',
  74. PlVehicle: 'ri:truck-line',
  75. PlSelfVehicle: 'ri:car-line',
  76. PlPersonnel: 'ri:user-settings-line',
  77. PlPlan: 'ri:route-line',
  78. PlPlanArchive: 'ri:folder-check-line',
  79. PlPlanCert: 'ri:shield-check-line',
  80. PlFreight: 'ri:money-cny-box-line',
  81. PlFreightApproval: 'ri:checkbox-circle-line',
  82. PlFreightDisburse: 'ri:bank-card-line',
  83. PlDocumentReminder: 'ri:alarm-warning-line',
  84. PlTransportAddress: 'ri:map-pin-line'
  85. }
  86. /** 按 menuCode 补充映射(后端菜单可能仅有 code) */
  87. export const SIDEBAR_MENU_ICON_BY_CODE: Record<string, string> = {
  88. 'bx:expenseItem:list': 'ri:price-tag-3-line',
  89. 'bx:workflowAdvance:list': 'ri:git-branch-line',
  90. 'bx:workflowReimburse:list': 'ri:git-merge-line',
  91. 'bx:advanceApply:list': 'ri:money-cny-circle-line',
  92. 'bx:advanceApprove:list': 'ri:check-double-line',
  93. 'bx:advanceIssue:list': 'ri:hand-coin-line',
  94. 'bx:reimburseApply:list': 'ri:file-edit-line',
  95. 'bx:reimburseApprove:list': 'ri:checkbox-circle-line',
  96. 'bx:payment:list': 'ri:bank-card-line',
  97. 'bx:invoiceWallet:admin': 'ri:folder-shared-line',
  98. 'bx:invoiceWallet:mine': 'ri:wallet-3-line',
  99. 'bx:viewMine:list': 'ri:user-line',
  100. 'bx:viewTodo:list': 'ri:time-line',
  101. 'bx:viewAll:list': 'ri:file-list-3-line',
  102. 'crm:productCategory:list': 'ri:folder-3-line',
  103. 'crm:product:list': 'ri:box-3-line',
  104. 'crm:clue:list': 'ri:seedling-line',
  105. 'crm:opportunity:list': 'ri:trophy-line',
  106. 'crm:quote:list': 'ri:file-text-line',
  107. 'crm:contract:list': 'ri:file-paper-2-line',
  108. 'crm:priceLetter:list': 'ri:file-list-3-line',
  109. 'crm:customer:list': 'ri:team-line',
  110. 'crm:customerPool:list': 'ri:global-line',
  111. 'db:dashboard:list': 'ri:dashboard-line',
  112. 'db:plan:list': 'ri:calendar-schedule-line',
  113. 'db:inventory:list': 'ri:archive-line',
  114. 'db:weighing:list': 'ri:scales-line',
  115. 'workflow:process': 'workflow',
  116. 'workflow:pending': 'ri:inbox-line',
  117. 'workflow:completed': 'ri:checkbox-circle-line',
  118. 'workflow:myApplications': 'ri:file-user-line',
  119. 'workflow:leave': 'ri:calendar-event-line',
  120. 'system:tenant:list': 'ri:building-line',
  121. 'system:dict:list': 'ri:book-2-line',
  122. 'system:menu:list': 'ri:menu-line',
  123. 'system:dept:list': 'ri:organization-chart',
  124. 'system:role:list': 'ri:shield-user-line',
  125. 'system:user:list': 'user',
  126. 'system:post:list': 'ri:briefcase-line',
  127. 'pl:carrier:list': 'ri:building-2-line',
  128. 'pl:vehicle:list': 'ri:truck-line',
  129. 'pl:self-vehicle:list': 'ri:car-line',
  130. 'pl:driver:list': 'ri:user-settings-line',
  131. 'pl:plan:list': 'ri:route-line',
  132. 'pl:plan-archive:list': 'ri:folder-check-line',
  133. 'pl:plan-cert:list': 'ri:shield-check-line',
  134. 'pl:freight:list': 'ri:money-cny-box-line',
  135. 'pl:freight-approval:list': 'ri:checkbox-circle-line',
  136. 'pl:freight-disburse:list': 'ri:bank-card-line',
  137. 'pl:transport-address:list': 'ri:map-pin-line',
  138. 'pl:vehicle-recharge-apply:list': 'ri:gas-station-line',
  139. 'pl:vehicle-recharge-record:list': 'ri:hand-coin-line',
  140. 'pl:vehicle-maintenance-apply:list': 'ri:tools-line',
  141. 'pl:vehicle-maintenance-process:list': 'ri:settings-3-line',
  142. 'pl:vehicle-urea-apply:list': 'ri:drop-line',
  143. 'pl:vehicle-urea-disburse:list': 'ri:drop-line',
  144. 'pl:document:list': 'ri:alarm-warning-line'
  145. }
  146. function lookupMappedIcon(item: AppRouteRecord): string {
  147. const metaIcon = String(item.meta?.icon ?? '').trim()
  148. if (metaIcon) return metaIcon
  149. const name = String(item.name ?? '').trim()
  150. if (name && SIDEBAR_MENU_ICON_MAP[name]) {
  151. return SIDEBAR_MENU_ICON_MAP[name]
  152. }
  153. const menuCode = String((item.meta as { menuCode?: string })?.menuCode ?? '').trim()
  154. if (menuCode && SIDEBAR_MENU_ICON_BY_CODE[menuCode]) {
  155. return SIDEBAR_MENU_ICON_BY_CODE[menuCode]
  156. }
  157. return ''
  158. }
  159. /**
  160. * 解析侧栏菜单图标:meta.icon → 路由 name / menuCode 映射 → 缺省图标。
  161. */
  162. export function resolveSidebarMenuIcon(
  163. item: AppRouteRecord,
  164. hasChildren = false
  165. ): string {
  166. const mapped = lookupMappedIcon(item)
  167. if (mapped) return mapped
  168. return hasChildren ? DEFAULT_SUBMENU_ICON : DEFAULT_MENU_ITEM_ICON
  169. }