Redis.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. <?php
  2. namespace addons\shopro\library\activity\getter;
  3. class Redis extends Base
  4. {
  5. /**
  6. * 获取所有给定类型给定状态的活动
  7. *
  8. * @param array $activityTypes
  9. * @return array
  10. */
  11. public function getActivities($activityTypes, $status = 'all')
  12. {
  13. $activities = $this->redis->getActivityList($activityTypes, $status, 'clear');
  14. return $activities;
  15. }
  16. /**
  17. * 获取指定时间区间内的活动
  18. *
  19. * @param array $range
  20. * @param array $activityTypes
  21. * @param string $range_type overlap=只要区间有重叠的就算|contain=包含,必须在这个区间之内的
  22. * @return array
  23. */
  24. public function getActivitiesByRange($range, $activityTypes = [], $range_type = 'overlap')
  25. {
  26. $activities = $this->redis->getActivityList($activityTypes);
  27. $newActivities = [];
  28. foreach ($activities as $key => $activity) {
  29. if ($this->rangeCompare($range, [$activity['start_time'], $activity['end_time']], $range_type)) {
  30. $newActivities[] = $activity;
  31. }
  32. }
  33. return $newActivities;
  34. }
  35. /**
  36. * 获取商品的所有正在进行,或正在预售的活动
  37. *
  38. * @param integer $goods_id
  39. * @return array
  40. */
  41. public function getGoodsActivitys($goods_id)
  42. {
  43. $classify = $this->model->classifies();
  44. $activityTypes = array_keys($classify['activity']);
  45. $activities = $this->redis->getGoodsActivitys($goods_id, $activityTypes, ['prehead', 'ing']);
  46. return $activities;
  47. }
  48. /**
  49. * 获取商品的所有正在进行,或正在预售的营销
  50. *
  51. * @param integer $goods_id
  52. * @return array
  53. */
  54. public function getGoodsPromos($goods_id)
  55. {
  56. $classify = $this->model->classifies();
  57. $activityTypes = array_keys($classify['promo']);
  58. $activities = $this->redis->getGoodsActivitys($goods_id, $activityTypes, ['prehead', 'ing'], 'promo');
  59. return $activities;
  60. }
  61. /**
  62. * 通过 活动 id 获取指定活动
  63. *
  64. * @param integer $goods_id
  65. * @param integer $activity_id
  66. * @return array
  67. */
  68. public function getGoodsActivityByActivity($goods_id, $activity_id)
  69. {
  70. $activities = $this->redis->getGoodsActivityByActivity($goods_id, $activity_id);
  71. return $activities;
  72. }
  73. /**
  74. * 比较时间区间
  75. *
  76. * @param array $range
  77. * @param array $activityRange
  78. * @param string $type
  79. * @return bool
  80. */
  81. private function rangeCompare($range, $activityRange, $type = 'overlap')
  82. {
  83. if ($type == 'overlap') {
  84. if ($range[1] >= $activityRange[0] && $range[0] <= $activityRange[1]) { // 时间相等也算没有交集
  85. // 两个时间区间有交集
  86. return true;
  87. }
  88. return false;
  89. } elseif ($type == 'contain') {
  90. if ($range[0] <= $activityRange[0] && $range[1] >= $activityRange[1]) { // 时间相等算包含
  91. // activityRange 是 range 的子集
  92. return true;
  93. }
  94. return false;
  95. }
  96. }
  97. }