/** * 前端页面三级按钮目录(与菜单 permissionCode 关联) * * - parentPermissionCode:与菜单表二级节点一致(如 Rbac.Menus、Order.MyOrders) * - permissionCode:三级按钮权限码,通常为 `{Parent}.{Action}` * * 维护:node scripts/collect-page-buttons.mjs 扫描变更后合并到此文件 */ export interface PageButtonDef { permissionCode: string; name: string; order?: number; } export interface PageButtonGroup { parentPermissionCode: string; buttons: PageButtonDef[]; } /** 权限动作后缀 → 中文名称 */ export const PERMISSION_ACTION_LABELS: Record = { Query: '查询', Create: '新增', Update: '修改', Delete: '删除', Move: '移动', AssignRoles: '分配角色', AssignPermissions: '分配权限', ResetPassword: '重置密码', Template: '模板管理', Audit: '审计', Use: '使用', Save: '保存', Export: '导出', Import: '导入', Publish: '发布', Pay: '支付', Print: '打印', BatchPrint: '批量打印', Intercept: '拦截', CancelIntercept: '取消拦截', PreDeclare: '预报', Refresh: '刷新', Reset: '重置', Search: '搜索', Submit: '提交', Copy: '复制', Download: '下载', Upload: '上传', Sync: '同步', Retry: '重试', RetryFailed: '重试失败', Cancel: '取消', CancelPending: '取消待处理', Enable: '启用', Disable: '禁用', View: '查看', Edit: '编辑', SaveConfig: '保存配置', TestConnection: '测试连接', BatchSend: '批量发送', BatchImport: '批量导入', BatchExport: '批量导出', BatchOrder: '批量下单', SingleOrder: '单票下单', SampleOrder: '生成示例订单', Recharge: '充值', Inbound: '入库', Outbound: '出库', Push: '推送', ChainPull: '串联拉取', CreateTrack: '创建轨迹', ForwardDownstream: '预报下游', MarkProblematic: '创建问题件', MarkClaimed: '创建理赔件', MarkProcessed: '标记已处理', EditOrder: '修改订单', AddMapping: '添加映射', AddInterface: '新增接口', RefreshList: '刷新列表', CreateApplication: '创建应用', NewPort: '新增接口', SaveTemplate: '保存模板', DeleteTemplate: '删除模板', PublishPrice: '价格发布', SaveOnly: '仅保存', SaveAndActivate: '保存并生效', ExportPrice: '导出价格', ImportPrice: '导入价格', SyncLevel3Buttons: '同步三级按钮', AddChild: '新增子菜单', AddChildOrg: '新增子组织', SaveProvider: '保存提供商', Chat: '对话', Analyze: '执行分析', Like: '点赞', Favorite: '收藏', Comment: '评论', AiCreate: 'AI创作', SchedulePublish: '定时发布', Preview: '预览', PublishNow: '立即发布', ImportOfficial: '导入官方示例', MatchSkill: '搭配新技能', DeleteOrder: '删除订单', BatchUpdatePullConfig: '批量修改拉取配置', DeleteTrack: '删除轨迹', UpdateTrack: '更新轨迹', RefreshTrack: '刷新轨迹', PushTrack: '推送轨迹', AddTrack: '新增轨迹', AddProduct: '新增产品', AddProvider: '新增服务商', AddWarningRule: '新增预警规则', SendDebug: '发送调试', AddAnnouncement: '新增公告', AddDict: '新增字典', AddWarehouse: '新增仓库', AddConfig: '新增配置', Debug: '调试', Rollback: '回滚到此版本', RollbackVersion: '回滚到此版本', PublishConfirm: '发布', ConfirmPublish: '确定', SelectPublishDate: '选择发布日期', EditPrice: '编辑', AddZone: '新增分区', AddRule: '新增规则', AddRounding: '新增进位', AddScene: '新增场景', EditScene: '编辑场景', AppReset: '应用重置', ImportCurl: '导入cURL', Send: '发送', SmartFill: '智能填充', ParamConfig: '参数配置', ReturnConfig: '返回配置', FillToForm: '填充到表单', AiScript: 'AI脚本', PrefixScript: '前置脚本', SuffixScript: '后置脚本', GenerateScript: '生成脚本', Parse: '解析', Format: '格式化', AddParam: '新增参数', AddSystemParam: '新增系统参数', ColumnConfig: '字段配置', PushRecord: '推送记录', ConfirmDelete: '确认删除', EditBasic: '编辑基本信息', SaveBasic: '保存基本信息', EditWeight: '编辑件重尺', SaveWeight: '保存件重尺', AddFee: '添加费用', RecalculateReceivable: '重算应收', RecalculatePayable: '重算应付', AddDeclarationRow: '添加申报行', DownstreamForecastResult: '下游预报结果', More: '更多', OrderNow: '立刻下单', SavePermissions: '保存权限', SelectAll: '全选', DeselectAll: '取消全选', ExpandAll: '全部展开', CollapseAll: '全部收起', NewTemplate: '新建模板', ApplyToUser: '套用到用户', WriteRolePerm: '写入角色权限', AddDetailRow: '添加明细行', AddSampleConfig: '添加示例配置', BatchImportDict: '批量导入字典', DownloadPresetDict: '下载 OMS 预置字典', RejectRecharge: '拒绝充值申请', RechargeScreenshot: '充值截图', DisableAi: '禁用 AI 服务', ClearChat: '清空', EditProvider: '编辑提供商', RestoreDefault: '恢复默认', Reload: '重新加载', GenerateName: '生成名称', EngineStart: '启动引擎', EngineStop: '停止引擎', RefreshStatus: '刷新状态', BrowserLogin: '浏览器登录', CheckLogin: '登录校验', Logout: '退出登录', AgentGuide: 'Agent 连接指南', AiAnalyze: 'AI分析', StartAnalyze: '开始分析', AutoComment: '自动评论', SaveLabel: '保存模板', OmsLogin: 'OMS登录', ComingSoon: '敬请期待', }; export function inferButtonName(permissionCode: string, fallbackName?: string | null): string { if (fallbackName?.trim()) return fallbackName.trim(); const action = permissionCode.split('.').pop() || permissionCode; return PERMISSION_ACTION_LABELS[action] || action; } /** 菜单 permissionCode → 目录分组 key(处理历史命名与路由 RBAC 不一致) */ export const PAGE_BUTTON_PARENT_ALIASES: Record = { 'Api.UpstreamInterface': 'Api.UpstreamInterface', 'Api.Interfaces': 'Api.UpstreamInterface', 'Api.DownstreamInterface': 'Api.DownstreamInterface', 'Api.ServiceProviders': 'Api.DownstreamInterface', 'Api.AppList': 'Api.AppList', 'Api.Applications': 'Api.AppList', 'Track.Order': 'Track.Order', 'Track.Orders': 'Track.Order', 'Track.WarningOrder': 'Track.WarningOrder', 'Track.Warnings': 'Track.WarningOrder', 'Track.State': 'Track.State', 'Track.States': 'Track.State', 'Track.Flag': 'Track.Flag', 'Track.Flags': 'Track.Flag', 'Track.Content': 'Track.Content', 'Track.Pull': 'Track.Pull', 'Track.Push': 'Track.Push', 'Track.Mapping': 'Track.Pull', 'Track.KpiRegion': 'Track.KpiRegion', 'Track.KpiEarlyWarningConfig': 'Track.KpiEarlyWarningConfig', 'Track.Kpi': 'Track.KpiEarlyWarningConfig', 'Rbac.Menus.Query': 'Rbac.Menus', 'Rbac.Roles.Query': 'Rbac.Roles', 'Rbac.Users.Query': 'Rbac.Users', 'Rbac.Organizations.Query': 'Rbac.Organizations', 'Rbac.DataPerm.Query': 'Rbac.DataPerm', 'Rbac.DataPermUsers': 'Rbac.DataPerm', 'System.XhsAiAssistant': 'Xhs.Ai', 'Xhs.Ai.Use': 'Xhs.Ai', 'Xhs.StartService': 'Xhs.Agent', 'Xhs.PublishHistory': 'Xhs.Publish', 'Xhs.Analysis.Use': 'Xhs.Analysis', 'Xhs.Creation.Use': 'Xhs.Creation', 'Xhs.HumanSettings.Save': 'Xhs.HumanSettings', 'User.Recharge': 'User.Recharge', 'User.Sub-account': 'User.SubAccount', 'Track.TrackOrder': 'Track.Order', 'Track.TrackWarningOrder': 'Track.WarningOrder', 'Track.TrackState': 'Track.State', 'Track.TrackFlag': 'Track.Flag', 'Track.TrackContent': 'Track.Content', 'System.Permission.Menu': 'Rbac.Menus', 'System.Permission.Role': 'Rbac.Roles', 'System.Organization': 'Rbac.Organizations', 'System.Organization.User': 'Rbac.Users', 'System.DataPerm.Audit': 'Rbac.DataPerm.Audit', 'System.DataPerm.Templates': 'Rbac.DataPerm.Template', 'System.DataPerm.Users': 'Rbac.DataPerm', 'Api.ApiTest': 'Api.ApiTest', 'Api.Test.Query': 'Api.ApiTest', 'Channel.LabelDesign': 'Channel.LabelDesign', 'Order.BatchJobs.Query': 'Order.BatchJobs', }; type BtnInput = { code: string; name: string }; /** 快捷定义:code 可为完整权限码或相对后缀 */ function B(parent: string, items: BtnInput[]): PageButtonGroup { return { parentPermissionCode: parent, buttons: items.map((item, order) => ({ permissionCode: item.code.includes('.') ? item.code : `${parent}.${item.code}`, name: item.name, order, })), }; } const CORE_GROUPS: PageButtonGroup[] = [ // ── 首页 ── B('Home.Workplace', [ { code: 'Query', name: '查询' }, { code: 'View', name: '查看' }, ]), B('Home.Monitor', [ { code: 'Query', name: '查询' }, { code: 'View', name: '查看监控' }, ]), // ── API ── B('Api.UpstreamInterface', [ { code: 'Api.Interfaces.Query', name: '查询' }, { code: 'Api.Interfaces.Create', name: '新增接口' }, { code: 'Api.Interfaces.Update', name: '修改' }, { code: 'Api.Interfaces.Delete', name: '删除' }, { code: 'RefreshList', name: '刷新列表' }, { code: 'Save', name: '保存' }, { code: 'Cancel', name: '取消' }, { code: 'AddMapping', name: '添加映射' }, { code: 'Debug', name: '调试' }, { code: 'PublishConfirm', name: '发布' }, { code: 'Rollback', name: '回滚' }, { code: 'RollbackVersion', name: '回滚到此版本' }, { code: 'Import', name: '导入' }, { code: 'AiScript', name: 'AI脚本' }, { code: 'PrefixScript', name: '前置脚本' }, { code: 'SuffixScript', name: '后置脚本' }, { code: 'GenerateScript', name: '生成脚本' }, { code: 'Parse', name: '解析' }, { code: 'Format', name: '格式化' }, { code: 'AddParam', name: '新增参数' }, { code: 'AddSystemParam', name: '新增系统参数' }, ]), B('Api.UpstreamInterfaceConfig', [ { code: 'Query', name: '查询' }, { code: 'Save', name: '保存' }, ]), B('Api.UpstreamInterfaceConfigEdit', [ { code: 'Save', name: '保存' }, ]), B('Api.DownstreamInterface', [ { code: 'Api.ServiceProviders.Query', name: '查询' }, { code: 'Api.ServiceProviders.Create', name: '新增服务商' }, { code: 'NewPort', name: '新增接口' }, { code: 'AddInterface', name: '新增接口' }, { code: 'RefreshList', name: '刷新接口列表' }, { code: 'Save', name: '保存' }, { code: 'Cancel', name: '取消' }, { code: 'Debug', name: '调试' }, { code: 'SmartFill', name: '智能填充' }, { code: 'ParamConfig', name: '参数配置' }, { code: 'ReturnConfig', name: '返回配置' }, { code: 'FillToForm', name: '填充到表单' }, ]), B('Api.AppList', [ { code: 'Api.Applications.Query', name: '查询' }, { code: 'Api.Applications.Create', name: '新增应用' }, { code: 'CreateApplication', name: '创建应用' }, { code: 'Update', name: '修改' }, { code: 'Delete', name: '删除' }, { code: 'Save', name: '保存' }, { code: 'Copy', name: '复制' }, { code: 'Reset', name: '重置' }, { code: 'AppReset', name: '应用重置' }, ]), B('Api.RequestLog', [ { code: 'Api.Logs.Query', name: '查询' }, { code: 'Export', name: '导出' }, ]), B('Api.CallStatistics', [ { code: 'Api.Statistics.Query', name: '查询' }, { code: 'Export', name: '导出' }, ]), B('Api.ApiDebugger', [ { code: 'Api.Debugger.Query', name: '查询' }, { code: 'SendDebug', name: '发送调试' }, { code: 'Save', name: '保存' }, ]), B('Api.ApiTest', [ { code: 'Api.Test.Query', name: '查询' }, { code: 'Send', name: '发送' }, { code: 'ImportCurl', name: '导入cURL' }, { code: 'Copy', name: '复制' }, { code: 'Format', name: '格式化' }, ]), // ── 轨迹 ── B('Track.Order', [ { code: 'Track.Orders.Query', name: '查询' }, { code: 'AddTrack', name: '新增轨迹' }, { code: 'UpdateTrack', name: '更新轨迹' }, { code: 'RefreshTrack', name: '刷新轨迹' }, { code: 'DeleteTrack', name: '删除轨迹' }, { code: 'PushTrack', name: '推送轨迹' }, { code: 'DeleteOrder', name: '删除订单' }, { code: 'BatchUpdatePullConfig', name: '批量修改拉取配置' }, { code: 'ColumnConfig', name: '字段配置' }, { code: 'PushRecord', name: '推送记录' }, ]), B('Track.WarningOrder', [ { code: 'Track.Warnings.Query', name: '查询' }, { code: 'PushTrack', name: '推送轨迹' }, { code: 'AddTrack', name: '新增轨迹' }, { code: 'RefreshTrack', name: '刷新轨迹' }, { code: 'PushRecord', name: '推送记录' }, ]), B('Track.State', [ { code: 'Track.States.Query', name: '查询' }, { code: 'Create', name: '新增' }, { code: 'Update', name: '修改' }, { code: 'Delete', name: '删除' }, ]), B('Track.Flag', [ { code: 'Track.Flags.Query', name: '查询' }, { code: 'Create', name: '新增' }, { code: 'Update', name: '修改' }, { code: 'Delete', name: '删除' }, ]), B('Track.Content', [ { code: 'Track.Content.Query', name: '查询' }, { code: 'Create', name: '新增' }, { code: 'Update', name: '修改' }, { code: 'Delete', name: '删除' }, ]), B('Track.Pull', [ { code: 'Track.Mapping.Query', name: '查询' }, { code: 'ChainPull', name: '串联拉取' }, { code: 'Create', name: '新增' }, { code: 'Update', name: '修改' }, { code: 'Delete', name: '删除' }, ]), B('Track.Push', [ { code: 'Track.Mapping.Query', name: '查询' }, { code: 'Save', name: '保存' }, { code: 'Create', name: '新增' }, { code: 'Update', name: '修改' }, { code: 'Delete', name: '删除' }, ]), B('Track.KpiRegion', [ { code: 'Track.Kpi.Query', name: '查询' }, { code: 'Create', name: '新增' }, { code: 'Update', name: '修改' }, { code: 'Delete', name: '删除' }, { code: 'AddZone', name: '预警分区' }, ]), B('Track.KpiEarlyWarningConfig', [ { code: 'Track.Kpi.Query', name: '查询' }, { code: 'AddWarningRule', name: '新增预警规则' }, { code: 'Create', name: '新增' }, { code: 'Update', name: '修改' }, { code: 'Delete', name: '删除' }, { code: 'Save', name: '保存' }, { code: 'Reset', name: '重置' }, { code: 'RefreshList', name: '刷新列表' }, { code: 'AddScene', name: '新增场景' }, { code: 'EditScene', name: '编辑场景' }, ]), // ── 订单 ── B('Order.PriceCheck', [ { code: 'Query', name: '查询' }, { code: 'Reset', name: '重置条件' }, { code: 'Search', name: '搜索' }, { code: 'OrderNow', name: '立刻下单' }, ]), B('Order.PlaceOrder', [ { code: 'Query', name: '查询' }, { code: 'BatchOrder', name: '批量下单' }, { code: 'SingleOrder', name: '单票下单' }, { code: 'SampleOrder', name: '生成示例订单' }, { code: 'Import', name: '上传文件' }, { code: 'Download', name: '下载模板' }, { code: 'Create', name: '新增申报行' }, { code: 'Delete', name: '删除申报行' }, ]), B('Order.MyOrders', [ { code: 'Query', name: '查询' }, { code: 'Pay', name: '支付' }, { code: 'PreDeclare', name: '预报' }, { code: 'CreateTrack', name: '创建轨迹订单' }, { code: 'ForwardDownstream', name: '预报下游订单' }, { code: 'Print', name: '单个打印' }, { code: 'BatchPrint', name: '批量打印' }, { code: 'Intercept', name: '拦截' }, { code: 'CancelIntercept', name: '取消拦截' }, { code: 'Delete', name: '删除' }, { code: 'ConfirmDelete', name: '确认删除' }, { code: 'Export', name: '导出' }, { code: 'MarkProblematic', name: '创建问题件' }, { code: 'MarkClaimed', name: '创建理赔件' }, { code: 'MarkProcessed', name: '标记已处理' }, { code: 'EditOrder', name: '修改订单' }, { code: 'View', name: '查看详情' }, { code: 'More', name: '更多' }, { code: 'DownstreamForecastResult', name: '下游预报结果' }, { code: 'EditBasic', name: '编辑' }, { code: 'SaveBasic', name: '保存' }, { code: 'Cancel', name: '取消' }, { code: 'AddFee', name: '添加费用' }, { code: 'RecalculateReceivable', name: '重算应收' }, { code: 'RecalculatePayable', name: '重算应付' }, { code: 'AddDeclarationRow', name: '添加申报行' }, ]), B('Order.BatchJobs', [ { code: 'Query', name: '查询' }, { code: 'View', name: '查看' }, { code: 'Retry', name: '重试失败' }, { code: 'Cancel', name: '取消待处理' }, ]), B('Order.PlatformStore', [ { code: 'Query', name: '查询' }, { code: 'Save', name: '保存' }, { code: 'Delete', name: '删除' }, { code: 'Auth', name: '授权' }, ]), B('Order.PlatformStoreOrder', [ { code: 'Query', name: '查询' }, { code: 'MatchInventory', name: '匹配库存' }, { code: 'ToggleSuspend', name: '搁置/恢复' }, { code: 'Delete', name: '删除' }, ]), B('Warehouse.Sku', [ { code: 'Query', name: '查询' }, { code: 'Save', name: '保存' }, { code: 'Delete', name: '删除' }, ]), B('Warehouse.Inventory', [ { code: 'Query', name: '查询' }, { code: 'Relocate', name: '换库位' }, ]), B('Warehouse.Parcel', [ { code: 'Query', name: '查询' }, { code: 'Save', name: '保存' }, { code: 'Delete', name: '删除' }, ]), B('Warehouse.InboundNotice', [ { code: 'Query', name: '查询' }, { code: 'Save', name: '保存' }, { code: 'Delete', name: '删除' }, ]), // ── 渠道 ── B('Channel.SalesProducts', [ { code: 'Query', name: '查询' }, { code: 'AddProduct', name: '新增产品' }, { code: 'Create', name: '新增' }, { code: 'Update', name: '修改' }, { code: 'Delete', name: '删除' }, { code: 'EditPrice', name: '编辑' }, { code: 'Save', name: '保存' }, { code: 'PublishPrice', name: '价格发布' }, { code: 'PublishConfirm', name: '发布' }, { code: 'SaveOnly', name: '仅保存' }, { code: 'SaveAndActivate', name: '保存并生效' }, { code: 'ExportPrice', name: '导出价格' }, { code: 'ImportPrice', name: '导入价格' }, { code: 'RollbackVersion', name: '回滚到此版本' }, { code: 'ConfirmPublish', name: '确定' }, { code: 'SelectPublishDate', name: '选择发布日期' }, { code: 'Cancel', name: '取消' }, { code: 'RefreshList', name: '刷新列表' }, ]), B('Channel.ServiceChannels', [ { code: 'Query', name: '查询' }, { code: 'AddProvider', name: '新增服务商' }, { code: 'Create', name: '新增' }, { code: 'Update', name: '修改' }, { code: 'Delete', name: '删除' }, { code: 'EditPrice', name: '编辑' }, { code: 'Save', name: '保存' }, { code: 'PublishPrice', name: '价格发布' }, { code: 'PublishConfirm', name: '发布' }, { code: 'SaveOnly', name: '仅保存' }, { code: 'SaveAndActivate', name: '保存并生效' }, { code: 'ExportPrice', name: '导出价格' }, { code: 'ImportPrice', name: '导入价格' }, { code: 'RollbackVersion', name: '回滚到此版本' }, { code: 'ConfirmPublish', name: '确定' }, { code: 'SelectPublishDate', name: '选择发布日期' }, { code: 'Cancel', name: '取消' }, { code: 'RefreshList', name: '刷新列表' }, ]), B('Channel.PriceArea', [ { code: 'Query', name: '查询' }, { code: 'Create', name: '新增' }, { code: 'AddZone', name: '新增分区' }, { code: 'Import', name: '导入' }, { code: 'Update', name: '修改' }, { code: 'Delete', name: '删除' }, { code: 'RefreshList', name: '刷新列表' }, ]), B('Channel.Blacklist', [ { code: 'Query', name: '查询' }, { code: 'Create', name: '新增' }, { code: 'AddZone', name: '新增分区' }, { code: 'Import', name: '导入' }, { code: 'Update', name: '修改' }, { code: 'Delete', name: '删除' }, { code: 'RefreshList', name: '刷新列表' }, ]), B('Channel.RemoteZones', [ { code: 'Query', name: '查询' }, { code: 'Create', name: '新增' }, { code: 'AddZone', name: '新增分区' }, { code: 'Import', name: '导入' }, { code: 'Update', name: '修改' }, { code: 'Delete', name: '删除' }, { code: 'RefreshList', name: '刷新列表' }, ]), B('Channel.WeightRules', [ { code: 'Query', name: '查询' }, { code: 'Create', name: '新增' }, { code: 'AddRule', name: '新增规则' }, { code: 'Update', name: '修改' }, { code: 'Delete', name: '删除' }, { code: 'RefreshList', name: '刷新列表' }, ]), B('Channel.WeightRounding', [ { code: 'Query', name: '查询' }, { code: 'Create', name: '新增' }, { code: 'AddRounding', name: '新增进位' }, { code: 'Update', name: '修改' }, { code: 'Delete', name: '删除' }, { code: 'RefreshList', name: '刷新列表' }, ]), B('Channel.AutoTrigger', [ { code: 'Query', name: '查询' }, { code: 'Create', name: '新增' }, { code: 'Update', name: '修改' }, { code: 'Delete', name: '删除' }, ]), B('Channel.IssueTemplate', [ { code: 'Query', name: '查询' }, { code: 'Create', name: '新增' }, { code: 'Update', name: '修改' }, { code: 'Delete', name: '删除' }, ]), B('Channel.LabelDesign', [ { code: 'Query', name: '查询' }, { code: 'SaveLabel', name: '保存模板' }, ]), // ── 操作 ── B('Operation.InboundScan', [ { code: 'Query', name: '查询' }, { code: 'Reset', name: '重置' }, { code: 'Inbound', name: '入库' }, ]), B('Operation.OutboundScan', [ { code: 'Query', name: '查询' }, { code: 'Reset', name: '重置' }, { code: 'Outbound', name: '出库' }, ]), B('Operation.PrintLabel', [ { code: 'Query', name: '查询' }, { code: 'Reset', name: '重置' }, { code: 'Print', name: '打印' }, ]), // ── 客户 / 用户 ── B('User.Recharge', [ { code: 'Query', name: '查询' }, { code: 'Recharge', name: '充值' }, { code: 'Submit', name: '提交' }, ]), B('User.Customer', [ { code: 'Query', name: '查询' }, { code: 'Search', name: '搜索' }, { code: 'Create', name: '新增' }, { code: 'Update', name: '修改' }, { code: 'Edit', name: '编辑' }, { code: 'Delete', name: '删除' }, { code: 'Reset', name: '重置' }, { code: 'ResetPassword', name: '重置密码' }, { code: 'OmsLogin', name: 'OMS登录' }, ]), B('User.SubAccount', [ { code: 'Query', name: '查询' }, { code: 'Create', name: '新增子账号' }, { code: 'Update', name: '修改' }, { code: 'Delete', name: '删除' }, { code: 'AssignRoles', name: '分配权限' }, { code: 'SelectAll', name: '全选' }, { code: 'DeselectAll', name: '取消全选' }, { code: 'ExpandAll', name: '全部展开' }, { code: 'CollapseAll', name: '全部收起' }, ]), // ── 财务 ── B('Finance.RechargeRecord', [ { code: 'Query', name: '查询' }, { code: 'Search', name: '搜索' }, { code: 'Reset', name: '重置' }, { code: 'Export', name: '导出' }, { code: 'RechargeScreenshot', name: '充值截图' }, { code: 'RejectRecharge', name: '拒绝充值申请' }, ]), B('Finance.AccountFlow', [ { code: 'Query', name: '查询' }, { code: 'Search', name: '搜索' }, { code: 'Reset', name: '重置' }, { code: 'Export', name: '导出' }, ]), B('Finance.ReceivablePayable', [ { code: 'Query', name: '查询' }, { code: 'Search', name: '搜索' }, { code: 'Reset', name: '重置' }, { code: 'Export', name: '导出' }, ]), // ── RBAC / 系统 ── B('Rbac.Menus', [ { code: 'Rbac.Menus.Query', name: '查询' }, { code: 'Rbac.Menus.Create', name: '新增菜单' }, { code: 'AddChild', name: '新增子菜单' }, { code: 'Rbac.Menus.Update', name: '修改' }, { code: 'Rbac.Menus.Delete', name: '删除' }, { code: 'Rbac.Menus.Move', name: '移动' }, { code: 'SyncLevel3Buttons', name: '同步三级按钮' }, ]), B('Rbac.Roles', [ { code: 'Rbac.Roles.Query', name: '查询' }, { code: 'Rbac.Roles.Create', name: '新增角色' }, { code: 'Rbac.Roles.Update', name: '修改' }, { code: 'Rbac.Roles.Delete', name: '删除' }, { code: 'Rbac.Roles.AssignPermissions', name: '分配权限' }, { code: 'SavePermissions', name: '保存权限' }, { code: 'SelectAll', name: '全选' }, { code: 'DeselectAll', name: '取消全选' }, { code: 'RefreshList', name: '刷新列表' }, ]), B('Rbac.Users', [ { code: 'Rbac.Users.Query', name: '查询' }, { code: 'Rbac.Users.Create', name: '新增用户' }, { code: 'Rbac.Users.Update', name: '修改' }, { code: 'Rbac.Users.Delete', name: '删除' }, { code: 'Rbac.Users.AssignRoles', name: '分配角色' }, { code: 'Rbac.Users.ResetPassword', name: '重置密码' }, ]), B('Rbac.Organizations', [ { code: 'Rbac.Organizations.Query', name: '查询' }, { code: 'Rbac.Organizations.Create', name: '新增组织' }, { code: 'AddChildOrg', name: '新增子组织' }, { code: 'Rbac.Organizations.Update', name: '修改' }, { code: 'Rbac.Organizations.Delete', name: '删除' }, { code: 'Rbac.Organizations.Move', name: '移动' }, ]), B('Rbac.DataPerm', [ { code: 'Rbac.DataPerm.Query', name: '查询' }, { code: 'Rbac.DataPerm.Update', name: '修改' }, { code: 'Rbac.DataPerm.Template', name: '模板管理' }, { code: 'Rbac.DataPerm.Audit', name: '审计' }, { code: 'Save', name: '保存' }, { code: 'RefreshList', name: '刷新列表' }, ]), B('Rbac.DataPerm.Template', [ { code: 'Query', name: '查询' }, { code: 'Create', name: '新增' }, { code: 'NewTemplate', name: '新建模板' }, { code: 'Update', name: '修改' }, { code: 'Delete', name: '删除' }, { code: 'Save', name: '保存' }, { code: 'ApplyToUser', name: '套用到用户' }, { code: 'WriteRolePerm', name: '写入角色权限' }, { code: 'AddDetailRow', name: '添加明细行' }, { code: 'AddSampleConfig', name: '添加示例配置' }, { code: 'RefreshList', name: '刷新列表' }, ]), B('Rbac.DataPerm.Audit', [ { code: 'Query', name: '查询' }, { code: 'Export', name: '导出' }, ]), B('System.Announcement', [ { code: 'Query', name: '查询' }, { code: 'AddAnnouncement', name: '新增公告' }, { code: 'Create', name: '新增' }, { code: 'Update', name: '修改' }, { code: 'Delete', name: '删除' }, ]), B('System.Dict', [ { code: 'Query', name: '查询' }, { code: 'AddDict', name: '新增字典' }, { code: 'Create', name: '新增' }, { code: 'Update', name: '修改' }, { code: 'Delete', name: '删除' }, { code: 'BatchImport', name: '批量导入' }, { code: 'BatchImportDict', name: '批量导入字典' }, { code: 'DownloadPresetDict', name: '下载 OMS 预置字典' }, { code: 'BatchExport', name: '批量导出' }, { code: 'Download', name: '下载模板' }, ]), B('System.WarehouseAddress', [ { code: 'Query', name: '查询' }, { code: 'AddWarehouse', name: '新增仓库' }, { code: 'Create', name: '新增' }, { code: 'Update', name: '修改' }, { code: 'Edit', name: '编辑' }, { code: 'Delete', name: '删除' }, { code: 'Copy', name: '复制' }, ]), B('System.OtherConfig', [ { code: 'Query', name: '查询' }, { code: 'AddConfig', name: '新增配置' }, { code: 'Create', name: '新增' }, { code: 'Update', name: '修改' }, { code: 'Delete', name: '删除' }, ]), B('System.BatchEmail', [ { code: 'System.BatchEmail.Use', name: '使用' }, { code: 'Import', name: '导入文件' }, { code: 'BatchSend', name: '批量发送' }, { code: 'SaveTemplate', name: '保存模板' }, { code: 'DeleteTemplate', name: '删除模板' }, { code: 'SaveConfig', name: '保存配置' }, { code: 'TestConnection', name: '测试连接' }, ]), // ── 小红书 ── B('Xhs.Agent', [ { code: 'Xhs.Agent.Query', name: '查询' }, { code: 'Refresh', name: '刷新' }, { code: 'View', name: '连接指南' }, { code: 'AgentGuide', name: 'Agent 连接指南' }, { code: 'EngineStart', name: '启动引擎' }, { code: 'EngineStop', name: '停止引擎' }, { code: 'RefreshStatus', name: '刷新状态' }, { code: 'Logout', name: '退出登录' }, { code: 'BrowserLogin', name: '浏览器登录' }, { code: 'CheckLogin', name: '登录校验' }, { code: 'ComingSoon', name: '敬请期待' }, ]), B('Xhs.Ai', [ { code: 'Xhs.Ai.Use', name: '使用' }, { code: 'SaveProvider', name: '保存提供商' }, { code: 'Chat', name: '对话' }, { code: 'DisableAi', name: '禁用 AI 服务' }, { code: 'EditProvider', name: '编辑提供商' }, { code: 'ClearChat', name: '清空' }, { code: 'Save', name: '保存' }, { code: 'Refresh', name: '刷新' }, ]), B('Xhs.Analysis', [ { code: 'Xhs.Analysis.Use', name: '使用' }, { code: 'Analyze', name: '执行分析' }, { code: 'AiAnalyze', name: 'AI分析' }, { code: 'StartAnalyze', name: '开始分析' }, { code: 'Like', name: '点赞' }, { code: 'Favorite', name: '收藏' }, { code: 'Comment', name: '评论' }, { code: 'AutoComment', name: '自动评论' }, ]), B('Xhs.Creation', [ { code: 'Xhs.Creation.Use', name: '使用' }, { code: 'AiCreate', name: 'AI创作' }, { code: 'SchedulePublish', name: '定时发布' }, { code: 'Preview', name: '预览' }, { code: 'PublishNow', name: '立即发布' }, ]), B('Xhs.Publish', [ { code: 'Xhs.Publish.Query', name: '查询' }, { code: 'Cancel', name: '取消' }, { code: 'Retry', name: '重试' }, ]), B('Xhs.Skills', [ { code: 'Xhs.Skills.Query', name: '查询' }, { code: 'ImportOfficial', name: '导入官方示例' }, { code: 'MatchSkill', name: '搭配新技能' }, { code: 'GenerateName', name: '生成名称' }, { code: 'Create', name: '新增' }, { code: 'Update', name: '修改' }, { code: 'Delete', name: '删除' }, ]), B('Xhs.HumanSettings', [ { code: 'Xhs.HumanSettings.Save', name: '保存' }, { code: 'Save', name: '保存' }, { code: 'Reset', name: '重置' }, { code: 'RestoreDefault', name: '恢复默认' }, { code: 'Reload', name: '重新加载' }, ]), ]; function buildCatalogLookup(): Map { const map = new Map(); const register = (key: string, buttons: PageButtonDef[]) => { const normalized = key.trim(); if (!normalized) return; map.set(normalized, buttons.map((item) => ({ ...item }))); }; CORE_GROUPS.forEach((group) => { register(group.parentPermissionCode, group.buttons); register(`${group.parentPermissionCode}.Query`, group.buttons); register(normalizeResourcePermissionCode(group.parentPermissionCode), group.buttons); }); Object.entries(PAGE_BUTTON_PARENT_ALIASES).forEach(([alias, canonical]) => { const buttons = map.get(canonical); if (buttons) { register(alias, buttons); } }); return map; } /** * 将菜单 permissionCode 规范化为资源级 */ export function normalizeResourcePermissionCode(permissionCode: string): string { const code = permissionCode?.trim() || ''; if (!code) return ''; if (/\.Query$/i.test(code)) { return code.replace(/\.Query$/i, ''); } return code; } const catalogLookup = buildCatalogLookup(); /** 导出完整目录(canonical 分组) */ export const PAGE_BUTTON_CATALOG: PageButtonGroup[] = CORE_GROUPS; /** 按菜单 permissionCode 获取三级按钮 */ export function getCatalogButtons(menuPermissionCode: string): PageButtonDef[] { const code = menuPermissionCode?.trim(); if (!code) return []; const resourceCode = normalizeResourcePermissionCode(code); const aliasKey = PAGE_BUTTON_PARENT_ALIASES[code]; const buttons = catalogLookup.get(code) ?? (aliasKey ? catalogLookup.get(aliasKey) : undefined) ?? catalogLookup.get(resourceCode) ?? catalogLookup.get(`${resourceCode}.Query`) ?? []; return buttons.map((item) => ({ ...item })); } /** 全部三级按钮(去重) */ export function getAllCatalogButtons(): PageButtonDef[] { const map = new Map(); CORE_GROUPS.forEach((group) => { group.buttons.forEach((btn) => { if (!map.has(btn.permissionCode)) { map.set(btn.permissionCode, { ...btn }); } }); }); return Array.from(map.values()); } /** 已收录的页面菜单 permissionCode 列表 */ export function getCatalogParentCodes(): string[] { return CORE_GROUPS.map((g) => g.parentPermissionCode).sort(); }