front/src/constants/pageButtonCatalog.ts
zzh 5191d1981f feat: 仓储模块前端、菜单同步扩展及相关页面优化
新增仓储模块页面与 API、店铺授权/店铺订单页面及路由权限目录;
扩展菜单管理同步能力支持二级子菜单与三级按钮;优化公告、仓库地址、下单等页面。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-11 15:19:35 +08:00

933 lines
32 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 前端页面三级按钮目录(与菜单 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<string, string> = {
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<string, string> = {
'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<string, PageButtonDef[]> {
const map = new Map<string, PageButtonDef[]>();
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<string, PageButtonDef>();
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();
}