where(['mall_id' => $mallId, 'id' => $userId])->select('id, mall_id, level')->limit(1)->one(); if (!empty($user)) { //基础会员等级折扣 $user_level = UserLevel::findOne(['mall_id' => $mallId, 'level' => $user['level'], 'status' => StatusEnum::ENABLED]); } foreach ($list as $item) { switch ($item['identify']) { case 'order_broadcast': // 订单播报-获取最新的三十条数据 if (empty($item['params']['is_virtual'])) { $before_day = strtotime(date("Y-m-d", strtotime("-3 day"))); $broadcast_params = ['where' => [['=', 'mall_id', $mallId], ['=', 'pay_status', OrderStatusEnum::PAY], ['>=', 'pay_time', $before_day]], 'with' => 'base_user', 'select' => 'id,user_id,pay_time,created_at', 'order' => 'id desc', 'limit' => $item['limit'] ?? 20]; $orders = Order::lists($broadcast_params, true); foreach ($orders as $order) { $nickname = $order['base_user']['nickname']; $username = (mb_strlen($nickname) > 4) ? mb_substr($nickname, 0, 4) . '...' : $nickname; $data[$item['site']][] = [ 'avatar' => $order['base_user']['avatar_url'], 'time' => $time - $order['pay_time'], 'username' => $username, 'mobile' => substr_replace($order['base_user']['mobile'], '****', 3, 4), 'created_at' => $order['created_at'], ]; } } else { $data[$item['site']] = self::virtualOrderBroadcast($item['limit']); } break; case 'goods_cate': // 商品分类 // todo 千人千面功能后续再开发 $goods_cate_ids = GoodsCate::getAllCate($mallId, [$item['id']]); $goods_ids = GoodsCateRelate::find()->select('goods_id')->andWhere(['in', 'cate_id' ,$goods_cate_ids])->column(); $goods_where[] = ['=', 'mall_id', $mallId]; $goods_where[] = ['in', 'id', $goods_ids]; $goods_where[] = ['=', 'status', StatusEnum::ENABLED]; $goods_where[] = ['=', 'is_on_sale', StatusEnum::ENABLED]; $goods_select = 'id,mch_id,goods_name,subtitle,price,original_price,cover_pic,virtual_sales,sales_num,goods_type,goods_source'; $goods_params = array('where' => $goods_where, 'select' => $goods_select, 'order' => 'sort asc,id desc,created_at desc', 'page' => $item['page'] ?? 1, 'limit' => $item['limit'] ?? 20); $goods = Goods::lists($goods_params, true); foreach ($goods as &$good) { $good['sales_num'] += $good['virtual_sales']; unset($good['virtual_sales']); if (!empty($good['goods_source'])) { $t_class = "\\addons\\{$good['goods_source']}\\common\\service\\ShoppingCartService"; if (is_callable([$t_class, "getCanAddToCart"])) { $good = $t_class::getCanAddToCart($good, $mallId); } } } unset($good); $data[$item['site']] = self::getMemberPrice($mallId, $goods, 1, $userId); $data = GlobalInvoke::exec(GlobalInvoke::GOODS_LIST_EXTRA,$mallId,['mall_id'=>$mallId,'user_id'=>$userId,'type'=>'goods_cate','goods_list'=>$data]) ?: $data; $data_temp = $data; $result = []; if(isset($data_temp['goods_list'])) { foreach ($data_temp['goods_list'] as $v) { $result[] = $v; } $data = $result; } break; case 'store_goods_cate': // 商品分类 $goods_cate_ids = StoreGoodsCate::getAllCate($mallId, null, [$item['id']]); $goods_ids = StoreGoodsCateRelate::find()->select('goods_id')->andWhere(['in', 'cate_id' ,$goods_cate_ids])->column(); $goods_where[] = ['=', 'mall_id', $mallId]; $goods_where[] = ['in', 'id', $goods_ids]; $goods_where[] = ['=', 'status', StatusEnum::ENABLED]; $goods_where[] = ['=', 'is_on_sale', StatusEnum::ENABLED]; $goods_select = 'id,goods_name,subtitle,price,original_price,cover_pic,virtual_sales,sales_num,goods_type,goods_source'; $goods_params = array('where' => $goods_where, 'select' => $goods_select, 'order' => 'sort asc,id desc,created_at desc', 'page' => $item['page'] ?? 1, 'limit' => $item['limit'] ?? 20); $goods = StoreGoods::lists($goods_params, true); foreach ($goods as &$good) { $good['sales_num'] += $good['virtual_sales']; unset($good['virtual_sales']); if (!empty($good['goods_source'])) { $t_class = "\\addons\\{$good['goods_source']}\\common\\service\\ShoppingCartService"; if (is_callable([$t_class, "getCanAddToCart"])) { $good = $t_class::getCanAddToCart($good, $mallId); } } } unset($good); $data[$item['site']] = self::getStoreMemberPrice($mallId, $goods, 1, $userId); $data = GlobalInvoke::exec(GlobalInvoke::GOODS_LIST_EXTRA,$mallId,['mall_id'=>$mallId,'user_id'=>$userId,'type'=>'goods_cate','goods_list'=>$data]) ?: $data; $data_temp = $data; $result = []; if(isset($data_temp['goods_list'])) { foreach ($data_temp['goods_list'] as $v) { $result[] = $v; } $data = $result; } break; case 'goods_cate_page': // todo 千人千面功能后续再开发 $goods_cate_ids = GoodsCate::getAllCate($mallId, [$item['id']]); $goods_ids = GoodsCateRelate::find()->select('goods_id')->andWhere(['in', 'cate_id' ,$goods_cate_ids])->column(); $goods_where[] = ['=', 'mall_id', $mallId]; $goods_where[] = ['in', 'id', $goods_ids]; $goods_where[] = ['=', 'status', StatusEnum::ENABLED]; $goods_where[] = ['=', 'is_on_sale', StatusEnum::ENABLED]; $goods_select = 'id,mch_id,goods_name,subtitle,price,original_price,cover_pic,virtual_sales,sales_num,goods_type,goods_source'; $goods_params = array('where' => $goods_where, 'select' => $goods_select, 'order' => 'sort asc,id desc,created_at desc', 'page' => $item['page'] ?? 1, 'limit' => $item['limit'] > 0 ? $item['limit'] :20); $goods_list = Goods::listPage($goods_params, false); $goods = $goods_list['list']; if (!empty($goods)) { foreach ($goods as &$good) { $good['sales_num'] += $good['virtual_sales']; unset($good['virtual_sales']); if (!empty($good['goods_source'])) { $t_class = "\\addons\\{$good['goods_source']}\\common\\service\\ShoppingCartService"; if (is_callable([$t_class, "getCanAddToCart"])) { $good = $t_class::getCanAddToCart($good, $mallId); } } } unset($good); } $data[$item['site']] = self::getMemberPrice($mallId, $goods, 1, $userId); $data = GlobalInvoke::exec(GlobalInvoke::GOODS_LIST_EXTRA,$mallId,['mall_id'=>$mallId,'user_id'=>$userId,'type'=>'goods_cate','goods_list'=>$data]) ?: $data; $data_temp = $data; $goods_list['list'] = $data[0]; $result = []; if(isset($data_temp['goods_list'])) { // foreach ($data_temp['goods_list'] as $v) { // $result[] = $v; // } // $goods_list['list'] = $result; $goods_list['list'] = call_user_func_array('array_merge', $data_temp['goods_list']); } $data = $goods_list; break; case 'store_goods_cate_page': // todo 千人千面功能后续再开发 $goods_cate_ids = StoreGoodsCate::getAllCate($mallId, null, [$item['id']]); $goods_ids = StoreGoodsCateRelate::find()->select('goods_id')->andWhere(['in', 'cate_id' ,$goods_cate_ids])->column(); $goods_where[] = ['=', 'mall_id', $mallId]; $goods_where[] = ['in', 'id', $goods_ids]; $goods_where[] = ['=', 'status', StatusEnum::ENABLED]; $goods_where[] = ['=', 'is_on_sale', StatusEnum::ENABLED]; $goods_select = 'id,goods_name,subtitle,price,original_price,cover_pic,virtual_sales,sales_num,goods_type,goods_source'; $goods_params = array('where' => $goods_where, 'select' => $goods_select, 'order' => 'sort asc,id desc,created_at desc', 'page' => $item['page'] ?? 1, 'limit' => $item['limit'] > 0 ? $item['limit'] :20); $goods_list = StoreGoods::listPage($goods_params, false); $goods = $goods_list['list']; if (!empty($goods)) { foreach ($goods as &$good) { $good['sales_num'] += $good['virtual_sales']; unset($good['virtual_sales']); if (!empty($good['goods_source'])) { $t_class = "\\addons\\{$good['goods_source']}\\common\\service\\ShoppingCartService"; if (is_callable([$t_class, "getCanAddToCart"])) { $good = $t_class::getCanAddToCart($good, $mallId); } } } unset($good); } $data[$item['site']] = self::getStoreMemberPrice($mallId, $goods, 1, $userId); $data = GlobalInvoke::exec(GlobalInvoke::GOODS_LIST_EXTRA,$mallId,['mall_id'=>$mallId,'user_id'=>$userId,'type'=>'goods_cate','goods_list'=>$data]) ?: $data; $data_temp = $data; $goods_list['list'] = $data[0]; $result = []; if(isset($data_temp['goods_list'])) { foreach ($data_temp['goods_list'] as $v) { $result[] = $v; } $goods_list['list'] = $result; } $data = $goods_list; break; case 'goods': // 商品 $goods_params = ['where' => [['=', 'mall_id', $mallId], ['in', 'id', Json::decode($item['id'], true)], ['=', 'status', StatusEnum::ENABLED], ['=', 'is_on_sale', StatusEnum::ENABLED]], 'select' => 'id,goods_name,subtitle,price,original_price,cover_pic,(sales_num+virtual_sales) as sales_num,is_attr, goods_type,goods_source', 'index' => 'id']; if ($item['limit']) { $goods_params['page'] = $item['page'] ?? 1; $page_data = Goods::listPage($goods_params, false, true); $data = $page_data['list']; } else { $data = Goods::lists($goods_params, true); } if(isset($item['addonsFields'])){ $data = Goods::getAddonsGoodsSetting($mallId, $item['addonsFields'], $data, 'list'); } if($user_level && !empty($user_level['member_price_is_show'])){ foreach($data as &$good){ $good['member_price_is_show'] = 0; $good['member_price_info'] = []; // $item['price'] = GoodsLogic::getMemberPriceList($mallId,$item,$user,true); $good['member_price'] = GoodsLogic::getMemberPriceList($mallId,$good,$user,true); } unset($good); }else{ $data = self::getMemberPrice($mallId, $data, 0, $userId); } $data = GlobalInvoke::exec(GlobalInvoke::GOODS_LIST_EXTRA,$mallId,['mall_id'=>$mallId,'user_id'=>$userId,'type'=>'goods','goods_list'=>$data]) ?: $data; $data_temp = $data; $result = []; if(isset($data_temp['goods_list'])){ foreach ($data_temp['goods_list'] as $v){ if (!empty($v['goods_source'])) { $t_class = "\\addons\\{$v['goods_source']}\\common\\service\\ShoppingCartService"; if (is_callable([$t_class, "getCanAddToCart"])) { $v = $t_class::getCanAddToCart($v, $mallId); } } $result[$v['id']] = $v; } $data = $result; } else { foreach ($data as &$good) { unset($good['virtual_sales']); if (!empty($good['goods_source'])) { $t_class = "\\addons\\{$good['goods_source']}\\common\\service\\ShoppingCartService"; if (is_callable([$t_class, "getCanAddToCart"])) { $good = $t_class::getCanAddToCart($good, $mallId); } } } } if (!empty($item['page']) && !empty($item['limit'])) { $page_data['list'] = array_values($data); $data = $page_data; } break; case 'course': // 课程 $course_params = ['where' => [['=', 'mall_id', $mallId], ['=', 'status', StatusEnum::ENABLED]], 'select' => 'id,mall_id,cat_id as cate_id,name,cat_id,sell_type,price,line_off_price,sales,logo,is_open_vm,vm_likes,vm_shares,vm_views,likes,shares,views,comments,status,created_at,introduce', 'index' => 'id']; $data = AddonsCourse::lists($course_params, true); break; case 'operating_note': // 运营笔记 $params = ['where' => [['=', 'mall_id', $mallId], ['in', 'id', Json::decode($item['id'], true)], ['=', 'status', StatusEnum::ENABLED]], 'select' => 'title,cover_img,views_num,likes_num,created_at,content_href,note_type,id,virtual_likes_num,virtual_views_num', 'order' => 'id desc']; $data = AddonsOperatingNoteContent::lists($params, true); break; case 'goods_strategy': $params = ['strategy' => $item['strategy'], 'displayNumber' => $item['displayNumber']]; $data = GoodsDecorationTemplate::getGoodsListByStrategy($mallId, $params); break; case 'store_cate_recommend': // 商品分类 // $where = [ // 'mall_id' => $mallId, // 'status' => StatusEnum::ENABLED, // 'is_recommend' => 1, // 'is_on_sale' => StatusEnum::ENABLED, // ]; $goods_ids = []; if (empty($item['cate_id']) && empty($item['id'])) { //没有分类id则返回空 return ['list' => [], 'count' => 0, 'page' => 1, 'limit' => $data['limit']]; } if (!empty($item['id']) && empty($item['cate_id'])) { // 判断是否是全部分类 $item['cate_id'] = StoreGoodsCate::getStoreGoodsAllCate($mallId, $item['id']); } //根据所有一级分类,获取所有分类 $goods_cate_ids = StoreGoodsCate::getAllCate($mallId, null, $item['cate_id']); $goods_ids = StoreGoodsCateRelate::find()->select('goods_id')->andWhere(['in', 'cate_id' ,$goods_cate_ids])->column(); //获取对应分类的商品id if (!empty($goods_ids)) { $item['id'] = $goods_ids; } else { //无数据则返回空 return ['list' => [], 'count' => 0, 'page' => 1, 'limit' => $data['limit']]; } $item['is_recommend'] = 1; // if (!empty($item['id'])) { //单选分类 // $where = [['c_id' => $item['id']]]; // } // unset($item['id']); // if (!empty($item['keyword'])) { // $where['keyword'] = trim($item['keyword']); // } // $params = [ // 'where' => $where, // 'select' => 'id,store_id,goods_name,price,original_price,cover_pic,(virtual_sales+sales_num) as sales_num, show_style,goods_type', // 'order' => 'sort asc', // 'limit' => $item['limit'] ?? 10, // 'page' => $item['page'] ?? 10, // ]; // $goods = StoreGoods::listPage($params, false); $goods = self::storeGoodsSqlCombination($mallId, $item); if (!empty($goods['list'])) { $goods['list'] = self::getStoreMemberPrice($mallId, $goods['list'], 1, $userId); // $goods = array_column($goods, null, 'id'); foreach ($goods['list'] as &$val) { $val['discount'] = bcsub($val['original_price'], $val['price'], 2); if ($val['discount'] < 0) $val['discount'] = 0; } } $data = $goods; break; case 'store-commodity-cate'://o2o门店商品组--选择分类 $goods_ids = []; if (empty($item['cate_id'])) { //没有分类id则返回空 return ['list' => [], 'count' => 0, 'page' => 1, 'limit' => $data['limit']]; } unset($item['id']); //根据所有一级分类,获取所有分类 $goods_cate_ids = StoreGoodsCate::getAllCate($mallId, null, $item['cate_id']); $goods_ids = StoreGoodsCateRelate::find()->select('goods_id')->andWhere(['in', 'cate_id' ,$goods_cate_ids])->column(); //获取对应分类的商品id if (!empty($goods_ids)) { $item['id'] = $goods_ids; } else { //无数据则返回空 return ['list' => [], 'count' => 0, 'page' => 1, 'limit' => $data['limit']]; } //获取商品数据 $goods = self::storeGoodsSqlCombination($mallId, $item); if (!empty($goods['list'])) { $goods['list'] = self::getStoreMemberPrice($mallId, $goods['list'], 1, $userId); // $goods = array_column($goods, null, 'id'); foreach ($goods['list'] as &$val) { $val['discount'] = bcsub($val['original_price'], $val['price'], 2); if ($val['discount'] < 0) $val['discount'] = 0; } } $data = $goods; break; case 'best-sellers': // 商品 $goods_ids = Json::decode($item['id'], true); $goods_params = [ 'alias' => 'sg', 'where' => [ ['sg.mall_id' => $mallId], ['sg.is_recommend' => 1], ['sg.id' => $goods_ids], ['sg.status' => StatusEnum::ENABLED], ['sg.is_on_sale' => StatusEnum::ENABLED] ], 'select' => 'sg.id,sg.store_id,sg.goods_name,sg.subtitle,sg.price,sg.original_price,sg.cover_pic,(sg.sales_num+sg.virtual_sales) as sales_num,sg.show_style,sg.goods_type', ]; // $item['is_recommend'] = 1; // $list = self::storeGoodsSqlCombination($mallId, $item); // $data = $list['list']; $data = StoreGoods::lists($goods_params, true); $data = array_column($data, null, 'id'); foreach ($data as &$val) { $val['discount'] = bcsub($val['original_price'], $val['price'], 2); if ($val['discount'] < 0) $val['discount'] = 0; } if($user_level && !empty($user_level['member_price_is_show'])){ foreach($data as &$item){ $item['member_price_is_show'] = 0; $item['member_price_info'] = []; $item['price'] = GoodsLogic::getMemberPriceList($mallId,$item,$user,true); $item['member_price'] = $item['price']; } unset($item); }else{ $data = self::getMemberPrice($mallId, $data, 0, $userId); } break; case 'store-goods': // o2o商品组 // $goods_params = [ // 'where' => [ // ['=', 'mall_id', $mallId], // ['in', 'id', Json::decode($item['id'], true)], // ['=', 'status', StatusEnum::ENABLED], // ['=', 'is_on_sale', StatusEnum::ENABLED] // ], // 'select' => 'id,goods_name,subtitle,price,original_price,cover_pic,(sales_num+virtual_sales) as sales_num,is_attr, goods_type,goods_source', // 'index' => 'id' // ]; if (empty($item['id'])) { return []; } $list = self::storeGoodsSqlCombination($mallId, $item); $data = $list['list']; // $data = StoreGoods::lists($goods_params, true); // print_r($data);exit; // $data = array_column($data, null, 'id'); foreach ($data as &$val) { $val['discount'] = bcsub($val['original_price'], $val['price'], 2); if ($val['discount'] < 0) $val['discount'] = 0; } if($user_level && !empty($user_level['member_price_is_show'])){ foreach($data as &$good){ $good['member_price_is_show'] = 0; $good['member_price_info'] = []; // $good['price'] = \addons\Store\common\logic\goods\GoodsLogic::getMemberPriceList($mallId,$good,$user,true); $good['member_price'] = \addons\Store\common\logic\goods\GoodsLogic::getMemberPriceList($mallId,$good,$user,true); } unset($good); }else{ $data = self::getStoreMemberPrice($mallId, $data, 1, $userId); } // 使用前端传输的ID排序重组 if (empty($item['sort_type'])) { $tmp = []; foreach (Json::decode($item['id']) ?? [] as $id) { $tmp[$id] = ArrayHelper::find($data, function ($i) use ($id) { return $i['id'] == $id; }); } $data = $tmp; } // 这里注释的代码先不删 // $count = count($data); // $keys = range($count, 1); // $data = array_combine($keys, $data); break; case 'location_goods': $data = CommunityGoods::getComponentData($item, $mallId); if($user_level && !empty($user_level['member_price_is_show'])){ foreach($data as &$item){ $item['member_price_is_show'] = 0; $item['member_price_info'] = []; $item['price'] = GoodsLogic::getMemberPriceList($mallId,$item,$user,true); $item['member_price'] = $item['price']; } unset($item); }else{ $data = self::getMemberPrice($mallId, $data, 0, $userId); } $type = $item['type'] ?? 'goods'; if($type == 'goods_cate'){ $initData = array_values($data); $data = []; $data[] = $initData; } break; case 'reserve_location_goods': $data = Goods::getComponentData($item, $mallId); if($user_level && !empty($user_level['member_price_is_show'])){ foreach($data as &$item){ $item['member_price_is_show'] = 0; $item['member_price_info'] = []; $item['price'] = GoodsLogic::getMemberPriceList($mallId,$item,$user,true); $item['member_price'] = $item['price']; } unset($item); }else{ $data = self::getMemberPrice($mallId, $data, 0, $userId); } $type = $item['type'] ?? 'goods'; if($type == 'goods_cate'){ $initData = array_values($data); $data = []; $data[] = $initData; } break; case 'store_coupons': //o2o优惠券 $store_coupon_ids = $item['id']; $data = StoreCoupon::lists([ 'where' => [ ['id' => $store_coupon_ids], ['mall_id' => $mallId], ['status' => StatusEnum::ENABLED], ['coupon_status' => CouponEnum::STATUS_RECEIVING] ], 'select' => 'id,name,type', 'index' => 'id' ], true); break; case 'score_game_secondary_card': if (!MallAddons::isInstall($mallId, AddonsEnum::ADDONS_SCORE_GAME)) { return ['list' => [], 'count' => 0, 'page' => 1, 'limit' => $data['limit']]; } $item['is_sell'] = 1; $card_list = (new \addons\ScoreGame\common\service\SecondaryCardService(['mall_id' => $mallId]))->getCardList($item); $data = $card_list; break; default: break; } } // 仅返回非空数据 return array_filter($data, function ($item) { return !empty($item); }); } public static function getMemberPrice($mallId, $data, $from = 0, $user_id = 0) { $goods_id = $from == 0 ? array_keys($data) : array_column($data, 'id'); $extra_params = ['where' => [['in', 'goods_id', $goods_id]], 'select' => 'is_show_price, member_price_setting, is_member_price,goods_id', 'index' => 'goods_id']; $goods_extra = GoodsExtra::lists($extra_params, true); $level = 0; if ($user_id) { $user = User::find()->where(['mall_id' => $mallId, 'id' => $user_id])->select('id, mall_id, level')->limit(1)->one(); $level = (!$user || $user->level == 0) ? $level : $user->level; } $level_where = ['mall_id' => $mallId, 'status' => StatusEnum::ENABLED]; if ($level > 0) $level_where['level'] = $level; $user_level = UserLevel::find()->where($level_where)->select('discount, level, mall_id, status')->orderBy('level ASC')->limit(1)->one(); if (!empty($goods_extra)) { // is_member_price: 是否参与会员价[0不参与会员折扣独立设置, 1参与会员折扣独立设置, 2不参与会员折扣] foreach ($goods_extra as &$v) { switch ($v['is_member_price']) { case 0: $v['member_price_setting'] = [$user_level ? $user_level->discount : 0]; break; case 1: $v['member_price_setting'] = json_decode($v['member_price_setting'], true) ?? []; break; default: $v['member_price_setting'] = [0]; break; } } unset($v); } foreach ($data as &$value) { $value['member_price_is_show'] = 0; $value['member_price_info'] = []; if (!isset($goods_extra[$value['id']])) { $value['member_price'] = 0; continue; } $is_member_price = $goods_extra[$value['id']]['is_member_price'] ?? 0; if ($is_member_price == 0) { $value['member_price'] = bcmul($value['price'], $goods_extra[$value['id']]['member_price_setting'][0] / 10, 2); continue; } $member_price = 0; if ($is_member_price == 1) { $member_price_arr = $goods_extra[$value['id']]['member_price_setting']; $level_where = ['mall_id' => $mallId, 'status' => StatusEnum::ENABLED]; $lowest_level = UserLevel::find()->where($level_where)->select('discount, level, mall_id, status')->orderBy('level ASC')->limit(1)->one(); if (!empty($value['is_attr'])) { if (count($member_price_arr) > 1) { $temp_level = $user_level ? $user_level->level : 0; // 有等级显示该等级的价格,否则显示第一个等级的 $member_arr = $member_price_arr['level' . ($temp_level == 0 ? $lowest_level->level : $temp_level)]; if (!empty($member_arr)) { // 增加排序 默认取最低的会员价 asort($member_arr); $member_arr = array_values($member_arr); $member_price = $member_arr[0] ?? 0; } } }else{ if (count($member_price_arr) > 1) { $key_first = array_key_first($member_price_arr); if (strpos($key_first, 'level') !== false) {// 判断是单规格还是多规格设置 // 多规格商品处理 $member_prices = $level > 0 ? $member_price_arr['level'.$level] : $member_price_arr['level'.$lowest_level->level]; $member_price = is_array($member_prices) ? current($member_prices) : 0;// 多规格默认获取第一个 } else { // 单规格商品处理 $member_price = $level > 0 ? $member_price_arr[$level] : $member_price_arr[$lowest_level->level]; } } else { $key_first = array_key_first($member_price_arr);// 获取第一个key if (count($member_price_arr) == 1) $member_price = $member_price_arr[$key_first]; if (count($member_price_arr) < 1) $member_price = 0; } } $value['member_price'] = $member_price; continue; } if ($is_member_price == 2) { $value['member_price'] = $value['price']; continue; } } unset($value); return $data; } public static function getStoreMemberPrice($mallId, $data, $from = 0, $user_id = 0) { $goods_id = $from == 0 ? array_keys($data) : array_column($data, 'id'); $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); $level = 0; if ($user_id) { $user = User::find()->where(['mall_id' => $mallId, 'id' => $user_id])->select('id, mall_id, level')->limit(1)->one(); $level = (!$user || $user->level == 0) ? $level : $user->level; } $level_where = ['mall_id' => $mallId, 'status' => StatusEnum::ENABLED]; if ($level > 0) $level_where['level'] = $level; $user_level = UserLevel::find()->where($level_where)->select('discount, level, mall_id, status')->orderBy('level ASC')->limit(1)->one(); if (!empty($goods_extra)) { // is_member_price: 是否参与会员价[0不参与会员折扣独立设置, 1参与会员折扣独立设置, 2不参与会员折扣] foreach ($goods_extra as &$v) { switch ($v['is_member_price']) { case 0: $v['member_price_setting'] = [$user_level ? $user_level->discount : 0]; break; case 1: $v['member_price_setting'] = json_decode($v['member_price_setting'], true) ?? []; break; default: $v['member_price_setting'] = [0]; break; } } unset($v); } foreach ($data as &$value) { $value['member_price_is_show'] = 0; $value['member_price_info'] = []; if (!isset($goods_extra[$value['id']])) { $value['member_price'] = 0; continue; } $is_member_price = $goods_extra[$value['id']]['is_member_price'] ?? 0; if ($is_member_price == 0) { $value['member_price'] = bcmul($value['price'], $goods_extra[$value['id']]['member_price_setting'][0] / 10, 2); continue; } $member_price = 0; if ($is_member_price == 1) { $member_price_arr = $goods_extra[$value['id']]['member_price_setting']; $level_where = ['mall_id' => $mallId, 'status' => StatusEnum::ENABLED]; $lowest_level = UserLevel::find()->where($level_where)->select('discount, level, mall_id, status')->orderBy('level ASC')->limit(1)->one(); if (!empty($value['is_attr'])) { if (count($member_price_arr) > 1) { $temp_level = $user_level ? $user_level->level : 0; // 有等级显示该等级的价格,否则显示第一个等级的 $member_arr = $member_price_arr['level' . ($temp_level == 0 ? $lowest_level->level : $temp_level)]; if (!empty($member_arr)) { // 增加排序 默认取最低的会员价 asort($member_arr); $member_arr = array_values($member_arr); $member_price = $member_arr[0] ?? 0; } } }else{ if (count($member_price_arr) > 1) { $key_first = array_key_first($member_price_arr); if (strpos($key_first, 'level') !== false) {// 判断是单规格还是多规格设置 // 多规格商品处理 $member_prices = $level > 0 ? $member_price_arr['level'.$level] : $member_price_arr['level'.$lowest_level->level]; $member_price = is_array($member_prices) ? current($member_prices) : 0;// 多规格默认获取第一个 } else { // 单规格商品处理 $member_price = $level > 0 ? $member_price_arr[$level] : $member_price_arr[$lowest_level->level]; } } else { $key_first = array_key_first($member_price_arr);// 获取第一个key if (count($member_price_arr) == 1) $member_price = $member_price_arr[$key_first]; if (count($member_price_arr) < 1) $member_price = 0; } } $value['member_price'] = $member_price; continue; } if ($is_member_price == 2) { $value['member_price'] = $value['price']; continue; } } unset($value); return $data; } /** * 虚拟订单播报数据 * @Author: lun * @DateTime: 2021/11/29 0029 17:04 * @Copyright: copyright (c) 2021 广东七件事集团 */ private static function virtualOrderBroadcast($limit = 50) { $mobile_prefix = ['130', '150', '133', '173', '177', '135', '138', '139', '180', '159']; $data = []; $time = time(); for ($i = 0; $i < $limit; $i++) { $data[] = [ 'avatar' => Yii::$app->request->hostInfo . '/resources/img/def-virtual-avatar/' . rand(1, 500) . '.png', 'time' => rand(1, 900), 'username' => StringHelper::randName(), 'mobile' => $mobile_prefix[rand(0, 9)] . '****' . rand(1000, 9999), 'create_at' => $time - rand(1, 900) * 60, ]; } return $data; } //获取o2o门店商品数据--sql语句拼接 public static function storeGoodsSqlCombination($mallId, $data) { $status = StatusEnum::ENABLED; try { $where = "(sg.`mall_id` = {$mallId}) AND (sg.`status` = {$status}) AND (sg.`is_on_sale` = {$status}) AND (sg.`check_status` = {$status})"; $page = $data['page'] ? $data['page'] : 1; if (!empty($data['is_recommend'])) $where .= " AND (sg.`is_recommend` = {$data['is_recommend']})"; if (!empty($data['id'])) { //拼接商品id if (is_string($data['id'])) $data['id'] = json_decode($data['id'],true); if (is_array($data['id']) && count($data['id']) >= 1) { $ids = implode(',', $data['id']); $where .= " AND sg.`id` in ({$ids})"; } else { throw new \Exception('商品id非数组'); } } if (!empty($data['keyword'])) { $where .= " AND (sg.`goods_name` like '%" .$data['keyword']. "%')"; } if (isset($data['store_ids']) && is_array($data['store_ids'])) { if (!empty($data['store_ids'])) { $store_ids_str = implode(',', $data['store_ids']); $where .= " AND sg.store_id in ({$store_ids_str})"; } else { throw new \Exception('无店铺id'); } } $select = "DISTINCT sg.id,sg.store_id,sg.goods_name,sg.subtitle,sg.price,sg.original_price,sg.cover_pic,(sg.sales_num+sg.virtual_sales) as sales_num,sg.is_attr,sg.show_style,sg.goods_type,sg.goods_source,st.latitude,st.longitude,sc.num as comment_num"; $orderBy = ''; //根据经纬数据获取商铺距离 if (!empty($data['longitude']) && !empty($data['latitude'])) { $select .= ",round( 2 * 6378.137 * ASIN( SQRT( POW( SIN( PI() * ({$data['longitude']} - st.longitude) / 360 ), 2 ) + COS(PI() * {$data['latitude']} / 180) * COS(st.latitude * PI() / 180) * POW( SIN( PI() * ({$data['latitude']} - st.latitude) / 360 ), 2 ) ) ) ,1) AS distance"; $orderBy = 'distance asc'; } //拼接排序语句 if (!empty($data['sort'])) { switch ($data['sort']) { case 'price': $data['sort_type'] = $data['sort_type']?$data['sort_type']:'asc'; $orderBy = "sg.". $data['sort']. ' '. $data['sort_type']; break; case 'sales_num': $data['sort_type'] = $data['sort_type']?$data['sort_type']:'desc'; $orderBy = $data['sort']. ' '. $data['sort_type']; break; case 'distance': $data['sort_type'] = $data['sort_type']?$data['sort_type']:'asc'; $orderBy = $data['sort']. ' '. $data['sort_type']; break; case 'comment_num': $data['sort_type'] = $data['sort_type']?$data['sort_type']:'desc'; $orderBy = $data['sort']. ' '. $data['sort_type']; break; } } $orderBy .= ",sg.sort desc,sg.id desc"; $orderBy = ltrim($orderBy, ','); $sql = "SELECT ".$select. " FROM `qimall_addons_store_goods` as sg"; $sql .= " LEFT JOIN `qimall_addons_store` as st on sg.store_id = st.id"; $sql .= " LEFT JOIN `qimall_order_comments_extra` as sc on sg.store_id = sc.store_id AND sg.id = sc.goods_id"; $sql .= " WHERE " . $where; $sql .= " ORDER BY ". $orderBy; $count = \Yii::$app->db->createCommand($sql)->execute(); $sql .= " LIMIT " . ($page - 1) * $data['limit'] . ",{$data['limit']}"; $list = \Yii::$app->db->createCommand($sql)->queryAll(); return ['list' => $list, 'count' => $count, 'page' => $page, 'limit' => $data['limit']]; } catch (\Exception $e) { // print_r($e->getMessage());exit; return ['list' => [], 'count' => 0, 'page' => $page, 'limit' => $data['limit']]; } } }