delete(); DB::table('sys_rule')->delete(); // 2. 重新填充系统菜单与业务菜单 $ruleIds = []; $this->insertNodes($this->menus(), 0, $ruleIds); // 3. 全部授权给超级管理员角色(role_id=1) DB::table('sys_role_rule')->insert(array_map( static fn (int $ruleId) => ['role_id' => 1, 'rule_id' => $ruleId], $ruleIds )); $this->command?->info('权限已重建,共 ' . count($ruleIds) . ' 个权限点,已全部授权给超级管理员'); }); } /** * 系统框架菜单(仪表盘、示例页面、AI、系统管理等) */ private function menus(): array { return [ [ 'type' => 'menu', 'name' => '仪表盘', 'key' => 'dashboard', 'icon' => 'PieChartOutlined', 'local' => 'menu.dashboard', 'children' => [ [ 'type' => 'route', 'name' => '分析页', 'local' => "menu.analysis", 'key' => 'dashboard.analysis', 'path' => '/dashboard/analysis', ] ] ], [ 'type' => 'menu', 'key' => 'procurement.product', 'name' => '商品中心', 'icon' => 'ShoppingOutlined', 'children' => [ [ 'type' => 'route', 'key' => 'product.category', 'name' => '分类管理', 'path' => '/product/category', 'children' => [ ['type' => 'rule', 'key' => 'product.category.query', 'name' => '查询'], ['type' => 'rule', 'key' => 'product.category.create', 'name' => '新增'], ['type' => 'rule', 'key' => 'product.category.update', 'name' => '编辑'], ['type' => 'rule', 'key' => 'product.category.delete', 'name' => '删除'], ], ], [ 'type' => 'route', 'key' => 'product.goods', 'name' => '商品列表', 'path' => '/product/goods', 'children' => [ ['type' => 'rule', 'key' => 'product.goods.query', 'name' => '查询'], ['type' => 'rule', 'key' => 'product.goods.create', 'name' => '新增'], ['type' => 'rule', 'key' => 'product.goods.update', 'name' => '编辑'], ['type' => 'rule', 'key' => 'product.goods.delete', 'name' => '删除'], ['type' => 'rule', 'key' => 'product.goods.batchPrice', 'name' => '批量调价'], ], ], [ 'type' => 'route', 'key' => 'customer.supplier', 'name' => '供应商', 'path' => '/customer/supplier', 'children' => [ ['type' => 'rule', 'key' => 'customer.supplier.query', 'name' => '查询'], ['type' => 'rule', 'key' => 'customer.supplier.create', 'name' => '新增'], ['type' => 'rule', 'key' => 'customer.supplier.update', 'name' => '编辑'], ['type' => 'rule', 'key' => 'customer.supplier.delete', 'name' => '删除'], ], ], ], ], [ 'type' => 'menu', 'key' => 'procurement.customer', 'name' => '客户管理', 'icon' => 'ShopOutlined', 'children' => [ [ 'type' => 'route', 'key' => 'customer.store', 'name' => '门店管理', 'path' => '/customer/store', 'children' => [ ['type' => 'rule', 'key' => 'customer.store.query', 'name' => '查询'], ['type' => 'rule', 'key' => 'customer.store.create', 'name' => '新增'], ['type' => 'rule', 'key' => 'customer.store.update', 'name' => '编辑'], ['type' => 'rule', 'key' => 'customer.store.delete', 'name' => '删除'], ], ], [ 'type' => 'route', 'key' => 'customer.level', 'name' => '客户等级', 'path' => '/customer/level', 'children' => [ ['type' => 'rule', 'key' => 'customer.level.query', 'name' => '查询'], ['type' => 'rule', 'key' => 'customer.level.create', 'name' => '新增'], ['type' => 'rule', 'key' => 'customer.level.update', 'name' => '编辑'], ['type' => 'rule', 'key' => 'customer.level.delete', 'name' => '删除'], ], ], [ 'type' => 'route', 'key' => 'customer.miniUser', 'name' => '小程序用户', 'path' => '/customer/mini-user', 'children' => [ ['type' => 'rule', 'key' => 'customer.miniUser.query', 'name' => '查询'], ['type' => 'rule', 'key' => 'customer.miniUser.update', 'name' => '启用停用'], ['type' => 'rule', 'key' => 'customer.miniUser.bind', 'name' => '绑定主体'], ], ], [ 'type' => 'route', 'key' => 'customer.notice', 'name' => '通知管理', 'path' => '/customer/notice', 'children' => [ ['type' => 'rule', 'key' => 'customer.notice.query', 'name' => '查询'], ['type' => 'rule', 'key' => 'customer.notice.create', 'name' => '发布'], ['type' => 'rule', 'key' => 'customer.notice.delete', 'name' => '删除'], ], ], ], ], [ 'type' => 'menu', 'key' => 'procurement.order', 'name' => '订货管理', 'icon' => 'FileTextOutlined', 'children' => [ [ 'type' => 'route', 'key' => 'order.store', 'name' => '门店订单', 'path' => '/order/store', 'children' => [ ['type' => 'rule', 'key' => 'order.store.query', 'name' => '查询'], ['type' => 'rule', 'key' => 'order.store.update', 'name' => '状态流转'], ['type' => 'rule', 'key' => 'order.store.delete', 'name' => '删除(仅已取消订单)'], ], ], ], ], [ 'type' => 'menu', 'key' => 'procurement.purchase', 'name' => '采购管理', 'icon' => 'ShoppingCartOutlined', 'children' => [ [ 'type' => 'route', 'key' => 'purchase.order', 'name' => '采购单', 'path' => '/purchase/order', 'children' => [ ['type' => 'rule', 'key' => 'purchase.order.query', 'name' => '查询'], ['type' => 'rule', 'key' => 'purchase.order.update', 'name' => '修改'], ['type' => 'rule', 'key' => 'purchase.order.generate', 'name' => '生成采购单'], ['type' => 'rule', 'key' => 'purchase.order.bill', 'name' => '生成账单'], ['type' => 'rule', 'key' => 'purchase.order.export', 'name' => '导出'], ], ], ], ], [ 'type' => 'menu', 'key' => 'procurement.recon', 'name' => '财务管理', 'icon' => 'AccountBookOutlined', 'children' => [ [ 'type' => 'route', 'key' => 'recon.list', 'name' => '财务对账', 'path' => '/recon/list', 'children' => [ ['type' => 'rule', 'key' => 'recon.list.query', 'name' => '查询'], ['type' => 'rule', 'key' => 'recon.list.create', 'name' => '新增'], ['type' => 'rule', 'key' => 'recon.list.update', 'name' => '编辑'], ['type' => 'rule', 'key' => 'recon.list.delete', 'name' => '删除'], ['type' => 'rule', 'key' => 'recon.list.build', 'name' => '生成明细'], ['type' => 'rule', 'key' => 'recon.list.settle', 'name' => '生成结算表'], // 对账明细操作权限点在独立控制器 recon.item 下(D4/D6/D8) ['type' => 'rule', 'key' => 'recon.item.item.update', 'name' => '对账明细操作'], ], ], [ 'type' => 'route', 'key' => 'recon.bill', 'name' => '门店账单', 'path' => '/recon/bill', 'children' => [ ['type' => 'rule', 'key' => 'recon.bill.query', 'name' => '查询'], ['type' => 'rule', 'key' => 'recon.bill.pay', 'name' => '确认收款'], ], ], [ 'type' => 'route', 'key' => 'recon.containerReturn', 'name' => '回筐记录', 'path' => '/recon/container-return', 'children' => [ ['type' => 'rule', 'key' => 'recon.containerReturn.query', 'name' => '查询'], ['type' => 'rule', 'key' => 'recon.containerReturn.create', 'name' => '回筐登记'], ['type' => 'rule', 'key' => 'recon.containerReturn.delete', 'name' => '删除'], ], ], [ 'type' => 'route', 'key' => 'recon.settlement', 'name' => '结算表', 'path' => '/recon/settlement', 'children' => [ ['type' => 'rule', 'key' => 'recon.settlement.query', 'name' => '查询'], ['type' => 'rule', 'key' => 'recon.settlement.download', 'name' => '下载导出'], ], ], ], ], [ 'type' => 'menu', 'name' => 'AI', 'local' => "menu.ai", 'icon' => "OpenAIOutlined", 'key' => "ai", 'children' => [ [ 'type' => "route", 'key' => "ai.chat", 'name' => "AI对话", "path" => "/ai/chat", 'local' => "menu.ai.chat", 'children' => [ ['type' => 'rule', 'name' => '发送消息', 'key' => 'ai.chat.send'], ['type' => 'rule', 'name' => '会话列表', 'key' => 'ai.chat.conversations'], ['type' => 'rule', 'name' => '消息列表', 'key' => 'ai.chat.messages'], ['type' => 'rule', 'name' => '删除会话', 'key' => 'ai.chat.delete'], ] ], [ 'type' => "route", 'key' => "ai.conversation", 'name' => "会话管理", "path" => "/ai/conversation", 'local' => "menu.ai.conversation", 'children' => [ ['type' => 'rule', 'name' => '查询会话列表', 'key' => 'ai.conversation.query'], ['type' => 'rule', 'name' => '删除会话', 'key' => 'ai.conversation.delete'], ] ], [ 'type' => "route", 'key' => "ai.agent", 'name' => "Agent 管理", "path" => "/ai/agent", 'local' => "menu.ai.agent", 'children' => [ ['type' => 'rule', 'name' => '查询列表', 'key' => 'ai.agent.query'], ['type' => 'rule', 'name' => '更新 Agent', 'key' => 'ai.agent.update'], ] ], ] ], [ 'type' => "menu", 'name' => "系统管理", 'local' => "menu.system", 'icon' => "SettingOutlined", 'key' => "system", 'children' => [ [ 'type' => "route", 'key' => "system.user", 'name' => "用户管理", 'path' => "/system/user", 'local' => "menu.system.user", 'children' => [ ['type' => 'rule', 'name' => '查询列表', 'key' => 'system.user.query'], ['type' => 'rule', 'name' => '新增用户', 'key' => 'system.user.create'], ['type' => 'rule', 'name' => '修改用户', 'key' => 'system.user.update'], ['type' => 'rule', 'name' => '删除用户', 'key' => 'system.user.delete'], ['type' => 'rule', 'name' => '重置用户密码', 'key' => 'system.user.resetPassword'], ['type' => 'rule', 'name' => '获取角色选项', 'key' => 'system.user.role'], ['type' => 'rule', 'name' => '获取部门选项', 'key' => 'system.user.dept'], ] ], [ 'type' => "route", 'key' => "system.dept", 'name' => "部门管理", 'path' => "/system/dept", 'local' => "menu.system.dept", 'children' => [ ['type' => 'rule', 'name' => '获取部门列表', 'key' => 'system.dept.query'], ['type' => 'rule', 'name' => '新建部门', 'key' => 'system.dept.create'], ['type' => 'rule', 'name' => '更新部门信息', 'key' => 'system.dept.update'], ['type' => 'rule', 'name' => '删除部门', 'key' => 'system.dept.delete'], ['type' => 'rule', 'name' => '获取部门用户', 'key' => 'system.dept.users'], ] ], [ 'type' => "route", 'key' => "system.role", 'name' => "角色管理", 'path' => "/system/role", 'local' => "menu.system.role", 'children' => [ ['type' => 'rule', 'name' => '新增角色', 'key' => 'system.role.create'], ['type' => 'rule', 'name' => '查询角色列表', 'key' => 'system.role.query'], ['type' => 'rule', 'name' => '更新角色信息', 'key' => 'system.role.update'], ['type' => 'rule', 'name' => '删除角色', 'key' => 'system.role.delete'], ['type' => 'rule', 'name' => '设置启用状态', 'key' => 'system.role.status'], ['type' => 'rule', 'name' => '获取角色用户', 'key' => 'system.role.users'], ['type' => 'rule', 'name' => '设置角色权限', 'key' => 'system.role.setRule'], ['type' => 'rule', 'name' => '获取权限选项', 'key' => 'system.role.ruleList'], ] ], [ 'type' => "route", 'key' => "system.rule", 'name' => "菜单管理", 'path' => "/system/rule", 'local' => "menu.system.rule", 'children' => [ ['type' => 'rule', 'name' => '获取权限列表', 'key' => 'system.rule.query'], ['type' => 'rule', 'name' => '创建权限规则', 'key' => 'system.rule.create'], ['type' => 'rule', 'name' => '更新权限规则', 'key' => 'system.rule.update'], ['type' => 'rule', 'name' => '删除权限规则', 'key' => 'system.rule.delete'], ['type' => 'rule', 'name' => '获取父级权限', 'key' => 'system.rule.parentQuery'], ['type' => 'rule', 'name' => '设置显示状态', 'key' => 'system.rule.show'], ['type' => 'rule', 'name' => '设置启用状态', 'key' => 'system.rule.status'], ] ], [ 'type' => "route", 'name' => "文件管理", 'local' => "menu.system.file", 'key' => "system.file", 'path' => "/system/file", 'children' => [ ['type' => 'rule', 'name' => '获取文件夹', 'key' => 'system.file.group.query'], ['type' => 'rule', 'name' => '新增文件夹', 'key' => 'system.file.group.create'], ['type' => 'rule', 'name' => '编辑文件夹', 'key' => 'system.file.group.update'], ['type' => 'rule', 'name' => '删除文件夹', 'key' => 'system.file.group.delete'], ['type' => 'rule', 'name' => '查询文件列表', 'key' => 'system.file.list.query'], ['type' => 'rule', 'name' => '查看文件详情', 'key' => 'system.file.list.show'], ['type' => 'rule', 'name' => '上传文件', 'key' => 'system.file.list.upload'], ['type' => 'rule', 'name' => '下载文件', 'key' => 'system.file.list.download'], ['type' => 'rule', 'name' => '删除文件', 'key' => 'system.file.list.delete'], ['type' => 'rule', 'name' => '永久删除文件', 'key' => 'system.file.list.force-delete'], ['type' => 'rule', 'name' => '恢复文件', 'key' => 'system.file.list.restore'], ['type' => 'rule', 'name' => '查看回收站', 'key' => 'system.file.list.trashed'], ['type' => 'rule', 'name' => '清空回收站', 'key' => 'system.file.list.clean-trashed'], ['type' => 'rule', 'name' => '复制文件', 'key' => 'system.file.list.copy'], ['type' => 'rule', 'name' => '移动文件', 'key' => 'system.file.list.move'], ['type' => 'rule', 'name' => '重命名文件', 'key' => 'system.file.list.rename'] ], ], [ 'type' => "route", 'name' => "系统字典", 'local' => "menu.system.dict", 'key' => "system.dict", 'path' => "/system/dict", 'children' => [ ['type' => 'rule', 'name' => '字典列表', 'key' => 'system.dict.list.query'], ['type' => 'rule', 'name' => '新增字典', 'key' => 'system.dict.list.create'], ['type' => 'rule', 'name' => '删除字典', 'key' => 'system.dict.list.delete'], ['type' => 'rule', 'name' => '更新字典', 'key' => 'system.dict.list.update'], ['type' => 'rule', 'name' => '字典项列表', 'key' => 'system.dict.item.query'], ['type' => 'rule', 'name' => '字典项新增', 'key' => 'system.dict.item.create'], ['type' => 'rule', 'name' => '字典项编辑', 'key' => 'system.dict.item.update'], ['type' => 'rule', 'name' => '字典项删除', 'key' => 'system.dict.item.delete'], ] ], [ 'type' => "route", 'name' => "系统配置", 'local' => "menu.system.config", 'key' => "system.config", 'path' => "/system/config", 'children' => [ ['type' => 'rule', 'name' => '配置列表', 'key' => 'system.config.items.query'], ['type' => 'rule', 'name' => '新增配置', 'key' => 'system.config.items.create'], ['type' => 'rule', 'name' => '编辑配置', 'key' => 'system.config.items.update'], ['type' => 'rule', 'name' => '删除配置', 'key' => 'system.config.items.delete'], ['type' => 'rule', 'name' => '保存配置', 'key' => 'system.config.items.save'], ['type' => 'rule', 'name' => '刷新配置', 'key' => 'system.config.items.refresh'], ['type' => 'rule', 'name' => '配置组编辑', 'key' => 'system.config.group.update'], ['type' => 'rule', 'name' => '配置组删除', 'key' => 'system.config.items.item.delete'], ['type' => 'rule', 'name' => '配置组列表', 'key' => 'system.config.group.query'], ['type' => 'rule', 'name' => '配置组新增', 'key' => 'system.config.group.create'], ] ], [ 'type' => 'route', 'key' => 'system.mail', 'name' => '邮件配置', 'path' => '/system/mail', 'local' => 'menu.system.mail', 'children' => [ ['type' => 'rule', 'name' => '获取配置', 'key' => 'system.mail.config'], ['type' => 'rule', 'name' => '保存配置', 'key' => 'system.mail.save'], ['type' => 'rule', 'name' => '发送测试', 'key' => 'system.mail.test'], ] ], [ 'type' => 'route', 'key' => 'system.storage', 'name' => '存储配置', 'path' => '/system/storage', 'local' => 'menu.system.storage', 'children' => [ ['type' => 'rule', 'name' => '获取配置', 'key' => 'system.storage.config'], ['type' => 'rule', 'name' => '保存配置', 'key' => 'system.storage.save'], ['type' => 'rule', 'name' => '测试连接', 'key' => 'system.storage.test'], ] ], [ 'type' => 'route', 'key' => 'system.ai', 'name' => 'AI 配置', 'path' => '/system/ai', 'local' => 'menu.system.ai', 'children' => [ ['type' => 'rule', 'name' => '获取可用AI列表', 'key' => 'system.ai.list'], ['type' => 'rule', 'name' => '获取AI配置', 'key' => 'system.ai.config'], ['type' => 'rule', 'name' => '保存AI配置', 'key' => 'system.ai.save'], ['type' => 'rule', 'name' => '测试连接', 'key' => 'system.ai.test'], ] ], [ 'type' => "route", 'name' => "系统信息", 'local' => "menu.system.info", 'key' => "system.info", 'path' => "/system/info", ] ] ] ]; } /** * 递归写入菜单节点,收集全部节点 ID(menu/route/rule)用于授权 * * @param array> $nodes * @param array $ruleIds */ private function insertNodes(array $nodes, int $parentId, array &$ruleIds): void { $now = now(); $order = 0; foreach ($nodes as $node) { $id = DB::table('sys_rule')->insertGetId([ 'parent_id' => $parentId, 'type' => $node['type'], 'key' => $node['key'], 'name' => $node['name'], 'path' => $node['path'] ?? '', 'icon' => $node['icon'] ?? '', 'order' => $order++, 'local' => $node['local'] ?? '', 'status' => 1, 'hidden' => 1, 'link' => $node['link'] ?? 0, 'created_at' => $now, 'updated_at' => $now, ]); $ruleIds[] = $id; if (!empty($node['children']) && is_array($node['children'])) { $this->insertNodes($node['children'], $id, $ruleIds); } } } }