FixTaskMenus.php 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. <?php
  2. namespace App\Console\Commands;
  3. use App\Module\System\Models\AdminMenu;
  4. use Illuminate\Console\Command;
  5. use Illuminate\Support\Str;
  6. class FixTaskMenus extends Command
  7. {
  8. /**
  9. * The name and signature of the console command.
  10. *
  11. * @var string
  12. */
  13. protected $signature = 'admin:fix-task-menus';
  14. /**
  15. * The console command description.
  16. *
  17. * @var string
  18. */
  19. protected $description = '修复任务相关的菜单项,删除英文的菜单项,保留中文的菜单项';
  20. /**
  21. * 任务相关的URI映射
  22. *
  23. * @var array
  24. */
  25. protected $taskUriMap = [
  26. 'task-achievement-condition' => 'task-achievement-conditions',
  27. 'task-category' => 'task-categories',
  28. 'task-completion-log' => 'task-completion-logs',
  29. 'task-condition' => 'task-conditions',
  30. 'task' => 'tasks',
  31. 'task-cost' => 'task-costs',
  32. 'task-cost-log' => 'task-cost-logs',
  33. 'task-reset-log' => 'task-reset-logs',
  34. 'task-reward' => 'task-rewards',
  35. 'task-reward-log' => 'task-reward-logs',
  36. 'task-user-progress' => 'task-user-progresses',
  37. 'task-user-task' => 'task-user-tasks'
  38. ];
  39. /**
  40. * Execute the console command.
  41. *
  42. * @return int
  43. */
  44. public function handle()
  45. {
  46. $this->info("开始修复任务相关的菜单项...");
  47. $deletedCount = 0;
  48. // 获取所有任务相关的菜单项
  49. $taskMenus = AdminMenu::where('uri', 'like', 'task%')
  50. ->orWhere('uri', 'like', 'tasks%')
  51. ->get();
  52. $this->info("找到 {$taskMenus->count()} 个任务相关的菜单项");
  53. // 按URI分组
  54. $menusByUri = [];
  55. foreach ($taskMenus as $menu) {
  56. $uri = $menu->uri;
  57. // 标准化URI
  58. foreach ($this->taskUriMap as $singular => $plural) {
  59. if ($uri === $singular) {
  60. $uri = $plural;
  61. break;
  62. }
  63. }
  64. if (!isset($menusByUri[$uri])) {
  65. $menusByUri[$uri] = [];
  66. }
  67. $menusByUri[$uri][] = $menu;
  68. }
  69. // 处理每组菜单项
  70. foreach ($menusByUri as $uri => $menus) {
  71. if (count($menus) > 1) {
  72. $this->info("发现重复的菜单项: URI = {$uri}");
  73. // 显示所有重复项
  74. foreach ($menus as $index => $menu) {
  75. $this->info(" [{$index}] ID = {$menu->id}, 标题 = {$menu->title}, URI = {$menu->uri}, 父ID = {$menu->parent_id}");
  76. }
  77. // 查找中文菜单项
  78. $chineseMenu = null;
  79. $englishMenus = [];
  80. foreach ($menus as $menu) {
  81. // 检查标题是否包含中文字符
  82. if (preg_match('/[\x{4e00}-\x{9fa5}]/u', $menu->title)) {
  83. $chineseMenu = $menu;
  84. } else {
  85. $englishMenus[] = $menu;
  86. }
  87. }
  88. if ($chineseMenu) {
  89. $this->info(" - 保留中文菜单项: ID = {$chineseMenu->id}, 标题 = {$chineseMenu->title}");
  90. // 标准化URI
  91. $standardUri = $uri;
  92. foreach ($this->taskUriMap as $singular => $plural) {
  93. if ($chineseMenu->uri === $singular) {
  94. $standardUri = $plural;
  95. $chineseMenu->uri = $standardUri;
  96. $chineseMenu->save();
  97. $this->info(" - 更新URI: {$singular} -> {$standardUri}");
  98. break;
  99. }
  100. }
  101. foreach ($englishMenus as $menu) {
  102. // 获取子菜单
  103. $childMenus = AdminMenu::where('parent_id', $menu->id)->get();
  104. // 更新子菜单的父ID
  105. foreach ($childMenus as $childMenu) {
  106. $childMenu->parent_id = $chineseMenu->id;
  107. $childMenu->save();
  108. $this->info(" - 更新子菜单: ID = {$childMenu->id}, 标题 = {$childMenu->title}, 新父ID = {$chineseMenu->id}");
  109. }
  110. // 删除菜单项
  111. $menu->delete();
  112. $this->info(" - 删除英文菜单项: ID = {$menu->id}, 标题 = {$menu->title}");
  113. $deletedCount++;
  114. }
  115. } else {
  116. $this->info(" - 未找到中文菜单项,保留第一个菜单项: ID = {$menus[0]->id}, 标题 = {$menus[0]->title}");
  117. // 标准化URI
  118. $standardUri = $uri;
  119. foreach ($this->taskUriMap as $singular => $plural) {
  120. if ($menus[0]->uri === $singular) {
  121. $standardUri = $plural;
  122. $menus[0]->uri = $standardUri;
  123. $menus[0]->save();
  124. $this->info(" - 更新URI: {$singular} -> {$standardUri}");
  125. break;
  126. }
  127. }
  128. for ($i = 1; $i < count($menus); $i++) {
  129. // 获取子菜单
  130. $childMenus = AdminMenu::where('parent_id', $menus[$i]->id)->get();
  131. // 更新子菜单的父ID
  132. foreach ($childMenus as $childMenu) {
  133. $childMenu->parent_id = $menus[0]->id;
  134. $childMenu->save();
  135. $this->info(" - 更新子菜单: ID = {$childMenu->id}, 标题 = {$childMenu->title}, 新父ID = {$menus[0]->id}");
  136. }
  137. // 删除菜单项
  138. $menus[$i]->delete();
  139. $this->info(" - 删除重复菜单项: ID = {$menus[$i]->id}, 标题 = {$menus[$i]->title}");
  140. $deletedCount++;
  141. }
  142. }
  143. } else {
  144. // 标准化URI
  145. $menu = $menus[0];
  146. $standardUri = $uri;
  147. foreach ($this->taskUriMap as $singular => $plural) {
  148. if ($menu->uri === $singular) {
  149. $standardUri = $plural;
  150. $menu->uri = $standardUri;
  151. $menu->save();
  152. $this->info(" - 更新URI: {$singular} -> {$standardUri}");
  153. break;
  154. }
  155. }
  156. }
  157. }
  158. $this->info("\n已删除 {$deletedCount} 个重复的菜单项");
  159. return 0;
  160. }
  161. }