PURCHASE_LIMIT_PERIOD.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <?php
  2. namespace App\Module\Shop\Enums;
  3. use UCore\Enum\EnumCore;
  4. use UCore\Enum\EnumToInt;
  5. use UCore\Enum\EnumExpression;
  6. /**
  7. * 商店限购周期类型枚举
  8. *
  9. * 定义商店商品的限购周期类型
  10. */
  11. enum PURCHASE_LIMIT_PERIOD: int
  12. {
  13. use EnumCore, EnumToInt, EnumExpression;
  14. /**
  15. * 永久限制
  16. * 商品在整个生命周期内的购买限制
  17. */
  18. case PERMANENT = 0;
  19. /**
  20. * 每日限制
  21. * 每天重置购买计数
  22. */
  23. case DAILY = 1;
  24. /**
  25. * 每周限制
  26. * 每周重置购买计数(周一重置)
  27. */
  28. case WEEKLY = 2;
  29. /**
  30. * 每月限制
  31. * 每月重置购买计数(每月1日重置)
  32. */
  33. case MONTHLY = 3;
  34. /**
  35. * 每年限制
  36. * 每年重置购买计数(每年1月1日重置)
  37. */
  38. case YEARLY = 4;
  39. /**
  40. * 获取所有限购周期类型
  41. *
  42. * @return array
  43. */
  44. public static function getAll(): array
  45. {
  46. return [
  47. self::PERMANENT->value => '永久限制',
  48. self::DAILY->value => '每日限制',
  49. self::WEEKLY->value => '每周限制',
  50. self::MONTHLY->value => '每月限制',
  51. self::YEARLY->value => '每年限制',
  52. ];
  53. }
  54. /**
  55. * 获取限购周期类型名称
  56. *
  57. * @param int $period
  58. * @return string
  59. */
  60. public static function getName(int $period): string
  61. {
  62. return self::getAll()[$period] ?? '未知';
  63. }
  64. /**
  65. * 获取下次重置时间
  66. *
  67. * @return \Carbon\Carbon|null
  68. */
  69. public function getNextResetTime(): ?\Carbon\Carbon
  70. {
  71. $now = now();
  72. return match ($this) {
  73. self::PERMANENT => null, // 永久限制不重置
  74. self::DAILY => $now->copy()->addDay()->startOfDay(),
  75. self::WEEKLY => $now->copy()->startOfWeek()->addWeek(),
  76. self::MONTHLY => $now->copy()->startOfMonth()->addMonth(),
  77. self::YEARLY => $now->copy()->startOfYear()->addYear(),
  78. };
  79. }
  80. /**
  81. * 检查是否需要重置计数
  82. *
  83. * @param \Carbon\Carbon $lastResetTime
  84. * @return bool
  85. */
  86. public function shouldReset(\Carbon\Carbon $lastResetTime): bool
  87. {
  88. if ($this === self::PERMANENT) {
  89. return false;
  90. }
  91. $now = now();
  92. return match ($this) {
  93. self::DAILY => !$lastResetTime->isToday(),
  94. self::WEEKLY => $lastResetTime->weekOfYear !== $now->weekOfYear || $lastResetTime->year !== $now->year,
  95. self::MONTHLY => $lastResetTime->month !== $now->month || $lastResetTime->year !== $now->year,
  96. self::YEARLY => $lastResetTime->year !== $now->year,
  97. default => false,
  98. };
  99. }
  100. }