IntegralRepository.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. namespace app\common\repositories\store;
  12. use app\common\repositories\BaseRepository;
  13. use think\facade\Cache;
  14. class IntegralRepository extends BaseRepository
  15. {
  16. const CACHE_KEY = 'sys_int_next_day';
  17. /**
  18. * 获取下个月的第一天的日期戳
  19. *
  20. * 本函数用于计算当前日期所在月份结束后,下一个月的第一天的日期戳。
  21. * 通过strtotime函数结合日期字符串计算得出,确保了计算结果的准确性。
  22. *
  23. * @return int 返回下一个月第一天的日期戳
  24. */
  25. public function getNextDay()
  26. {
  27. // 使用strtotime和日期字符串计算下个月的第一天的日期戳
  28. return strtotime(date('Y-m-d', strtotime('first day of +1 month 00:00:00')));
  29. }
  30. /**
  31. * 获取无效积分的截止日期
  32. *
  33. * 本函数用于计算无效积分的截止日期,即超过此日期的积分将被视为无效。截止日期是根据系统配置的积分清理时间
  34. * (integral_clear_time)来确定的,它会返回距离当前时间最近的过去一个整月的最后一天的23:59:59的时间戳。
  35. * 如果系统配置的积分清理时间小于等于0,则认为不进行积分清理,直接返回0。
  36. *
  37. * @return int 返回无效积分截止日期的时间戳,如果积分清理时间设置为0或负数,则返回0。
  38. */
  39. public function getInvalidDay()
  40. {
  41. // 从系统配置中获取积分清理时间,单位为月
  42. $month = systemConfig('integral_clear_time');
  43. // 如果积分清理时间小于等于0,则不进行积分清理,直接返回0
  44. if ($month <= 0) return 0;
  45. // 计算截止日期的时间戳,即上个月的最后一天的23:59:59
  46. // 使用strtotime函数来解析日期字符串,并指定参考时间为基础时间戳减去1
  47. return strtotime('last day of -' . $month . ' month 23:59:59', $this->getTimeoutDay() - 1);
  48. }
  49. /**
  50. * 获取缓存中的过期天数,如果缓存不存在或需要清除,则重新计算并设置缓存。
  51. *
  52. * 此方法主要用于获取或更新一个特定缓存键的值,该值表示距离某个事件的过期天数。
  53. * 如果缓存已经存在且没有明确要求清除,则直接返回缓存值,以提高效率。
  54. * 如果缓存不存在,或者通过参数明确要求清除缓存,则重新计算过期天数,并设置新的缓存值。
  55. * 设置的缓存有效期为20天加12小时,以确保缓存不过期太快,同时允许一定的缓冲时间。
  56. *
  57. * @param bool $clear 是否清除缓存。如果设置为true,则无论缓存是否存在都会重新计算并设置缓存值。
  58. * @return mixed 返回缓存中的过期天数。如果缓存不存在且无法设置新缓存,则可能返回false。
  59. */
  60. public function getTimeoutDay($clear = false)
  61. {
  62. // 使用文件缓存驱动器实例
  63. $driver = Cache::store('file');
  64. // 检查缓存是否存在,或者是否需要清除缓存
  65. if (!$driver->has(self::CACHE_KEY) || $clear) {
  66. // 计算下一个过期天数,并设置缓存,有效期为20天加12小时
  67. $driver->set(self::CACHE_KEY, $this->getNextDay(), (20 * 24 * 3600) + 3600 * 12);
  68. }
  69. // 返回缓存中的过期天数
  70. return $driver->get(self::CACHE_KEY);
  71. }
  72. /**
  73. * 清除当天的定时任务执行时间缓存
  74. *
  75. * 本方法用于清除使用文件存储的缓存中特定键的值。特定键是预定义的常量,
  76. * 代表了当天的定时任务执行时间。通过清除这个缓存,可以迫使系统重新计算
  77. * 并存储定时任务的下次执行时间,以应对可能的配置更改或系统重启等情况。
  78. *
  79. * @return void 没有返回值
  80. */
  81. public function clearTimeoutDay()
  82. {
  83. // 使用文件缓存存储驱动,删除指定的缓存键
  84. Cache::store('file')->delete(self::CACHE_KEY);
  85. }
  86. }