| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- <?php
- namespace addons\Store\common\logic\goods;
- use addons\Store\common\models\StoreGoodsExtra;
- use common\enums\StatusEnum;
- use common\models\common\MallSetting;
- use common\models\user\UserLevel;
- use common\traits\ErrorTrait;
- class GoodsLogic
- {
- use ErrorTrait;
- /**
- * 获取会员当前等级及下级会员价
- * @Author: lun
- * @DateTime: 2022/1/13 0013 10:36
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @param $mall_id
- * @param $code
- * @return array|bool
- */
- public static function getMemberPriceList($mallId,$goods,$user,$is_self = false)
- {
- $extra_params = ['where' => [['in', 'goods_id', $goods['id']]], 'select' => 'member_price_setting, is_member_price,goods_id', 'index' => 'goods_id'];
- $goods_extra = StoreGoodsExtra::lists($extra_params, true);
- $user_level = 0;
- if ($user) {
- $user_level = $user->level;
- }
- $level_where = ['mall_id' => $mallId, 'status' => StatusEnum::ENABLED];
- $query = UserLevel::find()->where($level_where);
- $wheres = $is_self ? "=" : "<=";
- if ($user_level > 0) $query->andWhere([$wheres,'level',$user_level]);
- $level_list = $query->select('name,discount,level')->orderBy('level desc')->asArray()->all();
- $member_price_list = [];
- if (!empty($goods_extra)) {
- foreach ($goods_extra as $v) {
- foreach($level_list as $level){
- if(isset($member_price_list[$level['level']])) continue;
- $member_price = $goods['price'];
- if($v['is_member_price'] == 0){
- $member_price = bcmul($goods['price'], $level['discount'] / 10, 2);
- }elseif($v['is_member_price'] == 1){
- $member_price_arr = json_decode($v['member_price_setting'], true) ?? [];
- if(empty($member_price_arr)) continue;
- if (!empty($goods['is_attr'])) {
- if (count($member_price_arr) > 1) {
- $member_arr = $member_price_arr['level' . $level['level']];
- if (isset($member_arr)) {
- $member_arr = array_values($member_arr);
- $member_price = $member_arr[0] ?? 0;
- }
- }
- }else{
- if (count($member_price_arr) > 1) {
- if(isset($member_price_arr[$level['level']])){
- $member_price = $member_price_arr[$level['level']];
- }
- } else {
- if (count($member_price_arr) == 1) $member_price = $member_price_arr[0];
- }
- }
- }
- $member_price_list[$level['level']] = [
- 'type' => 'member_price',
- 'level_name' => $level['name'],
- 'price'=> $member_price,
- ];
- }
- }
- }
- if($is_self){
- if(!empty($member_price_list[$user_level])){
- return $member_price_list[$user_level]['price'];
- }else{
- return $goods['price'];
- }
- }
- $member_price_list[0] = [
- 'type' => 'price',
- 'level_name' => MallSetting::getDefaultLevelName($mallId),
- 'price' => $goods['price'],
- ];
- $new_arr = [];
- foreach($member_price_list as $item){
- $new_arr[] = $item;
- }
- return $new_arr;
- }
- /**
- * @Description:
- * 1. 获取该会员等级的会员价
- * 2. 获取该会员等级指定显示的其他会员价
- * 3. 多规格商品显示第一个规格的会员价
- * @Author: zsan
- * @DateTime 2023-10-25 17:04:54
- * @param integer $mall_id
- * @param array $goods
- * @param array $user_level
- * @return array
- */
- public static function getSpecifiedLevelPrice($mall_id, $goods, $user_level)
- {
- $data = [
- 'levels_member_price' => []
- ];
- if(empty($user_level)) return $data;
- $extra = $goods['extra'];
- if($extra['is_member_price'] == 2) return $data;
- $specified_level = $user_level['specified_level'] ? json_decode($user_level['specified_level'], true) : [];
- $level = [$user_level['level']];
- if(!empty($specified_level)){
- $level = array_merge($specified_level, $level);
- }
- $level_list = UserLevel::lists([
- 'where' => [['mall_id' => $mall_id], ['status' => StatusEnum::ENABLED], ['level' => $level]],
- 'select' => 'id,level,name,discount',
- 'order' => 'level asc',
- ]);
- $member_price_setting = !empty($extra['member_price_setting']) ? json_decode($extra['member_price_setting'], true) : [];
- $your_member_price = [];
- if($extra['is_member_price'] == 0){
- //不参与会员折扣独立设置
- foreach($level_list as $lv){
- $member_price = bcmul($lv['discount'] / 10, $goods['price'], 2);
- if($lv['level'] == $user_level['level']){
- $your_member_price = [
- 'name' => $lv['name'],
- 'member_price' => $member_price,
- 'level' => $lv['level']
- ];;
- }else{
- $data['levels_member_price'][] = [
- 'name' => $lv['name'],
- 'member_price' => $member_price,
- 'level' => $lv['level']
- ];
- }
- }
- } elseif ($extra['is_member_price'] == 1){
- // 参与会员折扣独立设置
- foreach($level_list as $lv){
- if($goods['is_attr'] == 1){
- $level_set = $member_price_setting['level'.$lv['level']] ?? [];
- $level_set = array_values($level_set);
- sort($level_set);
- $member_price = $level_set[0] ?? 0;
- }else{
- $member_price = $member_price_setting[$lv['level']] ?? 0;
- }
- if($lv['level'] == $user_level['level']){
- $your_member_price = [
- 'name' => $lv['name'],
- 'member_price' => $member_price,
- 'level' => $lv['level']
- ];
- }else{
- $data['levels_member_price'][] = [
- 'name' => $lv['name'],
- 'member_price' => $member_price,
- 'level' => $lv['level']
- ];
- }
- }
- }
- array_unshift($data['levels_member_price'], $your_member_price);
- return $data;
- }
- }
|