checkGoods($goods_id,$goods_no); if($ck_ret['error_code'] == 1) $this->error('商品已经下架'); if($ck_ret['error_code'] == 2) $this->error('该规格已经下架'); if($num > $ck_ret['num'] ) $this->error('库存不足'); $car_info = Db::table('shopping_trolley') ->where(['user_id'=>$this->uid,'goods_id'=>$goods_id,'goods_no'=>$goods_no]) ->find(); Db::startTrans(); // 更新购物车 if(empty($car_info)) { Db::table('shopping_trolley')->insert(['user_id'=>$this->uid,'goods_id'=>$goods_id,'goods_no'=>$goods_no,'num'=>$num,'create_at'=>date("Y-m-d H:i:s"),'is_integral'=>$ck_ret['goods_info']['is_integral']]); $res1 = Db::getLastInsID(); }else{ if($num + $car_info['num'] == 0 ) { $res1 = Db::table('shopping_trolley')->where(['id'=>$car_info['id']])->delete(); }else{ $res1 = Db::table('shopping_trolley')->where(['id'=>$car_info['id']])->update(['num'=>$num + $car_info['num']]); } } // 更新库存 $res2 = update_goods_stock($goods_id,$goods_no,$num); if(!$res1 || !$res2){ Db::rollback(); $this->error('操作失败'); }else{ Db::commit(); $ret = Db::table('shopping_trolley') ->where(['user_id'=>$this->uid,'goods_id'=>$goods_id,'goods_no'=>$goods_no]) ->find(); $this->success('ok',$ret); } } /** * @title 获取购物车列表(购物车列表页) * @desc 获取购物车列表(购物车列表页) * @author qc * @url /api/Shoppingcar/getList * @method GET * @header name:Authorization require:1 desc:Token * @param name:page type:int : default:1 desc:页数 * @param name:page_num type:int : default:20 desc:每页数 * @param name:source type:int : default:0 desc:购物车类型:0商城购物车,1积分购物车 * @return name:id type:int default:-- desc:记录id * @return name:user_id type:int default:-- desc:会员id * @return name:goods_id type:int default:-- desc:商品id * @return name:goods_no type:string default:-- desc:货号 * @return name:num type:int default:-- desc:商品数量 * @return name:is_integral type:int default:-- desc:是否是积分商品 * @return name:error_code type:int default:-- desc:错误码(0商品正常,1商品下架,2规格下架) * @return name:spec_img type:sting default:-- desc:商品规格封面 * @return name:sell_money type:sting default:-- desc:商品规格售价 * @return name:spec_exp type:sting default:-- desc:商品规格名 */ public function getList() { $source = input('source',0); if(!in_array($source,[0,1])) $this->error('购物车类型错误'); $list = Db::table('shopping_trolley') ->where('user_id',$this->uid) ->where('num','>',0) ->where('is_integral',$source) ->limit($this->off_set,$this->page_num) ->order('id desc') ->select(); array_walk($list,function (&$val){ $check_goods = $this->checkGoods($val['goods_id'],$val['goods_no']); $val['error_code'] =$check_goods['error_code']; $val['spec_img'] = ''; $val['sell_money'] = ''; $val['spec_exp'] = ''; if($check_goods['error_code'] == 0) { $spec_arr = $check_goods['goods_info']['spec']; foreach (json_decode($spec_arr,true) as $sk=>$sv) { if($val['goods_no'] == $sv['goods_no']){ $val['spec_img'] = $sv['spec_img']; $val['sell_money'] = $sv['sell_money']; $val['spec_exp'] = $sv['spec_exp']; } } } }); $this->success('ok',['list'=>$list]); } /** * @title 获取购物车列表(提交订单页面) * @desc 获取购物车列表(提交订单页面) * @author qc * @url /api/Shoppingcar/getCommitList * @method GET * @header name:Authorization require:1 desc:Token * @param name:ids type:string : default:1 desc:购物车记录id串(逗号分开) * @param name:source type:int : default:0 desc:购物车类型:0商城购物车,1积分购物车 * @return name:id type:int default:-- desc:记录id * @return name:user_id type:int default:-- desc:会员id * @return name:goods_id type:int default:-- desc:商品id * @return name:goods_no type:string default:-- desc:货号 * @return name:num type:int default:-- desc:商品数量 * @return name:is_integral type:int default:-- desc:是否是积分商品 * @return name:error_code type:int default:-- desc:错误码(0商品正常,1商品下架,2规格下架) * @return name:spec_img type:sting default:-- desc:商品规格封面 * @return name:sell_money type:sting default:-- desc:商品规格售价 * @return name:spec_exp type:sting default:-- desc:商品规格名 */ public function getCommitList() { $source = input('source',0); $ids = input('ids',0); if(!in_array($source,[0,1])) $this->error('购物车类型错误'); if(!$ids) $this->error('请选择商品'); $ids_arr = explode(',',$ids); $list = Db::table('shopping_trolley') ->where('user_id',$this->uid) ->where('id','in',$ids_arr) ->where('num','>',0) ->where('is_integral',$source) ->order('id desc') ->select(); array_walk($list,function (&$val){ $check_goods = $this->checkGoods($val['goods_id'],$val['goods_no']); $val['error_code'] =$check_goods['error_code']; $val['spec_img'] = ''; $val['sell_money'] = ''; $val['spec_exp'] = ''; if($check_goods['error_code'] == 0) { $spec_arr = $check_goods['goods_info']['spec']; foreach (json_decode($spec_arr,true) as $sk=>$sv) { if($val['goods_no'] == $sv['goods_no']){ $val['spec_img'] = $sv['spec_img']; $val['sell_money'] = $sv['sell_money']; $val['spec_exp'] = $sv['spec_exp']; } } } }); $this->success('ok',['list'=>$list]); } /** * 验证商品 * @param $goods_id * @param $goods_no * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ function checkGoods($goods_id,$goods_no){ $ret_data = ['error_code'=>0,'num'=>0,'goods_info'=>[]]; $goods_info = Db::table('store_goods') ->field('id,spec,stock,is_integral,status,is_deleted') ->where(['id'=>$goods_id]) ->find(); if(empty($goods_info)){ $ret_data['error_code'] = 1; }else{ if($goods_info['status'] == 0 || $goods_info['is_deleted'] == 1 ) $ret_data['error_code'] = 1; $key= array_search($goods_no,array_column(json_decode($goods_info['spec'],true),'goods_no')); if($key === false) $ret_data['error_code'] = 2; foreach (json_decode($goods_info['spec'],true) as $c){ if($c['goods_no'] == $goods_no) { $ret_data['num'] =$c['store_num']; break; } } $ret_data['goods_info'] = $goods_info; } return $ret_data; } /** * @title 更改购物车商品数量 * @desc 更改购物车商品数量 * @author qc * @url /api/Shoppingcar/changeNum * @method POST * @header name:Authorization require:1 desc:Token * @param name:id type:int : default:-- desc:购物车记录id * @param name:num type:int : default:20 desc:变更数量(减少数量是负数) */ public function changeNum() { $id = input('post.id'); $num = input('post.num'); $car_info = Db::table('shopping_trolley')->find($id); $ck_ret = $this->checkGoods($car_info['goods_id'],$car_info['goods_no']); if($ck_ret['error_code'] == 1) $this->error('商品已经下架'); if($ck_ret['error_code'] == 2) $this->error('该规格已经下架'); if( $num > 0 && ($ck_ret['num'] < $num || $ck_ret['goods_info']['stock'] < $num ) ) $this->error('库存不足'); Db::startTrans(); if( $num + $car_info['num'] <= 0){ if($num + $car_info['num'] < 0) $num = $car_info['num'] * -1; $up1 = Db::table('shopping_trolley')->where(['id'=>$id])->delete(); }else{ $up1 = Db::table('shopping_trolley')->where(['id'=>$id])->update(['num'=>$num + $car_info['num']]); } // 更新商品库存 $up2 = update_goods_stock($car_info['goods_id'],$car_info['goods_no'],$num); if(!$up1 || !$up2) { Db::rollback(); $this->error('修改失败'); }else{ Db::commit(); $this->success('修改成功'); } } /** * @title 批量删除购物车记录 * @desc 批量删除购物车记录 * @author qc * @url /api/Shoppingcar/cancelTrolley * @method POST * @header name:Authorization require:1 desc:Token * @param name:ids type:int : default:-- desc:购物车记录id串(1,2,3) */ public function cancelTrolley() { $ids = input('post.ids'); if(!$ids) $this->error('请选择要删除的记录'); $id_arr = explode(',',$ids); foreach ($id_arr as $id) { Db::startTrans(); $car_info =Db::table('shopping_trolley')->where(['user_id'=>$this->uid,'id'=>$id])->find(); $ck_ret = $this->checkGoods($car_info['goods_id'],$car_info['goods_no']); if(!$ck_ret['error_code'] != 2) { $up2 = update_goods_stock($car_info['goods_id'],$car_info['goods_no'],$car_info['num']*-1); }else{ $up2 = true; } $up1 = Db::table('shopping_trolley')->where(['id'=>$id])->delete();// 删除记录 if(!$up1 || !$up2) { Db::rollback(); }else{ Db::commit(); } } $this->success('ok'); } /** * @title 验证商品是否已经加到购物车 * @desc 验证商品是否已经加到购物车 * @author qc * @url /api/Shoppingcar/checkTrolley * @method GET * @header name:Authorization require:1 desc:Token * @param name:goods_id type:int require:1 default:-- desc:商品id * @param name:goods_no type:string require:1 default:-- desc:货号 * @return name:id type:int default:-- desc:记录id * @return name:user_id type:int default:-- desc:会员id * @return name:goods_id type:int default:-- desc:商品id * @return name:goods_no type:string default:-- desc:货号 * @return name:num type:int default:-- desc:商品数量 * @return name:is_integral type:int default:-- desc:是否是积分商品 */ public function checkTrolley() { $goods_id = input('post.goods_id'); $goods_no = input('post.goods_no'); if(!$goods_id || !$goods_no ) $this->error('请选择商品'); $detail = Db::table('shopping_trolley') ->where(['user_id'=>$this->uid,'goods_id'=>$goods_id,'goods_no'=>$goods_no]) ->find(); $this->success('ok',$detail); } }