SyncPromotions.php 1.6 KB

12345678910111213141516171819202122232425262728293031
  1. <?php
  2. namespace App\Console\Commands;
  3. use App\Services\PromotionService;
  4. use Illuminate\Console\Command;
  5. use Illuminate\Support\Facades\DB;
  6. use Illuminate\Support\Facades\Schema;
  7. use Illuminate\Support\Facades\Log;
  8. class SyncPromotions extends Command
  9. {
  10. protected $signature = 'promotions:sync';
  11. protected $description = '补记转盘任务次数并解冻满足流水的新活动奖金';
  12. public function handle(PromotionService $service): int
  13. {
  14. if (!Schema::hasTable('promotion_accounts')) return self::SUCCESS;
  15. $errors = 0;
  16. DB::table('promotion_accounts as p')->join('promotion_activities as a', 'a.id', '=', 'p.activity_id')->where('a.type', 9)->where('a.status', 1)
  17. ->where('a.start_time', '<=', now()->timestamp)->where('a.end_time', '>=', now()->timestamp)->select('p.*')->orderBy('p.id')
  18. ->chunkById(100, function ($rows) use ($service, &$errors) {
  19. foreach ($rows as $row) try { $service->progress($row->activity_id, $row->user_id); }
  20. catch (\Throwable $e) { ++$errors; Log::error('promotion_sync_failed', ['account_id' => $row->id, 'exception' => $e]); }
  21. }, 'p.id', 'id');
  22. foreach (DB::table('promotion_rewards')->where('status', 'locked')->distinct()->pluck('user_id') as $userId) {
  23. try { $service->unlock((int)$userId); } catch (\Throwable $e) { ++$errors; Log::error('promotion_unlock_failed', ['user_id' => $userId, 'exception' => $e]); }
  24. }
  25. $this->info('活动任务和奖金同步完成,失败数:' . $errors);
  26. return $errors ? self::FAILURE : self::SUCCESS;
  27. }
  28. }