[['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; } }