From 143601c2510bb6b78884419dcbd899e747ee71d9 Mon Sep 17 00:00:00 2001 From: lkddi Date: Sun, 1 Mar 2026 15:16:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=9A=E5=A9=9A=E5=A7=BB?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E7=AC=AC11=E6=AD=A5=EF=BC=88Horizon=20Jobs?= =?UTF-8?q?=20+=20=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 5个 Job: - ExpireMarriageProposals:每5分钟扫描超时求婚(广播通知) - TriggerScheduledWeddings:每5分钟触发定时婚礼(广播庆典) - AutoExpireDivorces:每小时处理离婚超时自动解除 - ExpireWeddingEnvelopes:每小时清理过期红包 - ProcessMarriageIntimacy:每日00:05全量亲密度时间奖励 console.php 注册5个 Schedule --- app/Jobs/AutoExpireDivorces.php | 46 ++++++++++++++++++++++++ app/Jobs/ExpireMarriageProposals.php | 42 ++++++++++++++++++++++ app/Jobs/ExpireWeddingEnvelopes.php | 36 +++++++++++++++++++ app/Jobs/ProcessMarriageIntimacy.php | 31 +++++++++++++++++ app/Jobs/TriggerScheduledWeddings.php | 50 +++++++++++++++++++++++++++ routes/console.php | 17 +++++++++ 6 files changed, 222 insertions(+) create mode 100644 app/Jobs/AutoExpireDivorces.php create mode 100644 app/Jobs/ExpireMarriageProposals.php create mode 100644 app/Jobs/ExpireWeddingEnvelopes.php create mode 100644 app/Jobs/ProcessMarriageIntimacy.php create mode 100644 app/Jobs/TriggerScheduledWeddings.php 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');