123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327 |
- <?php
- namespace app\api\controller;
- use think\Db;
- /**
- * @title 购物车管理(线上商城 && 积分商城)
- * @controller Shoppingcar
- * @group base
- */
- class Shoppingcar extends Base
- {
- public function initialize(){
- parent::initialize();
- parent::check_login();
- }
- /**
- * @title 添加购物车
- * @desc 添加购物车
- * @author qc
- * @url /api/Shoppingcar/modifyTrolley
- * @method POST
- * @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:货号
- * @param name:num type:string require:1 default:1 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 modifyTrolley(){
- $goods_id = input('post.goods_id');
- $goods_no = input('post.goods_no');
- $num = input('post.num',1);
- $ck_ret = $this->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);
- }
- }
|