方案:点击提交订单,发起ajax请求,在creatorder查询用户的优惠卷信息,判断优惠卷是否可用,如果有可用的优惠卷,就跳转到优惠卷使用页面。这个时候已经创建完订单了,在从优惠卷页面跳转到结算页面时,会出现数据丢失。这个时候就将订单的id带到优惠卷使用页面,从优惠卷页面选择优惠卷之后,将优惠卷的id和订单的id在带回到结算页面。然后在confirm_order判断当地址栏存在优惠卷id和订单id时。查询从优惠卷页面跳转过来的的订单的id,在数据库查询数据,展示在结算页面。这个时候会发现,当再次点击结算时,就会再次发起ajax请求,判断是否有可用的优惠卷。解决方案,在第一次使用了优惠卷时,给视图assign一个值。前台视图判断有没有这个值,如果有这个值的时候就直接带着订单id进行支付

    1. <script type="text/javascript">
    2. $('.submit').click(function(){
    3. $(this).attr("disabled",'disabled');
    4. // 判断是否有地址
    5. var address=$('.address').attr('data-id');
    6. if(address == ''){
    7. alert('收货地址不能为空');
    8. location.href="{:U('addon/WeiuidStore/Mobile/adds_status')}";
    9. return false;
    10. }
    11. // 声明一个空数组,保存商品的id
    12. var arr = [];
    13. $('.shop_id').each(function(){
    14. // 获取到选中的商品id
    15. var shop_id = $(this).attr('shop_id');
    16. // 将id一个一个的追加到数组中
    17. arr.push(shop_id);
    18. })
    19. // 获取备注
    20. var mark = $('#mark').val();
    21. var address_id = $('.address').attr('data-id');
    22. // 将id转json格式
    23. var str = arr.join();
    24. var orderid = $('.orderId').val();
    25. if(orderid){
    26. location.href="{:U('Home/Wxpay/shopPay/orderid/"+orderid+"')}";
    27. }else{
    28. $.post("{:U('addon/WeiuidStore/Mobile/creatOrder')}",{mark:mark,shop_id:str,address_id:address_id},function(data){
    29. if(data.return_code == 200){
    30. location.href="{:U('Home/Wxpay/shopPay/orderid/"+data.return_orderid+"')}";
    31. }else if(data.return_code == 201){
    32. if(confirm("是否使用优惠卷")){
    33. window.location.href="{:U('addon/WeiuidStore/Mobile/couponindex/orderid/"+data.return_orderid+"')}";
    34. }else{
    35. location.href="{:U('Home/Wxpay/shopPay/orderid/"+data.return_orderid+"')}";
    36. }
    37. }
    38. })
    39. }
    40. })
    41. $('.address').click(function(){
    42. location.href="{:U('addon/WeiuidStore/Mobile/adds_status')}";
    43. })
    44. </script>
    1. /**
    2. * 确认订单
    3. * author:咔咔
    4. * time:2018.7.2
    5. * @access public
    6. */
    7. //确认订单页面
    8. public function confirm_order(){
    9. //清除优惠卷的金额
    10. session('coupon_fee',null);
    11. $data = I();
    12. // dump($data);
    13. // exit;
    14. $address_id = $data['address_id'];
    15. $user_id = $_SESSION['userinfo']['id'];
    16. if(!$address_id){
    17. //默认地址
    18. $address = M('foodaddress')->where(array('userid'=>$user_id,'is_show'=>1,'checked'=>1))->find();
    19. if(!$address){
    20. $address = M('foodaddress')->where(array('userid'=>$user_id,'is_show'=>1))->find();
    21. }
    22. }else{
    23. $address = M('foodaddress') -> where(array('id'=>$address_id,'userid'=>$user_id,'is_show'=>1))->find();
    24. }
    25. // 获取优惠卷id
    26. $couponId = I();
    27. // 判断当优惠卷id存在时,组装数据
    28. if($couponId['orderid']){
    29. $orderData = D('goodsorder')->where([
    30. 'id'=>$couponId['orderid']
    31. ])->find();
    32. $orderData['cartorder'] = json_decode($orderData['cartorder'],true);
    33. // 查询优惠卷信息
    34. $couponData = D('goodscoupon')->where([
    35. 'id'=>$couponId['coupon_id']
    36. ])->find();
    37. //减少总价
    38. if($_SESSION['total'] == $orderData['cash_fee']){
    39. // 重构总价
    40. $_SESSION['total'] = $_SESSION['total']-$couponData['coupon_denomination'];
    41. }
    42. //实际支付金额
    43. $data['price'] = $_SESSION['total'];
    44. //优惠金额
    45. $data['coupon_fee'] = $couponData['coupon_denomination'];
    46. session('coupon_fee',$couponData['coupon_denomination']);
    47. // 修改订单的实付金额
    48. $orderSave= D('goodsorder')->where([
    49. 'id'=>$couponId['orderid']
    50. ])->save($data);
    51. $confirm_list = $orderData['cartorder'];
    52. $this->assign([
    53. 'confirm_list'=>$confirm_list,
    54. 'address'=>$address,
    55. 'orderid'=>$orderData['id']
    56. ]);
    57. }else{
    58. // var_dump($address);die;
    59. // dump($address);die;
    60. //因为购物车将商品的id获取到后存放到了in_chose里,所有只需要判断接受的数据是否有这个数组
    61. //定义运费变量
    62. $express = 0;
    63. if(isset($data['in_chose'])){
    64. // 购物车
    65. // 将从购物车传送过来的字符串id,转换为数组
    66. $arr = explode(',',$data['in_chose']);
    67. session('goods_data',null);
    68. // 循环过来的商品id ,$v就是商品的id
    69. foreach($arr as $k => $v){
    70. // 循环数据查询产品的基本信息
    71. $cart_data = D('goodscart')->where(array('id'=>$v))->find();
    72. $id = $cart_data['goods_id'];
    73. $pro_data = D('goodsproduct')->where([
    74. 'id'=>$id
    75. ])->find();
    76. if($pro_data['express']!=0){
    77. $pro_data['express'] >= $express;
    78. $express = $pro_data['express'];
    79. }
    80. // 将表内的图片地址,转为数组
    81. // $img_arr = explode(',',$pro_data['image_url']);
    82. // 表里存的是四张图片,订单页面只需要显示一张,取第一张
    83. // $pro_data['img'] = $img_arr[0];
    84. // 组装视图要显示的商品数据 从购物车过来的数据有很大的可能会不是一件商品 所以在组装数据的时候,要给俩组值,以商品的id作为下标,防止当有俩件产品的时候,最后一件商品的数据将之前的数据都覆盖
    85. // 注意::用户选择的产品数量是存在session里边的
    86. $confirm_list[$v]['id'] = $pro_data['id'];
    87. $confirm_list[$v]['img'] = $pro_data['image_url'];
    88. $confirm_list[$v]['title'] = $pro_data['title'];
    89. $confirm_list[$v]['excerpt'] = $pro_data['excerpt'];
    90. $confirm_list[$v]['price'] = $pro_data['price'];
    91. $confirm_list[$v]['oldprice'] = $pro_data['oldprice'];
    92. $confirm_list[$v]['attr'] = $cart_data['spec_key_name'];
    93. $confirm_list[$v]['user_num'] = $cart_data['goods_num'];
    94. // $confirm_list['num'] += $cart_data['goods_num'];
    95. // 商品的总价
    96. // $total += $pro_data['price'] * session::get('Cart')[$v]['user_num'];
    97. $total += $pro_data['price'] * $confirm_list[$v]['user_num'];
    98. // 用户选择的数量
    99. $num += $confirm_list[$v]['user_num'] = $cart_data['goods_num'];
    100. }
    101. $total = $total+ $express;
    102. // 将商品的总价存在session里边
    103. session('total',$total);
    104. // var_dump(session('total'))
    105. // session('num',$confirm_list['num']);
    106. // dump(session('total'));die;
    107. // 保存商品的id
    108. // session('in_chose',$data['in_chose']);
    109. // 保存用户购买的数量
    110. session('num',$num);
    111. // dump($confirm_list);die;
    112. session('in_chose',$data);
    113. session('express',$express);
    114. $this->assign([
    115. 'express'=> $express,
    116. 'confirm_list'=>$confirm_list,
    117. 'total'=>$total,
    118. 'address'=>$address
    119. ]);
    120. // var_dump($data);
    121. // exit;
    122. }else{
    123. // 立即购买
    124. // 循环数据查询产品的基本信息
    125. session('goods_data',$data);
    126. $pro_data = D('goodsproduct')->where([
    127. 'id'=>$data['id']
    128. ])->find();
    129. // 将表内的图片地址,转为数组
    130. $img_arr = explode(',',$pro_data['image_url']);
    131. // 表里存的是四张图片,订单页面只需要显示一张,取第一张
    132. $pro_data['img'] = $img_arr[0];
    133. // 组装立即购买的数据 ,显示在结算页面
    134. session('orderbuy.id',$data['id']);
    135. session('orderbuy.user_num',$data['user_num']);
    136. session('orderbuy.img',$pro_data['img']);
    137. session('orderbuy.title',$pro_data['title']);
    138. session('orderbuy.excerpt',$pro_data['excerpt']);
    139. session('orderbuy.price',$pro_data['price']);
    140. session('orderbuy.oldprice',$pro_data['oldprice']);
    141. // 商品的分类id
    142. session('orderbuy.category_id',$pro_data['category_id']);
    143. // 商品的总价
    144. session('total',$pro_data['price']*$data['user_num']+$pro_data['express']);
    145. //商品运费
    146. session('express',$pro_data['express']);
    147. // 保存用户购买的数量
    148. $num[$data['id']] = $data['user_num'];
    149. session('num',$num[$data['id']]);
    150. $confirm_list = session('orderbuy');
    151. // 商品的属性
    152. $attr_data = $data['attr'];
    153. // 字符串转数组
    154. $attr_data = explode('-',$attr_data);
    155. session('in_chose',null);
    156. $this->assign([
    157. 'express'=> $pro_data['express'],
    158. 'confirm_list'=>$confirm_list,
    159. 'attr_data'=>$attr_data,
    160. 'post_data'=>$data,
    161. 'address'=>$address
    162. ]);
    163. }
    164. }
    165. // 查询用户地址信息
    166. $this->display();
    167. }
    168. /**
    169. * 创建订单
    170. * author:咔咔
    171. * time:2018.7.2
    172. * @access public
    173. */
    174. public function creatOrder(){
    175. // 获取所有的数据
    176. $all_data = I();
    177. // 查询优惠卷信息
    178. $coupon_data = M()->table('antweb_goodscouponreceive as a')
    179. ->join('antweb_goodscoupon as b on b.id=a.goodscoupon_id')
    180. ->where([
    181. 'foodmumber_id'=>session('userinfo')['id'],
    182. 'receive_status'=>1,
    183. ])
    184. ->order('a.id desc')
    185. ->select();
    186. // 保存优惠卷id
    187. $coupon_id = [];
    188. // 将优惠卷id存储到数组
    189. foreach($coupon_data as $k=>$v){
    190. // 判断总价是否大于优惠卷价格
    191. if(session('total')>=$v['coupon_condition']){
    192. // 保存优惠卷id
    193. $coupon_id[] = $v['id'];
    194. }
    195. }
    196. // 用户的id
    197. $data['user_id'] = session('userinfo.id');
    198. // 订单总价 不论从购物车过来的还是立即购买过来的,都将总价保存到了total
    199. $data['cash_fee'] = session('total');
    200. //实际支付金额
    201. $data['price'] = session('total');
    202. // 用户名
    203. $data['username'] = session('userinfo.username');
    204. // 订单状态
    205. $data['status'] = 1;
    206. //订单快递运费
    207. $data['express'] = session('express');
    208. // 备注
    209. $data['mark'] = $all_data['mark'];
    210. //地址id
    211. $data['address_id'] = $all_data['address_id'];
    212. // 下单时间
    213. $data['ctime'] = time();
    214. // 订单号 用时间戳作为订单号
    215. $data['ordername'] = time('YmdHis').rand(100,999);
    216. if(session('in_chose')){
    217. // dump(session('in_chose'));die;
    218. // 购物车
    219. // 将从购物车传送过来的字符串id,转换为数组
    220. $arr = explode(',',$_POST['shop_id']);
    221. // 循环过来的商品id ,$v就是商品的id
    222. foreach($arr as $k => $v){
    223. // 循环数据查询产品的基本信息
    224. $pro_data = M('goodsproduct')->where([
    225. 'id'=>$v
    226. ])->find();
    227. $cart_data = M('goodscart') ->where(array('goods_id'=>$v,'user_id'=>$_SESSION['userinfo']['id']))->find();
    228. // 将表内的图片地址,转为数组
    229. //$img_arr = explode(',',$pro_data['image_url']);
    230. // 表里存的是四张图片,订单页面只需要显示一张,取第一张
    231. // $pro_data['img'] = $img_arr[0];
    232. // 组装视图要显示的商品数据 从购物车过来的数据有很大的可能会不是一件商品 所以在组装数据的时候,要给俩组值,以商品的id作为下标,防止当有俩件产品的时候,最后一件商品的数据将之前的数据都覆盖
    233. // 注意::用户选择的产品数量是存在session里边的
    234. $confirm_list[$v]['id'] = $pro_data['id'];
    235. $confirm_list[$v]['img'] = $pro_data['image_url'];
    236. $confirm_list[$v]['title'] = $pro_data['title'];
    237. $confirm_list[$v]['excerpt'] = $pro_data['excerpt'];
    238. $confirm_list[$v]['price'] = $pro_data['price'];
    239. $confirm_list[$v]['oldprice'] = $pro_data['oldprice'];
    240. $confirm_list[$v]['user_num'] = $cart_data['goods_num'];
    241. $confirm_list[$v]['attr'] = $cart_data['spec_key_name'];
    242. $confirm_list[$v]['category_id'] = $pro_data['category_id'];
    243. }
    244. $data['cartorder'] = json_encode($confirm_list);
    245. }else{
    246. // 立即购买的已经存session
    247. $data['cartorder'] = json_encode(session('orderbuy'));
    248. }
    249. // 存表
    250. $res = D('goodsorder')->add($data);
    251. if($res){
    252. // 清除购物车商品数据
    253. if(session('in_chose')){
    254. $arr = explode(',',$_POST['shop_id']);
    255. foreach($arr as $k=>$v){
    256. $del = M('goodscart')->where(array('goods_id'=>$v,'user_id'=>$_SESSION['userinfo']['id']))->delete();
    257. }
    258. // dump(session::get('Cart'));die;
    259. }else{
    260. // 清除立即购买的数据
    261. session('orderbuy',null);
    262. }
    263. // 清除存储购物车的商品id
    264. session('in_chose',null);
    265. session('coupon_fee',null);
    266. // 将订单号保存session,在支付页面输出
    267. session('ordername',$data['ordername']);
    268. if(!empty($coupon_id)){
    269. $return['return_code'] = 201;
    270. $return['return_mag'] = "有可用的优惠卷";
    271. $return['return_orderid'] = $res;
    272. $this->ajaxReturn($return);
    273. }
    274. $return['return_code'] = 200;
    275. $return['return_msg'] = "下单成功";
    276. $return['return_orderid'] = $res;
    277. $this->ajaxReturn($return);
    278. }else{
    279. $return['return_code'] = 400;
    280. $return['return_msg'] = "下单失败";
    281. $this->ajaxReturn($return);
    282. }
    283. }