| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284 |
- <?php
- namespace App\Console\Commands;
- use App\Module\System\Models\AdminMenu;
- use Illuminate\Console\Command;
- use Illuminate\Support\Str;
- class RemoveDuplicateMenus extends Command
- {
- /**
- * The name and signature of the console command.
- *
- * @var string
- */
- protected $signature = 'admin:remove-duplicate-menus';
- /**
- * The console command description.
- *
- * @var string
- */
- protected $description = '删除重复的菜单项,保留中文的菜单项';
- /**
- * 需要保留的中文菜单项映射
- *
- * @var array
- */
- protected $chineseMenuMap = [
- 'task' => '任务',
- 'task-category' => '任务分类',
- 'task-achievement-condition' => '任务达成条件',
- 'task-completion-log' => '任务完成日志',
- 'task-condition' => '任务条件',
- 'task-cost' => '任务消耗',
- 'task-cost-log' => '任务消耗日志',
- 'task-reset-log' => '任务重置日志',
- 'task-reward' => '任务奖励',
- 'task-reward-log' => '任务奖励日志',
- 'task-user-progress' => '用户进度',
- 'task-user-task' => '用户任务',
- 'pet-battle-log' => '宠物战斗记录',
- 'pet-battle-season' => '争霸赛-赛季',
- 'pet-battle-team' => '争霸赛-队伍',
- 'pet-battle-team-member' => '争霸赛-队伍成员',
- 'pet-config' => '宠物配置',
- 'pet-level-config' => '宠物-等级配置',
- 'pet-remould-log' => '宠物洗髓记录',
- 'pet-skill' => '宠物-技能配置',
- 'pet-skill-log' => '宠物-技能使用日志',
- 'pet-user' => '宠物管理',
- 'farm-crop' => '作物管理',
- 'farm-god-buff' => '神灵加持管理',
- 'farm-harvest-log' => '收获记录管理',
- 'farm-house-config' => '房屋等级配置',
- 'farm-land' => '土地管理',
- 'farm-land-type' => '土地类型配置',
- 'farm-land-upgrade-config' => '土地升级配置',
- 'farm-seed' => '种子配置管理',
- 'farm-seed-output' => '种子产出配置',
- 'farm-team-profit' => '团队收益记录',
- 'farm-upgrade-log' => '升级记录管理',
- 'farm-user' => '用户农场管理',
- 'game-items-categories' => '物品分类',
- 'game-items' => '物品设置',
- 'game-items-chest-contents' => '宝箱内容',
- 'game-items-dismantle-rules' => '物品分解规则',
- 'game-items-groups' => '物品组管理',
- 'game-items-group-items' => '物品组内容',
- 'game-items-output-limits' => '物品产出限制',
- 'game-items-recipes' => '合成配方管理',
- 'game-items-chest-costs' => '宝箱消耗配置',
- 'game-items-craft-logs' => '物品合成记录',
- 'game-items-dismantle-logs' => '物品分解记录',
- 'game-items-instances' => '单独属性物品管理',
- 'game-items-pity-times' => '用户宝箱保底计数',
- 'game-items-transaction-logs' => '物品记录',
- 'game-items-user-items' => '用户物品',
- 'game-items-user-output-counters' => '用户产出限制计数',
- 'game-items-user-recipes' => '用户配方解锁状态',
- 'team-talent-config' => '达人等级配置',
- 'team-profit-rule' => '收益规则配置',
- 'team-user-talent' => '达人等级管理',
- 'team-user-referral' => '用户推荐关系',
- 'team-referral-change' => '推荐关系变更记录',
- 'team-referral-code' => '推荐码管理',
- 'team-referral-code-usage' => '推荐码使用记录',
- 'team-profit' => '团队收益记录',
- 'team-invite-reward' => '邀请奖励记录',
- 'team-user-relation-cache' => '用户关系缓存'
- ];
- /**
- * Execute the console command.
- *
- * @return int
- */
- public function handle()
- {
- $this->info("开始查找和删除重复的菜单项...");
- $duplicateCount = 0;
- // 查找任务相关的菜单项
- $this->info("查找任务相关的菜单项...");
- // 查找任务配置菜单
- $taskConfigMenus = AdminMenu::where('title', 'like', '%任务配置%')
- ->orWhere('title', 'like', '%Task%配置%')
- ->orWhere('title', 'like', '%📋 任务配置%')
- ->get();
- if ($taskConfigMenus->count() > 1) {
- $this->info("发现重复的任务配置菜单:");
- // 显示所有重复项
- foreach ($taskConfigMenus as $index => $menu) {
- $this->info(" [{$index}] ID = {$menu->id}, 标题 = {$menu->title}, 父ID = {$menu->parent_id}");
- }
- // 询问用户要保留哪个
- $keepIndex = $this->ask("请输入要保留的菜单项索引 (0-" . ($taskConfigMenus->count() - 1) . ")");
- if (is_numeric($keepIndex) && $keepIndex >= 0 && $keepIndex < $taskConfigMenus->count()) {
- for ($i = 0; $i < $taskConfigMenus->count(); $i++) {
- if ($i != $keepIndex) {
- $this->info(" - 删除菜单项: ID = {$taskConfigMenus[$i]->id}, 标题 = {$taskConfigMenus[$i]->title}");
- // 获取子菜单
- $childMenus = AdminMenu::where('parent_id', $taskConfigMenus[$i]->id)->get();
- // 更新子菜单的父ID
- foreach ($childMenus as $childMenu) {
- $childMenu->parent_id = $taskConfigMenus[$keepIndex]->id;
- $childMenu->save();
- $this->info(" - 更新子菜单: ID = {$childMenu->id}, 标题 = {$childMenu->title}, 新父ID = {$taskConfigMenus[$keepIndex]->id}");
- }
- // 删除菜单项
- $taskConfigMenus[$i]->delete();
- $duplicateCount++;
- }
- }
- } else {
- $this->error("无效的索引,跳过此重复项");
- }
- }
- // 查找任务管理菜单
- $taskManageMenus = AdminMenu::where('title', 'like', '%任务管理%')
- ->orWhere('title', 'like', '%Task%管理%')
- ->orWhere('title', 'like', '%👥 用户任务管理%')
- ->get();
- if ($taskManageMenus->count() > 1) {
- $this->info("发现重复的任务管理菜单:");
- // 显示所有重复项
- foreach ($taskManageMenus as $index => $menu) {
- $this->info(" [{$index}] ID = {$menu->id}, 标题 = {$menu->title}, 父ID = {$menu->parent_id}");
- }
- // 询问用户要保留哪个
- $keepIndex = $this->ask("请输入要保留的菜单项索引 (0-" . ($taskManageMenus->count() - 1) . ")");
- if (is_numeric($keepIndex) && $keepIndex >= 0 && $keepIndex < $taskManageMenus->count()) {
- for ($i = 0; $i < $taskManageMenus->count(); $i++) {
- if ($i != $keepIndex) {
- $this->info(" - 删除菜单项: ID = {$taskManageMenus[$i]->id}, 标题 = {$taskManageMenus[$i]->title}");
- // 获取子菜单
- $childMenus = AdminMenu::where('parent_id', $taskManageMenus[$i]->id)->get();
- // 更新子菜单的父ID
- foreach ($childMenus as $childMenu) {
- $childMenu->parent_id = $taskManageMenus[$keepIndex]->id;
- $childMenu->save();
- $this->info(" - 更新子菜单: ID = {$childMenu->id}, 标题 = {$childMenu->title}, 新父ID = {$taskManageMenus[$keepIndex]->id}");
- }
- // 删除菜单项
- $taskManageMenus[$i]->delete();
- $duplicateCount++;
- }
- }
- } else {
- $this->error("无效的索引,跳过此重复项");
- }
- }
- // 查找任务子菜单项
- $this->info("\n查找任务子菜单项...");
- // 获取所有任务相关的子菜单
- $taskSubMenus = AdminMenu::where(function ($query) {
- $query->where('uri', 'like', 'task%')
- ->orWhere('uri', 'like', '/task%');
- })->get();
- // 按URI分组
- $uriGroups = [];
- foreach ($taskSubMenus as $menu) {
- $uri = ltrim($menu->uri, '/');
- if (!isset($uriGroups[$uri])) {
- $uriGroups[$uri] = [];
- }
- $uriGroups[$uri][] = $menu;
- }
- // 处理重复项
- foreach ($uriGroups as $uri => $menus) {
- if (count($menus) > 1) {
- $this->info("发现重复的任务子菜单项: URI = {$uri}");
- // 显示所有重复项
- foreach ($menus as $index => $menu) {
- $this->info(" [{$index}] ID = {$menu->id}, 标题 = {$menu->title}, 父ID = {$menu->parent_id}");
- }
- // 询问用户要保留哪个
- $keepIndex = $this->ask("请输入要保留的菜单项索引 (0-" . (count($menus) - 1) . ")");
- if (is_numeric($keepIndex) && $keepIndex >= 0 && $keepIndex < count($menus)) {
- for ($i = 0; $i < count($menus); $i++) {
- if ($i != $keepIndex) {
- $this->info(" - 删除菜单项: ID = {$menus[$i]->id}, 标题 = {$menus[$i]->title}");
- $menus[$i]->delete();
- $duplicateCount++;
- }
- }
- } else {
- $this->error("无效的索引,跳过此重复项");
- }
- }
- }
- // 查找其他可能的重复项
- $this->info("\n查找其他可能的重复项...");
- $allMenus = AdminMenu::all();
- $uriCounts = [];
- foreach ($allMenus as $menu) {
- $uri = ltrim($menu->uri, '/');
- if (!empty($uri)) {
- if (!isset($uriCounts[$uri])) {
- $uriCounts[$uri] = [];
- }
- $uriCounts[$uri][] = $menu;
- }
- }
- foreach ($uriCounts as $uri => $menus) {
- if (count($menus) > 1) {
- $this->info("发现重复的菜单项: URI = {$uri}");
- // 显示所有重复项
- foreach ($menus as $index => $menu) {
- $this->info(" [{$index}] ID = {$menu->id}, 标题 = {$menu->title}, 父ID = {$menu->parent_id}");
- }
- // 询问用户要保留哪个
- $keepIndex = $this->ask("请输入要保留的菜单项索引 (0-" . (count($menus) - 1) . ")");
- if (is_numeric($keepIndex) && $keepIndex >= 0 && $keepIndex < count($menus)) {
- for ($i = 0; $i < count($menus); $i++) {
- if ($i != $keepIndex) {
- $this->info(" - 删除菜单项: ID = {$menus[$i]->id}, 标题 = {$menus[$i]->title}");
- $menus[$i]->delete();
- $duplicateCount++;
- }
- }
- } else {
- $this->error("无效的索引,跳过此重复项");
- }
- }
- }
- $this->info("\n总共删除了 {$duplicateCount} 个重复的菜单项");
- return 0;
- }
- }
|