RemoveDuplicateMenus.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  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 RemoveDuplicateMenus extends Command
  7. {
  8. /**
  9. * The name and signature of the console command.
  10. *
  11. * @var string
  12. */
  13. protected $signature = 'admin:remove-duplicate-menus';
  14. /**
  15. * The console command description.
  16. *
  17. * @var string
  18. */
  19. protected $description = '删除重复的菜单项,保留中文的菜单项';
  20. /**
  21. * 需要保留的中文菜单项映射
  22. *
  23. * @var array
  24. */
  25. protected $chineseMenuMap = [
  26. 'task' => '任务',
  27. 'task-category' => '任务分类',
  28. 'task-achievement-condition' => '任务达成条件',
  29. 'task-completion-log' => '任务完成日志',
  30. 'task-condition' => '任务条件',
  31. 'task-cost' => '任务消耗',
  32. 'task-cost-log' => '任务消耗日志',
  33. 'task-reset-log' => '任务重置日志',
  34. 'task-reward' => '任务奖励',
  35. 'task-reward-log' => '任务奖励日志',
  36. 'task-user-progress' => '用户进度',
  37. 'task-user-task' => '用户任务',
  38. 'pet-battle-log' => '宠物战斗记录',
  39. 'pet-battle-season' => '争霸赛-赛季',
  40. 'pet-battle-team' => '争霸赛-队伍',
  41. 'pet-battle-team-member' => '争霸赛-队伍成员',
  42. 'pet-config' => '宠物配置',
  43. 'pet-level-config' => '宠物-等级配置',
  44. 'pet-remould-log' => '宠物洗髓记录',
  45. 'pet-skill' => '宠物-技能配置',
  46. 'pet-skill-log' => '宠物-技能使用日志',
  47. 'pet-user' => '宠物管理',
  48. 'farm-crop' => '作物管理',
  49. 'farm-god-buff' => '神灵加持管理',
  50. 'farm-harvest-log' => '收获记录管理',
  51. 'farm-house-config' => '房屋等级配置',
  52. 'farm-land' => '土地管理',
  53. 'farm-land-type' => '土地类型配置',
  54. 'farm-land-upgrade-config' => '土地升级配置',
  55. 'farm-seed' => '种子配置管理',
  56. 'farm-seed-output' => '种子产出配置',
  57. 'farm-team-profit' => '团队收益记录',
  58. 'farm-upgrade-log' => '升级记录管理',
  59. 'farm-user' => '用户农场管理',
  60. 'game-items-categories' => '物品分类',
  61. 'game-items' => '物品设置',
  62. 'game-items-chest-contents' => '宝箱内容',
  63. 'game-items-dismantle-rules' => '物品分解规则',
  64. 'game-items-groups' => '物品组管理',
  65. 'game-items-group-items' => '物品组内容',
  66. 'game-items-output-limits' => '物品产出限制',
  67. 'game-items-recipes' => '合成配方管理',
  68. 'game-items-chest-costs' => '宝箱消耗配置',
  69. 'game-items-craft-logs' => '物品合成记录',
  70. 'game-items-dismantle-logs' => '物品分解记录',
  71. 'game-items-instances' => '单独属性物品管理',
  72. 'game-items-pity-times' => '用户宝箱保底计数',
  73. 'game-items-transaction-logs' => '物品记录',
  74. 'game-items-user-items' => '用户物品',
  75. 'game-items-user-output-counters' => '用户产出限制计数',
  76. 'game-items-user-recipes' => '用户配方解锁状态',
  77. 'team-talent-config' => '达人等级配置',
  78. 'team-profit-rule' => '收益规则配置',
  79. 'team-user-talent' => '达人等级管理',
  80. 'team-user-referral' => '用户推荐关系',
  81. 'team-referral-change' => '推荐关系变更记录',
  82. 'team-referral-code' => '推荐码管理',
  83. 'team-referral-code-usage' => '推荐码使用记录',
  84. 'team-profit' => '团队收益记录',
  85. 'team-invite-reward' => '邀请奖励记录',
  86. 'team-user-relation-cache' => '用户关系缓存'
  87. ];
  88. /**
  89. * Execute the console command.
  90. *
  91. * @return int
  92. */
  93. public function handle()
  94. {
  95. $this->info("开始查找和删除重复的菜单项...");
  96. $duplicateCount = 0;
  97. // 查找任务相关的菜单项
  98. $this->info("查找任务相关的菜单项...");
  99. // 查找任务配置菜单
  100. $taskConfigMenus = AdminMenu::where('title', 'like', '%任务配置%')
  101. ->orWhere('title', 'like', '%Task%配置%')
  102. ->orWhere('title', 'like', '%📋 任务配置%')
  103. ->get();
  104. if ($taskConfigMenus->count() > 1) {
  105. $this->info("发现重复的任务配置菜单:");
  106. // 显示所有重复项
  107. foreach ($taskConfigMenus as $index => $menu) {
  108. $this->info(" [{$index}] ID = {$menu->id}, 标题 = {$menu->title}, 父ID = {$menu->parent_id}");
  109. }
  110. // 询问用户要保留哪个
  111. $keepIndex = $this->ask("请输入要保留的菜单项索引 (0-" . ($taskConfigMenus->count() - 1) . ")");
  112. if (is_numeric($keepIndex) && $keepIndex >= 0 && $keepIndex < $taskConfigMenus->count()) {
  113. for ($i = 0; $i < $taskConfigMenus->count(); $i++) {
  114. if ($i != $keepIndex) {
  115. $this->info(" - 删除菜单项: ID = {$taskConfigMenus[$i]->id}, 标题 = {$taskConfigMenus[$i]->title}");
  116. // 获取子菜单
  117. $childMenus = AdminMenu::where('parent_id', $taskConfigMenus[$i]->id)->get();
  118. // 更新子菜单的父ID
  119. foreach ($childMenus as $childMenu) {
  120. $childMenu->parent_id = $taskConfigMenus[$keepIndex]->id;
  121. $childMenu->save();
  122. $this->info(" - 更新子菜单: ID = {$childMenu->id}, 标题 = {$childMenu->title}, 新父ID = {$taskConfigMenus[$keepIndex]->id}");
  123. }
  124. // 删除菜单项
  125. $taskConfigMenus[$i]->delete();
  126. $duplicateCount++;
  127. }
  128. }
  129. } else {
  130. $this->error("无效的索引,跳过此重复项");
  131. }
  132. }
  133. // 查找任务管理菜单
  134. $taskManageMenus = AdminMenu::where('title', 'like', '%任务管理%')
  135. ->orWhere('title', 'like', '%Task%管理%')
  136. ->orWhere('title', 'like', '%👥 用户任务管理%')
  137. ->get();
  138. if ($taskManageMenus->count() > 1) {
  139. $this->info("发现重复的任务管理菜单:");
  140. // 显示所有重复项
  141. foreach ($taskManageMenus as $index => $menu) {
  142. $this->info(" [{$index}] ID = {$menu->id}, 标题 = {$menu->title}, 父ID = {$menu->parent_id}");
  143. }
  144. // 询问用户要保留哪个
  145. $keepIndex = $this->ask("请输入要保留的菜单项索引 (0-" . ($taskManageMenus->count() - 1) . ")");
  146. if (is_numeric($keepIndex) && $keepIndex >= 0 && $keepIndex < $taskManageMenus->count()) {
  147. for ($i = 0; $i < $taskManageMenus->count(); $i++) {
  148. if ($i != $keepIndex) {
  149. $this->info(" - 删除菜单项: ID = {$taskManageMenus[$i]->id}, 标题 = {$taskManageMenus[$i]->title}");
  150. // 获取子菜单
  151. $childMenus = AdminMenu::where('parent_id', $taskManageMenus[$i]->id)->get();
  152. // 更新子菜单的父ID
  153. foreach ($childMenus as $childMenu) {
  154. $childMenu->parent_id = $taskManageMenus[$keepIndex]->id;
  155. $childMenu->save();
  156. $this->info(" - 更新子菜单: ID = {$childMenu->id}, 标题 = {$childMenu->title}, 新父ID = {$taskManageMenus[$keepIndex]->id}");
  157. }
  158. // 删除菜单项
  159. $taskManageMenus[$i]->delete();
  160. $duplicateCount++;
  161. }
  162. }
  163. } else {
  164. $this->error("无效的索引,跳过此重复项");
  165. }
  166. }
  167. // 查找任务子菜单项
  168. $this->info("\n查找任务子菜单项...");
  169. // 获取所有任务相关的子菜单
  170. $taskSubMenus = AdminMenu::where(function ($query) {
  171. $query->where('uri', 'like', 'task%')
  172. ->orWhere('uri', 'like', '/task%');
  173. })->get();
  174. // 按URI分组
  175. $uriGroups = [];
  176. foreach ($taskSubMenus as $menu) {
  177. $uri = ltrim($menu->uri, '/');
  178. if (!isset($uriGroups[$uri])) {
  179. $uriGroups[$uri] = [];
  180. }
  181. $uriGroups[$uri][] = $menu;
  182. }
  183. // 处理重复项
  184. foreach ($uriGroups as $uri => $menus) {
  185. if (count($menus) > 1) {
  186. $this->info("发现重复的任务子菜单项: URI = {$uri}");
  187. // 显示所有重复项
  188. foreach ($menus as $index => $menu) {
  189. $this->info(" [{$index}] ID = {$menu->id}, 标题 = {$menu->title}, 父ID = {$menu->parent_id}");
  190. }
  191. // 询问用户要保留哪个
  192. $keepIndex = $this->ask("请输入要保留的菜单项索引 (0-" . (count($menus) - 1) . ")");
  193. if (is_numeric($keepIndex) && $keepIndex >= 0 && $keepIndex < count($menus)) {
  194. for ($i = 0; $i < count($menus); $i++) {
  195. if ($i != $keepIndex) {
  196. $this->info(" - 删除菜单项: ID = {$menus[$i]->id}, 标题 = {$menus[$i]->title}");
  197. $menus[$i]->delete();
  198. $duplicateCount++;
  199. }
  200. }
  201. } else {
  202. $this->error("无效的索引,跳过此重复项");
  203. }
  204. }
  205. }
  206. // 查找其他可能的重复项
  207. $this->info("\n查找其他可能的重复项...");
  208. $allMenus = AdminMenu::all();
  209. $uriCounts = [];
  210. foreach ($allMenus as $menu) {
  211. $uri = ltrim($menu->uri, '/');
  212. if (!empty($uri)) {
  213. if (!isset($uriCounts[$uri])) {
  214. $uriCounts[$uri] = [];
  215. }
  216. $uriCounts[$uri][] = $menu;
  217. }
  218. }
  219. foreach ($uriCounts as $uri => $menus) {
  220. if (count($menus) > 1) {
  221. $this->info("发现重复的菜单项: URI = {$uri}");
  222. // 显示所有重复项
  223. foreach ($menus as $index => $menu) {
  224. $this->info(" [{$index}] ID = {$menu->id}, 标题 = {$menu->title}, 父ID = {$menu->parent_id}");
  225. }
  226. // 询问用户要保留哪个
  227. $keepIndex = $this->ask("请输入要保留的菜单项索引 (0-" . (count($menus) - 1) . ")");
  228. if (is_numeric($keepIndex) && $keepIndex >= 0 && $keepIndex < count($menus)) {
  229. for ($i = 0; $i < count($menus); $i++) {
  230. if ($i != $keepIndex) {
  231. $this->info(" - 删除菜单项: ID = {$menus[$i]->id}, 标题 = {$menus[$i]->title}");
  232. $menus[$i]->delete();
  233. $duplicateCount++;
  234. }
  235. }
  236. } else {
  237. $this->error("无效的索引,跳过此重复项");
  238. }
  239. }
  240. }
  241. $this->info("\n总共删除了 {$duplicateCount} 个重复的菜单项");
  242. return 0;
  243. }
  244. }