CheckTaskProgressCommand.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. <?php
  2. namespace App\Module\Task\Commands;
  3. use App\Module\Task\Enums\TASK_STATUS;
  4. use App\Module\Task\Models\Task;
  5. use App\Module\Task\Models\TaskUserTask;
  6. use App\Module\Task\Services\TaskProgressService;
  7. use Illuminate\Console\Command;
  8. use Illuminate\Support\Carbon;
  9. use Illuminate\Support\Facades\Log;
  10. /**
  11. * 检查任务进度命令
  12. *
  13. * 用于检查用户任务进度,自动完成满足条件的任务。
  14. */
  15. class CheckTaskProgressCommand extends Command
  16. {
  17. /**
  18. * 命令名称
  19. *
  20. * @var string
  21. */
  22. protected $signature = 'task:check-progress
  23. {--user-id= : 指定用户ID进行检查}
  24. {--task-id= : 指定任务ID进行检查}
  25. {--batch-size=100 : 每批处理的数量}
  26. {--dry-run : 仅检查不执行实际操作}';
  27. /**
  28. * 命令描述
  29. *
  30. * @var string
  31. */
  32. protected $description = '检查任务进度,自动完成满足条件的任务';
  33. /**
  34. * 任务进度服务
  35. *
  36. * @var TaskProgressService
  37. */
  38. protected $progressService;
  39. /**
  40. * 构造函数
  41. *
  42. * @param TaskProgressService $progressService
  43. */
  44. public function __construct(TaskProgressService $progressService)
  45. {
  46. parent::__construct();
  47. $this->progressService = $progressService;
  48. }
  49. /**
  50. * 执行命令
  51. *
  52. * @return int
  53. */
  54. public function handle()
  55. {
  56. $this->info('开始检查任务进度...');
  57. // 获取命令选项
  58. $userId = $this->option('user-id');
  59. $taskId = $this->option('task-id');
  60. $batchSize = $this->option('batch-size');
  61. $dryRun = $this->option('dry-run');
  62. // 构建查询
  63. $query = TaskUserTask::query()
  64. ->where('status', TASK_STATUS::IN_PROGRESS->value)
  65. ->where('progress', '>=', 100);
  66. // 应用过滤条件
  67. if ($userId) {
  68. $query->where('user_id', $userId);
  69. }
  70. if ($taskId) {
  71. $query->where('task_id', $taskId);
  72. }
  73. // 获取符合条件的任务数量
  74. $totalTasks = $query->count();
  75. if ($totalTasks === 0) {
  76. $this->info('没有找到需要完成的任务');
  77. return 0;
  78. }
  79. $this->info("找到 {$totalTasks} 个需要完成的任务");
  80. if ($dryRun) {
  81. $this->warn('仅检查模式,不执行实际操作');
  82. return 0;
  83. }
  84. // 创建进度条
  85. $bar = $this->output->createProgressBar($totalTasks);
  86. $bar->start();
  87. // 分批处理
  88. $completedCount = 0;
  89. $failedCount = 0;
  90. $query->chunk($batchSize, function ($userTasks) use (&$completedCount, &$failedCount, $bar) {
  91. foreach ($userTasks as $userTask) {
  92. try {
  93. // 检查任务是否需要重置
  94. $this->progressService->checkAndResetTask($userTask);
  95. // 如果任务仍然是进行中状态且进度达到100%,则完成任务
  96. if ($userTask->status === TASK_STATUS::IN_PROGRESS->value && $userTask->progress >= 100) {
  97. $result = $this->progressService->checkTaskCompletion($userTask->user_id, $userTask->task_id);
  98. if ($result['success']) {
  99. $completedCount++;
  100. } else {
  101. $failedCount++;
  102. $this->error("完成任务失败: 用户ID={$userTask->user_id}, 任务ID={$userTask->task_id}, 错误: {$result['message']}");
  103. }
  104. }
  105. } catch (\Exception $e) {
  106. $failedCount++;
  107. Log::error('检查任务进度失败', [
  108. 'user_id' => $userTask->user_id,
  109. 'task_id' => $userTask->task_id,
  110. 'error' => $e->getMessage(),
  111. ]);
  112. $this->error("处理任务异常: 用户ID={$userTask->user_id}, 任务ID={$userTask->task_id}, 错误: {$e->getMessage()}");
  113. }
  114. $bar->advance();
  115. }
  116. });
  117. $bar->finish();
  118. $this->newLine(2);
  119. $this->info("任务处理完成: 成功完成 {$completedCount} 个任务, 失败 {$failedCount} 个任务");
  120. return 0;
  121. }
  122. }