diff --git a/app/Jobs/AutoExpireDivorces.php b/app/Jobs/AutoExpireDivorces.php new file mode 100644 index 0000000..bda6096 --- /dev/null +++ b/app/Jobs/AutoExpireDivorces.php @@ -0,0 +1,46 @@ +get('divorce_request_timeout', 72); + + Marriage::query() + ->where('status', 'married') + ->where('divorce_type', 'mutual') + ->whereNotNull('divorce_requested_at') + ->where('divorce_requested_at', '<=', now()->subHours($timeoutHours)) + ->cursor() + ->each(function (Marriage $marriage) use ($service) { + $service->autoExpireDivorce($marriage); + $marriage->refresh(); + broadcast(new MarriageDivorced($marriage, 'auto')); + }); + } +} diff --git a/app/Jobs/ExpireMarriageProposals.php b/app/Jobs/ExpireMarriageProposals.php new file mode 100644 index 0000000..6f4b1ba --- /dev/null +++ b/app/Jobs/ExpireMarriageProposals.php @@ -0,0 +1,42 @@ +where('status', 'pending') + ->where('expires_at', '<=', now()) + ->cursor() + ->each(function (Marriage $marriage) use ($service) { + $service->expireProposal($marriage); + // 广播通知求婚方(若在线则收到) + broadcast(new MarriageExpired($marriage)); + }); + } +} diff --git a/app/Jobs/ExpireWeddingEnvelopes.php b/app/Jobs/ExpireWeddingEnvelopes.php new file mode 100644 index 0000000..4abf1d4 --- /dev/null +++ b/app/Jobs/ExpireWeddingEnvelopes.php @@ -0,0 +1,36 @@ +where('status', 'active') + ->whereNotNull('expires_at') + ->where('expires_at', '<', now()) + ->update(['status' => 'completed']); + } +} diff --git a/app/Jobs/ProcessMarriageIntimacy.php b/app/Jobs/ProcessMarriageIntimacy.php new file mode 100644 index 0000000..5d6c0b1 --- /dev/null +++ b/app/Jobs/ProcessMarriageIntimacy.php @@ -0,0 +1,31 @@ +dailyBatch(); + } +} diff --git a/app/Jobs/TriggerScheduledWeddings.php b/app/Jobs/TriggerScheduledWeddings.php new file mode 100644 index 0000000..8d2161f --- /dev/null +++ b/app/Jobs/TriggerScheduledWeddings.php @@ -0,0 +1,50 @@ +where('status', 'pending') + ->where('ceremony_type', 'scheduled') + ->where('ceremony_at', '<=', now()) + ->with('marriage') + ->cursor() + ->each(function (WeddingCeremony $ceremony) use ($wedding) { + if (! $ceremony->marriage) { + return; + } + + $result = $wedding->trigger($ceremony); + + if ($result['ok']) { + // 广播全房间婚礼庆典 + broadcast(new WeddingCelebration($ceremony, $ceremony->marriage)); + } + }); + } +} diff --git a/routes/console.php b/routes/console.php index e55f0b2..b30164e 100644 --- a/routes/console.php +++ b/routes/console.php @@ -13,3 +13,20 @@ Schedule::command('messages:purge')->dailyAt('03:00'); // 每 5 分钟为所有在线用户自动存点(经验/金币/等级) Schedule::command('chatroom:auto-save-exp')->everyFiveMinutes(); + +// ──────────── 婚姻系统定时任务 ──────────────────────────────────── + +// 每 5 分钟:扫描超时求婚(48h后失效 + 戒指消失 + 广播通知) +Schedule::job(new \App\Jobs\ExpireMarriageProposals)->everyFiveMinutes(); + +// 每 5 分钟:触发到时的定时婚礼(红包分发 + 广播庆典) +Schedule::job(new \App\Jobs\TriggerScheduledWeddings)->everyFiveMinutes(); + +// 每小时:协议离婚超时自动升级为强制(72h无响应) +Schedule::job(new \App\Jobs\AutoExpireDivorces)->hourly(); + +// 每小时:清理过期婚礼红包(expired_at 过后标记 completed) +Schedule::job(new \App\Jobs\ExpireWeddingEnvelopes)->hourly(); + +// 每天 00:05:全量处理婚姻亲密度时间奖励(每日加分) +Schedule::job(new \App\Jobs\ProcessMarriageIntimacy)->dailyAt('00:05');