CheckActivity.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. <?php
  2. namespace addons\shopro\library\activity\traits;
  3. trait CheckActivity
  4. {
  5. /**
  6. * 检测活动商品必须至少设置一个规格为活动规格
  7. *
  8. * @param array $goodsList
  9. * @return void
  10. */
  11. public function checkActivitySkuPrice($goodsList)
  12. {
  13. foreach ($goodsList as $key => $goods) {
  14. $activitySkuPrice = $goods['activity_sku_prices'] ?? [];
  15. if (!$activitySkuPrice) {
  16. error_stop('请至少将商品一个规格设置为活动规格');
  17. }
  18. }
  19. }
  20. /**
  21. * 检测满赠规则设置
  22. *
  23. * @param array $discounts
  24. * @return void
  25. */
  26. public function checkGiftDiscount($discounts)
  27. {
  28. foreach ($discounts as $discount) {
  29. $types = $discount['types'];
  30. if (in_array('coupon', $types) && (!isset($discount['coupon_ids']) || empty($discount['coupon_ids']))) {
  31. // 验证优惠券
  32. error_stop('请选择要赠送的优惠券');
  33. }
  34. if (in_array('money', $types) && (!isset($discount['money']) || empty($discount['money']))) {
  35. // 赠送余额
  36. error_stop('请填写要赠送的余额');
  37. }
  38. if (in_array('score', $types) && (!isset($discount['score']) || empty($discount['score']))) {
  39. // 赠送积分
  40. error_stop('请填写要赠送的积分');
  41. }
  42. if (in_array('goods', $types) && (!isset($discount['goods_ids']) || empty($discount['goods_ids']))) {
  43. // 赠送优惠券
  44. error_stop('请选择要赠送的商品');
  45. }
  46. }
  47. }
  48. /**
  49. * 幸运拼团参与奖校验
  50. *
  51. * @param array $part_gift
  52. * @return void
  53. */
  54. public function checkLuckyPartGift($part_gift)
  55. {
  56. $types = $part_gift['types'];
  57. if (in_array('coupon', $types) && (!isset($part_gift['coupon_ids']) || empty($part_gift['coupon_ids']))) {
  58. // 验证优惠券
  59. error_stop('请选择要赠送的优惠券');
  60. }
  61. if (in_array('money', $types) && (!isset($discount['money']) || empty($discount['money']))) {
  62. // 赠送余额
  63. error_stop('请填写要赠送的余额');
  64. }
  65. if (in_array('score', $types) && (!isset($discount['score']) || empty($discount['score']))) {
  66. // 赠送积分
  67. error_stop('请填写要赠送的积分');
  68. }
  69. }
  70. /**
  71. * 检测活动商品是否重合
  72. *
  73. * @return void
  74. */
  75. public function checkActivityConflict($params, $goodsList = [], $activity_id = 0)
  76. {
  77. if ($params['classify'] == 'activity') {
  78. // 活动可以共存,不检测冲突
  79. return true;
  80. }
  81. $start_time = strtotime($params['start_time']);
  82. $end_time = strtotime($params['end_time']);
  83. $prehead_time = isset($params['prehead_time']) && $params['prehead_time'] ? strtotime($params['prehead_time']) : $start_time;
  84. $goodsIds = array_column($goodsList, 'id'); // 获取活动提交过来的所有商品的 id
  85. $goodsList = array_column($goodsList, null, 'id');
  86. // 获取所有时间有交叉的活动
  87. $activities = $this->getActivities($params['type'], [$prehead_time, $end_time]);
  88. foreach ($activities as $key => $activity) {
  89. if ($activity_id && $activity_id == $activity['id']) {
  90. // 编辑的时候,把自己排除在外
  91. continue;
  92. }
  93. $intersect = []; // 两个活动重合的商品Ids
  94. if ($goodsIds) {
  95. $activityGoodsIds = array_filter(explode(',', $activity['goods_ids']));
  96. // 不是全部商品,并且不重合
  97. if ($activityGoodsIds && !$intersect = array_intersect($activityGoodsIds, $goodsIds)) {
  98. // 商品不重合,继续验证下个活动
  99. continue;
  100. }
  101. }
  102. $goods_names = '';
  103. foreach ($intersect as $id) {
  104. if (isset($goodsList[$id]) && isset($goodsList[$id]['title'])) {
  105. $goods_names .= $goodsList[$id]['title'] . ',';
  106. }
  107. }
  108. if ($goods_names) {
  109. $goods_names = mb_strlen($goods_names) > 40 ? mb_substr($goods_names, 0, 37) . '...' : $goods_names;
  110. }
  111. if (!$goodsIds && !$intersect) {
  112. // 没有商品
  113. $msg = '活动时间与 “' . $activity['type_text'] . ' 活动的 ' . $activity['title'] . '” 冲突';
  114. } else {
  115. $msg = ((count($intersect) > 1 || !$goodsIds) ? '部分商品' : '该商品') . ($goods_names ? ' ' . $goods_names . ' ' : '') . '已在 “' . $activity['title'] . '” 活动中设置';
  116. }
  117. error_stop($msg);
  118. }
  119. }
  120. /**
  121. * 获取所有活动
  122. *
  123. * @param string $current_activity_type
  124. * @param array $range 要查询的时间区间
  125. * @return array
  126. */
  127. private function getActivities($current_activity_type, $range) {
  128. // 获取当前活动的互斥活动
  129. $activityTypes = $this->manager->model->getMutexActivityTypes($current_activity_type);
  130. $activities = $this->manager->getActivitiesByRange($range, $activityTypes);
  131. return $activities;
  132. }
  133. }