CartController.class.php 14.5 KB
<?php
/**
 * Created by PhpStorm.
 * User: 29925
 * Date: 2018/5/1
 * Time: 17:59
 */

namespace User\Controller;

use Common\Controller\MemberbaseController;

class CartController extends MemberbaseController {

    protected $cart_model;
    protected $user_address_model;
    protected $goods_model;
    protected $goods_brand_model;
    protected $product_model;
    protected $order_model;
    protected $order_detail_model;

    function _initialize() {
        parent::_initialize();
        $this->cart_model = D("Common/Cart");
        $this->user_address_model = D("Common/UserAddress");
        $this->goods_model = D("Common/Goods");
        $this->goods_brand_model = D("Common/GoodsBrand");
        $this->product_model = D("Common/Product");
        $this->order_model = D("Common/Order");
        $this->order_detail_model = D("Common/OrderDetail");
    }

    /**
     * 用户购物车列表
     */
    public function index() {
        $cartList = $this->cart_model->getList($this->userid);
        $count_amount = 0;
        foreach($cartList as $k=>$v) {
            $cartList[$k]['amount'] = $v['goods_price']*$v['num'];
            $count_amount += $cartList[$k]['amount'];
        }
        $this->assign('cartList',$cartList);
        $this->assign('count_amount', $count_amount);
        $this->display();
    }

    /**
     * 修改购物车商品数量
     * @param id 商品id
     * @param sort 类型(增加/减少)
     */
    public function changeNum() {
        if(IS_AJAX) {
            $user_id = sp_get_current_userid();
            $id = I('post.id',0,'intval');
            $sort = I('post.sort');
            $num = I('post.num',0,'intval');
            if($sort == 'reduce') {
                $num = -1;
            }
            // 判断传参是否正常
            if(!$num) {
                $this->ajaxReturn(array('status'=>false,'msg'=>'请输入正确的商品数量'));
            }
            if($sort != 'plus' && $sort != 'reduce' && $sort != 'change') {
                $this->ajaxReturn(array('status'=>false,'msg'=>'参数错误'));
            }
            // 判断购物车及商品数据
            $info = $this->cart_model->getOneByUser($user_id,$id);
            if(!$info) {
                $this->ajaxReturn(array('status'=>false,'msg'=>'购物车不存在该商品'));
            }
            if($sort == 'plus' || $sort == 'reduce') {
                if(($info['num']+$num)>$info['goods_num']) {
                    $this->ajaxReturn(array('status'=>false,'msg'=>'商品库存不足'));
                }
                $info['num'] += $num;
            }
            if($sort == 'change') {
                if(($num)>$info['goods_num']) {
                    $this->ajaxReturn(array('status'=>false,'msg'=>'商品库存不足'));
                }
                $info['num'] = $num;
            }
            // 更新购物车数据(价格及数量)
            $this->cart_model->where(array('user_id'=>$user_id,'goods_id'=>$id))->save(array('num'=>$info['num'],'price'=>$info['goods_price']));
            $info['amount'] = $info['num'] * $info['goods_price'];
            $info['sort'] = $sort;
            $this->ajaxReturn(array('status'=>true,'msg'=>'修改成功','data'=>$info));
        } else {
            $this->error('非法操作');
        }
    }

    /**
     * 删除购物车商品
     * @param ids 要删除的商品
     */
    public function del() {
        if(IS_AJAX) {
            $user_id = sp_get_current_userid();
            $ids = I('post.ids');
            if(!$ids) {
                $this->ajaxReturn(array('status'=>false,'msg'=>'请选择要删除的商品'));
            }
            $result = $this->cart_model->where(array('goods_id'=>array('in',$ids),'user_id'=>$user_id))->delete();
            if(!$result) {
                $this->ajaxReturn(array('status'=>false,'msg'=>'删除失败'));
            }
            $this->ajaxReturn(array('status'=>true,'msg'=>'删除成功'));
        } else {
            $this->error('非法操作');
        }
    }

    /**
     * 去付款
     * @param ids 去付款的商品
     */
    public function topay() {
        if(IS_AJAX) {
            $user_id = sp_get_current_userid();
            $ids = I('post.ids');
            $redirect_url = U('User/Cart/confirm',array('ids'=>implode(',',$ids)));
            if(!$ids) {
                $this->ajaxReturn(array('status'=>false,'msg'=>'请选择要购买的商品'));
            }
            $this->ajaxReturn(array('status'=>true,'msg'=>'购买成功','data'=>$redirect_url,'ids'=>$ids));
        } else {
            $this->error('非法操作');
        }
    }

