MemberPriceMarketing.php 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. <?php
  2. namespace common\logic\order\marketing;
  3. use addons\Agent\common\models\Agent;
  4. use addons\Agent\common\models\AgentCommissionItemSetting;
  5. use common\enums\AddonsEnum;
  6. use common\enums\StatusEnum;
  7. use common\models\goods\Goods;
  8. use common\models\mall\MallAddons;
  9. use common\models\user\UserLevel;
  10. use Exception;
  11. use yii\helpers\Json;
  12. /**
  13. * 会员价
  14. * @Author bing
  15. * @DateTime 2021-09-27 19:07:32
  16. * @copyright: Copyright (c) 2020 广东七件事集团
  17. */
  18. class MemberPriceMarketing extends BaseMarketing
  19. {
  20. public function execute($form)
  21. {
  22. }
  23. public static function compute($item, &$form, &$extra)
  24. {
  25. try {
  26. $group_order_goods = $form['group_order_goods'];
  27. $mall_id = $form['mall_id'];
  28. $user_level = $form->user->level;
  29. $enable_goods_deduct = 0;// 商品是否参与了渠道分红
  30. //渠道分红,开启了内购-商品抵扣后,不再享受会员价
  31. if (MallAddons::isInstall($mall_id, AddonsEnum::ADDONS_NAME_AGENT)){
  32. $setting = \Yii::$app->services->setting->addons->get($mall_id, AddonsEnum::ADDONS_NAME_AGENT, 'basic');
  33. $agent = Agent::findOne(['user_id'=>$form['user_id'],'status'=>StatusEnum::ENABLED]);
  34. if (!empty($agent)&&!empty($setting['is_self_buy']) && !empty($setting['enable_goods_deduct'])) $enable_goods_deduct = 1;
  35. }
  36. if (empty($extra['user_level_model'])) {
  37. $user_level_model = UserLevel::getOne([['level' => $user_level],['mall_id' => $mall_id],['status'=>StatusEnum::ENABLED]], true);
  38. if(empty($user_level_model)) return $item;
  39. } else {
  40. $user_level_model = $extra['user_level_model'];
  41. }
  42. $discount = $user_level_model['discount'] ?? 10;
  43. if (empty($extra['goods_arr'])) {
  44. $goods_arr = self::getGoodListArr($group_order_goods);
  45. $extra['goods_arr'] = $goods_arr;
  46. } else {
  47. $goods_arr = $extra['goods_arr'];
  48. }
  49. if (empty($extra['total_deduct_money'])) {
  50. $total_deduct_money = 0;
  51. $extra['total_deduct_money'] = $total_deduct_money;
  52. } else {
  53. $total_deduct_money = $extra['total_deduct_money'];
  54. }
  55. $total_deduct_goods_price = 0;
  56. foreach ($item['goods'] as &$row) {
  57. $cha = 0;
  58. // 检测商品是否参与了渠道分红
  59. if ($enable_goods_deduct) {
  60. $item_setting = AgentCommissionItemSetting::find()->select('item_id,is_participate,is_self_buy_alone,is_self_buy,enable_goods_deduct')->where(['item_id' => $row['goods_id'], 'status' => StatusEnum::ENABLED])->asArray()->one();
  61. if (empty($item_setting) || !empty($item_setting['is_participate'])) continue;
  62. //独立设置内购
  63. if(!empty($item_setting['is_self_buy_alone'])){
  64. if (empty($item_setting['is_self_buy']) || empty($item_setting['enable_goods_deduct'])) continue;
  65. }
  66. }
  67. if (isset($goods_arr[$row['goods_id']]) && $goods_arr[$row['goods_id']]['extra']['is_member_price'] == 1) {
  68. //单独设置会员价
  69. $member_price_setting = Json::decode($goods_arr[$row['goods_id']]['extra']['member_price_setting']);
  70. if(!empty($form['sku'][$row['goods_id']]['goods']['is_attr'])){
  71. //多规格
  72. if (isset($member_price_setting['level' . $user_level])){
  73. $differences_money = 0; // 循环差额
  74. foreach ($row['goods_details'] as &$v) {
  75. if (isset($member_price_setting['level' . $user_level][$v['sign_id']])){
  76. $member_price = $member_price_setting['level' . $user_level][$v['sign_id']];
  77. if($v['price']>$member_price){
  78. if($member_price=='')$member_price = 0;
  79. $cha = ($v['price'] - $member_price) * $v['num'];//差额
  80. $cha = bcadd($cha, 0, 2);
  81. $differences_money = bcadd($differences_money, $cha, 2);
  82. $v['goods_price'] = bcsub($v['goods_price'], $cha, 2);
  83. $v['marketing']['member_price_deduct'] = $cha;
  84. $v['marketing']['pay_money'] = $v['goods_price'];
  85. }
  86. }
  87. }
  88. if ($differences_money>0) {
  89. $cha = bcadd(0, $differences_money, 2);
  90. $total_deduct_money = bcadd($total_deduct_money, $cha, 2);
  91. $total_deduct_goods_price = bcadd($total_deduct_goods_price, $cha, 2);
  92. }
  93. }
  94. }else{
  95. //默认规格
  96. if (!empty($member_price_setting[$user_level])){
  97. foreach ($row['goods_details'] as &$v) {
  98. if($v['price']>$member_price_setting[$user_level]) {
  99. $cha = 0;
  100. if(!empty($member_price_setting[$user_level])){
  101. if($member_price_setting[$user_level]=='')$member_price_setting[$user_level] = 0;
  102. $cha = ($v['price'] - $member_price_setting[$user_level]) * $v['num'];//差额
  103. }
  104. $cha = bcadd(0, $cha, 2);
  105. $total_deduct_money = bcadd($total_deduct_money, $cha, 2);
  106. $total_deduct_goods_price = bcadd($total_deduct_goods_price, $cha, 2);
  107. $v['goods_price'] = bcsub($v['goods_price'], $cha, 2);
  108. $v['marketing']['member_price_deduct'] = $cha;
  109. $v['marketing']['pay_money'] = $v['goods_price'];
  110. }
  111. }
  112. }
  113. }
  114. } else {
  115. //全局设置会员价
  116. if($goods_arr[$row['goods_id']]['extra']['is_member_price']==0){
  117. foreach ($row['goods_details'] as &$v) {
  118. $member_price = bcdiv(bcmul($v['price'], $discount, 2), 10, 2);
  119. if($v['price']>$member_price) {
  120. $cha = ($v['price'] - $member_price) * $v['num'];//差额
  121. $cha = bcadd(0, $cha, 2);
  122. $total_deduct_money = bcadd($total_deduct_money, $cha, 2);
  123. $total_deduct_goods_price = bcadd($total_deduct_goods_price, $cha, 2);
  124. $v['goods_price'] = bcsub($v['goods_price'], $cha, 2);
  125. $v['marketing']['member_price_deduct'] = $cha;
  126. $v['marketing']['pay_money'] = $v['goods_price'];
  127. }
  128. }
  129. }
  130. }
  131. $row['goods_price'] = bcsub($row['goods_price'], $cha, 2) ?? 0;
  132. }
  133. $total_deduct_money = bcadd(0, $total_deduct_money, 2);
  134. $item['mch_order_info']['goods_price'] = bcsub($item['mch_order_info']['goods_price'],$total_deduct_money,2);
  135. $form['group_order_goods'] = $group_order_goods;
  136. $form['total_pay_money'] = bcsub($form['total_pay_money'],$total_deduct_money,2);
  137. $prev_member_price = $form->marketing['deduct']['member_price']['money'] ?? 0;
  138. if ($total_deduct_money>0) $form->marketing['deduct']['member_price'] = ['name' => '会员优惠', 'money' => -bcsub($total_deduct_money, $prev_member_price, 2)];
  139. return $item;
  140. } catch (Exception $e) {
  141. self::setStaticError('会员价计算错误:' . $e->getMessage());
  142. return false;
  143. }
  144. }
  145. /**
  146. * @param $group_order_goods
  147. * @return array
  148. */
  149. public static function getGoodListArr($group_order_goods)
  150. {
  151. $gid_arr = [];
  152. array_map(function ($item) use (&$gid_arr) {
  153. array_map(function ($row) use (&$gid_arr) {
  154. $gid_arr[] = $row['goods_id'];
  155. }, $item['goods']);
  156. }, $group_order_goods);
  157. if (empty($gid_arr)) return [];
  158. $params = [
  159. 'where' => [['id' => $gid_arr]],
  160. 'with' => ['extra'],
  161. ];
  162. $goods_list = Goods::lists($params);
  163. $arr = [];
  164. array_map(function ($arg) use (&$arr) {
  165. $arr[$arg['id']] = $arg;
  166. }, $goods_list);
  167. return $arr;
  168. }
  169. }