98 lines
3.1 KiB
PHP
98 lines
3.1 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 文件功能:AI小班长自动领取百家乐买单活动补偿任务
|
||
|
|
*
|
||
|
|
* 当买单活动进入“可领取”状态后,异步为 AI小班长检查并领取
|
||
|
|
* 本次活动中累计的补偿金币,确保金币入账和流水日志统一走正式服务。
|
||
|
|
*/
|
||
|
|
|
||
|
|
namespace App\Jobs;
|
||
|
|
|
||
|
|
use App\Models\BaccaratLossCoverEvent;
|
||
|
|
use App\Models\BaccaratLossCoverRecord;
|
||
|
|
use App\Models\User;
|
||
|
|
use App\Services\BaccaratLossCoverService;
|
||
|
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
||
|
|
use Illuminate\Foundation\Queue\Queueable;
|
||
|
|
use Illuminate\Support\Facades\Log;
|
||
|
|
|
||
|
|
class AiClaimBaccaratLossCoverJob implements ShouldQueue
|
||
|
|
{
|
||
|
|
use Queueable;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 最大重试次数。
|
||
|
|
*/
|
||
|
|
public int $tries = 3;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @param int $eventId 需要自动领取补偿的活动 ID
|
||
|
|
*/
|
||
|
|
public function __construct(
|
||
|
|
public readonly int $eventId,
|
||
|
|
) {}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 执行 AI 小班长自动领取补偿逻辑。
|
||
|
|
*/
|
||
|
|
public function handle(BaccaratLossCoverService $lossCoverService): void
|
||
|
|
{
|
||
|
|
$event = BaccaratLossCoverEvent::query()->find($this->eventId);
|
||
|
|
if (! $event) {
|
||
|
|
Log::channel('daily')->warning('AI小班长自动领取买单补偿失败:活动不存在', [
|
||
|
|
'event_id' => $this->eventId,
|
||
|
|
]);
|
||
|
|
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 只有活动进入可领取状态后,才允许自动发起补偿领取。
|
||
|
|
if (! $event->isClaimable()) {
|
||
|
|
Log::channel('daily')->info('AI小班长自动领取买单补偿跳过:活动暂不可领取', [
|
||
|
|
'event_id' => $event->id,
|
||
|
|
'status' => $event->status,
|
||
|
|
]);
|
||
|
|
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
$aiUser = User::query()->where('username', 'AI小班长')->first();
|
||
|
|
if (! $aiUser) {
|
||
|
|
Log::channel('daily')->warning('AI小班长自动领取买单补偿失败:未找到 AI 用户', [
|
||
|
|
'event_id' => $event->id,
|
||
|
|
]);
|
||
|
|
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
$record = BaccaratLossCoverRecord::query()
|
||
|
|
->where('event_id', $event->id)
|
||
|
|
->where('user_id', $aiUser->id)
|
||
|
|
->first();
|
||
|
|
|
||
|
|
// 没有补偿记录或本次没有待领取金额时,直接记日志后结束。
|
||
|
|
if (! $record || $record->compensation_amount <= 0 || $record->claim_status !== 'pending') {
|
||
|
|
Log::channel('daily')->info('AI小班长自动领取买单补偿跳过:暂无待领取补偿', [
|
||
|
|
'event_id' => $event->id,
|
||
|
|
'user_id' => $aiUser->id,
|
||
|
|
'claim_status' => $record?->claim_status,
|
||
|
|
'compensation_amount' => $record?->compensation_amount,
|
||
|
|
]);
|
||
|
|
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
$claimResult = $lossCoverService->claim($event, $aiUser);
|
||
|
|
|
||
|
|
// 统一记录自动领取结果,便于后续核对 AI 补偿发放情况。
|
||
|
|
Log::channel('daily')->info('AI小班长自动领取买单补偿结果', [
|
||
|
|
'event_id' => $event->id,
|
||
|
|
'user_id' => $aiUser->id,
|
||
|
|
'ok' => $claimResult['ok'],
|
||
|
|
'message' => $claimResult['message'],
|
||
|
|
'amount' => $claimResult['amount'] ?? 0,
|
||
|
|
]);
|
||
|
|
}
|
||
|
|
}
|