方案:点击提交订单,发起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;
}
// 声明一个空数组,保存商品的id
var arr = [];
$('.shop_id').each(function(){
// 获取到选中的商品id
var 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就是商品的id
foreach($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']);
// 商品的分类id
session('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就是商品的id
foreach($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);
}
// 清除存储购物车的商品id
session('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);
}
}