| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- <?php
- namespace App\Module\Task\Commands;
- use App\Module\Task\Enums\TASK_STATUS;
- use App\Module\Task\Models\Task;
- use App\Module\Task\Models\TaskUserTask;
- use App\Module\Task\Services\TaskProgressService;
- use Illuminate\Console\Command;
- use Illuminate\Support\Carbon;
- use Illuminate\Support\Facades\Log;
- /**
- * 检查任务进度命令
- *
- * 用于检查用户任务进度,自动完成满足条件的任务。
- */
- class CheckTaskProgressCommand extends Command
- {
- /**
- * 命令名称
- *
- * @var string
- */
- protected $signature = 'task:check-progress
- {--user-id= : 指定用户ID进行检查}
- {--task-id= : 指定任务ID进行检查}
- {--batch-size=100 : 每批处理的数量}
- {--dry-run : 仅检查不执行实际操作}';
- /**
- * 命令描述
- *
- * @var string
- */
- protected $description = '检查任务进度,自动完成满足条件的任务';
- /**
- * 任务进度服务
- *
- * @var TaskProgressService
- */
- protected $progressService;
- /**
- * 构造函数
- *
- * @param TaskProgressService $progressService
- */
- public function __construct(TaskProgressService $progressService)
- {
- parent::__construct();
- $this->progressService = $progressService;
- }
- /**
- * 执行命令
- *
- * @return int
- */
- public function handle()
- {
- $this->info('开始检查任务进度...');
-
- // 获取命令选项
- $userId = $this->option('user-id');
- $taskId = $this->option('task-id');
- $batchSize = $this->option('batch-size');
- $dryRun = $this->option('dry-run');
-
- // 构建查询
- $query = TaskUserTask::query()
- ->where('status', TASK_STATUS::IN_PROGRESS->value)
- ->where('progress', '>=', 100);
-
- // 应用过滤条件
- if ($userId) {
- $query->where('user_id', $userId);
- }
-
- if ($taskId) {
- $query->where('task_id', $taskId);
- }
-
- // 获取符合条件的任务数量
- $totalTasks = $query->count();
-
- if ($totalTasks === 0) {
- $this->info('没有找到需要完成的任务');
- return 0;
- }
-
- $this->info("找到 {$totalTasks} 个需要完成的任务");
-
- if ($dryRun) {
- $this->warn('仅检查模式,不执行实际操作');
- return 0;
- }
-
- // 创建进度条
- $bar = $this->output->createProgressBar($totalTasks);
- $bar->start();
-
- // 分批处理
- $completedCount = 0;
- $failedCount = 0;
-
- $query->chunk($batchSize, function ($userTasks) use (&$completedCount, &$failedCount, $bar) {
- foreach ($userTasks as $userTask) {
- try {
- // 检查任务是否需要重置
- $this->progressService->checkAndResetTask($userTask);
-
- // 如果任务仍然是进行中状态且进度达到100%,则完成任务
- if ($userTask->status === TASK_STATUS::IN_PROGRESS->value && $userTask->progress >= 100) {
- $result = $this->progressService->checkTaskCompletion($userTask->user_id, $userTask->task_id);
-
- if ($result['success']) {
- $completedCount++;
- } else {
- $failedCount++;
- $this->error("完成任务失败: 用户ID={$userTask->user_id}, 任务ID={$userTask->task_id}, 错误: {$result['message']}");
- }
- }
- } catch (\Exception $e) {
- $failedCount++;
- Log::error('检查任务进度失败', [
- 'user_id' => $userTask->user_id,
- 'task_id' => $userTask->task_id,
- 'error' => $e->getMessage(),
- ]);
- $this->error("处理任务异常: 用户ID={$userTask->user_id}, 任务ID={$userTask->task_id}, 错误: {$e->getMessage()}");
- }
-
- $bar->advance();
- }
- });
-
- $bar->finish();
- $this->newLine(2);
-
- $this->info("任务处理完成: 成功完成 {$completedCount} 个任务, 失败 {$failedCount} 个任务");
-
- return 0;
- }
- }
|