<?php namespace app\api\controller; use app\admin\model\Car; use app\common\controller\Api; use think\Validate; use think\Db; /** * 购物车接口 */ class Cars extends Api { protected $noNeedLogin = []; protected $noNeedRight = ['*']; protected $uid = ''; public function _initialize() { parent::_initialize(); $this->uid = $this->auth->getUserId(); } /** * @ApiTitle (加入购物车) * @ApiSummary (加入购物车) * @ApiMethod (POST) * @ApiRoute (/api/cars/addCar) * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * * @ApiParams (name="goods_id", type="inter", required=true, description="商品id") * @ApiParams (name="style", type="string", required=true, description="商品款式") * @ApiParams (name="price", type="inter", required=true, description="商品价格(新人价格或销售价)") * @ApiParams (name="goods_number", type="inter", required=true, description="商品数量") * * @ApiReturn({ "code": 1, "msg": "成功", "time": "1575103466", "data": null }) */ public function addCar(){ if($this->request->isPost()){ $data = $this->request->post(); $rule = config('verify.add_car'); $validate = new Validate($rule['rule'],$rule['msg']); if (!$validate->check($data)) { $this->error($validate->getError()); } //检测库存 $stock_res = Common::findSoftWhereData('goods',['id'=>$data['goods_id']],'id,stock,style g_style'); if($stock_res){ //检测库存 $check_stock = Common::checkStock($data['style'],$data['goods_number'],$stock_res['g_style'],$stock_res['stock']); if(!$check_stock){ $this->error('库存不足'); } } //查询有无记录 $where = [ 'uid'=>$this->uid, 'g_id'=>$data['goods_id'], 'style'=>trim($data['style']), ]; $res = Common::findWhereData('car',$where,'id,g_id'); $carModel = new Car(); if($res){ $carModel->where($where)->setInc('goods_number',$data['goods_number']); }else{ $data['g_id'] = $data['goods_id']; $data['uid'] = $this->uid; unset($data['goods_id']); $carModel->create($data); } $this->success('成功'); }else{ $this->error('请求方式错误'); } } /** * @ApiTitle (购物车列表) * @ApiSummary (购物车列表) * @ApiMethod (GET) * @ApiRoute (/api/cars/carList) * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * * @ApiReturn({ "code": 1, "msg": "成功", "time": "1575102913", "data": { "data": [ { "id": 1,//购物车id "image": "http://jinglong.springchunjia.cn/uploads/20191127/287ca016a4d41a239ec77c91d982309d.png",//商品图片 "price": 100,//商品价格 "style": "",//商品款式 "goods_id": 1,//商品id "goods_number": 2,//商品数量 "name": "MONENT 动感系列动感系列动感系列",//商品名称 "introduce": "轻波款,为客厅缀上霞光淡雾"//商品简介 "stock": "12"//商品库存 }, { "id": 2, "price": 100, "goods_id": 2, "goods_number": 1, "name": "MONENT 动感系列动感系列", "introduce": "轻波款,为客厅缀上霞光淡雾" } ], "total_price": 300 } }) */ public function carList(){ if($this->request->isGet()){ $res = Db::name('car') ->alias('c') ->join('goods g','c.g_id = g.id') ->where(['c.uid'=>$this->uid]) ->field('c.id,c.g_id goods_id,c.price,c.goods_number,c.style,g.name,g.image,g.style g_style,g.stock,g.introduce') ->useSoftDelete('g.deletetime') ->select(); $total_price = 0; foreach ($res as &$value){ $value['image'] = $this->auth->absolutionUrlOne($value['image']); $total_price += $value['price'] * $value['goods_number']; //检测库存 $check_stock = Common::checkStock($value['style'],$value['goods_number'],$value['g_style'],$value['stock']); if(!$check_stock){ $s_index = array_search($value['style'],Common::salePrice($value['g_style'])); $stock = Common::salePrice($value['stock'])[$s_index]; $value['goods_number'] = $stock; } $s_index = array_search($value['style'],Common::salePrice($value['g_style'])); $stock = Common::salePrice($value['stock'])[$s_index]; $value['stock'] = $stock; } // $total_price = array_sum(array_map(function ($product_row) { // return $product_row['price'] * $product_row['goods_number']; // }, $res)); $arr['data'] = $res; $arr['total_price'] = $total_price; $this->success('成功',$arr); }else{ $this->error('请求方式错误'); } } /** * @ApiTitle (删除购物车) * @ApiSummary (删除购物车) * @ApiMethod (GET) * @ApiRoute (/api/cars/deleteCar) * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * * @ApiParams (name="car_id", type="inter", required=true, description="购物车id") * * @ApiReturn({ "code": 1, "msg": "成功", "time": "1575103466", "data": null }) */ public function deleteCar(){ if($this->request->isGet()){ $car_id = $this->request->get('car_id'); $rule = config('verify.delete_car'); $validate = new Validate($rule['rule'],$rule['msg']); if (!$validate->check(['car_id'=>$car_id])) { $this->error($validate->getError()); } $carModel = new Car(); $res = $carModel->where(['id'=>$car_id,'uid'=>$this->uid])->delete(); if($res){ $this->success('成功'); }else{ $this->error('失败'); } }else{ $this->error('请求方式错误'); } } /** * @ApiTitle (猜你喜欢商品列表) * @ApiSummary (猜你喜欢商品列表) * @ApiMethod (GET) * @ApiRoute (/api/cars/likeGodsList) * * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * * @ApiParams (name="page", type="inter", required=true, description="分页页码") * * @ApiReturn({ "code": 1, "msg": "成功", "time": "1574941706", "data": { "data": [ { "id": 7,//商品id "image": "http://jinglong.springchunjia.cn/uploads/20191128/8a677f5a0418059bf1b974c50026af13.png",//图片路径 "name": "MONENT 动感系列",//商品名称 "tag": [//商品标签 "日式简约", "隐秘乡奢", "家庭情侣" ], "style": [//商品规格 "主餐匙,茶匙各1件", "古堡灰" ], "sale_price": 2299//销售价格 "expense_price": //运费(0:显示包运费标签) "is_new_tag": 0//新人价格标签(0:不显示,1:显示) }, { "id": 4, "image": "http://jinglong.springchunjia.cn/uploads/20191128/93971e55b83d1a09c1831f8197514305.png", "name": "MONENT 动感系列", "tag": [ "AB级", "ABX级", "ABN级" ], "new_price": 2499, "sale_price": 2599 }, ], "total_page": 1 } }) */ public function likeGodsList(){ if($this->request->isGet()){ $page = $this->request->get('page'); $rule = config('verify.page'); $validate = new Validate($rule['rule'],$rule['msg']); if (!$validate->check(['page'=>$page])) { $this->error($validate->getError()); } $limit = config('verify.goods_limit'); $arr = Common::goodsList('',$page,$this->uid,$limit,'hots desc,id desc'); $this->success('成功',$arr); }else{ $this->error('请求方式错误'); } } /** * @ApiTitle (商品结算) * @ApiSummary (商品结算) * @ApiMethod (POST) * @ApiRoute (/api/cars/settleGoods) * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * * @ApiParams (name="goods_id", type="string", required=true, description="商品id(多个以逗号隔开,如:1,3,4)") * @ApiParams (name="price", type="string", required=true, description="商品价格(多个以逗号隔开,如:100,10,200)") * @ApiParams (name="goods_number", type="string", required=true, description="商品数量(多个以逗号隔开,如:10,10,10)") * @ApiParams (name="style", type="string", required=true, description="商品款式(多个以逗号隔开,如:‘款式1,款式2,款式3’)") * * @ApiReturn({ "code": 1, "msg": "成功", "time": "1575106933", "data": { "data": [ { "id": 2,//商品id "name": "MONENT 动感系列动感系列",//商品名称 "image": "http://jinglong.springchunjia.cn/uploads/20191128/8a677f5a0418059bf1b974c50026af13.png",//商品图片路径 "introduce": "轻波款,为客厅缀上霞光淡雾",//商品简介 "price": "250",//商品价格 "goods_number": "5"//商品数量 "style": "款式1"//商品款式 }, { "id": 1, "name": "MONENT 动感系列动感系列动感系列", "image": "http://jinglong.springchunjia.cn/uploads/20191128/93971e55b83d1a09c1831f8197514305.png", "introduce": "轻波款,为客厅缀上霞光淡雾", "price": "100", "goods_number": "3" } ], "total_goods_price": 1550,//商品总金额 "total_expense_price": 10,//运费总金额 "total_price": 1560//总金额(商品总金额+运费总金额) } }) */ public function settleGoods(){ if($this->request->isPost()){ $goods_id = $this->request->post('goods_id'); $price = $this->request->post('price'); $goods_number = $this->request->post('goods_number'); $style = $this->request->post('style'); $rule = config('verify.settle_goods'); $validate = new Validate($rule['rule'],$rule['msg']); if (!$validate->check(['goods_id'=>$goods_id,'price'=>$price,'goods_number'=>$goods_number,'style'=>$style])) { $this->error($validate->getError()); } $goods_id_s = explode(',',$goods_id); $price_s = explode(',',$price); $goods_number_s = explode(',',$goods_number); $style_s = explode(',',$style); //合并数组 $key = ['goods_id','price','goods_number','style']; $res_goods = Common::array_merge_more($key,$goods_id_s,$price_s,$goods_number_s,$style_s); //查询商品 $res = Common::selectSoftWhereData('goods',['id'=>['in',$goods_id_s]],'id,name,image,expense_price,stock,style g_style,introduce'); $total_price = 0;//总商品费用(不含运费) $total_expense_price = 0;//总运费 foreach($res_goods as &$g_value){ $g_value['id'] = $g_value['goods_id']; foreach ($res as $value){ if($value['id'] == $g_value['goods_id']){ $g_value['name'] = $value['name']; $g_value['image'] = $this->auth->absolutionUrlOne($value['image']); $g_value['introduce'] = $value['introduce']; //检测库存 $check_stock = Common::checkStock($g_value['style'],$g_value['goods_number'],$value['g_style'],$value['stock']); if(!$check_stock){ $this->error('规格:'.$g_value['style'].'库存不足'); } $total_expense_price += $value['expense_price']; break; } } $total_price += $g_value['price'] * $g_value['goods_number']; } $arr['data'] = $res_goods; $arr['total_goods_price'] = $total_price; $arr['total_expense_price'] = $total_expense_price; $arr['total_price'] = $total_price + $total_expense_price; $this->success('成功',$arr); }else{ $this->error('请求方式错误'); } } /** * @ApiTitle (结算可使用优惠券) * @ApiSummary (结算可使用优惠券) * @ApiMethod (GET) * @ApiRoute (/api/cars/settleUseCoupon) * * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * * @ApiParams (name="goods_id", type="string", required=true, description="商品id(多个以逗号隔开,如:1,3,4)") * @ApiParams (name="price", type="string", required=true, description="商品金额(多个以逗号隔开,如:100,200,300)") * @ApiParams (name="total_goods_price", type="inter", required=true, description="商品总金额") * * @ApiReturn({ "code": 1, "msg": "成功", "time": "1575372162", "data": [ { "id": 2,//优惠券id "coupon_tag": "无门槛",//优惠券(无门槛,折扣券,满减券) "coupon_price": "¥300",//(折扣或减少金额) "coupon_tag1": "无门槛",优惠券(无门槛,满多少可用) "coupon_name": "全场优惠券",//优惠券名称 "end_time": "2020.1.31",//优惠券有效期 "type": "全场通用"//优惠券用途 "is_discount": "0"//是否为折扣(0:否,1:是) "price_tag": 100 //折扣或者减少金额 "use_goods_id": [//适用商品id "15", "16" ] }, { "id": 10, "coupon_tag": "折扣券", "coupon_price": "9.5折", "coupon_tag1": "满2000可用", "coupon_name": "商品优惠券", "end_time": "2020.1.31", "type": "商品可用" } ] }) */ public function settleUseCoupon(){ if($this->request->isGet()){ $goods_id = $this->request->get('goods_id'); $price = $this->request->get('price'); $total_goods_price = $this->request->get('total_goods_price'); $rule = config('verify.settle_use_coupon'); $validate = new Validate($rule['rule'],$rule['msg']); if (!$validate->check(['goods_id'=>$goods_id,'price'=>$price,'total_goods_price'=>$total_goods_price])) { $this->error($validate->getError()); } //查询已经领取过,未使用 $flag = config('verify.flag'); $type = config('verify.type'); $receive = Common::selectWhereData('rcoupon',['uid'=>$this->uid,'is_use'=>$flag[0]],'id,c_id'); $receive_s = array_column($receive,'c_id'); $goods_id_s = explode(',',$goods_id); $price_s = explode(',',$price); //查询商品所属品牌id $res1 = Common::selectSoftWhereData('goods',['id'=>['in',$goods_id_s],'type'=>$flag[1]],'id,t_id'); $b_id_s = array_unique(array_values(array_column($res1,'t_id'))); $time = time(); $where['id'] = ['in',$receive_s]; $where['start_time'] = ['<',$time]; $where['end_time'] = ['>',$time]; $data = Common::selectWhereData('coupon',$where,'id,type,coupon_name,c_type,bg_id,coupon_type,full_reduce,reduce,discount,coupon_number,end_time','sort desc,id desc'); //整合商品id,商品总金额 $k = ['goods_id','price']; $res_goods = $this->auth->array_merge_more($k,$goods_id_s,$price_s); $res = []; $key = 0; foreach($data as $value){ $key+=0; $flag = 0; if(!empty($b_id_s)){ //有品牌,看商品所属品牌 if($value['type'] == $type[0]){ $flag = 1; }else if($value['type'] == $type[1]){ if(in_array($value['bg_id'],$b_id_s)){ //去除不是该商品的 $flag = 1; } }else{ //品类 if(in_array($value['bg_id'],$goods_id_s)){ $flag = 1; } } }else{ //无品牌 if($value['type'] == $type[0]){//是全场券 $flag = 1; }else{ if($value['type'] == $type[2] && in_array($value['bg_id'],$goods_id_s)){ //去除不是该商品的 $flag = 1; } } } if($flag == 1){ //无门槛,有门槛 if($value['c_type'] == 0){ $res[$key]['id'] = $value['id']; //无门槛 if($value['coupon_type'] == 0){ //减少券,去掉满减金额,折扣字段, unset($value['full_reduce']); unset($value['discount']); $res[$key]['coupon_tag'] = '无门槛'; $res[$key]['coupon_price'] = '¥'.$value['reduce']; $res[$key]['coupon_tag1'] = '无门槛'; $res[$key]['is_discount'] = 0;//是否为折扣(0:否,1:是) $res[$key]['price_tag'] = $value['reduce']; }else{ //折扣券,去掉满减金额,减少金额字段, unset($value['full_reduce']); unset($value['reduce']); $res[$key]['coupon_tag'] = '折扣券'; $res[$key]['coupon_price'] = $value['discount'].'折'; $res[$key]['coupon_tag1'] = '无门槛'; $res[$key]['is_discount'] = 1;//是否为折扣(0:否,1:是) $res[$key]['price_tag'] = $value['discount']; } $res[$key]['coupon_name'] = $value['coupon_name'];//优惠券名称 $res[$key]['end_time'] = date('Y.n.j',$value['end_time']);//优惠券有效期 //全场,品牌,商品 if($value['type'] == 0){ $res[$key]['type'] = '全场通用'; }else if($value['type'] == 1){ $res[$key]['type'] = '部分品牌可用'; }else{ $res[$key]['type'] = '部分商品可用'; } $res[$key]['type_tag'] = $value['type']; $res[$key]['bg_id'] = $value['bg_id']; $res[$key]['c_type'] = $value['c_type']; $key++; }else{ //有门槛 $res[$key]['id'] = $value['id']; if($value['coupon_type'] == 0){ //减少券,去掉折扣字段, unset($value['discount']); $res[$key]['coupon_tag'] = '满减券'; $res[$key]['coupon_price'] = '¥'.$value['reduce']; $res[$key]['coupon_tag1'] = '满'.$value['full_reduce'].'可用'; $res[$key]['is_discount'] = 0;//是否为折扣(0:否,1:是) $res[$key]['price_tag'] = $value['reduce']; }else{ //折扣券,去掉减少金额字段, unset($value['reduce']); $res[$key]['coupon_tag'] = '折扣券'; $res[$key]['coupon_price'] = $value['discount'].'折'; $res[$key]['coupon_tag1'] = '满'.$value['full_reduce'].'可用'; $res[$key]['is_discount'] = 1;//是否为折扣(0:否,1:是) $res[$key]['price_tag'] = $value['discount']; } $res[$key]['coupon_name'] = $value['coupon_name'];//优惠券名称 $res[$key]['end_time'] = date('Y.n.j',$value['end_time']);//优惠券有效期 //全场,品牌,商品 if($value['type'] == 0){ $res[$key]['type'] = '全场通用'; }else if($value['type'] == 1){ $res[$key]['type'] = '部分品牌可用'; }else{ $res[$key]['type'] = '部分商品可用'; } $res[$key]['type_tag'] = $value['type']; $res[$key]['bg_id'] = $value['bg_id']; $res[$key]['c_type'] = $value['c_type']; $res[$key]['full_reduce'] = $value['full_reduce']; $key++; } } } foreach($res as &$r_value){ if($r_value['type_tag'] == $type[0]){ //全场 $r_value['use_goods_id'] = $goods_id_s; }else if($r_value['type_tag'] == $type[1]){ //品牌 $arr = []; foreach($res1 as $value1){ if($r_value['bg_id'] == $value1['t_id']){ array_push($arr,$value1['id']); } } $r_value['use_goods_id'] = $arr; }else{ //商品 $r_value['use_goods_id'] = []; foreach($goods_id_s as $g_value){ if($r_value['bg_id'] == $g_value){ $r_value['use_goods_id'] = [$r_value['bg_id']]; } } $r_value['use_goods_str'] = implode(',',$r_value['use_goods_id']); } } $res2 = []; //满减金额的优惠券 foreach($res as $res_value){ $res2_flag = 0; if($res_value['c_type'] == 1){ if($res_value['type_tag'] == $type[0]){ //全场 //商品总金额大于等于满减金额 if(($total_goods_price <=> $res_value['full_reduce']) == -1){ $res2_flag = 1; } }else if($res_value['type_tag'] == $type[1]){ //品牌 $price = 0; foreach($res_goods as $goods_value){ foreach($res_value['use_goods_id'] as $u_value){ //品牌下的商品id if($u_value == $goods_value['goods_id']){ $price += $goods_value['price']; } } } if(($price <=> $res_value['full_reduce']) == -1){ $res2_flag = 1; } }else{ //商品 $price = 0; foreach($res_goods as $goods_value){ if($res_value['use_goods_str'] == $goods_value['goods_id']){ $price += $goods_value['price']; } } if(($price <=> $res_value['full_reduce']) == -1){ $res2_flag = 1; } } } if($res2_flag == 0){ array_push($res2,$res_value); } } $this->success('成功',$res2); }else{ $this->error('请求方式错误'); } } /** * @ApiTitle (获取最近订单的地址) * @ApiSummary (获取最近订单的地址) * @ApiMethod (GET) * @ApiRoute (/api/cars/getOrderAddress) * * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * * @ApiReturn({ "code": 1, "msg": "成功", "time": "1575462785", "data": { "id": 2, "receive_name": "景龙1", "receive_mobile": "13752011725", "receive_address": "天津市南开区1" } }) */ public function getOrderAddress(){ if($this->request->isGet()){ $res = Common::findSoftWhereData('order',['uid'=>$this->uid],'id,receive_name,receive_mobile,receive_address'); $this->success('成功',$res); }else{ $this->error('请求方式错误'); } } }