request->get('goods_id',0); $store_id = Yii::$app->request->get('store_id',0); $latitude_b = Yii::$app->request->get('latitude',23.219761); $longitude_b = Yii::$app->request->get('longitude',113.305405); $mall_id = $this->mall_id; try { $select = 'id,is_on_sale,goods_name,price,original_price,unit,attr_groups_format,attr_groups,area_limit,is_attr,is_show_stock,video_url, stock,video_cover_pic,cover_pic,bannar_pic,sales_num,virtual_sales,is_show_sales,detail,services,status,goods_source,freight_type,show_style,package_data,subtitle, goods_type'; $user_id = $this->user_id?? 0; $user = $this->user ?? []; $params['mall_id'] = $mall_id; $params['where'] = [['id' => $goods_id], ['mall_id' => $mall_id],['store_id'=>$store_id],['check_status'=>1],['is_on_sale'=>1],['status'=>StatusEnum::ENABLED]]; $params['is_array'] = true; $params['with'] = [ 'attr' => function ($query) { $query->orderBy('price asc')->select('id,goods_id,goods_no,name,original_price,pic_url,price,sign_id,sort,status,version,weight,stock'); },'extra', 'reserve' => function ($query) { $query->select('id,goods_id,original_price,price,ordering_information,information_detail,reserve_type,service_type,reserve_max_buy'); //reserve_type 0 项目预约 //reserve_type 1 技师预约 }, 'reserve.skus' => function ($query) { $query->orderBy('price asc')->select('id,goods_id,name,sign_id,original_price,price,pic_url,reserve_date,reserve_time_range_type,reserve_max_buy,service_min'); }, ]; $params['order'] = false; $params['select'] = $select; $goods = StoreGoods::getGoodsDetail($params); if (empty($goods)) throw new Exception("商品不存在"); foreach ($goods['attr'] as $k => &$item) { $item['is_show'] = StatusEnum::ENABLED; if ($goods['show_style'] == 2) $goods['attr'][$k]['name'] = str_replace('套餐:','', $goods['attr'][$k]['name']); if($k == 0){ $goods['attr_id'] = $item['id']; $goods['price'] = $item['price']; $goods['original_price'] = $item['original_price']; break; } } if(!empty($goods['is_attr'])) $goods['stock'] = array_sum(array_column($goods['attr'],'stock'));//多规格,按规格库存累计 $member_price_info = DiyComponentsData::getStoreMemberPrice($mall_id, [$goods], 1, $user_id ?? 0); $goods['member_price'] = $member_price_info[0]['member_price']; $goods['is_show_member_price'] = 0; $goods['is_show_price'] = $goods['extra']['is_show_price']; $goods['member_price_switch'] = $goods['extra']['member_price_switch']; $diy_page = DiyPage::getOne([['mall_id' => $mall_id], ['template' => DiyEnum::GOODS_DETAIL], ['status' => StatusEnum::ENABLED]], true, [], '', 'id,title,content'); $goods['is_member_price_check'] = 0; if($diy_page){ $diy_page_content = json_decode($diy_page['content'], true); $func_list_item = []; foreach($diy_page_content as $v){ if($v['funcListItem']['type'] == 'goods-info'){ $func_list_item = $v['data']['goodsData'] ?? []; break; } } if($func_list_item){ if(isset($func_list_item['checkList'])) { in_array('memberPrice', $func_list_item['checkList']) && $goods['is_member_price_check'] = 1; } } } if (($goods['member_price_switch'] == 0 && $goods['is_member_price_check'] == 1) || ($goods['member_price_switch'] == 1 && $goods['is_show_price'] == 1)) { $goods['is_show_member_price'] = 1; } $goods['member_price_is_show'] = 0; $goods['member_price_info'] = []; $goods['is_specified_level'] = 0; $goods['specified_level_price'] = []; $goods['is_bind_popups'] = UserPartitionRelationship::getIsNeedPopups($this->mall_id, $this->user_id ?? 0); if (!empty($user)) { //基础会员等级折扣 $user_level = UserLevel::findOne(['mall_id' => $mall_id, 'level' => $user['level'], 'status' => StatusEnum::ENABLED]); //额外会员设置 if($user_level && !empty($user_level['member_price_is_show'])){ $goods['member_price_is_show'] = $user_level['member_price_is_show']; $goods['member_price_info'] = StoreGoodsLogic::getMemberPriceList($mall_id,$goods,$user); } if($user_level && !empty($user_level['is_specified_level'])){ $goods['is_specified_level'] = $user_level['is_specified_level']; $goods['specified_level_price'] = StoreGoodsLogic::getSpecifiedLevelPrice($mall_id, $goods, $user_level); } if(!$user_level) $user_level = UserLevel::find()->where(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED])->orderBy('level asc')->limit(1)->one(); if(isset($user_level)){ $discount = $user_level['discount']??0; $goods['price_type'] = '会员优惠'; $is_member_price = $goods['extra']['is_member_price']??2; $goods['is_member_price'] = $is_member_price; if($is_member_price!=2) { if (!empty($goods['extra']['is_member_price']) && !empty($goods['extra']['member_price_setting'])) { $member_systems = json_decode($goods['extra']['member_price_setting'], true); // 因为前端会员sign_id 是按照升序排列。所以这里需要修改 $member_price_setting = []; if (!empty($member_systems)) { foreach ($member_systems as $key => $system) { $setting = []; foreach ($system as $key2 => $system2) { $key2 = explode(':', $key2); // 将key2 转为数组 asort($key2); // 排序 $key2 = implode(':', $key2); $setting[$key2] = $system2; } $member_price_setting[$key] = $setting; } } } // $goods['price'] = bcdiv($goods['price'] * $discount,10,2); if (empty($goods['is_attr'])) { if (isset($member_price_setting[$user['level']])) { //$goods['price'] = $member_price_setting[$user['level']]; foreach ($goods['attr'] as &$item) { //$item['price'] = $goods['price']; $item['member_price'] = $goods['price']; } } }else{ $attr_price_arr =[]; foreach ($goods['attr'] as $k => &$item) { // if($item['is_show'] == false) continue; //$item['price'] = bcdiv($item['price'] * $discount,10,2); //全局等级会员价 $item['member_price'] = bcdiv($item['price'] * $discount,10,2); //全局等级会员价 if (isset($member_price_setting['level' . ($user['level'] > 0 ? $user['level'] : $user_level['level'])][$item['sign_id']])) { //商品独立设置的会员价 //$item['price'] = $member_price_setting['level' . $user['level']][$item['sign_id']]; $item['member_price'] = $member_price_setting['level' . ($user['level'] > 0 ? $user['level'] : $user_level['level'])][$item['sign_id']]; } $attr_price_arr[$item['price']] = ['id'=>$item['id'],'price'=>$item['price'],'original_price'=>$item['original_price']]; } ksort($attr_price_arr); $attr_arr = array_shift($attr_price_arr); $goods['attr_id'] = $attr_arr['id']??0; //$goods['price'] = $attr_arr['price']??0; $goods['original_price'] = $attr_arr['original_price']??0; } } } } $store = Store::getOne([['id'=>$store_id],['status'=>StatusEnum::ENABLED]],true,[],false, 'id,store_name,logo_img,province_id,city_id,district_id,address,longitude,latitude,business_time_start,business_time_end,shop_mobile,license_img,show_style'); $region = Region::lists(['where'=>[['id'=>[$store['province_id'],$store['city_id'],$store['district_id']]]],'index'=>'id','id,name']); $latitude_a = $store['latitude']; $longitude_a = $store['longitude']; $location_obj = new LocationHelper(); $distance = $location_obj->getDistanceByGeo($latitude_a,$longitude_a,$latitude_b,$longitude_b); $store['province'] = $region[$store['province_id']]['name']??''; $store['city'] = $region[$store['city_id']]['name']??''; $store['district'] = $region[$store['district_id']]['name']??''; $store['distance'] = bcmul($distance,1,1); unset($store['province_id']); unset($store['city_id']); unset($store['district_id']); unset($store['longitude']); unset($store['latitude']); $goods['member_buy_limit_setting'] = json_decode($goods['extra']['member_buy_limit_setting'],true); $goods['package_data'] = !empty($goods['package_data']) ? json_decode($goods['package_data']) : []; $repurchase_setting = []; if($goods['extra']['is_repurchase'] == StatusEnum::ENABLED && !empty($goods['extra']['repurchase_setting'])){ $repurchase_setting = json_decode($goods['extra']['repurchase_setting'], true); } $goods['repurchase_setting'] = $repurchase_setting; unset($goods['extra']); //指定商品 $coupon_goods_relate_list = StoreCouponGoodsRelate::lists(['where'=>[['goods_id'=>$goods_id]],'select'=>'coupon_id']); $coupon_ids = array_column($coupon_goods_relate_list,'coupon_id'); $coupon_list2 = StoreCoupon::lists([ 'where'=>[ ['id'=>$coupon_ids], ['store_id'=>$store['id']], ['status'=>StatusEnum::ENABLED], ['coupon_status'=>AddonsCouponEnum::STATUS_RECEIVING], ], 'select'=>'id,name,type,exchange_voucher_type,sub_price', 'limit'=>5 ]); //指定分类 $goods_cate_relate_list = GoodsCateRelate::lists(['where'=>[['goods_id'=>$goods_id]],'select'=>'cate_id']); $cate_ids = array_column($goods_cate_relate_list,'cate_id'); $coupon_cate_relate_list = StoreCouponCatRelate::lists(['where'=>[['cate_id'=>$cate_ids]],'select'=>'coupon_id']); $coupon_ids = array_column($coupon_cate_relate_list,'coupon_id'); $coupon_list1 = StoreCoupon::lists([ 'where'=>[ ['id'=>$coupon_ids], ['store_id'=>$store['id']], ['status'=>StatusEnum::ENABLED], ['coupon_status'=>AddonsCouponEnum::STATUS_RECEIVING], ], 'select'=>'id,name,type,exchange_voucher_type,sub_price', 'limit'=>5 ]); //全场通用 $coupon_list3 = StoreCoupon::lists([ 'where'=>[ ['store_id'=>$store['id']], ['appoint_type' => 3], ['status'=>StatusEnum::ENABLED], ['coupon_status'=>AddonsCouponEnum::STATUS_RECEIVING], ], 'select'=>'id,name,type,exchange_voucher_type,sub_price', 'limit'=>5 ]); $coupon_list = array_merge($coupon_list1,$coupon_list2,$coupon_list3); foreach ($coupon_list as&$item){ $item['from_type_txt'] = '店铺券'; } if(!empty($goods['freight_type'])){ $goods['freight_type'] = explode(',',$goods['freight_type']); } // 处理兑换券 if ($coupon_list2) { $sub_price = 0; foreach ($coupon_list2 as $item) { if ($item['type'] == StoreEnum::EXCHANGE) { if ($item['exchange_voucher_type'] == 0) { $goods['coupon_price'] = 0; break; } else { if ($item['sub_price'] > $sub_price) { $sub_price = $item['sub_price']; $goods['coupon_price'] = bcsub($goods['price'], $item['sub_price'], 2); if ($goods['coupon_price'] < 0) { $goods['coupon_price'] = 0; } } } } } } $res = GoodsLogic::getGoodsAssociationList($this->mall_id,$goods_id, $store['id']); $goods['extra1_goods_list'] = $res['extra1_goods_list']??[]; $goods['extra2_goods_list'] = $res['extra2_goods_list']??[]; $StoreGoodsTrackingService = new StoreGoodsTrackingService(); $trackingData = [ 'store_id' => $store_id, 'mall_id' => $mall_id, 'goods_id' => $goods_id, 'user_id' => $this->user_id ]; $StoreGoodsTrackingService->addStoreGoodsTracking($trackingData); $goodsStoreConfig = Yii::$app->services->setting->addons->get($mall_id, StoreEnum::ADDONS_NAME, 'goodsStore'); $store['is_hidden_goods_store'] = 0; if ($goodsStoreConfig['is_hidden_goods_store'] == 1) $store['is_hidden_goods_store'] = 1; $return = [ 'goods' => $goods, 'store' => $store, 'coupon_list' => $coupon_list, ]; if($goods['goods_type']==GoodsTypeEnum::GoodsTypeReserved){ $store_reserve_setting = (new StoreReserveSettingService(['mall_id'=>$this->mall_id,'store_id'=>$store_id]))->detail(); $reserve_setting['employee_selection'] = $store_reserve_setting['employee_selection']??1; $return['reserve']['reserve_setting'] =$reserve_setting; $range_end = $store_reserve_setting['range_end']??1; $range_end_arr = ReservationServiceEnum::RANGE_END_ARR_MAP; $return['reserve']['days'] = $range_end_arr[$range_end]??7; } return $this->success('获取成功', $return); } catch (Exception $e) { return $this->error($e->getMessage()); } } /** * 商品评价列表 * @return mixed|void */ public function actionCommentsList() { $params = \Yii::$app->request->get(); $res = \Yii::$app->services->validate->validate($params, [ [['store_id'], 'required', 'message' => 'store_id必传'], [['limit', 'page', 'type','goods_id'], 'safe'] ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $data['comments'] = []; $data['good_rate'] = 0;//满意度 $where = ['mall_id' => $this->mall_id,'store_id'=>$params['store_id'], 'status' => StatusEnum::ENABLED, ]; if(!empty($params['goods_id'])) $where[]=['goods_id' => $params['goods_id']]; $total = OrderComments::find()->where($where)->count(); $data['comment_count'][0] = ['name' => OrderCommentEnum::OC_ALL, 'count' => $total ?? 0]; $good_num = OrderComments::find()->where($where)->andWhere(['in', 'score', OrderCommentEnum::OC_PRAISE_SCORES])->count(); $data['comment_count'][1] = ['name' => OrderCommentEnum::OC_PRAISE, 'count' => $good_num ?? 0]; $count = OrderComments::find()->where($where)->andWhere(['in', 'score', OrderCommentEnum::OC_MIDDLE_SCORES])->count(); $data['comment_count'][2] = ['name' => OrderCommentEnum::OC_MIDDLE, 'count' => $count ?? 0]; $count = OrderComments::find()->where($where)->andWhere(['in', 'score', OrderCommentEnum::OC_NEGATIVE_SCORES])->count(); $data['comment_count'][3] = ['name' => OrderCommentEnum::OC_NEGATIVE, 'count' => $count ?? 0]; $count = OrderComments::find()->where($where)->andWhere(['<>', 'pic_url', '[]'])->count(); $data['comment_count'][4] = ['name' =>'有图', 'count' => $count ?? 0]; $where = []; $where[] = ['mall_id' => $this->mall_id]; $where[] = ['status' => StatusEnum::ENABLED]; if(!empty($params['goods_id'])) $where[]=['goods_id'=>$params['goods_id']]; $where[] = ['store_id' => $params['store_id']]; if (!empty($params['type'])) { switch ($params['type']) { case OrderCommentEnum::TYPE1://差评 $where[] = ['in', 'score', OrderCommentEnum::OC_NEGATIVE_SCORES]; break; case OrderCommentEnum::TYPE2://中评 $where[] = ['in', 'score', OrderCommentEnum::OC_MIDDLE_SCORES]; break; case OrderCommentEnum::TYPE4://好评 $where[] = ['in', 'score', OrderCommentEnum::OC_PRAISE_SCORES]; break; case OrderCommentEnum::TYPE5://有图 $where[] = ['<>', 'pic_url', '[]']; break; } } $params['where'] = $where; $params['select'] = '*'; $params['order'] = 'is_top desc,id desc'; $order_comments_list = OrderComments::listPage($params); if (!empty($order_comments_list['list'])) { $user_id_arr = array_column($order_comments_list['list'], 'user_id'); $user_list = User::findAll(['id' => $user_id_arr]); $user_arr = []; foreach ($user_list as $v) { $user_arr[$v['id']] = ['nickname' => $v['nickname'], 'avatar_url' => $v['avatar_url'], 'level' => $v['level']]; } foreach ($order_comments_list['list'] as &$v) { $v['pic_url'] = !empty($v['pic_url']) ? json_decode($v['pic_url'], true) : []; $comment['nickname'] = $comment['avatar_url'] = ''; if (isset($user_arr[$v['user_id']])) { $user = $user_arr[$v['user_id']]; $v['nickname'] = $user['nickname']; $v['avatar_url'] = $user['avatar_url']; $v['level'] = $user['level']; } } $data['comments'] = $order_comments_list; } return $this->success('操作成功', $data); } /** * 分类商品列表 * @return mixed|void */ public function actionCateGoodsList() { $params = \Yii::$app->request->get(); $res = \Yii::$app->services->validate->validate($params, [ [['store_id'], 'required'], [['cate_id','keyword','type'], 'safe'], ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $store_id = $params['store_id']; $where[] = ['store_id'=>$store_id,'mall_id' => $this->mall_id,'check_status'=>1, 'is_on_sale' => 1, 'status' => StatusEnum::ENABLED]; if(!empty($params['cate_id'])){ $goods_cate_relate_list = StoreGoodsCateRelate::findAll(['cate_id' => $params['cate_id']]); $goods_id_arr = array_column($goods_cate_relate_list, 'goods_id'); $where[] = ['id' => $goods_id_arr]; } if(!empty($params['keyword'])){ $where[] = ['like', 'goods_name', trim($params['keyword'])]; } if(!empty($params['type'])){ switch ($params['type']){ case 'platform': $where[] = ['!=', 'mall_goods_id', 0]; break; case 'store': $where[] = ['mall_goods_id'=> 0]; break; } } $platform_goods_cate = StoreGoods::getPlatformGoodsCate($this->mall_id); if ($platform_goods_cate) { $filter_goods_ids = StoreGoodsCateRelate::lists([ 'where' => [ ['cate_id' => $platform_goods_cate['id']], ], 'select' => 'goods_id' ]); $filter_goods_ids = array_column($filter_goods_ids, 'goods_id') ?? []; $where[] = ['not in', 'id', $filter_goods_ids]; } $params['where'] = $where; $params['select'] = 'id,goods_name,cover_pic,price,(sales_num+virtual_sales) as sales_num,original_price,status,stock,attr_groups,attr_groups_format,is_attr,is_show_sales,goods_type,show_style'; $params['order'] = 'sort asc'; $params['with'] = ['attr'=>function($query){ $query->select('id,goods_id,name,price,sign_id,stock,pic_url,original_price'); },'extra' ]; $goods_list = StoreGoods::listPage($params); $list = StoreCart::getCartList($this->user_id); $goods_num_arr = []; $goods_attr_ids = []; foreach ($list as $v) { $row = json_decode($v, true); if (is_array($row)) { $goods_attr_ids[]=$row['attr_id']; } } $goods_attr_arr = StoreGoodsAttr::lists(['where'=>[['id'=>$goods_attr_ids],['>','stock',0],['status'=>StatusEnum::ENABLED]],'select'=>'goods_id,id','index'=>'goods_id']); foreach ($list as $v) { $row = json_decode($v, true); if(!is_array($row)) continue; if (isset($goods_num_arr[$row['goods_id']])) { if(isset($goods_attr_arr[$row['goods_id']])){ $goods_num_arr[$row['goods_id']] += $row['num']; } } else { $goods_num_arr[$row['goods_id']] = $row['num']; } } if (!empty($goods_list['list'])) { $setting = \Yii::$app->services->setting->addons->get($this->mall_id, StoreEnum::ADDONS_NAME, 'decoration'); foreach ($goods_list['list'] as &$item) { if(!$setting['custom_goods_style']){ // 如果不是自定义,就按照主商城的 $item['show_style'] = $setting['default_goods_style']; } $item['member_buy_limit_setting'] = empty($item['extra']['member_buy_limit_setting'])?'':json_decode($item['extra']['member_buy_limit_setting'],true); unset($item['extra']); $item['num'] = !empty($goods_num_arr[$item['id']]) ? $goods_num_arr[$item['id']] : 0; $item['status'] = empty($item['stock']) ? 0 : 1; $item['attr_id'] = 0; foreach($item['attr'] as &$val){ $val['is_show'] = StatusEnum::ENABLED; $item['attr_id'] <= 0 && $item['attr_id'] = $val['id']; } unset($val); } } return $this->success('操作成功', $goods_list); } public function actionGetPlatformGoods() { $params = \Yii::$app->request->get(); $res = \Yii::$app->services->validate->validate($params, [ [['store_id'], 'required'], [['keyword'], 'string'] ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $store_id = $params['store_id']; $where[] = ['store_id'=>$store_id,'mall_id' => $this->mall_id,'check_status'=>1, 'is_on_sale' => 1, 'status' => StatusEnum::ENABLED]; $platform_goods_cate = StoreGoods::getPlatformGoodsCate($this->mall_id); if ($platform_goods_cate) { $filter_goods_ids = StoreGoodsCateRelate::lists([ 'where' => [ ['cate_id' => $platform_goods_cate['id']], ], 'select' => 'goods_id' ]); $filter_goods_ids = array_column($filter_goods_ids, 'goods_id') ?? []; $where[] = ['id' => $filter_goods_ids]; }else{ $where[] = ['id' => 0]; } if($params['keyword']) $where[] = ['like', 'goods_name', $params['keyword']]; $params['where'] = $where; $params['select'] = 'id,goods_name,cover_pic,price,(sales_num+virtual_sales) as sales_num,original_price,status,stock,attr_groups,attr_groups_format,is_attr,goods_type'; $params['order'] = 'sort asc'; $params['with'] = ['attr'=>function($query){ $query->select('id,goods_id,name,price,sign_id,stock,pic_url,original_price'); },'extra' ]; $goods_list = StoreGoods::listPage($params); $list = StoreCart::getCartList($this->user_id); $goods_num_arr = []; $goods_attr_ids = []; foreach ($list as $v) { $row = json_decode($v, true); if (is_array($row)) { $goods_attr_ids[]=$row['attr_id']; } } $goods_attr_arr = StoreGoodsAttr::lists(['where'=>[['id'=>$goods_attr_ids],['>','stock',0],['status'=>StatusEnum::ENABLED]],'select'=>'goods_id,id','index'=>'goods_id']); foreach ($list as $v) { $row = json_decode($v, true); if(!is_array($row)) continue; if (isset($goods_num_arr[$row['goods_id']])) { if(isset($goods_attr_arr[$row['goods_id']])){ $goods_num_arr[$row['goods_id']] += $row['num']; } } else { $goods_num_arr[$row['goods_id']] = $row['num']; } } if (!empty($goods_list['list'])) { foreach ($goods_list['list'] as &$item) { $item['member_buy_limit_setting'] = empty($item['extra']['member_buy_limit_setting'])?'':json_decode($item['extra']['member_buy_limit_setting'],true); unset($item['extra']); $item['num'] = !empty($goods_num_arr[$item['id']]) ? $goods_num_arr[$item['id']] : 0; $item['status'] = empty($item['stock']) ? 0 : 1; $item['attr_id'] = 0; foreach($item['attr'] as &$val){ $val['is_show'] = StatusEnum::ENABLED; if($item['attr_id'] <= 0) $item['attr_id'] = $val['id']; } unset($val); } unset($item); } return $this->success('操作成功', $goods_list); } public function actionReserveDetail() { $params = \Yii::$app->request->get(); $res = \Yii::$app->services->validate->validate($params, [ [['goods_id'], 'required'], [['goods_id'], 'integer'], ]); if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage()); $data = StoreGoodsReserve::getOne([ ['goods_id' => $params['goods_id']], ['mall_id' => $this->mall_id], ], true, [], 'id desc', 'ordering_information, information_detail'); return $this->success('获取成功', $data); } }