validate()){ return $this->getModelError(); } $data = []; //商品信息 $res = $this->getGoodsInfo(); if($res['code'] != 0){ return $res; } $data['goods_list'] = $res['data']['goods_list']; //地址信息 $data['address'] = $this->getDefaultAddress(); //支付方式 $data['pay_types'] = $this->getPayTypes(); return $this->apiReturnSuccess('ok', $data); } private function getGoodsInfo() { $goods_list = []; $goods_info = is_array($this->goods_info) ? $this->goods_info : json_decode($this->goods_info, true); //商品信息检查 $res = $this->checkGoodsInfo($goods_info); if($res['code'] != 0){ return $res; } $goods_info = $res['data']['goods_info']; foreach ($goods_info as $index => $item){ $goods_item = Goods::find()->alias('g') ->leftJoin(['gh' => GoodsHub::tableName()], 'g.goods_hub_id=gh.id') ->leftJoin(['img' => IntegralMallGoods::tableName()],'img.goods_id=g.id') ->where([ 'g.cx_mch_id' => $this->cx_mch_id, 'g.is_delete' => 0, 'g.status' => Goods::STATUS_ONLINE, 'gh.is_delete' => 0, 'img.is_delete' => 0, 'g.id' => $item['goods_id'] ]) ->select('g.id,g.price,g.goods_stock,g.use_attr,g.attr_groups,gh.name,gh.cover_pic,gh.unit,gh.type,img.integral_num')->asArray()->one(); if($goods_item == null){ return $this->apiReturnError('所选商品不存在或已经下架'); } $goods_item['attr_groups'] = !empty($goods_item['attr_groups']) ? json_decode($goods_item['attr_groups'],true) : []; $goods_item['cover_pic'] = SiteHelper::getFullUrl($goods_item['cover_pic']); $goods_item['goods_attr_info'] = GoodsAttr::find()->alias('gr') ->leftJoin(['imgr' => IntegralMallGoodsAttr::tableName()],'imgr.goods_attr_id=gr.id') ->where([ 'gr.id' => $item['goods_attr_id'], 'gr.goods_id' => $item['goods_id'], 'gr.is_delete' => 0, 'imgr.is_delete' => 0, ]) ->select('gr.id,gr.goods_id,gr.price,gr.sign_id,gr.stock,gr.serial_no,gr.weight,gr.cover_pic,imgr.integral_num') ->asArray()->one(); $goods_item['goods_num'] = isset($item['goods_num']) ? $item['goods_num'] : 1; if($goods_item['goods_attr_info']){ $goods_item['goods_stock'] = (int)$goods_item['goods_attr_info']['stock']; $goods_item['integral_num'] = (int)$goods_item['goods_attr_info']['integral_num']; $goods_item['price'] = sprintf('%.2f',$goods_item['goods_attr_info']['price']); $goods_item['goods_attr_info']['cover_pic'] = SiteHelper::getFullUrl($goods_item['goods_attr_info']['cover_pic']); $goods_item['goods_attr_info']['attr_info_list'] = Goods::getGoodsAttrInfoListBySignId($goods_item['goods_attr_info']['sign_id'], $goods_item['attr_groups']); $goods_item['goods_attr_info']['attr_info'] = Goods::getGoodsAttrInfoToString($goods_item['goods_attr_info']['sign_id'], $goods_item['attr_groups'], '|'); $goods_item['goods_attr_info']['goods_name'] = $goods_item['name']; $goods_item['goods_attr_info']['goods_unit'] = $goods_item['unit']; $goods_item['goods_attr_info']['goods_type'] = $goods_item['type']; } else { if($item['goods_attr_id'] != 0){ return $this->apiReturnError('商品规格不存在'); } } $goods_item['total_original_price'] = $item['goods_num'] * $goods_item['price']; $goods_item['total_original_price'] = sprintf('%.2f',$goods_item['total_original_price']); $goods_item['total_integral_num'] = $item['goods_num'] * $goods_item['integral_num']; $goods_item['has_stock'] = $item['goods_nun'] > $goods_item['goods_stock'] ? false : true; $goods_list[] = $goods_item; } if(count($goods_list) == 0){ return $this->apiReturnError('商品信息不能为空'); } return $this->apiReturnSuccess('ok', ['goods_list' => $goods_list]); } private function checkGoodsInfo($goods_info) { $goods_list = []; foreach ($goods_info as $index => $item){ if(!isset($item['goods_id'])){ return $this->apiReturnError('商品信息缺少goods_id参数'); } if(!isset($item['goods_attr_id'])){ return $this->apiReturnError('商品信息缺少goods_attr_id参数'); } if(!isset($item['goods_num'])){ return $this->apiReturnError('商品信息缺少goods_num参数'); } $goods_list = $this->mergeGoodsList($item, $goods_list); } if(count($goods_list) == 0){ return $this->apiReturnError('商品信息不能为空'); } return $this->apiReturnSuccess('ok', ['goods_info' => $goods_list]); } private function mergeGoodsList($goods, $goods_list) { $is_exists = false; foreach ($goods_list as $index => $item){ if($item['goods_id'] == $goods['goods_id'] && $item['goods_attr_id'] == $goods['goods_attr_id']){ $item['goods_num'] += $goods['goods_num']; $goods_list[$index] = $item; $is_exists = true; break; } } if(!$is_exists){ $goods_list[] = $goods; } return $goods_list; } private function getDefaultAddress() { //最近收货使用地址 $order = Order::findOne(['user_id' => $this->user_id, 'cx_mch_id' => $this->cx_mch_id, 'is_delete' => 0, 'send_type' => [0, 2, 4]]); if($order != null && $order->location != null){ $location = explode(',', $order->location); $address = Address::findOne(['user_id' => $this->user_id, 'cx_mch_id' => $this->cx_mch_id, 'is_delete' => 0, 'lat' => $location[0], 'lng' => $location[1]]); } else { $address = Address::findOne(['user_id' => $this->user_id, 'cx_mch_id' => $this->cx_mch_id, 'is_delete' => 0, 'is_default' => 1]); } if($address != null){ return [ 'id' => $address->id, 'name' => $address->name, 'mobile' => $address->mobile, 'address' => $address->province.$address->city.$address->district.$address->detail, 'location' => $address->location, 'province' => $address->province, 'city' => $address->city, 'district' => $address->district, 'detail' => $address->detail ]; } return null; } private function getPayTypes() { $pay_types = []; $pay_types[] = [ 'name' => '积分支付', 'short_name' => 'integral', 'is_show' => true, 'is_open' => true, ]; return $pay_types; } }