front/src/constants/pageButtonCatalog.ts
zzh 50b3eac99c
All checks were successful
Build and Deploy Front / deploy (push) Successful in 5m40s
feat: 运单费用版本切换、服务商名称与列配置中文,我的运单隐藏操作日志
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-09 18:30:48 +08:00

1175 lines
42 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: '复制',
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: '重算应付',
BindSnapshotVersions: '切换版本',
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<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.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: 'BindSnapshotVersions', 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: 'BindSnapshotVersions', 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: 'UpdateCode', 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<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();
}