/** * 前端页面三级按钮目录(与菜单 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: '复制', Transfer: '转余额', Withdraw: '提现', Download: '下载', Upload: '上传', Sync: '同步', Pull: '拉单同步', Rts: '准备发货', Label: '重新获取面单', MatchInventory: '匹配库存', CreateLogistics: '创建物流订单', CreateFulfill: '创建物流&代发订单', ToggleSuspend: '搁置/恢复', Auth: '授权', Retry: '重试', RetryFailed: '重试失败', Cancel: '取消', CancelPending: '取消待处理', Enable: '启用', Disable: '禁用', View: '查看', Edit: '编辑', SaveConfig: '保存配置', TestConnection: '测试连接', BatchSend: '批量发送', BatchImport: '批量导入', BatchExport: '批量导出', BatchOrder: '批量下单', SingleOrder: '单票下单', SampleOrder: 'Mock下单', Recharge: '充值', Inbound: '入库', Outbound: '出库', Push: '推送', ChainPull: '串联拉取', CreateTrack: '创建轨迹', ForwardDownstream: '预报下游', MarkProblematic: '创建问题件', MarkClaimed: '创建理赔件', MarkProcessed: '标记已处理', EditOrder: '修改订单', StockBind: '绑定包裹/库存', AddMapping: '添加映射', AddInterface: '新增接口', RefreshList: '刷新列表', CreateApplication: '创建应用', NewPort: '新增接口', SaveTemplate: '保存模板', DeleteTemplate: '删除模板', PublishPrice: '价格发布', SaveOnly: '仅保存', SaveAndActivate: '保存并生效', ExportPrice: '导出价格', ImportPrice: '导入价格', SyncLevel3Buttons: '同步三级按钮', SetDefault: '设为默认', AddChild: '新增子菜单', AddChildOrg: '新增子组织', SaveProvider: '保存提供商', Chat: '对话', Analyze: '执行分析', Like: '点赞', Favorite: '收藏', Comment: '评论', AiCreate: 'AI创作', SchedulePublish: '定时发布', Preview: '预览', Grant: '发放', Adjust: '调账', Rebind: '改绑', Approve: '通过', Reject: '拒绝', End: '结束', PublishNow: '立即发布', ImportOfficial: '导入官方示例', MatchSkill: '搭配新技能', DeleteOrder: '删除订单', BatchUpdatePullConfig: '批量修改拉取配置', DeleteTrack: '删除轨迹', UpdateTrack: '更新轨迹', RefreshTrack: '刷新轨迹', PushTrack: '推送轨迹', AddTrack: '新增轨迹', AddProduct: '新增产品', AddProvider: '新增服务商', AddWarningRule: '新增预警规则', SendDebug: '发送调试', AddAnnouncement: '新增公告', AddDict: '新增字典', AddWarehouse: '新增仓库', Relocate: '换库位', ConfirmReceive: '确认收货', 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: '重算应付', ImportDownstreamWeight: '导入对账件重尺', 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.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.AiAssistant': 'System.Ai', 'System.AiSkills': 'System.AiSkill', 'System.McpTools': 'System.McpTools', 'System.McpTools.Use': 'System.McpTools', 'System.Ai.Use': 'System.Ai', 'System.AiSkill.Use': 'System.AiSkill', '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', 'Rbac.email': 'System.BatchEmail', 'System.BatchEmail.Use': 'System.BatchEmail', 'System.BatchEmail': 'System.BatchEmail', 'Api.ApiTest': 'Api.ApiTest', 'Api.Test.Query': 'Api.ApiTest', 'Api.OpenApi.Query': 'Api.OpenApi', 'Channel.LabelDesign': 'Channel.LabelDesign', 'Order.BatchJobs.Query': 'Order.BatchJobs', 'Order.WaybillManage.Query': 'Order.WaybillManage', 'Order.Pickup.Query': 'Order.Pickup', 'Order.Customs9610.Query': 'Order.Customs9610', 'Order.SenderAddress.Query': 'Order.SenderAddress', 'User.ExportQualification.Query': 'User.ExportQualification', 'Order.PlatformStore.Query': 'Order.PlatformStore', 'Order.PlatformStoreOrder.Query': 'Order.PlatformStoreOrder', 'Warehouse.Sku.Query': 'Warehouse.Sku', 'Warehouse.Inventory.Query': 'Warehouse.Inventory', 'Warehouse.Parcel.Query': 'Warehouse.Parcel', 'Warehouse.InboundNotice.Query': 'Warehouse.InboundNotice', 'Warehouse.BinLocation.Query': 'Warehouse.BinLocation', 'Operation.InboundScan.Query': 'Operation.InboundScan', 'Operation.OutboundScan.Query': 'Operation.OutboundScan', 'Operation.PrintLabel.Query': 'Operation.PrintLabel', 'Operation.FulfillPack.Query': 'Operation.FulfillPack', 'Operation.FulfillPack.BatchPrint': 'Operation.FulfillPack', 'Operation.FulfillPack.ConfirmOutbound': 'Operation.FulfillPack', 'Operation.ParcelArrival.Query': 'Operation.ParcelArrival', 'Marketing.Level.View': 'Marketing.Level', 'Marketing.PointsRule.Edit': 'Marketing.PointsRule', 'Marketing.Points.View': 'Marketing.Points', 'Marketing.Coupon.Template.View': 'Marketing.CouponTemplate', 'Marketing.Coupon.Grant': 'Marketing.CouponGrant', 'Marketing.Commission.Rule.Edit': 'Marketing.CommissionRule', 'Marketing.Commission.View': 'Marketing.CommissionDetail', 'Marketing.Commission.Withdraw.View': 'Marketing.CommissionWithdraw', 'Marketing.Referral.View': 'Marketing.ReferralTree', 'User.Marketing.Invite': 'User.Marketing.Invite', 'User.Marketing.Member': 'User.Marketing.Member', 'User.Marketing.Coupons': 'User.Marketing.Coupons', 'User.Marketing.Commission': 'User.Marketing.Commission', 'Kb.Category.Query': 'Knowledge.Category', 'Kb.Article.Query': 'Knowledge.Article', 'Knowledge.Category.Query': 'Knowledge.Category', 'Knowledge.Article.Query': 'Knowledge.Article', }; 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('Api.OpenApi', [ { code: 'Api.OpenApi.Query', name: '查询' }, { code: 'SendDebug', name: '发送调试' }, { code: 'ImportCurl', name: '导入cURL' }, { code: 'Copy', 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.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: 'Mock下单' }, { 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: 'StockBind', 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.FulfillOrders', [ { code: 'Query', name: '查询' }, { code: 'StockBind', name: '管理绑定' }, { code: 'View', name: '查看详情' }, { code: 'Export', name: '导出' }, { code: 'Print', name: '单个打印' }, { code: 'BatchPrint', name: '批量打印' }, ]), B('Order.WaybillManage', [ { 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: 'ImportDownstreamWeight', 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: 'Pull', name: '拉单同步' }, { code: 'Sync', name: '同步状态' }, { code: 'Rts', name: '准备发货' }, { code: 'Label', name: '重新获取面单' }, { code: 'MatchInventory', name: '匹配库存' }, { code: 'CreateLogistics', name: '创建物流订单' }, { code: 'CreateFulfill', name: '创建物流&代发订单' }, { code: 'ToggleSuspend', name: '搁置/恢复' }, { code: 'Delete', name: '删除' }, ]), B('Order.Pickup', [ { code: 'Query', name: '查询' }, { code: 'Search', name: '搜索' }, { code: 'Create', name: '创建揽收订单' }, { code: 'CreateTrack', name: '创建轨迹订单' }, { code: 'ForwardDownstream', name: '预报下游订单' }, { code: 'DownstreamForecastResult', name: '下游预报结果' }, ]), B('Order.Customs9610', [ { code: 'Query', name: '查询' }, { code: 'Search', name: '搜索' }, { code: 'Update', name: '编辑' }, { code: 'Declare', name: '申报' }, { code: 'DeclareBatch', name: '批量申报' }, { code: 'FetchManifestBatch', name: '批量获取清单数据' }, { code: 'FetchDeclarationFormBatch', name: '预报下游' }, ]), B('Order.SenderAddress', [ { code: 'Query', name: '查询' }, { code: 'Search', name: '搜索' }, { code: 'Create', name: '新增' }, { code: 'Update', name: '修改' }, { code: 'Delete', name: '删除' }, { code: 'SetDefault', 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: 'ConfirmReceive', name: '确认收货' }, { code: 'Delete', name: '删除' }, ]), B('Warehouse.BinLocation', [ { code: 'Query', name: '查询' }, { code: 'Save', 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('Operation.FulfillPack', [ { code: 'Query', name: '查询队列' }, { code: 'BatchPrint', name: '批量打印面单' }, { code: 'ConfirmOutbound', name: '确认打包' }, { code: 'Reset', name: '重置' }, ]), B('Operation.ParcelArrival', [ { code: 'Query', name: '查询' }, { code: 'Save', name: '到仓' }, { code: 'Delete', 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登录' }, { code: 'ApiKey', name: '开放接口凭证' }, { code: 'ApiKeyReset', name: '重置开放接口密钥' }, { code: 'ApiKeyEnable', name: '启停开放接口' }, ]), 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('User.ExportQualification', [ { code: 'Query', name: '查询' }, { code: 'Create', name: '新增' }, { code: 'Update', name: '修改' }, { code: 'Delete', name: '删除' }, { code: 'SetDefault', name: '设默认' }, ]), B('User.Marketing.Invite', [ { code: 'Query', name: '查询' }, { code: 'Copy', name: '复制邀请链接' }, ]), B('User.Marketing.Member', [ { code: 'Query', name: '查询' }, { code: 'View', name: '查看等级权益' }, ]), B('User.Marketing.Coupons', [ { code: 'Query', name: '查询' }, { code: 'View', name: '查看券包' }, ]), B('User.Marketing.Commission', [ { code: 'Query', name: '查询' }, { code: 'Transfer', name: '转余额' }, { code: 'Withdraw', 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: '导出' }, ]), // ── 营销 ── B('Marketing.Level', [ { code: 'Query', name: '查询' }, { code: 'Marketing.Level.Create', name: '新增' }, { code: 'Marketing.Level.Update', name: '修改' }, { code: 'Marketing.Level.Delete', name: '删除' }, ]), B('Marketing.PointsRule', [ { code: 'Save', name: '保存' }, { code: 'Reset', name: '重置' }, ]), B('Marketing.Points', [ { code: 'Query', name: '查询' }, { code: 'Marketing.Points.Adjust', name: '人工调账' }, ]), B('Marketing.CouponTemplate', [ { code: 'Query', name: '查询' }, { code: 'Marketing.Coupon.Template.Create', name: '新增' }, { code: 'Marketing.Coupon.Template.Update', name: '修改' }, { code: 'Publish', name: '发布' }, { code: 'End', name: '结束活动' }, ]), B('Marketing.CouponGrant', [ { code: 'Preview', name: '预览' }, { code: 'Query', name: '查询' }, ]), B('Marketing.CommissionRule', [ { code: 'Save', name: '保存' }, { code: 'Reset', name: '重置' }, ]), B('Marketing.CommissionDetail', [ { code: 'Query', name: '查询' }, { code: 'Marketing.Commission.Adjust', name: '人工调整' }, ]), B('Marketing.CommissionWithdraw', [ { code: 'Query', name: '查询' }, { code: 'Marketing.Commission.Withdraw.Audit', name: '审核' }, { code: 'Approve', name: '通过' }, { code: 'Reject', name: '拒绝' }, ]), B('Marketing.ReferralTree', [ { code: 'Query', name: '查询' }, { code: 'Marketing.Referral.Rebind', name: '改绑' }, ]), // ── 知识库 ── B('Knowledge.Category', [ { code: 'Query', name: '查询' }, { code: 'Knowledge.Category.Edit', name: '编辑' }, ]), B('Knowledge.Article', [ { code: 'Query', name: '查询' }, { code: 'Knowledge.Article.Edit', name: '编辑' }, { code: 'Knowledge.Article.Publish', 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('System.Ai', [ { code: 'System.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('System.AiSkill', [ { code: 'System.AiSkill.Use', name: '使用' }, { code: 'System.AiSkill.Save', name: '保存' }, { code: 'Create', name: '新建' }, { code: 'Delete', 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(); }