where(['store_id' => $user->store_id, 'status' => 1, 'is_delete' => 0, 'level' => $user->level])->andWhere(['>', 'discount', 0])->select('id')->one(); $open = true; //判断商品是否开启会员折扣,且用户是否为会员,且会员中的折扣存在 if ($user->level && !empty($level)) { $open = false; } //如果以上条件成立,则不使用满减折扣 if (isset($goods['full_minus']) && $open){ foreach ($goods['full_minus'] as $k => $v){ $full_minus_list = json_decode($goods['full_minus'][$k]['attr'], true); if (!$full_minus_list || count($full_minus_list) < 1) { continue; } foreach ($full_minus_list as $key => $value) { $attrIds = []; foreach ($full_minus_list[$key]['attr_list'] as $item) { $attrIds[] = $item['attr_id']; } sort($attrIds); sort($currentAttrIds); if (($number >= $goods['full_minus'][$k]['full_minus_num']) && (implode($attrIds) === implode($currentAttrIds)) && $full_minus_list[$key]['price']) { $full_minus_attrs = $full_minus_list[$key]; $current_batch_price_tips ='满'.$goods['full_minus'][$k]['full_minus_num'].$goods['unit'].', '. $full_minus_list[$key]['price'] .'元'; } if (($number <= $goods['full_minus'][$k]['full_minus_num']) && $is_true == 0 && (implode($attrIds) === implode($currentAttrIds)) && $full_minus_list[$key]['price']){ $is_true = 1; $batch_price_tips ='满'.$goods['full_minus'][$k]['full_minus_num'].$goods['unit'].', '. $full_minus_list[$key]['price'] .'元'; }elseif (($number > $goods['full_minus'][$k]['full_minus_num']) && (implode($attrIds) === implode($currentAttrIds)) && $full_minus_list[$key]['price']){ $batch_price_tips ='满'.$goods['full_minus'][$k]['full_minus_num'].$goods['unit'].', '. $full_minus_list[$key]['price'] .'元'; } } } } $attrs = Json::decode($goods['attr']); $level = self::currentLevelDiscount($user ? $user : null); foreach ($attrs as $attr) { $attrIds = []; foreach ($attr['attr_list'] as $item) { $attrIds[] = $item['attr_id']; } sort($attrIds); sort($currentAttrIds); // 找出当前规格信息 if (implode($attrIds) === implode($currentAttrIds)) { // 如果是收银台过来的订单 不再走满减活动!!!!因为收银台可以改商品价格 if (!(isset($otherData['form']) && $otherData['form'] == 'cashier') && $full_minus_attrs && $full_minus_attrs['price']){ $goods['price'] = $attr['price'] = $full_minus_attrs['price']; } // price 前端展示价格(该价格可以是 原价、会员价) $data['price'] = $goods['use_attr'] == 1 ? ($attr['price'] > 0 ? (isset($attr['group_price']) ? $attr['group_price'] : $attr['price']) : $goods['price']) : $goods['price'];//$goods['use_attr'] == 1 ? ($attr['price'] > 0 ? $attr['price'] : $goods['price']) : $goods['price']; $data['num'] = $attr['num']; if ($otherData['goods_id'] && $otherData['user_id']) { $goods_price_log = CashierGoodsPriceLog::find()->where(['goods_id' => $otherData['goods_id'], 'user_id' => $otherData['user_id'], 'md_id' => $goods['md_id'] ?: 0])->asArray()->all(); foreach ($goods_price_log as $price_log_item) { $price_attr = json_decode($price_log_item['attr'], true); $price_attr_id = array_column($price_attr['attr_list'], 'attr_id'); sort($price_attr_id); if (!array_diff($attrIds, $price_attr_id)) { $data['old_price'] = $price_log_item['price'] ?? '0.00'; } } } $data['supplier_id'] = isset($goods['supplier_id']) ? $goods['supplier_id'] : 0; $data['supplier_goods_id'] = isset($goods['supplier_goods_id']) ? $goods['supplier_goods_id'] : 0; $data['supplier_price'] = isset($attr['supplier_price']) ? ($attr['supplier_price'] > 0 ? $attr['supplier_price'] : (isset($goods['supplier_price']) ? $goods['supplier_price'] : 0)) : 0; $data['goods_price'] = $goods['use_attr'] == 1 ? ($attr['price'] > 0 ? (isset($attr['group_price']) ? $attr['group_price'] : $attr['price']) : $goods['price']) : $goods['price'];//$goods['use_attr'] == 1 ? ($attr['price'] > 0 ? $attr['price'] : $goods['price']) : $goods['price'];//商品售价 $data['attr_list'] = $attr['attr_list']; $data['pic'] = $attr['pic']; $data['no'] = $attr['no']; $data['share_commission_first'] = $attr['share_commission_first']; $data['share_commission_second'] = $attr['share_commission_second']; $data['share_commission_third'] = $attr['share_commission_third']; $data['is_member_price'] = false; $data['is_level'] = false; $data['next_level_price'] = $data['level_price'] = $goods['use_attr'] == 1 ? ($attr['price'] > 0 ? (isset($attr['group_price']) ? $attr['group_price'] : $attr['price']) : $goods['price']) : $goods['price'];//$goods['use_attr'] == 1 ? ($attr['price'] > 0 ? $attr['price'] : $goods['price']) : $goods['price'] ;//会员折扣价 $data['batch_price_tips'] = $batch_price_tips; $data['current_batch_price_tips'] = $current_batch_price_tips; // 用户等级 可以传入指定用户等级 $userLevel = $level['userLevel'] ? $level['userLevel'] : 0; $keyName = 'member' . $userLevel; $nextKeyName = 'member' . $level['userNextLevel']; // 为会员用户 会员价 > 0 并且商品开启了会员折扣 则显示会员价 if (isset($attr[$keyName]) && $attr[$keyName] > 0 && $goods['is_level'] && $level['userLevel'] >= 0) { $data['price'] = $attr[$keyName]; $data['is_member_price'] = true; $data['is_level'] = true; } //计算会员股东佣金方式 $level_price_arr = []; foreach ($level['level'] as $level_index => $level_) { $level_price_arr[$level_index] = $data['price']; if (isset($attr[$level_index]) && $attr[$level_index] > 0 && $goods['is_level']) { $level_price_arr[$level_index] = $attr[$level_index]; } elseif (isset($attr[$level_index]) && $attr[$level_index] <= 0 && $goods['is_level']) { $level_price_arr[$level_index] = (($data['price'] * $level_) / 10) >= 0.01 ? (($data['price'] * $level_) / 10) : 0.00; } elseif (1) { $level_price_arr[$level_index] = ($data['price'] * floatval($level_) / 10) >= 0.01 ? ($data['price'] * floatval($level_) / 10) : 0.00; } } $data['level_price_arr'] = $level_price_arr; if (isset($attr[$nextKeyName]) && $attr[$nextKeyName] > 0 && $goods['is_level']) { if (isset($attr[$nextKeyName])) { $data['next_price'] = $attr[$nextKeyName]; } } // \Yii::error([$attr, $keyName, $goods, $level]); // 为会员用户 开启了规格会员价、但没设置或者规格价等于0 则使用全局会员折扣 if (isset($attr[$keyName]) && $attr[$keyName] <= 0 && $level['userLevel'] >= 0) { // 如果算出的会员折扣价 < 0.01 那会员价就是0 $data['price'] = (($data['price'] * $level['discount']) / 10) >= 0.01 ? (($data['price'] * $level['discount']) / 10) : 0.00; $data['is_member_price'] = true; $data['is_level'] = true; } if (isset($attr[$keyName]) && $attr[$keyName] <= 0) { $data['next_price'] = (($data['price'] * $level['next_discount']) / 10) >= 0.01 ? (($data['price'] * $level['next_discount']) / 10) : 0.00; } // 商城开启了会员折扣 且是会员用户 if ($level['userLevel'] >= 0) { // 会员折扣价为 会员价 if ($data['is_member_price'] === true) { $data['level_price'] = $data['price']; $data['next_level_price'] = $data['next_price']; // $data['is_level'] = false; } else { // 会员折扣价 根据会员折扣计算而来 $data['level_price'] = ($data['price'] * floatval($level['discount']) / 10) >= 0.01 ? ($data['price'] * floatval($level['discount']) / 10) : 0.00; $data['next_level_price'] = ($data['price'] * floatval($level['next_discount']) / 10) >= 0.01 ? ($data['price'] * floatval($level['next_discount']) / 10) : 0.00; $data['is_level'] = true; } // TODO 特殊 拼团单买暂时不需要计算会员折扣 if (!empty($otherData['order_type']) && $otherData['order_type'] === 'ONLY_BUY') { $data['is_level'] = false; // TODO 以下两个字段会被覆盖,没什么作用 $data['goods_price'] = $attr['single'] > 0 ? $attr['single'] : $otherData['single_price']; $data['level_price'] = $data['single_price']; } } // 商城开启了会员折扣 且是普通用户 if ($level['userLevel'] === -1) { // 会员折扣价为 会员价 $data['level_price'] = $data['goods_price']; $data['next_level_price'] = $data['next_price']; $data['is_level'] = false; if (isset($otherData['order_type']) && $otherData['order_type'] === 'ONLY_BUY') { $data['is_level'] = false; $data['goods_price'] = $attr['single'] > 0 ? $attr['single'] : $otherData['single_price']; $data['level_price'] = $data['single_price']; $data['next_level_price'] = ($data['single_price'] * ($level['next_discount'] / 10)); } } $data['price'] = sprintf("%.2f", $data['price']) > 0 ? sprintf("%.2f", $data['price']) : $goods['price']; $data['level_price'] = sprintf("%.2f", $data['level_price']) > 0 ? sprintf("%.2f", $data['level_price']) : sprintf("%.2f", $data['price']); $data['next_level_price'] = sprintf("%.2f", $data['next_level_price']) > 0 ? sprintf("%.2f", $data['next_level_price']) : sprintf("%.2f", $data['price']); $food_ext_goods_price = 0; if($goods['food_ext_goods']){ $food_ext_goods = is_array($goods['food_ext_goods']) ? $goods['food_ext_goods'] : json_decode($goods['food_ext_goods'], true); foreach($food_ext_goods as $egitem){ $food_ext_goods_price += $egitem['price'] * $egitem['num']; } } $data['price'] += $food_ext_goods_price; $data['level_price'] += $food_ext_goods_price; $data['next_level_price'] += $food_ext_goods_price; return $data; } } } /** * 获取当前商品的最高分销价、及最低会员价(根据用户等级) * user_is_member 是否会员 * is_level 是否开启会员折扣 * is_share 是否开启分销 * min_member_price 最低会员价 * max_share_price 最高分销价 * @param $goods * @return array */ public static function getMMPrice(array $goods, $otherData = []) { $attrs = is_string($goods['attr']) && !empty($goods['attr']) ? Json::decode($goods['attr']) : []; $storeId = get_store_id(); $level = self::currentLevelDiscount(); $maxSharePriceArr = []; $minMemberPriceArr = []; $minNextMemberPriceArr = []; foreach ($attrs as $attr) { $price = $goods['use_attr'] == 1 ? ($attr['price'] > 0 ? $attr['price'] : $goods['price']) : $goods['price']; // 商品开启单独分销设置 (按一级分销佣金计算) if ((int)$goods['individual_share'] === 1) { // 普通设置 (单商品全局) if ((int)$goods['attr_setting_type'] === 0 && $goods['share_commission_first'] > 0) { // 分销普通设置 按百分比 if ((int)$goods['share_type'] === 0) { $maxSharePriceArr[] = ($goods['share_commission_first'] * $price) / 100; } // 分销普通设置 按固定金额 if ((int)$goods['share_type'] === 1) { $maxSharePriceArr[] = $goods['share_commission_first']; } } // 详细设置 (多规格分销价) if ((int)$goods['attr_setting_type'] === 1 && $attr['share_commission_first'] > 0) { if ((int)$goods['share_type'] === 0) { $maxSharePriceArr[] = ($attr['share_commission_first'] * $price) / 100; } if ((int)$goods['share_type'] === 1) { $maxSharePriceArr[] = $attr['share_commission_first']; } } } // 开启商品会员折扣 $data['user_is_member'] = false; if (1) { // 普通用户 (显示下一级会员价) if ($level['userLevel'] === -1) { $data['user_is_member'] = false; $keyName = 'member' . $level['list'][0]['level']; // 多规格会员价大于 > 0 则直接展示 if (isset($attr[$keyName]) && $attr[$keyName] > 0 && $goods['is_level']) { $minMemberPriceArr[] = $attr[$keyName]; } else { $minMemberPriceArr[] = ($price * $level['list'][0]['discount']) / 10; } } // 会员用户 (显示当前会员价) if ($level['userLevel'] >= 0) { $data['user_is_member'] = true; $keyName = 'member' . $level['userLevel']; // 多规格会员价大于 > 0 则直接展示 if (isset($attr[$keyName]) && $attr[$keyName] > 0 && $goods['is_level']) { $minMemberPriceArr[] = $attr[$keyName]; } else { $minMemberPriceArr[] = ($price * $level['discount']) / 10; } } $keyNextName = 'member' . $level['userNextLevel']; if (isset($attr[$keyNextName]) && $attr[$keyNextName] > 0) { $minNextMemberPriceArr[] = $attr[$keyNextName]; } else { $minNextMemberPriceArr[] = ($price * $level['next_discount']) / 10; } } // 未开启商品会员折扣 if (1) { // 显示最小规格价 $minMemberPriceArr[] = $price; } } $data['max_share_price'] = !empty($maxSharePriceArr) ? max($maxSharePriceArr) : 0; $data['min_member_price'] = !empty($minMemberPriceArr) ? min($minMemberPriceArr) : 0; $data['min_next_member_price'] = !empty($minNextMemberPriceArr) ? min($minNextMemberPriceArr) : 0; // 商品是否开启会员折扣 $data['is_level'] = false; if (1) { $data['is_level'] = true; } // 总商城分销 是否开启 $data['is_share'] = false; // 如果会员价 <= 0 则不显示 if (sprintf('%.2f', $data['min_member_price']) <= 0) { $data['is_level'] = false; } // 如果会员中心一个会员都没有,则不显示会员价 if (empty($level['list'])) { $data['is_level'] = false; } return $data; } /** * 获取当前会员折扣 */ private static function currentLevelDiscount($user = null) { $user = $user ? $user : get_user(); $userNextLevel = $userLevel = isset($user->level) ? $user->level : -1; $storeId = $user->store_id; $levelList = Level::find()->where(['store_id' => $storeId, 'is_delete' => 0, 'status' => Level::STATUS_TRUE]) ->select('id, level, name, discount, price') ->orderBy('level ASC') ->asArray()->all(); $currentLevelDiscount = 10; $next_currentLevelDiscount = 10; $is_discount = false; $level_ = []; foreach ($levelList as $level) { $level_['member' . $level['level']] = $level['discount']; } foreach ($levelList as $level) { if ((int)$level['level'] === $userLevel && !$is_discount) { $currentLevelDiscount = $level['discount']; $is_discount = true; continue; } if ((int)$level['level'] > $userLevel && $level['price'] > 0) { $userNextLevel = (int)$level['level']; $next_currentLevelDiscount = $level['discount']; break; } } return [ 'discount' => $currentLevelDiscount, 'next_discount' => $next_currentLevelDiscount, 'userLevel' => $userLevel, 'userNextLevel' => $userNextLevel, 'list' => $levelList, 'level' => $level_ ]; } public static function getMemberPrice(array $goods, $otherData = [], $user = null) { $attrs = json_decode($goods['attr'], true); $storeId = get_store_id(); $level = self::currentLevelDiscount($user); $use_attr = isset($goods['use_attr']) ? $goods['use_attr'] : 0; $minMemberPriceArr = []; foreach ((array)$attrs as $attr) { if ((bool)$use_attr) { $price = $attr['price'] > 0 ? $attr['price'] : $goods['price']; } else { $price = $goods['price']; } // 秒杀插件规格价字段有所不同 if ($otherData && $otherData['type'] === 'MIAOSHA') { $price = $attr['miaosha_price'] > 0 ? $attr['miaosha_price'] : $goods['price']; } // 开启商品会员折扣 $data['user_is_member'] = false; if (1) { // 普通用户 (显示下一级会员价) if ($level['userLevel'] === -1) { $data['user_is_member'] = false; $keyName = 'member' . $level['list'][0]['level']; // 多规格会员价大于 > 0 则直接展示 // if (isset($attr[$keyName])) { // if ($attr[$keyName] > 0) { // $minMemberPriceArr[] = $attr[$keyName]; // } // // 如果开启了会员折扣,但i设置的多规格会员价为0,则使用下一级全局会员折扣 // if ($attr[$keyName] <= 0) { // $minMemberPriceArr[] = ($price * $level['list'][0]['discount']) / 10; // } // } $minMemberPriceArr[] = sprintf("%.2f", $price); } // 会员用户 (显示当前会员价) if ($level['userLevel'] >= 0) { $data['user_is_member'] = true; $keyName = 'member' . $level['userLevel']; if (isset($attr[$keyName]) && $goods['is_level']) { // 多规格会员价大于 > 0 则直接展示 if ($attr[$keyName] > 0) { $minMemberPriceArr[] = $attr[$keyName]; } // 如果开启了会员折扣,但设置的多规格会员价为0,则使用全局会员折扣 if ($attr[$keyName] <= 0) { $minMemberPriceArr[] = ($price * $level['discount']) / 10; } } else { // 如果开启了会员折扣,但设置的多规格会员价为0,则使用全局会员折扣 $minMemberPriceArr[] = ($price * $level['discount']) / 10; } } } // 未开启商品会员折扣 if (1) { // 显示最小规格价 $minMemberPriceArr[] = $price; } } $data['min_member_price'] = !empty($minMemberPriceArr) ? min($minMemberPriceArr) : 0; // 商品是否开启会员折扣 $data['is_level'] = false; if (1) { $data['is_level'] = true; } // 如果会员价 <= 0 则不显示 if (sprintf('%.2f', $data['min_member_price']) <= 0) { $data['is_level'] = false; } // 如果会员中心一个会员都没有,则不显示会员价 if (empty($level['list'])) { $data['is_level'] = false; } return $data; } }