| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- <?php
- namespace App\Module\Shop\Enums;
- use UCore\Enum\EnumCore;
- use UCore\Enum\EnumToInt;
- use UCore\Enum\EnumExpression;
- /**
- * 商店限购周期类型枚举
- *
- * 定义商店商品的限购周期类型
- */
- enum PURCHASE_LIMIT_PERIOD: int
- {
- use EnumCore, EnumToInt, EnumExpression;
- /**
- * 永久限制
- * 商品在整个生命周期内的购买限制
- */
- case PERMANENT = 0;
- /**
- * 每日限制
- * 每天重置购买计数
- */
- case DAILY = 1;
- /**
- * 每周限制
- * 每周重置购买计数(周一重置)
- */
- case WEEKLY = 2;
- /**
- * 每月限制
- * 每月重置购买计数(每月1日重置)
- */
- case MONTHLY = 3;
- /**
- * 每年限制
- * 每年重置购买计数(每年1月1日重置)
- */
- case YEARLY = 4;
- /**
- * 获取所有限购周期类型
- *
- * @return array
- */
- public static function getAll(): array
- {
- return [
- self::PERMANENT->value => '永久限制',
- self::DAILY->value => '每日限制',
- self::WEEKLY->value => '每周限制',
- self::MONTHLY->value => '每月限制',
- self::YEARLY->value => '每年限制',
- ];
- }
- /**
- * 获取限购周期类型名称
- *
- * @param int $period
- * @return string
- */
- public static function getName(int $period): string
- {
- return self::getAll()[$period] ?? '未知';
- }
- /**
- * 获取下次重置时间
- *
- * @return \Carbon\Carbon|null
- */
- public function getNextResetTime(): ?\Carbon\Carbon
- {
- $now = now();
-
- return match ($this) {
- self::PERMANENT => null, // 永久限制不重置
- self::DAILY => $now->copy()->addDay()->startOfDay(),
- self::WEEKLY => $now->copy()->startOfWeek()->addWeek(),
- self::MONTHLY => $now->copy()->startOfMonth()->addMonth(),
- self::YEARLY => $now->copy()->startOfYear()->addYear(),
- };
- }
- /**
- * 检查是否需要重置计数
- *
- * @param \Carbon\Carbon $lastResetTime
- * @return bool
- */
- public function shouldReset(\Carbon\Carbon $lastResetTime): bool
- {
- if ($this === self::PERMANENT) {
- return false;
- }
- $now = now();
-
- return match ($this) {
- self::DAILY => !$lastResetTime->isToday(),
- self::WEEKLY => $lastResetTime->weekOfYear !== $now->weekOfYear || $lastResetTime->year !== $now->year,
- self::MONTHLY => $lastResetTime->month !== $now->month || $lastResetTime->year !== $now->year,
- self::YEARLY => $lastResetTime->year !== $now->year,
- default => false,
- };
- }
- }
|