方案:点击提交订单,发起ajax请求,在creatorder查询用户的优惠卷信息,判断优惠卷是否可用,如果有可用的优惠卷,就跳转到优惠卷使用页面。这个时候已经创建完订单了,在从优惠卷页面跳转到结算页面时,会出现数据丢失。这个时候就将订单的id带到优惠卷使用页面,从优惠卷页面选择优惠卷之后,将优惠卷的id和订单的id在带回到结算页面。然后在confirm_order判断当地址栏存在优惠卷id和订单id时。查询从优惠卷页面跳转过来的的订单的id,在数据库查询数据,展示在结算页面。这个时候会发现,当再次点击结算时,就会再次发起ajax请求,判断是否有可用的优惠卷。解决方案,在第一次使用了优惠卷时,给视图assign一个值。前台视图判断有没有这个值,如果有这个值的时候就直接带着订单id进行支付
<script type="text/javascript">$('.submit').click(function(){$(this).attr("disabled",'disabled');// 判断是否有地址var address=$('.address').attr('data-id');if(address == ''){alert('收货地址不能为空');location.href="{:U('addon/WeiuidStore/Mobile/adds_status')}";return false;}// 声明一个空数组,保存商品的idvar arr = [];$('.shop_id').each(function(){// 获取到选中的商品idvar shop_id = $(this).attr('shop_id');// 将id一个一个的追加到数组中arr.push(shop_id);})// 获取备注var mark = $('#mark').val();var address_id = $('.address').attr('data-id');// 将id转json格式var str = arr.join();var orderid = $('.orderId').val();if(orderid){location.href="{:U('Home/Wxpay/shopPay/orderid/"+orderid+"')}";}else{$.post("{:U('addon/WeiuidStore/Mobile/creatOrder')}",{mark:mark,shop_id:str,address_id:address_id},function(data){if(data.return_code == 200){location.href="{:U('Home/Wxpay/shopPay/orderid/"+data.return_orderid+"')}";}else if(data.return_code == 201){if(confirm("是否使用优惠卷")){window.location.href="{:U('addon/WeiuidStore/Mobile/couponindex/orderid/"+data.return_orderid+"')}";}else{location.href="{:U('Home/Wxpay/shopPay/orderid/"+data.return_orderid+"')}";}}})}})$('.address').click(function(){location.href="{:U('addon/WeiuidStore/Mobile/adds_status')}";})</script>
/*** 确认订单* author:咔咔* time:2018.7.2* @access public*///确认订单页面public function confirm_order(){//清除优惠卷的金额session('coupon_fee',null);$data = I();// dump($data);// exit;$address_id = $data['address_id'];$user_id = $_SESSION['userinfo']['id'];if(!$address_id){//默认地址$address = M('foodaddress')->where(array('userid'=>$user_id,'is_show'=>1,'checked'=>1))->find();if(!$address){$address = M('foodaddress')->where(array('userid'=>$user_id,'is_show'=>1))->find();}}else{$address = M('foodaddress') -> where(array('id'=>$address_id,'userid'=>$user_id,'is_show'=>1))->find();}// 获取优惠卷id$couponId = I();// 判断当优惠卷id存在时,组装数据if($couponId['orderid']){$orderData = D('goodsorder')->where(['id'=>$couponId['orderid']])->find();$orderData['cartorder'] = json_decode($orderData['cartorder'],true);// 查询优惠卷信息$couponData = D('goodscoupon')->where(['id'=>$couponId['coupon_id']])->find();//减少总价if($_SESSION['total'] == $orderData['cash_fee']){// 重构总价$_SESSION['total'] = $_SESSION['total']-$couponData['coupon_denomination'];}//实际支付金额$data['price'] = $_SESSION['total'];//优惠金额$data['coupon_fee'] = $couponData['coupon_denomination'];session('coupon_fee',$couponData['coupon_denomination']);// 修改订单的实付金额$orderSave= D('goodsorder')->where(['id'=>$couponId['orderid']])->save($data);$confirm_list = $orderData['cartorder'];$this->assign(['confirm_list'=>$confirm_list,'address'=>$address,'orderid'=>$orderData['id']]);}else{// var_dump($address);die;// dump($address);die;//因为购物车将商品的id获取到后存放到了in_chose里,所有只需要判断接受的数据是否有这个数组//定义运费变量$express = 0;if(isset($data['in_chose'])){// 购物车// 将从购物车传送过来的字符串id,转换为数组$arr = explode(',',$data['in_chose']);session('goods_data',null);// 循环过来的商品id ,$v就是商品的idforeach($arr as $k => $v){// 循环数据查询产品的基本信息$cart_data = D('goodscart')->where(array('id'=>$v))->find();$id = $cart_data['goods_id'];$pro_data = D('goodsproduct')->where(['id'=>$id])->find();if($pro_data['express']!=0){$pro_data['express'] >= $express;$express = $pro_data['express'];}// 将表内的图片地址,转为数组// $img_arr = explode(',',$pro_data['image_url']);// 表里存的是四张图片,订单页面只需要显示一张,取第一张// $pro_data['img'] = $img_arr[0];// 组装视图要显示的商品数据 从购物车过来的数据有很大的可能会不是一件商品 所以在组装数据的时候,要给俩组值,以商品的id作为下标,防止当有俩件产品的时候,最后一件商品的数据将之前的数据都覆盖// 注意::用户选择的产品数量是存在session里边的$confirm_list[$v]['id'] = $pro_data['id'];$confirm_list[$v]['img'] = $pro_data['image_url'];$confirm_list[$v]['title'] = $pro_data['title'];$confirm_list[$v]['excerpt'] = $pro_data['excerpt'];$confirm_list[$v]['price'] = $pro_data['price'];$confirm_list[$v]['oldprice'] = $pro_data['oldprice'];$confirm_list[$v]['attr'] = $cart_data['spec_key_name'];$confirm_list[$v]['user_num'] = $cart_data['goods_num'];// $confirm_list['num'] += $cart_data['goods_num'];// 商品的总价// $total += $pro_data['price'] * session::get('Cart')[$v]['user_num'];$total += $pro_data['price'] * $confirm_list[$v]['user_num'];// 用户选择的数量$num += $confirm_list[$v]['user_num'] = $cart_data['goods_num'];}$total = $total+ $express;// 将商品的总价存在session里边session('total',$total);// var_dump(session('total'))// session('num',$confirm_list['num']);// dump(session('total'));die;// 保存商品的id// session('in_chose',$data['in_chose']);// 保存用户购买的数量session('num',$num);// dump($confirm_list);die;session('in_chose',$data);session('express',$express);$this->assign(['express'=> $express,'confirm_list'=>$confirm_list,'total'=>$total,'address'=>$address]);// var_dump($data);// exit;}else{// 立即购买// 循环数据查询产品的基本信息session('goods_data',$data);$pro_data = D('goodsproduct')->where(['id'=>$data['id']])->find();// 将表内的图片地址,转为数组$img_arr = explode(',',$pro_data['image_url']);// 表里存的是四张图片,订单页面只需要显示一张,取第一张$pro_data['img'] = $img_arr[0];// 组装立即购买的数据 ,显示在结算页面session('orderbuy.id',$data['id']);session('orderbuy.user_num',$data['user_num']);session('orderbuy.img',$pro_data['img']);session('orderbuy.title',$pro_data['title']);session('orderbuy.excerpt',$pro_data['excerpt']);session('orderbuy.price',$pro_data['price']);session('orderbuy.oldprice',$pro_data['oldprice']);// 商品的分类idsession('orderbuy.category_id',$pro_data['category_id']);// 商品的总价session('total',$pro_data['price']*$data['user_num']+$pro_data['express']);//商品运费session('express',$pro_data['express']);// 保存用户购买的数量$num[$data['id']] = $data['user_num'];session('num',$num[$data['id']]);$confirm_list = session('orderbuy');// 商品的属性$attr_data = $data['attr'];// 字符串转数组$attr_data = explode('-',$attr_data);session('in_chose',null);$this->assign(['express'=> $pro_data['express'],'confirm_list'=>$confirm_list,'attr_data'=>$attr_data,'post_data'=>$data,'address'=>$address]);}}// 查询用户地址信息$this->display();}/*** 创建订单* author:咔咔* time:2018.7.2* @access public*/public function creatOrder(){// 获取所有的数据$all_data = I();// 查询优惠卷信息$coupon_data = M()->table('antweb_goodscouponreceive as a')->join('antweb_goodscoupon as b on b.id=a.goodscoupon_id')->where(['foodmumber_id'=>session('userinfo')['id'],'receive_status'=>1,])->order('a.id desc')->select();// 保存优惠卷id$coupon_id = [];// 将优惠卷id存储到数组foreach($coupon_data as $k=>$v){// 判断总价是否大于优惠卷价格if(session('total')>=$v['coupon_condition']){// 保存优惠卷id$coupon_id[] = $v['id'];}}// 用户的id$data['user_id'] = session('userinfo.id');// 订单总价 不论从购物车过来的还是立即购买过来的,都将总价保存到了total$data['cash_fee'] = session('total');//实际支付金额$data['price'] = session('total');// 用户名$data['username'] = session('userinfo.username');// 订单状态$data['status'] = 1;//订单快递运费$data['express'] = session('express');// 备注$data['mark'] = $all_data['mark'];//地址id$data['address_id'] = $all_data['address_id'];// 下单时间$data['ctime'] = time();// 订单号 用时间戳作为订单号$data['ordername'] = time('YmdHis').rand(100,999);if(session('in_chose')){// dump(session('in_chose'));die;// 购物车// 将从购物车传送过来的字符串id,转换为数组$arr = explode(',',$_POST['shop_id']);// 循环过来的商品id ,$v就是商品的idforeach($arr as $k => $v){// 循环数据查询产品的基本信息$pro_data = M('goodsproduct')->where(['id'=>$v])->find();$cart_data = M('goodscart') ->where(array('goods_id'=>$v,'user_id'=>$_SESSION['userinfo']['id']))->find();// 将表内的图片地址,转为数组//$img_arr = explode(',',$pro_data['image_url']);// 表里存的是四张图片,订单页面只需要显示一张,取第一张// $pro_data['img'] = $img_arr[0];// 组装视图要显示的商品数据 从购物车过来的数据有很大的可能会不是一件商品 所以在组装数据的时候,要给俩组值,以商品的id作为下标,防止当有俩件产品的时候,最后一件商品的数据将之前的数据都覆盖// 注意::用户选择的产品数量是存在session里边的$confirm_list[$v]['id'] = $pro_data['id'];$confirm_list[$v]['img'] = $pro_data['image_url'];$confirm_list[$v]['title'] = $pro_data['title'];$confirm_list[$v]['excerpt'] = $pro_data['excerpt'];$confirm_list[$v]['price'] = $pro_data['price'];$confirm_list[$v]['oldprice'] = $pro_data['oldprice'];$confirm_list[$v]['user_num'] = $cart_data['goods_num'];$confirm_list[$v]['attr'] = $cart_data['spec_key_name'];$confirm_list[$v]['category_id'] = $pro_data['category_id'];}$data['cartorder'] = json_encode($confirm_list);}else{// 立即购买的已经存session$data['cartorder'] = json_encode(session('orderbuy'));}// 存表$res = D('goodsorder')->add($data);if($res){// 清除购物车商品数据if(session('in_chose')){$arr = explode(',',$_POST['shop_id']);foreach($arr as $k=>$v){$del = M('goodscart')->where(array('goods_id'=>$v,'user_id'=>$_SESSION['userinfo']['id']))->delete();}// dump(session::get('Cart'));die;}else{// 清除立即购买的数据session('orderbuy',null);}// 清除存储购物车的商品idsession('in_chose',null);session('coupon_fee',null);// 将订单号保存session,在支付页面输出session('ordername',$data['ordername']);if(!empty($coupon_id)){$return['return_code'] = 201;$return['return_mag'] = "有可用的优惠卷";$return['return_orderid'] = $res;$this->ajaxReturn($return);}$return['return_code'] = 200;$return['return_msg'] = "下单成功";$return['return_orderid'] = $res;$this->ajaxReturn($return);}else{$return['return_code'] = 400;$return['return_msg'] = "下单失败";$this->ajaxReturn($return);}}
