修复节日福利过期补发
This commit is contained in:
@@ -45,6 +45,39 @@ class HolidayEventScheduleService
|
||||
|
||||
$currentSendAt = CarbonImmutable::instance($event->send_at);
|
||||
|
||||
return $this->nextOccurrenceAfter($event, $currentSendAt);
|
||||
}
|
||||
|
||||
/**
|
||||
* 跳过已经超过领取窗口的历史计划点。
|
||||
*/
|
||||
public function skipExpiredOccurrences(HolidayEvent $event, CarbonInterface $reference): ?CarbonImmutable
|
||||
{
|
||||
if ($event->send_at === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$candidate = CarbonImmutable::instance($event->send_at);
|
||||
$referenceTime = CarbonImmutable::instance($reference);
|
||||
$expireMinutes = max(0, (int) $event->expire_minutes);
|
||||
|
||||
while ($candidate->addMinutes($expireMinutes)->lessThanOrEqualTo($referenceTime)) {
|
||||
// 历史批次的领取窗口已经结束,只推进调度指针,不能补发金币。
|
||||
$candidate = $this->nextOccurrenceAfter($event, $candidate);
|
||||
|
||||
if ($candidate === null) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
return $candidate;
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算指定计划点之后的下一次触发时间。
|
||||
*/
|
||||
private function nextOccurrenceAfter(HolidayEvent $event, CarbonImmutable $currentSendAt): ?CarbonImmutable
|
||||
{
|
||||
return match ($event->repeat_type) {
|
||||
'daily' => $currentSendAt->addDay(),
|
||||
'weekly' => $currentSendAt->addWeek(),
|
||||
|
||||
Reference in New Issue
Block a user