GoodsLogic.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. <?php
  2. namespace addons\Store\common\logic\goods;
  3. use addons\Store\common\models\StoreGoodsExtra;
  4. use common\enums\StatusEnum;
  5. use common\models\common\MallSetting;
  6. use common\models\user\UserLevel;
  7. use common\traits\ErrorTrait;
  8. class GoodsLogic
  9. {
  10. use ErrorTrait;
  11. /**
  12. * 获取会员当前等级及下级会员价
  13. * @Author: lun
  14. * @DateTime: 2022/1/13 0013 10:36
  15. * @Copyright: copyright (c) 2021 广东七件事集团
  16. * @param $mall_id
  17. * @param $code
  18. * @return array|bool
  19. */
  20. public static function getMemberPriceList($mallId,$goods,$user,$is_self = false)
  21. {
  22. $extra_params = ['where' => [['in', 'goods_id', $goods['id']]], 'select' => 'member_price_setting, is_member_price,goods_id', 'index' => 'goods_id'];
  23. $goods_extra = StoreGoodsExtra::lists($extra_params, true);
  24. $user_level = 0;
  25. if ($user) {
  26. $user_level = $user->level;
  27. }
  28. $level_where = ['mall_id' => $mallId, 'status' => StatusEnum::ENABLED];
  29. $query = UserLevel::find()->where($level_where);
  30. $wheres = $is_self ? "=" : "<=";
  31. if ($user_level > 0) $query->andWhere([$wheres,'level',$user_level]);
  32. $level_list = $query->select('name,discount,level')->orderBy('level desc')->asArray()->all();
  33. $member_price_list = [];
  34. if (!empty($goods_extra)) {
  35. foreach ($goods_extra as $v) {
  36. foreach($level_list as $level){
  37. if(isset($member_price_list[$level['level']])) continue;
  38. $member_price = $goods['price'];
  39. if($v['is_member_price'] == 0){
  40. $member_price = bcmul($goods['price'], $level['discount'] / 10, 2);
  41. }elseif($v['is_member_price'] == 1){
  42. $member_price_arr = json_decode($v['member_price_setting'], true) ?? [];
  43. if(empty($member_price_arr)) continue;
  44. if (!empty($goods['is_attr'])) {
  45. if (count($member_price_arr) > 1) {
  46. $member_arr = $member_price_arr['level' . $level['level']];
  47. if (isset($member_arr)) {
  48. $member_arr = array_values($member_arr);
  49. $member_price = $member_arr[0] ?? 0;
  50. }
  51. }
  52. }else{
  53. if (count($member_price_arr) > 1) {
  54. if(isset($member_price_arr[$level['level']])){
  55. $member_price = $member_price_arr[$level['level']];
  56. }
  57. } else {
  58. if (count($member_price_arr) == 1) $member_price = $member_price_arr[0];
  59. }
  60. }
  61. }
  62. $member_price_list[$level['level']] = [
  63. 'type' => 'member_price',
  64. 'level_name' => $level['name'],
  65. 'price'=> $member_price,
  66. ];
  67. }
  68. }
  69. }
  70. if($is_self){
  71. if(!empty($member_price_list[$user_level])){
  72. return $member_price_list[$user_level]['price'];
  73. }else{
  74. return $goods['price'];
  75. }
  76. }
  77. $member_price_list[0] = [
  78. 'type' => 'price',
  79. 'level_name' => MallSetting::getDefaultLevelName($mallId),
  80. 'price' => $goods['price'],
  81. ];
  82. $new_arr = [];
  83. foreach($member_price_list as $item){
  84. $new_arr[] = $item;
  85. }
  86. return $new_arr;
  87. }
  88. /**
  89. * @Description:
  90. * 1. 获取该会员等级的会员价
  91. * 2. 获取该会员等级指定显示的其他会员价
  92. * 3. 多规格商品显示第一个规格的会员价
  93. * @Author: zsan
  94. * @DateTime 2023-10-25 17:04:54
  95. * @param integer $mall_id
  96. * @param array $goods
  97. * @param array $user_level
  98. * @return array
  99. */
  100. public static function getSpecifiedLevelPrice($mall_id, $goods, $user_level)
  101. {
  102. $data = [
  103. 'levels_member_price' => []
  104. ];
  105. if(empty($user_level)) return $data;
  106. $extra = $goods['extra'];
  107. if($extra['is_member_price'] == 2) return $data;
  108. $specified_level = $user_level['specified_level'] ? json_decode($user_level['specified_level'], true) : [];
  109. $level = [$user_level['level']];
  110. if(!empty($specified_level)){
  111. $level = array_merge($specified_level, $level);
  112. }
  113. $level_list = UserLevel::lists([
  114. 'where' => [['mall_id' => $mall_id], ['status' => StatusEnum::ENABLED], ['level' => $level]],
  115. 'select' => 'id,level,name,discount',
  116. 'order' => 'level asc',
  117. ]);
  118. $member_price_setting = !empty($extra['member_price_setting']) ? json_decode($extra['member_price_setting'], true) : [];
  119. $your_member_price = [];
  120. if($extra['is_member_price'] == 0){
  121. //不参与会员折扣独立设置
  122. foreach($level_list as $lv){
  123. $member_price = bcmul($lv['discount'] / 10, $goods['price'], 2);
  124. if($lv['level'] == $user_level['level']){
  125. $your_member_price = [
  126. 'name' => $lv['name'],
  127. 'member_price' => $member_price,
  128. 'level' => $lv['level']
  129. ];;
  130. }else{
  131. $data['levels_member_price'][] = [
  132. 'name' => $lv['name'],
  133. 'member_price' => $member_price,
  134. 'level' => $lv['level']
  135. ];
  136. }
  137. }
  138. } elseif ($extra['is_member_price'] == 1){
  139. // 参与会员折扣独立设置
  140. foreach($level_list as $lv){
  141. if($goods['is_attr'] == 1){
  142. $level_set = $member_price_setting['level'.$lv['level']] ?? [];
  143. $level_set = array_values($level_set);
  144. sort($level_set);
  145. $member_price = $level_set[0] ?? 0;
  146. }else{
  147. $member_price = $member_price_setting[$lv['level']] ?? 0;
  148. }
  149. if($lv['level'] == $user_level['level']){
  150. $your_member_price = [
  151. 'name' => $lv['name'],
  152. 'member_price' => $member_price,
  153. 'level' => $lv['level']
  154. ];
  155. }else{
  156. $data['levels_member_price'][] = [
  157. 'name' => $lv['name'],
  158. 'member_price' => $member_price,
  159. 'level' => $lv['level']
  160. ];
  161. }
  162. }
  163. }
  164. array_unshift($data['levels_member_price'], $your_member_price);
  165. return $data;
  166. }
  167. }