    /**
     * 确认订单页面
     */
    public function confirm() {
        if(IS_GET) {
            if(C('MOBILE_TPL_ENABLED') && sp_is_mobile()) {
                require_once VENDOR_PATH."jssdk/jssdk.php";
                $jssdk = new \JSSDK(C('WX_APPID'), C('WX_APPSECRET'));
                $signPackage = $jssdk->getSignPackage();
                $this->assign('signPackage',$signPackage);
            }
            if(I('get.id',0,'intval') && I('get.num',0,'intval')) {
                $id = I('get.id');
                $num = I('get.num');
                // 判断购物车及商品数据
                $goods_num = $this->goods_model->getInfoNum($id);
                if($num>$goods_num) {
                    $this->error('商品库存不足');
                }
                $cartList[] = $this->goods_model->getInfo($id);
                $count_amount = 0;
                foreach($cartList as $k=>$v) {
                    $cartList[$k]['amount'] = $v['goods_price']*$num;
                    $cartList[$k]['num'] = $num;
                    $cartList[$k]['goods_id'] = $v['id'];
                    $count_amount += $cartList[$k]['amount'];
                }
                $this->assign('sort',1);
                $this->assign('num',$num);
                $this->assign('cartList',$cartList);
                $this->assign('count_amount', $count_amount);
            }elseif(I('get.ids')) {
                $ids = explode(',',I('get.ids'));
                $cartList = $this->cart_model->getListConfirmByUser($this->userid,$ids);
                if(!$ids || !$cartList) {
                    $this->error('未选择购买商品或订单已生成');
                }
                $count_amount = 0;
                foreach($cartList as $k=>$v) {
                    $cartList[$k]['amount'] = $v['goods_price']*$v['num'];
                    $count_amount += $cartList[$k]['amount'];
                }
                $this->assign('sort',2);
                $this->assign('cartList',$cartList);
                $this->assign('count_amount', $count_amount);
            } else {
                $this->error('参数错误');
            }
            $addressList = $this->user_address_model->getList($this->userid);
            $this->assign('addressList',$addressList);
            $default_addressid = $this->user_model->defaultAddressid($this->userid);
            $this->assign('default_addressid',$default_addressid);
            $this->display();
        } else {
            $this->error('非法操作');
        }
    }

    /**
     * 确认订单
     * @param address_id 收货地址信息
     * @param ids 购买的商品id
     */
    public function createOrder() {
        if(IS_AJAX) {
            $user_id = $info['user_id'] = sp_get_current_userid();
            $address_id = I('post.address_id',0,'intval');
            $addressInfo = $this->user_address_model->getInfo($address_id);
            $sort = I('post.sort');
            $ids = I('post.ids');
            if(!$ids) {
                $this->ajaxReturn(array('status'=>false,'msg'=>'参数错误'));
            }
            if($sort == 1) {
                $num = I('post.num');
                $goods = $this->goods_model->getInfo($ids[0]);
                $goods['goods_id'] = $goods['id'];
                $goods['num'] = $num;
                $list[0] = $goods;
            }
            if($sort == 2) {
                $list = $this->cart_model->getListConfirmByUser($user_id,$ids);
            }
            if(!$list) {
                $this->ajaxReturn(array('status'=>false,'msg'=>'商品获取失败,请重新购买'));
            }
            $count_amount = 0;
            foreach($list as $k=>$v) {
                $count_amount += $v['num'] * $v['goods_price'];
            }
            // 生成订单
            M('Order')->startTrans();
            $order_model = D('Common/Order');
            $order_detail_model = D('Common/OrderDetail');
            $info['province'] = $addressInfo['province'];
            $info['city'] = $addressInfo['city'];
            $info['region'] = $addressInfo['region'];
            $info['address'] = $addressInfo['address'];
            $info['realname'] = $addressInfo['realname'];
            $info['mobile'] = $addressInfo['mobile'];
            $info['order_sn'] = $detail['order_sn'] = sp_get_order_sn();
            $info['status'] = 1;
            $info['sheet'] = 'Goods';
            $info['price_count'] = $count_amount;
            $info['ctime'] = time();
            if(!$order_model->create($info)) {
                M('Order')->rollback();
                $this->ajaxReturn(array('status'=>false,'msg'=>$order_model->getError()));
            }
            $order_id = $order_model->add($info);
            if(!$order_id) {
                M('Order')->rollback();
                $this->ajaxReturn(array('status'=>false,'msg'=>'添加订单失败'));
            }
            foreach($list as $k=>$v) {
                $detail['goods_id'] = $v['goods_id'];
                $detail['goods_name'] = $v['goods_name'];
                $detail['goods_price'] = $v['goods_price'];
                $detail['price'] = $v['price'];
                $detail['num'] = $v['num'];
                $detail['amount'] = $v['num'] * $v['goods_price'];
                $detail['ctime'] = time();
                if(!$order_detail_model->create($detail)) {
                    M('Order')->rollback();
                    $this->ajaxReturn(array('status'=>false,'msg'=>$order_detail_model->getError()));
                }
                if(!$order_detail_model->add($detail)) {
                    M('Order')->rollback();
                    $this->ajaxReturn(array('status'=>false,'msg'=>'添加订单失败'));
                }
            }
            if($sort == 2) {
                $result = $this->cart_model->where(array('goods_id'=>array('in',$ids),'user_id'=>$user_id))->delete();
                if(!$result) {
                    M('Order')->rollback();
                    $this->ajaxReturn(array('status'=>false,'msg'=>'删除购物车商品失败'));
                }
            }
            M('Order')->commit();
            $redirect_url = U('User/Cart/pay',array('id'=>$order_id));
            if(C('MOBILE_TPL_ENABLED') && sp_is_mobile()) {
                $redirect_url = $this->getPayParam($info);
            }
            $this->ajaxReturn(array('status'=>true,'msg'=>'添加订单成功','data'=>$redirect_url));
        } else {
            $this->error('非法操作');
        }
    }

