| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- <?php
- namespace App\Console\Commands;
- use App\Module\System\Models\AdminMenu;
- use Illuminate\Console\Command;
- use Illuminate\Support\Str;
- class FixTaskMenus extends Command
- {
- /**
- * The name and signature of the console command.
- *
- * @var string
- */
- protected $signature = 'admin:fix-task-menus';
- /**
- * The console command description.
- *
- * @var string
- */
- protected $description = '修复任务相关的菜单项,删除英文的菜单项,保留中文的菜单项';
- /**
- * 任务相关的URI映射
- *
- * @var array
- */
- protected $taskUriMap = [
- 'task-achievement-condition' => 'task-achievement-conditions',
- 'task-category' => 'task-categories',
- 'task-completion-log' => 'task-completion-logs',
- 'task-condition' => 'task-conditions',
- 'task' => 'tasks',
- 'task-cost' => 'task-costs',
- 'task-cost-log' => 'task-cost-logs',
- 'task-reset-log' => 'task-reset-logs',
- 'task-reward' => 'task-rewards',
- 'task-reward-log' => 'task-reward-logs',
- 'task-user-progress' => 'task-user-progresses',
- 'task-user-task' => 'task-user-tasks'
- ];
- /**
- * Execute the console command.
- *
- * @return int
- */
- public function handle()
- {
- $this->info("开始修复任务相关的菜单项...");
-
- $deletedCount = 0;
-
- // 获取所有任务相关的菜单项
- $taskMenus = AdminMenu::where('uri', 'like', 'task%')
- ->orWhere('uri', 'like', 'tasks%')
- ->get();
-
- $this->info("找到 {$taskMenus->count()} 个任务相关的菜单项");
-
- // 按URI分组
- $menusByUri = [];
-
- foreach ($taskMenus as $menu) {
- $uri = $menu->uri;
-
- // 标准化URI
- foreach ($this->taskUriMap as $singular => $plural) {
- if ($uri === $singular) {
- $uri = $plural;
- break;
- }
- }
-
- if (!isset($menusByUri[$uri])) {
- $menusByUri[$uri] = [];
- }
-
- $menusByUri[$uri][] = $menu;
- }
-
- // 处理每组菜单项
- foreach ($menusByUri as $uri => $menus) {
- if (count($menus) > 1) {
- $this->info("发现重复的菜单项: URI = {$uri}");
-
- // 显示所有重复项
- foreach ($menus as $index => $menu) {
- $this->info(" [{$index}] ID = {$menu->id}, 标题 = {$menu->title}, URI = {$menu->uri}, 父ID = {$menu->parent_id}");
- }
-
- // 查找中文菜单项
- $chineseMenu = null;
- $englishMenus = [];
-
- foreach ($menus as $menu) {
- // 检查标题是否包含中文字符
- if (preg_match('/[\x{4e00}-\x{9fa5}]/u', $menu->title)) {
- $chineseMenu = $menu;
- } else {
- $englishMenus[] = $menu;
- }
- }
-
- if ($chineseMenu) {
- $this->info(" - 保留中文菜单项: ID = {$chineseMenu->id}, 标题 = {$chineseMenu->title}");
-
- // 标准化URI
- $standardUri = $uri;
- foreach ($this->taskUriMap as $singular => $plural) {
- if ($chineseMenu->uri === $singular) {
- $standardUri = $plural;
- $chineseMenu->uri = $standardUri;
- $chineseMenu->save();
- $this->info(" - 更新URI: {$singular} -> {$standardUri}");
- break;
- }
- }
-
- foreach ($englishMenus as $menu) {
- // 获取子菜单
- $childMenus = AdminMenu::where('parent_id', $menu->id)->get();
-
- // 更新子菜单的父ID
- foreach ($childMenus as $childMenu) {
- $childMenu->parent_id = $chineseMenu->id;
- $childMenu->save();
- $this->info(" - 更新子菜单: ID = {$childMenu->id}, 标题 = {$childMenu->title}, 新父ID = {$chineseMenu->id}");
- }
-
- // 删除菜单项
- $menu->delete();
- $this->info(" - 删除英文菜单项: ID = {$menu->id}, 标题 = {$menu->title}");
- $deletedCount++;
- }
- } else {
- $this->info(" - 未找到中文菜单项,保留第一个菜单项: ID = {$menus[0]->id}, 标题 = {$menus[0]->title}");
-
- // 标准化URI
- $standardUri = $uri;
- foreach ($this->taskUriMap as $singular => $plural) {
- if ($menus[0]->uri === $singular) {
- $standardUri = $plural;
- $menus[0]->uri = $standardUri;
- $menus[0]->save();
- $this->info(" - 更新URI: {$singular} -> {$standardUri}");
- break;
- }
- }
-
- for ($i = 1; $i < count($menus); $i++) {
- // 获取子菜单
- $childMenus = AdminMenu::where('parent_id', $menus[$i]->id)->get();
-
- // 更新子菜单的父ID
- foreach ($childMenus as $childMenu) {
- $childMenu->parent_id = $menus[0]->id;
- $childMenu->save();
- $this->info(" - 更新子菜单: ID = {$childMenu->id}, 标题 = {$childMenu->title}, 新父ID = {$menus[0]->id}");
- }
-
- // 删除菜单项
- $menus[$i]->delete();
- $this->info(" - 删除重复菜单项: ID = {$menus[$i]->id}, 标题 = {$menus[$i]->title}");
- $deletedCount++;
- }
- }
- } else {
- // 标准化URI
- $menu = $menus[0];
- $standardUri = $uri;
-
- foreach ($this->taskUriMap as $singular => $plural) {
- if ($menu->uri === $singular) {
- $standardUri = $plural;
- $menu->uri = $standardUri;
- $menu->save();
- $this->info(" - 更新URI: {$singular} -> {$standardUri}");
- break;
- }
- }
- }
- }
-
- $this->info("\n已删除 {$deletedCount} 个重复的菜单项");
-
- return 0;
- }
- }
|