FreeShipping.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <?php
  2. namespace addons\shopro\library\activity\provider;
  3. /**
  4. * 满额包邮
  5. */
  6. class FreeShipping extends Base
  7. {
  8. protected $rules = [
  9. "type" => "require",
  10. "full_num" => "require|float"
  11. ];
  12. protected $message = [
  13. ];
  14. protected $default = [
  15. "type" => "money", // money=满足金额|num=满足件数
  16. "province_except" => '', // 不包邮的省份
  17. "city_except" => '', // 不包邮的城市
  18. "district_except" => '', // 不包邮的地区
  19. "district_text" => [], // 中文
  20. "full_num" => 0
  21. ];
  22. public function check($params, $activity_id = 0)
  23. {
  24. // 数据验证
  25. $params = parent::check($params);
  26. // 检测活动之间是否存在冲突
  27. $this->checkActivityConflict($params, $params['goods_list'], $activity_id);
  28. return $params;
  29. }
  30. public function formatTags($rules, $type)
  31. {
  32. $full_num = $rules['full_num'] ?? ($rules['discounts'][0]['full_num'] ?? 0); // activity_order 存的格式不一样是在 discount 里面包裹着
  33. $tags[] = $this->formatTag([
  34. 'type' => $rules['type'],
  35. 'full_num' => $full_num,
  36. ]);
  37. return array_values(array_filter($tags));
  38. }
  39. /**
  40. * 格式化 discount 折扣为具体优惠标签
  41. *
  42. * @param array $discountData
  43. * @return string
  44. */
  45. public function formatTag($discountData)
  46. {
  47. $tag = '满' . $discountData['full_num'] . ($discountData['type'] == 'money' ? '元' : '件') . '包邮';
  48. return $tag;
  49. }
  50. /**
  51. * 格式化 discount 折扣为具体优惠详情
  52. */
  53. public function formatTexts($rules, $type)
  54. {
  55. $text = '满' . $rules['full_num'] . ($rules['type'] == 'money' ? '元' : '件') . '即可包邮';
  56. if (isset($rules['district_text']) && $rules['district_text']) {
  57. $district = '';
  58. if (isset($rules['district_text']['province']) && $rules['district_text']['province']) {
  59. $district .= join(',', $rules['district_text']['province']) . ',';
  60. }
  61. if (isset($rules['district_text']['city']) && $rules['district_text']['city']) {
  62. $district .= join(',', $rules['district_text']['city']) . ',';
  63. }
  64. if (isset($rules['district_text']['district']) && $rules['district_text']['district']) {
  65. $district .= join(',', $rules['district_text']['district']) . ',';
  66. }
  67. if ($district) {
  68. $text .= " (不支持包邮地区:" . rtrim($district, ',') . ")";
  69. }
  70. }
  71. $texts[] = $text;
  72. return array_values(array_filter($texts));
  73. }
  74. public function getPromoInfo($promo, $data = [])
  75. {
  76. extract($this->promoGoodsData($promo));
  77. $rules = $promo['rules'];
  78. $userAddress = $data['userAddress'] ?? null;
  79. // 是按金额,还是按件数比较
  80. $compareif = $rules['type'] == 'num' ? 'promo_goods_num' : 'promo_goods_amount';
  81. // 判断除外的地区
  82. $district_except = isset($rules['district_except']) && $rules['district_except'] ? explode(',', $rules['district_except']) : [];
  83. $city_except = isset($rules['city_except']) && $rules['city_except'] ? explode(',', $rules['city_except']) : [];
  84. $province_except = isset($rules['province_except']) && $rules['province_except'] ? explode(',', $rules['province_except']) : [];
  85. if ($userAddress) {
  86. if (
  87. in_array($userAddress['district_id'], $district_except)
  88. || in_array($userAddress['city_id'], $city_except)
  89. || in_array($userAddress['province_id'], $province_except)
  90. ) {
  91. // 收货地址在非包邮地区,则继续循环下个活动
  92. return null;
  93. }
  94. } else if ($district_except || $city_except || $province_except) {
  95. // 没有选择收货地址,并且活动中包含地区限制,不计算活动
  96. return null;
  97. }
  98. if (${$compareif} < $rules['full_num']) {
  99. // 不满足条件,接着循环下个规则
  100. return null;
  101. }
  102. // 记录活动信息
  103. $promo_discount_info = [
  104. 'activity_id' => $promo['id'], // 活动id
  105. 'activity_title' => $promo['title'], // 活动标题
  106. 'activity_type' => $promo['type'], // 活动类型
  107. 'activity_type_text' => $promo['type_text'], // 活动类型中文
  108. 'promo_discount_money' => 0, // 这里无法知道真实运费减免,会在 orderCreate 后续计算完包邮优惠之后,改为真实减免的运费
  109. 'promo_goods_amount' => $promo_goods_amount, // 当前活动商品总金额
  110. 'rule_type' => $rules['type'], // 满多少元|还是满多少件
  111. 'discount_rule' => [
  112. 'full_num' => $rules['full_num']
  113. ], // 满足的那条规则
  114. 'goods_ids' => $goodsIds // 这个活动包含的这次购买的商品
  115. ];
  116. return $promo_discount_info;
  117. }
  118. }