MigrateTaskRewardsToRewardGroups.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <?php
  2. namespace App\Module\Task\Commands;
  3. use App\Module\Task\Models\Task;
  4. use App\Module\Task\Services\TaskRewardGroupService;
  5. use Illuminate\Console\Command;
  6. /**
  7. * 迁移任务奖励到奖励组命令
  8. */
  9. class MigrateTaskRewardsToRewardGroups extends Command
  10. {
  11. /**
  12. * 命令名称
  13. *
  14. * @var string
  15. */
  16. protected $signature = 'task:migrate-rewards {task_id?} {--all : 迁移所有任务}';
  17. /**
  18. * 命令描述
  19. *
  20. * @var string
  21. */
  22. protected $description = '将任务奖励迁移到奖励组';
  23. /**
  24. * 执行命令
  25. *
  26. * @return int
  27. */
  28. public function handle()
  29. {
  30. $taskId = $this->argument('task_id');
  31. $migrateAll = $this->option('all');
  32. if (!$taskId && !$migrateAll) {
  33. $this->error('请指定任务ID或使用 --all 选项迁移所有任务');
  34. return 1;
  35. }
  36. if ($taskId) {
  37. // 迁移单个任务
  38. $this->migrateTask($taskId);
  39. } else {
  40. // 迁移所有任务
  41. $this->migrateAllTasks();
  42. }
  43. return 0;
  44. }
  45. /**
  46. * 迁移单个任务
  47. *
  48. * @param int $taskId 任务ID
  49. * @return void
  50. */
  51. private function migrateTask(int $taskId)
  52. {
  53. $task = Task::find($taskId);
  54. if (!$task) {
  55. $this->error("任务 {$taskId} 不存在");
  56. return;
  57. }
  58. $this->info("开始迁移任务 {$taskId}: {$task->name}");
  59. $result = TaskRewardGroupService::migrateTaskRewardsToRewardGroup($taskId);
  60. if ($result['success']) {
  61. $this->info("任务 {$taskId} 迁移成功: {$result['message']}");
  62. if ($result['reward_group_id']) {
  63. $this->info("关联的奖励组ID: {$result['reward_group_id']}");
  64. }
  65. } else {
  66. $this->error("任务 {$taskId} 迁移失败: {$result['message']}");
  67. }
  68. }
  69. /**
  70. * 迁移所有任务
  71. *
  72. * @return void
  73. */
  74. private function migrateAllTasks()
  75. {
  76. $this->info('开始迁移所有任务奖励到奖励组');
  77. // 获取所有有奖励但没有关联奖励组的任务
  78. $tasks = Task::whereHas('rewards')
  79. ->whereNull('reward_group_id')
  80. ->get();
  81. $total = $tasks->count();
  82. $this->info("找到 {$total} 个需要迁移的任务");
  83. $bar = $this->output->createProgressBar($total);
  84. $bar->start();
  85. $success = 0;
  86. $failed = 0;
  87. foreach ($tasks as $task) {
  88. $result = TaskRewardGroupService::migrateTaskRewardsToRewardGroup($task->id);
  89. if ($result['success']) {
  90. $success++;
  91. } else {
  92. $failed++;
  93. $this->newLine();
  94. $this->error("任务 {$task->id} 迁移失败: {$result['message']}");
  95. }
  96. $bar->advance();
  97. }
  98. $bar->finish();
  99. $this->newLine(2);
  100. $this->info("迁移完成: 成功 {$success} 个, 失败 {$failed} 个");
  101. }
  102. }