    // 手机端jsapi支付回调
    public function notify(){
        $notify = new \WxPayNotify();
        $notify->Handle(false);     //最后为WxPayApi类下replyNotify方法    echo $xml

        $xml = $GLOBALS['HTTP_RAW_POST_DATA'];  //微信的回调数据
        $base = new \WxPayResults();            //实例化数据对象结果类
        $data = $base->FromXml($xml);           //将xml转为array
        F('return_xml',$data);
        if($base->CheckSign() == true){
//            if ($data["return_code"] == "FAIL") {
//                $in['status'] = 4;
//                M('order')->where(array('order_sn'=>$data['out_trade_no']))->save($in);
//            }else{
//                $in['status'] = 2;
//                $in['paytime'] = time();
//                $score['score'] = $data['total_fee'];
//                $in['transaction_id'] = $data['transaction_id'];
//                $order=M('order')->field('type,score,status,price,user_id')->where(array('order_sn'=>$data['out_trade_no']))->find();
//                if($order['status'] == 1){
//                    if(M('order')->where(array('order_sn'=>$data['out_trade_no']))->save($in)){
//                        M('users')->where(array('id'=>$order['user_id']))->setInc('score', $order['price']);
//                    }
//                }
//            }
        }
    }

    /**
     * 支付页面
     * @param id 订单ID
     */
    public function pay() {
        if(IS_GET) {
            $id = I('get.id',0,'intval');
            $orderInfo = $this->order_model->getInfo($id);
            if(!$orderInfo) {
                $this->error('订单不存在');
            }
            if($orderInfo['status']>1) {
                $this->error('订单已支付或已取消');
            }
            $order_goods_list = $orderInfo['goods_list'] = $this->order_detail_model->getListByOrder($orderInfo['order_sn']);
            foreach($order_goods_list as $k=>$v) {
                if($v['is_hidden'] == 1) {
                    $this->error($v['goods_name'].'已下架');
                }
                if($v['is_del'] == 1) {
                    $this->error($v['goods_name'].'已删除');
                }
                if($v['num'] > $v['gnum']) {
                    $this->error($v['goods_name'].'库存不足');
                }
            }
            $orderInfo['goods_ids'] = $this->order_detail_model->where(array('order_sn'=>$orderInfo['order_sn']))->getField('goods_id',true);
            $return = $this->wxpay($orderInfo,'订单支付');
            $this->assign('qrcode',base64_encode($return['code_url']));
            $this->assign('alipay_url',U('Portal/Alipay/alipay',array('order_sn'=>$orderInfo['order_sn'],'name'=>'订单支付','price'=>$orderInfo['price_count'])));
            $this->assign('orderInfo',$orderInfo);
            $this->display();
        } else {
            $this->error('非法操作');
        }
    }

    /**
     * 改变支付方式
     * @param type 支付类型
     */
    public function changePay() {
        if(IS_AJAX) {
            $type = I('post.type',0,'intval');
            $id = I('post.id',0,'intval');
            $orderInfo = $this->order_model->getInfo($id);
            if(!$orderInfo) {
                $this->ajaxReturn(array('status'=>false,'msg'=>'订单不存在'));
            }
            $this->order_model->where(array('id'=>$id))->save(array('pay_sort'=>$type));
            $this->ajaxReturn(array('status'=>true,'msg'=>'支付方式修改成功'));
        } else {
            $this->error('非法操作');
        }
    }
}